');
+ if (tab && headerEnd > 0) ctx.body = ctx.body.slice(0, headerEnd).replace(`
{
+ if (ctx.method === 'GET' && /^recent$/i.test(String(ctx.query.filter || '')) && ['q', 'search'].some(k => String(ctx.query[k] || '').trim())) ctx.query = { ...ctx.query, filter: ctx.query.filter === 'RECENT' ? 'ALL' : 'all' };
await next();
},
- async (ctx, next) => { setLanguage(ctx.cookies.get("language") || getConfig().language || "en"); await next(); },
+ async (ctx, next) => { await require('../models/typed_log').requestScope.run({ capped: false, limit: 0, path: ctx.path, query: ctx.querystring, method: ctx.method }, next); },
async (ctx, next) => {
- const isBinary = ctx.path.startsWith('/qr') || ctx.path.startsWith('/image/') || ctx.path.startsWith('/blob/') || ctx.path.startsWith('/assets/');
+ if (ctx.method !== 'POST') return next();
+ const forget = () => {
+ censusCache.clear();
+ lifetime.forget();
+ try { activityModel.invalidateCache(); } catch (_) {}
+ clearnetDecisionCache = { at: 0, data: null };
+ clearnetIndexCache = { ts: 0, data: null, building: null };
+ clearnetBlobCache = { ts: 0, set: null, forcedAt: clearnetBlobCache.forcedAt };
+ clearnetTribesCache = { at: 0, data: null };
+ };
+ forget();
+ try { await next(); } finally { forget(); await settleLogWrites(); }
+ },
+ publicModeGuard({
+ isPublic: !!config.public,
+ onBlocked: (ctx) => sendErrorPage(ctx, "Sorry, many actions are unavailable when Oasis is running in public mode. Please run Oasis in the default mode and try again.", { status: 403 })
+ }),
+ async (ctx, next) => {
+ if (isLoopbackOnlyPath(ctx.path) && !isLoopbackRequest(ctx)) { sendErrorPage(ctx, 'Forbidden', { status: 403 }); return; }
+ await next();
+ },
+ syncTribeModuleExposure,
+ async (ctx, next) => { applyFirstRunLanguage(ctx); setLanguage(isClearnetPath(ctx.request) ? clearnetLanguage(ctx) : (ctx.cookies.get("language") || getConfig().language || "en")); await next(); },
+ async (ctx, next) => {
+ try { require('../views/comments_view').setCommentsOpen(ctx.method === 'GET' && String(ctx.query.comments || '') === 'open'); } catch (_) {}
+ await next();
+ },
+ async (ctx, next) => {
+ if (ctx.method === 'GET' && WALLET_CHIP_PATHS.some(p => ctx.path === p || ctx.path.startsWith(`${p}/`))) {
+ await settleWithin(refreshWalletReady(), WALLET_CHECK_WAIT_MS);
+ const kind = (ctx.path === '/transfers' || ctx.path.startsWith('/transfers/')) ? 'transfers'
+ : (ctx.path === '/banking' || ctx.path.startsWith('/banking/')) ? 'banking' : null;
+ if (kind) require('../models/typed_log').requestScope.run({ capped: false, limit: 0, path: '/', query: '' }, () => runWalletWork(kind)).catch(() => {});
+ }
+ await next();
+ },
+ async (ctx, next) => {
+ await next();
+ const flash = String((ctx.state && ctx.state.inlineError) || (ctx.method === 'GET' ? signedErrorOf(ctx) : '')).trim();
+ if (!flash || typeof ctx.body !== 'string' || !/html/.test(String(ctx.type || ''))) return;
+ const { renderInlineError } = require('../views/main_views');
+ const marker = '';
+ const at = ctx.body.indexOf(marker);
+ if (at < 0) return;
+ const cleanUrl = ctx.method === 'GET' ? ctx.path + (() => { const q = new URLSearchParams(ctx.querystring); q.delete('error'); q.delete('errsig'); const s = q.toString(); return s ? `?${s}` : ''; })() : null;
+ ctx.body = ctx.body.slice(0, at + marker.length) + renderInlineError(flash, cleanUrl) + ctx.body.slice(at + marker.length);
+ },
+ async (ctx, next) => {
+ const isBinary = ctx.path.startsWith('/qr') || ctx.path.startsWith('/wallet/qr/') || ctx.path.startsWith('/image/') || ctx.path.startsWith('/blob/') || ctx.path.startsWith('/assets/');
if (isBinary) {
try { await next(); } catch (err) {
ctx.status = err.status || 500;
@@ -9331,9 +15132,17 @@ const middleware = [
}
return;
}
- const ssb = await cooler.open(), status = await ssb.status(), values = Object.values(status.sync.plugins);
- const totalCurrent = values.reduce((acc, cur) => acc + cur, 0), totalTarget = status.sync.since * values.length;
- if (totalTarget - totalCurrent > 1024 * 1024) ctx.response.body = indexingView({ percent: Math.floor((totalCurrent / totalTarget) * 1000) / 10 });
+ const migration = typeof SSBconfig.migrationStatus === 'function' ? SSBconfig.migrationStatus() : null;
+ if (migration && migration.running) { ctx.response.body = indexingView({ percent: migration.percent }); return; }
+ const until = Date.now() + STARTUP_WAIT_MS;
+ const ssb = await Promise.race([cooler.open(), new Promise((resolve) => setTimeout(() => resolve(null), STARTUP_WAIT_MS))]);
+ let status = ssb ? await ssb.status() : { ready: false };
+ while (ssb && status && status.ready === false && Date.now() < until) {
+ await new Promise((resolve) => setTimeout(resolve, 150));
+ status = await ssb.status();
+ }
+ if (status && status.ready === false) ctx.response.body = indexingView({ percent: startupProgress(status), refresh: 5 });
+ else if (indexingLag(status) > INDEXING_LAG_BYTES) ctx.response.body = indexingView({ percent: Math.floor(indexingProgress(status) * 1000) / 10 });
else { try { await next(); } catch (err) {
const { i18n } = require('../views/main_views');
if (err.name === 'FileTooLargeError' || (err.message && err.message.includes('maxFileSize'))) {
@@ -9347,97 +15156,11 @@ const middleware = [
},
async (ctx, next) => {
if (!ctx.path.startsWith('/assets/') && !ctx.path.startsWith('/image/') && !ctx.path.startsWith('/blob/') && !ctx.path.startsWith('/qr') && !ctx.path.startsWith('/c/')) {
- // filtro del hive (Personal/Community); lo leen la topbar y renderHiveNav
+ // filtro de la home (Personal/Community); lo leen la topbar y el lanzador
global.__OASIS_HIVE_FILTER__ = (ctx.path === '/activity' && (ctx.query.hive === 'personal' || ctx.query.hive === 'community')) ? ctx.query.hive : '';
- // los hexagonos SOLO en la home; en el resto de paginas el top queda limpio
+ // el lanzador de modulos SOLO en la home; en el resto de paginas el top queda limpio
global.__OASIS_SHOW_HIVE__ = (ctx.path === '/activity' || ctx.path === '/');
- const now = Date.now();
- if (now - sharedState.getLastRefresh() > 60000) {
- sharedState.setLastRefresh(now);
- try {
- // avatar propio para el circulo de la topbar movil (lo lee renderMobileTopbar)
- const meId = getViewerId();
- const selfImg = meId ? await about.image(meId) : null;
- const NULL_IMG = '&' + '0'.repeat(43) + '=.sha256';
- if (typeof selfImg === 'string' && selfImg[0] === '&' && selfImg !== NULL_IMG) {
- global.__OASIS_SELF_AVATAR__ = `/image/256/${encodeURIComponent(selfImg)}`;
- } else if (typeof selfImg === 'string' && selfImg[0] === '/') {
- global.__OASIS_SELF_AVATAR__ = selfImg;
- } else {
- global.__OASIS_SELF_AVATAR__ = null;
- }
- } catch (_) { }
- try {
- const stats = await statsModel.getStats('ALL');
- const totalMB = parseSizeMB(stats.statsBlobsSize) + parseSizeMB(stats.statsBlockchainSize);
- const hcT = parseFloat((totalMB * 0.0002 * 475).toFixed(2));
- const inhabitants = stats.usersKPIs?.totalInhabitants || stats.inhabitants || 1;
- const hcH = inhabitants > 0 ? parseFloat((hcT / inhabitants).toFixed(2)) : 0;
- sharedState.setCarbonHcT(hcT);
- sharedState.setCarbonHcH(hcH);
- } catch (_) {}
- try {
- const dataRes = await dataModel.listMatches('ALL');
- const top = (dataRes.matches || [])[0] || null;
- sharedState.setBestMatch(top ? { href: top.href, title: top.title || top.id, kind: top.kind, score: top.score } : null);
- } catch (_) {}
- try { await refreshInboxCount(); } catch (_) {}
- try { await refreshMentionsCount(); } catch (_) {}
- try { await calendarsModel.checkDueReminders(); } catch (_) {}
- try { await tasksModel.checkDueReminders(); } catch (_) {}
- try { await checkPoliticalChanges(); } catch (_) {}
- try { await checkJobMatches(); } catch (_) {}
- try {
- const peers = await meta.connectedPeers();
- sharedState.setOnlinePeerCount(Array.isArray(peers) ? peers.length : 0);
- } catch (_) {}
- try {
- sharedState.setInboxUnreadCount(sharedState.getInboxCount());
- sharedState.setLastSyncTs(now);
- } catch (_) {}
- try {
- const ex = await bankingModel.calculateEcoinValue();
- if (ex && ex.isSynced) sharedState.setEcoValue(Number(ex.ecoValue).toFixed(4));
- } catch (_) {}
- try {
- const me = getViewerId();
- const actions = await activityModel.listFeed('all').catch(() => []);
- const mine = (actions || []).filter(a => a && a.author === me && a.type !== 'tombstone' && a.type !== 'post');
- mine.sort((a, b) => (b.ts || 0) - (a.ts || 0));
- const prev = mine[1] || mine[0];
- if (prev) {
- const hrefByType = {
- vote: prev.content?.vote?.link ? `/thread/${encodeURIComponent(prev.content.vote.link)}#${encodeURIComponent(prev.content.vote.link)}` : null,
- transfer: `/transfers/${encodeURIComponent(prev.id)}`,
- tribe: `/tribe/${encodeURIComponent(prev.id)}`,
- shop: `/shops/${encodeURIComponent(prev.id)}`,
- job: `/jobs/${encodeURIComponent(prev.id)}`,
- event: `/events/${encodeURIComponent(prev.id)}`,
- project: `/projects/${encodeURIComponent(prev.id)}`,
- image: `/images/${encodeURIComponent(prev.id)}`,
- audio: `/audios/${encodeURIComponent(prev.id)}`,
- video: `/videos/${encodeURIComponent(prev.id)}`,
- document: `/documents/${encodeURIComponent(prev.id)}`,
- torrent: `/torrents/${encodeURIComponent(prev.id)}`,
- forum: `/forum/${encodeURIComponent(prev.content?.key || prev.id)}`,
- bookmark: `/bookmarks/${encodeURIComponent(prev.id)}`,
- task: `/tasks/${encodeURIComponent(prev.id)}`,
- event_: `/events/${encodeURIComponent(prev.id)}`,
- about: `/author/${encodeURIComponent(prev.author)}`,
- map: `/maps/${encodeURIComponent(prev.id)}`,
- chat: `/chats/${encodeURIComponent(prev.id)}`,
- pad: `/pads/${encodeURIComponent(prev.id)}`,
- pixelia: `/pixelia`
- };
- sharedState.setLastActivity({
- id: prev.id,
- type: prev.type,
- ts: prev.ts,
- href: hrefByType[prev.type] || `/activity?filter=mine`
- });
- }
- } catch (_) {}
- }
+ if (Date.now() - sharedState.getLastRefresh() > 60000) kickRefresh();
}
await next();
},
@@ -9446,28 +15169,146 @@ const middleware = [
getConfig, saveConfig,
isLoopbackRequest, sendErrorPage }),
routes,
+ async (ctx) => {
+ if (ctx.body != null || (ctx.method !== 'GET' && ctx.method !== 'HEAD')) return;
+ if (isClearnetPath(ctx.request) || ctx.path === '/clearnet' || ctx.path.startsWith('/clearnet/')) {
+ ctx.status = 404;
+ ctx.type = 'text/html';
+ ctx.body = require('../views/clearnet_view').renderClearnetNotFound();
+ return;
+ }
+ if (/^\/(blob|image|assets|qr|qr-invite)(\/|$)/.test(ctx.path)) return;
+ ctx.redirect('/');
+ },
];
const app = http({ host, port, middleware, allowHost: config.allowHost });
+if (ADMIN_TOKEN) console.log(`- Admin access (open it on this device): http://localhost:${port}/admin-session/${ADMIN_TOKEN}`);
+const startDesktopNotices = async () => {
+ const { notify: desktopNotify, i18nNow, displayName } = require('./desktopNotify');
+ const ssb = await cooler.open();
+ if (!ssb || !ssb.db || typeof ssb.db.onMsgAdded !== 'function') return;
+ const me = ssb.id;
+ let lastEmergency = null;
+ try { const f = await emergenciesModel.featured(); lastEmergency = f && f.id; } catch (_) {}
+ const nameFor = async (id) => { try { return displayName(id, await about.name(id)); } catch (_) { return String(id); } };
+ const isMutual = async (id) => { try { const rel = await friend.getRelationship(id); return !!(rel && rel.following && rel.followsMe); } catch (_) { return false; } };
+ ssb.db.onMsgAdded((ev) => {
+ const kvt = ev && ev.kvt;
+ const v = kvt && kvt.value;
+ if (!v || v.author === me || Date.now() - (Number(v.timestamp) || 0) > 15 * 60 * 1000) return;
+ (async () => {
+ const i18n = i18nNow();
+ const cfg = getConfig();
+ if (typeof v.content === 'string') {
+ let c = null;
+ try { const dec = ssb.private.unbox({ key: kvt.key, value: v, timestamp: kvt.timestamp }); c = dec && dec.value && dec.value.content; } catch (_) {}
+ if (!c || c.private !== true || !Array.isArray(c.to) || !c.to.includes(me)) return;
+ if (cfg.pmVisibility === 'mutuals' && !(await isMutual(v.author))) return;
+ if (c.type === 'pam') {
+ if (cfg.modules.phoneMod !== 'off') desktopNotify(i18n.phoneTitle, `${i18n.notifyNewPamFrom} ${await nameFor(v.author)}`);
+ return;
+ }
+ if (c.type !== 'post') return;
+ const bot = pmModel.botOf({ subject: String(c.subject || '') });
+ if (bot && pmModel.mutedBots(cfg).has(bot)) return;
+ desktopNotify(i18n.inbox, `${i18n.notifyNewPmFrom} ${bot || await nameFor(v.author)}`);
+ return;
+ }
+ const t = v.content && v.content.type;
+ if (typeof t === 'string' && t.startsWith('emergency') && cfg.modules.emergenciesMod === 'on') {
+ const f = await emergenciesModel.featured().catch(() => null);
+ if (!f || !f.id || f.id === lastEmergency) return;
+ lastEmergency = f.id;
+ if (sharedState.getDismissedEmergency && sharedState.getDismissedEmergency() === f.id) return;
+ desktopNotify(i18n.emergenciesTitle, f.title);
+ }
+ })().catch(() => {});
+ }, false);
+};
+if (!config.public) setTimeout(() => { phoneModel.start().catch(() => {}); startDesktopNotices().catch(() => {}); syncClearnetSince().catch(() => {}); }, 3000);
let pubEngineTimer = null;
+let pubAddressEnsured = false;
+let pubEngineRunning = false;
async function runPubEngineTick() {
- if (!bankingModel.isPubNode()) return;
- try { await bankingModel.executeEpoch({}); } catch (_) {}
- try { await bankingModel.processPendingClaims(); } catch (_) {}
- try { await bankingModel.publishPubAvailability(); } catch (_) {}
+ if (!bankingModel.isPubNode() || pubEngineRunning) return;
+ pubEngineRunning = true;
+ try {
+ if (!pubAddressEnsured) { try { const r = await bankingModel.ensureSelfAddressPublished(); pubAddressEnsured = r && r.status !== 'skipped'; } catch (_) {} }
+ try { await bankingModel.executeEpoch({}); } catch (_) {}
+ try { await bankingModel.processPendingClaims(); } catch (_) {}
+ try { await bankingModel.confirmIncomingTransfers(); } catch (_) {}
+ try { await bankingModel.rebalanceUbiPools(); } catch (_) {}
+ try { await bankingModel.publishPubAvailability(); } catch (_) {}
+ } finally {
+ pubEngineRunning = false;
+ }
+}
+const ubiNoticePath = process.env.OASIS_BANKING_DIR ? path.join(process.env.OASIS_BANKING_DIR, 'banking-ubi-notice.json') : stateFilePath('banking-ubi-notice.json');
+const confirmNoticePath = process.env.OASIS_BANKING_DIR ? path.join(process.env.OASIS_BANKING_DIR, 'banking-confirm-notice.json') : stateFilePath('banking-confirm-notice.json');
+async function notifyPendingConfirmations() {
+ if (getConfig().modules?.transfersMod === 'off') return;
+ try {
+ const me = getViewerId();
+ const list = await transfersModel.listAll('all', me).catch(() => []);
+ const pending = (list || []).filter(t => {
+ const tags = Array.isArray(t.tags) ? t.tags.map(x => String(x).toUpperCase()) : [];
+ const settledUbi = tags.includes('UBI') && /^[0-9a-f]{64}$/i.test(String(t.txid || ''));
+ return String(t.status || '').toUpperCase() === 'UNCONFIRMED'
+ && String(t.to) === String(me)
+ && !(Array.isArray(t.confirmedBy) ? t.confirmedBy : []).includes(me)
+ && !tags.includes('PENDING')
+ && !settledUbi;
+ });
+ if (!pending.length) return;
+ let notified = [];
+ try { notified = JSON.parse(fs.readFileSync(confirmNoticePath, 'utf8')) || []; } catch (_) {}
+ const fresh = pending.filter(t => !notified.includes(t.id));
+ if (!fresh.length) return;
+ const { i18n: i18nB } = require('../views/main_views');
+ const lines = fresh.slice(0, 5).map(t => `· [${t.concept || t.id}](/transfers/${encodeURIComponent(t.id)}) — ${Number(t.amount || 0).toFixed(6)} ECO`).join('\n');
+ await notifyBot('BANKING_CONFIRM_PENDING', [me], `${i18nB.bankingBotConfirmText} (${fresh.length}):\n${lines}\n\n[${i18nB.transfersFilterPending}](/transfers?filter=pending)`);
+ fs.writeFileSync(confirmNoticePath, JSON.stringify([...notified, ...fresh.map(t => t.id)].slice(-500)));
+ } catch (_) {}
+}
+
+const lastWalletWork = { transfers: 0, banking: 0 };
+async function runWalletWork(kind) {
+ if (bankingModel.isPubNode()) return;
+ if (Date.now() - (lastWalletWork[kind] || 0) < 60000) return;
+ lastWalletWork[kind] = Date.now();
+ try { await bankingModel.confirmIncomingTransfers(); } catch (_) {}
+ if (kind === 'transfers') { try { await notifyPendingConfirmations(); } catch (_) {} return; }
+ try {
+ const avail = await bankingModel.claimAvailability(getViewerId());
+ if (!avail.available) return;
+ let notified = {};
+ try { notified = JSON.parse(fs.readFileSync(ubiNoticePath, 'utf8')) || {}; } catch (_) {}
+ if (notified.epochId === avail.epochId) return;
+ const { i18n: i18nB } = require('../views/main_views');
+ await notifyBot('BANKING_UBI_AVAILABLE', [getViewerId()], `${i18nB.bankingBotUbiAvailableText}: [${i18nB.bankClaimUBI}](/banking?filter=exchange) · ${avail.epochId}`);
+ fs.writeFileSync(ubiNoticePath, JSON.stringify({ epochId: avail.epochId, at: new Date().toISOString() }));
+ } catch (_) {}
+}
+const PUB_INVITES_REFRESH_MS = 24 * 60 * 60 * 1000;
+if (ssbConfig.pub === true) {
+ const announcePubInvites = async () => { try { await pubInvites.announce(await cooler.open()); } catch (_) {} };
+ setTimeout(announcePubInvites, 60000);
+ setInterval(announcePubInvites, PUB_INVITES_REFRESH_MS);
}
if (bankingModel.isPubNode()) {
+ console.log(`[UBI] PUB engine on: paying UBI through ecoind at ${getConfig().wallet.url}`);
setTimeout(() => { runPubEngineTick(); }, 15000);
pubEngineTimer = setInterval(runPubEngineTick, 30 * 60 * 1000);
}
-setTimeout(() => { larpModel.init().catch(() => {}); }, 10000);
+setTimeout(() => { if (getConfig().modules?.larpMod === 'on') larpModel.init().catch(() => {}); }, 10000);
let welcomePmAttempted = false;
async function sendWelcomePmIfFirstLaunch() {
if (welcomePmAttempted) return;
welcomePmAttempted = true;
- const flagPath = path.join(ssbConfig.path, 'oasis-first-contact');
+ const flagPath = stateFilePath('oasis-first-contact');
try {
const ssbClient = await cooler.open();
if (!ssbClient || !ssbClient.id) { welcomePmAttempted = false; return; }
@@ -9502,9 +15343,47 @@ async function sendWelcomePmIfFirstLaunch() {
welcomePmAttempted = false;
}
}
+let firstRunLanguageSettled = false;
+const supportedLanguages = () => Object.keys(require('../client/assets/translations/i18n'));
+function clearnetLanguage(ctx) {
+ const supported = supportedLanguages();
+ const wanted = String(ctx.query.lang || '').trim().toLowerCase();
+ if (supported.includes(wanted)) {
+ const store = require('../models/typed_log').requestScope.getStore();
+ if (store) store.cnLang = wanted;
+ return wanted;
+ }
+ const detected = require('../models/onboarding_model').browserLanguage(ctx.get('accept-language'), supported);
+ return detected || getConfig().language || 'en';
+}
+function applyFirstRunLanguage(ctx) {
+ if (firstRunLanguageSettled || isClearnetPath(ctx.request)) return;
+ const cfg = getConfig();
+ const decision = require('../models/onboarding_model').firstRunLanguage({
+ fresh: !onboardingModel.firstContactSeen(),
+ isPublic: !!config.public,
+ configured: cfg.language,
+ cookie: ctx.cookies.get('language'),
+ header: ctx.get('accept-language'),
+ supported: supportedLanguages()
+ });
+ if (!decision.settled) return;
+ firstRunLanguageSettled = true;
+ if (decision.language && decision.language !== cfg.language) {
+ cfg.language = decision.language;
+ saveConfig(cfg);
+ }
+ setTimeout(welcomePmTick, 0);
+}
let welcomePmRetries = 0;
const welcomePmTick = async () => {
if (onboardingModel.firstContactSeen()) return;
+ if (!firstRunLanguageSettled) {
+ const cfg = getConfig();
+ const decision = require('../models/onboarding_model').firstRunLanguage({ fresh: true, isPublic: !!config.public, configured: cfg.language, supported: supportedLanguages() });
+ if (!decision.settled) return;
+ firstRunLanguageSettled = true;
+ }
await sendWelcomePmIfFirstLaunch();
if (onboardingModel.firstContactSeen()) return;
if (welcomePmRetries++ >= 30) return;
@@ -9605,7 +15484,7 @@ async function checkJobMatches() {
(t.jobsBotMatchHint || 'You receive this because your curriculum is AI managed. You can turn it off in your CV.')
].filter(Boolean).join('\n');
try {
- await pmModel.sendMessage([], 'JOB_MATCH', body, false, ref);
+ await notifyBot('JOB_MATCH', [], body, false, ref);
announced.add(`JOB_MATCH|${ref}`);
} catch (e) {
if (config.debug) console.error('[jobs-bot] send failed:', e && e.message);
@@ -9639,7 +15518,7 @@ async function checkPoliticalChanges() {
return;
}
try {
- await pmModel.sendMessage([], subject, body, false, ref);
+ await notifyBot(subject, [], body, { ref });
announced.add(`${subject}|${ref}`);
seen[subject] = String(ref);
pmPolicy.writeAnnounceSeen(seen);
@@ -9668,7 +15547,7 @@ async function checkPoliticalChanges() {
const ref = [String(card.id || card.method || ''), String(card.since || '')].filter(Boolean).join(':');
if (ref && !alreadyAnnounced('PARLIAMENT_GOV', ref)) {
let population = 0;
- try { const inh = await inhabitantsModel.listInhabitants({ filter: 'all', includeInactive: true }); population = Array.isArray(inh) ? inh.length : 0; } catch (_) {}
+ try { population = Number(await inhabitantsModel.countInhabitants()) || 0; } catch (_) {}
const leaderId = (card.powerType === 'inhabitant' && card.powerId) ? card.powerId : null;
const { subject, body } = buildParliamentGovMsg({ method: card.method, since: card.since, end: card.end, population, leaderId }, t);
await send(subject, body, ref);
@@ -9708,19 +15587,8 @@ async function logClearnetStatus() {
const ssbClient = await cooler.open();
if (!ssbClient || !ssbClient.id) return;
const prefs = await about.visibilityPrefs(ssbClient.id).catch(() => null);
- const modules = [
- ['Shops', 'clearnetShops'],
- ['Jobs', 'clearnetJobs'],
- ['Events', 'clearnetEvents'],
- ['Projects', 'clearnetProjects'],
- ['Blogs', 'clearnetPosts'],
- ['Audios', 'clearnetAudios'],
- ['Videos', 'clearnetVideos'],
- ['Images', 'clearnetImages'],
- ['Documents', 'clearnetDocuments'],
- ['Torrents', 'clearnetTorrents']
- ];
- const active = prefs ? modules.filter(([_, k]) => prefs[k] === true).map(([label]) => label) : [];
+ const { CLEARNET_MODULES } = require('../views/main_views');
+ const active = prefs ? CLEARNET_MODULES.filter(m => prefs[m.prefKey] === true).map(m => m.label) : [];
try {
const { setClearnetModules } = require('../server/ssb_metadata');
setClearnetModules(active);
diff --git a/src/backend/blobHandler.js b/src/backend/blobHandler.js
index dfa6e17..abee774 100644
--- a/src/backend/blobHandler.js
+++ b/src/backend/blobHandler.js
@@ -5,11 +5,13 @@ const ssb = require("../client/gui");
const config = require("../server/SSB_server").config;
const cooler = ssb({ offline: config.offline });
-let sharp;
-try {
- sharp = require("sharp");
-} catch (e) {
-}
+let sharpLib;
+const getSharp = () => {
+ if (sharpLib === undefined) {
+ try { sharpLib = require('../server/node_modules/sharp'); } catch (_) { sharpLib = null; }
+ }
+ return sharpLib;
+};
/**
* Quitar metadatos de una imagen SIN sharp.
@@ -161,7 +163,8 @@ const stripMetadataPure = (buffer) => {
const stripImageMetadata = async (buffer) => {
// Con sharp se prefiere su camino: ademas de quitar metadatos, aplica la
// orientacion girando los pixeles de verdad.
- if (typeof sharp === "function") {
+ const sharp = getSharp();
+ if (sharp) {
try {
return await sharp(buffer).rotate().toBuffer();
} catch {
@@ -198,7 +201,7 @@ const stripPdfMetadata = (buffer) => {
}
};
-const MAX_BLOB_SIZE = 50 * 1024 * 1024;
+const MAX_BLOB_SIZE = 75 * 1024 * 1024;
class FileTooLargeError extends Error {
constructor(fileName, fileSize) {
@@ -346,6 +349,52 @@ function waitForBlob(ssbClient, blobId, timeoutMs = 8000) {
});
}
+const contentDisposition = (type, name) => {
+ const clean = String(name || 'file').replace(/["\r\n\\/]/g, '').trim() || 'file';
+ const ascii = clean.replace(/[^\x20-\x7e]/g, '_');
+ if (ascii === clean) return `${type}; filename="${clean}"`;
+ return `${type}; filename="${ascii}"; filename*=UTF-8''${encodeURIComponent(clean).replace(/['()*]/g, (c) => '%' + c.charCodeAt(0).toString(16).toUpperCase())}`;
+};
+
+const sendBlobBuffer = (ctx, buffer) => {
+ const size = buffer.length;
+ const range = ctx.headers.range;
+
+ if (range) {
+ const match = /^bytes=(\d*)-(\d*)$/.exec(range);
+ if (!match) {
+ ctx.status = 416;
+ ctx.set('Content-Range', `bytes */${size}`);
+ return;
+ }
+
+ let start = match[1] ? parseInt(match[1], 10) : 0;
+ let end = match[2] ? parseInt(match[2], 10) : size - 1;
+
+ if (Number.isNaN(start) || start < 0) start = 0;
+ if (Number.isNaN(end) || end >= size) end = size - 1;
+
+ if (start > end || start >= size) {
+ ctx.status = 416;
+ ctx.set('Content-Range', `bytes */${size}`);
+ return;
+ }
+
+ const chunk = buffer.slice(start, end + 1);
+
+ ctx.status = 206;
+ ctx.set('Content-Range', `bytes ${start}-${end}/${size}`);
+ ctx.set('Accept-Ranges', 'bytes');
+ ctx.set('Content-Length', String(chunk.length));
+ ctx.body = chunk;
+ } else {
+ ctx.status = 200;
+ ctx.set('Accept-Ranges', 'bytes');
+ ctx.set('Content-Length', String(size));
+ ctx.body = buffer;
+ }
+};
+
const serveBlob = async function (ctx) {
const encodedParam = (ctx.params.id || ctx.params.blobId || '').trim();
const raw = decodeURIComponent(encodedParam);
@@ -385,8 +434,6 @@ const serveBlob = async function (ctx) {
return;
}
- const size = buffer.length;
-
let mime = 'application/octet-stream';
try {
const ft = await FileType.fromBuffer(buffer);
@@ -394,7 +441,7 @@ const serveBlob = async function (ctx) {
} catch {}
if (mime === 'application/octet-stream' && buffer.length > 10 && buffer[0] === 0x64) {
- const head = buffer.slice(0, 128).toString('ascii');
+ const head = buffer.slice(0, 512).toString('ascii');
if (head.includes('announce') || head.includes('8:announce') || head.includes('4:info')) mime = 'application/x-bittorrent';
}
@@ -412,48 +459,17 @@ const serveBlob = async function (ctx) {
const isSvg = mime === 'image/svg+xml';
const qName = ctx.query.name ? String(ctx.query.name).replace(/["\r\n\\]/g, '').trim() : '';
const safeRaw = String(raw).replace(/["\r\n\\]/g, '');
- const filename = qName || (mime === 'application/x-bittorrent' ? 'download.torrent' : safeRaw);
- const disposition = isSvg ? 'attachment' : 'inline';
+ const wantsDownload = String(ctx.query.download || '') === '1';
+ const extByMime = { 'image/jpeg': 'jpg', 'image/png': 'png', 'image/gif': 'gif', 'image/webp': 'webp', 'image/svg+xml': 'svg', 'video/mp4': 'mp4', 'video/webm': 'webm', 'audio/mpeg': 'mp3', 'audio/ogg': 'ogg', 'application/pdf': 'pdf', 'application/x-bittorrent': 'torrent' };
+ const ext = extByMime[mime] || String(mime.split('/')[1] || 'bin').replace(/[^a-z0-9]/gi, '').slice(0, 8) || 'bin';
+ const filename = qName || (mime === 'application/x-bittorrent' ? 'download.torrent' : (wantsDownload ? `oasis-${safeRaw.replace(/^&/, '').slice(0, 8)}.${ext}` : safeRaw));
+ const disposition = isSvg || wantsDownload ? 'attachment' : 'inline';
ctx.type = mime;
- ctx.set('Content-Disposition', `${disposition}; filename="${filename}"`);
+ ctx.set('Content-Disposition', contentDisposition(disposition, filename));
ctx.set('Cache-Control', 'public, max-age=31536000, immutable');
- const range = ctx.headers.range;
-
- if (range) {
- const match = /^bytes=(\d*)-(\d*)$/.exec(range);
- if (!match) {
- ctx.status = 416;
- ctx.set('Content-Range', `bytes */${size}`);
- return;
- }
-
- let start = match[1] ? parseInt(match[1], 10) : 0;
- let end = match[2] ? parseInt(match[2], 10) : size - 1;
-
- if (Number.isNaN(start) || start < 0) start = 0;
- if (Number.isNaN(end) || end >= size) end = size - 1;
-
- if (start > end || start >= size) {
- ctx.status = 416;
- ctx.set('Content-Range', `bytes */${size}`);
- return;
- }
-
- const chunk = buffer.slice(start, end + 1);
-
- ctx.status = 206;
- ctx.set('Content-Range', `bytes ${start}-${end}/${size}`);
- ctx.set('Accept-Ranges', 'bytes');
- ctx.set('Content-Length', String(chunk.length));
- ctx.body = chunk;
- } else {
- ctx.status = 200;
- ctx.set('Accept-Ranges', 'bytes');
- ctx.set('Content-Length', String(size));
- ctx.body = buffer;
- }
+ sendBlobBuffer(ctx, buffer);
};
-module.exports = { handleBlobUpload, handleBlobUploads, serveBlob, oggMime, FileTooLargeError };
+module.exports = { handleBlobUpload, handleBlobUploads, serveBlob, sendBlobBuffer, contentDisposition, oggMime, FileTooLargeError, stripImageMetadata };
diff --git a/src/backend/contentPdf.js b/src/backend/contentPdf.js
deleted file mode 100644
index c84e05b..0000000
--- a/src/backend/contentPdf.js
+++ /dev/null
@@ -1,280 +0,0 @@
-const { buildDocumentPdf } = require('./pdfDocument');
-
-const fmtDate = v => {
- if (!v) return '';
- const d = new Date(v);
- return isNaN(d.getTime()) ? String(v) : d.toISOString().replace('T', ' ').slice(0, 19) + ' UTC';
-};
-
-const fmtDay = v => {
- if (!v) return '';
- const d = new Date(v);
- return isNaN(d.getTime()) ? String(v) : d.toISOString().slice(0, 10);
-};
-
-const asList = v => (Array.isArray(v) ? v : []);
-const txt = v => (v == null ? '' : String(v));
-
-const humanLabel = (key) => String(key || '')
- .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
- .replace(/^./, c => c.toUpperCase());
-
-const pushMeta = (out, item) => {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'METADATA' });
- if (item.id) out.push({ kind: 'kv', label: 'Content ID', value: item.id });
- const author = item.author || item.organizer || item.createdBy || item.from || '';
- if (author) out.push({ kind: 'kv', label: 'Author', value: author });
- if (item.createdAt) out.push({ kind: 'kv', label: 'Created At', value: fmtDate(item.createdAt) });
- if (item.updatedAt) out.push({ kind: 'kv', label: 'Updated At', value: fmtDate(item.updatedAt) });
-};
-
-const pushOpinions = (out, item) => {
- const op = item.opinions && typeof item.opinions === 'object' ? item.opinions : {};
- const entries = Object.entries(op).filter(([, n]) => Number(n) > 0);
- if (!entries.length) return;
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'OPINIONS' });
- for (const [cat, n] of entries) out.push({ kind: 'kv', label: humanLabel(cat), value: String(n) });
-};
-
-const pushTags = (out, item) => {
- const tags = asList(item.tags).filter(Boolean);
- if (tags.length) out.push({ kind: 'kv', label: 'Tags', value: tags.join(', ') });
-};
-
-const reportSections = (report) => {
- const out = [];
- out.push({ kind: 'title', text: `Report: ${txt(report.title) || '-'}` });
- out.push({ kind: 'blank' });
-
- out.push({ kind: 'section', text: 'CLASSIFICATION' });
- out.push({ kind: 'kv', label: 'Category', value: txt(report.category).toUpperCase() });
- out.push({ kind: 'kv', label: 'Severity', value: txt(report.severity).toUpperCase() });
- out.push({ kind: 'kv', label: 'Status', value: txt(report.status).toUpperCase() });
- pushTags(out, report);
-
- if (txt(report.description).trim()) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'DESCRIPTION' });
- out.push({ kind: 'text', text: report.description });
- }
-
- const tpl = report.template && typeof report.template === 'object' ? report.template : {};
- const tplEntries = Object.entries(tpl).filter(([, v]) => txt(v).trim());
- if (tplEntries.length) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'DETAILS' });
- for (const [k, v] of tplEntries) out.push({ kind: 'kv', label: humanLabel(k), value: v });
- }
-
- const confirmations = asList(report.confirmations);
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'CONFIRMATIONS' });
- out.push({ kind: 'kv', label: 'Confirmed', value: String(confirmations.length) });
- for (const c of confirmations) out.push({ kind: 'kv', label: 'Confirmed by', value: c });
-
- pushOpinions(out, report);
- pushMeta(out, report);
- return out;
-};
-
-const voteSections = (vote) => {
- const out = [];
- out.push({ kind: 'title', text: `Votation: ${txt(vote.question) || '-'}` });
- out.push({ kind: 'blank' });
-
- out.push({ kind: 'section', text: 'TERMS' });
- out.push({ kind: 'kv', label: 'Status', value: txt(vote.status).toUpperCase() });
- if (vote.deadline) out.push({ kind: 'kv', label: 'Deadline', value: fmtDate(vote.deadline) });
- pushTags(out, vote);
-
- const votes = vote.votes && typeof vote.votes === 'object' ? vote.votes : {};
- const total = Number(vote.totalVotes) || asList(vote.voters).length;
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'RESULTS' });
- out.push({ kind: 'kv', label: 'Total votes', value: String(total) });
- for (const [choice, n] of Object.entries(votes)) {
- const count = Number(n) || 0;
- const pct = total > 0 ? Math.round((count / total) * 100) : 0;
- out.push({ kind: 'kv', label: choice, value: `${count} (${pct}%)` });
- }
-
- pushOpinions(out, vote);
- pushMeta(out, vote);
- return out;
-};
-
-const eventSections = (event) => {
- const out = [];
- out.push({ kind: 'title', text: `Event: ${txt(event.title) || '-'}` });
- out.push({ kind: 'blank' });
-
- out.push({ kind: 'section', text: 'SCHEDULE' });
- out.push({ kind: 'kv', label: 'Date', value: fmtDate(event.date) });
- out.push({ kind: 'kv', label: 'Status', value: txt(event.status).toUpperCase() });
- if (event.location) out.push({ kind: 'kv', label: 'Location', value: event.location });
- if (event.mapUrl) out.push({ kind: 'kv', label: 'Map', value: event.mapUrl });
- if (Number(event.price) > 0) out.push({ kind: 'kv', label: 'Price', value: `${Number(event.price)} ECO` });
- out.push({ kind: 'kv', label: 'Privacy', value: txt(event.isPublic).toUpperCase() });
- if (event.url) out.push({ kind: 'kv', label: 'Url', value: event.url });
- pushTags(out, event);
-
- if (txt(event.description).trim()) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'DESCRIPTION' });
- out.push({ kind: 'text', text: event.description });
- }
-
- const attendees = asList(event.attendees);
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'ATTENDEES' });
- out.push({ kind: 'kv', label: 'Total', value: String(attendees.length) });
- for (const a of attendees) out.push({ kind: 'kv', label: 'Attendee', value: a });
-
- pushOpinions(out, event);
- pushMeta(out, event);
- return out;
-};
-
-const taskSections = (task) => {
- const out = [];
- out.push({ kind: 'title', text: `Task: ${txt(task.title) || '-'}` });
- out.push({ kind: 'blank' });
-
- out.push({ kind: 'section', text: 'SCHEDULE' });
- out.push({ kind: 'kv', label: 'Status', value: txt(task.status).toUpperCase() });
- out.push({ kind: 'kv', label: 'Priority', value: txt(task.priority).toUpperCase() });
- if (task.startTime) out.push({ kind: 'kv', label: 'Starts', value: fmtDate(task.startTime) });
- if (task.endTime) out.push({ kind: 'kv', label: 'Ends', value: fmtDate(task.endTime) });
- if (task.location) out.push({ kind: 'kv', label: 'Location', value: task.location });
- out.push({ kind: 'kv', label: 'Privacy', value: txt(task.isPublic).toUpperCase() });
- pushTags(out, task);
-
- if (txt(task.description).trim()) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'DESCRIPTION' });
- out.push({ kind: 'text', text: task.description });
- }
-
- const assignees = asList(task.assignees);
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'ASSIGNEES' });
- out.push({ kind: 'kv', label: 'Total', value: String(assignees.length) });
- for (const a of assignees) out.push({ kind: 'kv', label: 'Assignee', value: a });
-
- pushOpinions(out, task);
- pushMeta(out, task);
- return out;
-};
-
-const calendarSections = (calendar, extra = {}) => {
- const dates = asList(extra.dates);
- const notesByDate = extra.notesByDate && typeof extra.notesByDate === 'object' ? extra.notesByDate : {};
-
- const out = [];
- out.push({ kind: 'title', text: `Calendar: ${txt(calendar.title) || '-'}` });
- out.push({ kind: 'blank' });
-
- out.push({ kind: 'section', text: 'SUMMARY' });
- out.push({ kind: 'kv', label: 'Status', value: calendar.isClosed ? 'CLOSED' : txt(calendar.status).toUpperCase() });
- if (calendar.deadline) out.push({ kind: 'kv', label: 'Deadline', value: fmtDate(calendar.deadline) });
- if (calendar.mapUrl) out.push({ kind: 'kv', label: 'Map', value: calendar.mapUrl });
- out.push({ kind: 'kv', label: 'Participants', value: String(asList(calendar.participants).length) });
- out.push({ kind: 'kv', label: 'Dates', value: String(dates.length) });
- const noteTotal = Object.values(notesByDate).reduce((n, arr) => n + asList(arr).length, 0);
- out.push({ kind: 'kv', label: 'Notes', value: String(noteTotal) });
- pushTags(out, calendar);
-
- const participants = asList(calendar.participants);
- if (participants.length) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'PARTICIPANTS' });
- for (const p of participants) out.push({ kind: 'kv', label: 'Participant', value: p });
- }
-
- if (dates.length) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'DATES' });
- for (const d of dates) {
- const day = fmtDay(d && d.date) || txt(d && d.date);
- out.push({ kind: 'kv', label: day, value: txt(d && d.label) });
- for (const note of asList(notesByDate[d && d.key])) {
- const noteText = txt(note && note.text);
- if (noteText) out.push({ kind: 'text', text: ` - ${noteText}` });
- }
- }
- }
-
- pushMeta(out, calendar);
- return out;
-};
-
-const cvSections = (cv) => {
- const out = [];
- out.push({ kind: 'title', text: `Curriculum: ${txt(cv.name) || txt(cv.author) || '-'}` });
- out.push({ kind: 'blank' });
-
- out.push({ kind: 'section', text: 'PROFILE' });
- if (cv.location) out.push({ kind: 'kv', label: 'Location', value: cv.location });
- if (cv.status) out.push({ kind: 'kv', label: 'Status', value: txt(cv.status).toUpperCase() });
- if (cv.preferences) out.push({ kind: 'kv', label: 'Preferences', value: txt(cv.preferences).toUpperCase() });
- if (cv.languages) out.push({ kind: 'kv', label: 'Languages', value: cv.languages });
-
- if (txt(cv.description).trim()) {
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: 'DESCRIPTION' });
- out.push({ kind: 'text', text: cv.description });
- }
-
- const blocks = [
- ['PERSONAL', cv.personalExperiences, cv.personalSkills],
- ['EDUCATION', cv.educationExperiences, cv.educationalSkills],
- ['PROFESSIONAL', cv.professionalExperiences, cv.professionalSkills],
- ['OASIS', cv.oasisExperiences, cv.oasisSkills]
- ];
-
- for (const [heading, experiences, skills] of blocks) {
- const skillList = asList(skills).filter(Boolean);
- const body = txt(experiences).trim();
- if (!body && !skillList.length) continue;
- out.push({ kind: 'blank' });
- out.push({ kind: 'section', text: heading });
- if (body) out.push({ kind: 'text', text: body });
- if (skillList.length) out.push({ kind: 'kv', label: 'Skills', value: skillList.join(', ') });
- }
-
- pushMeta(out, cv);
- return out;
-};
-
-const BUILDERS = {
- reports: { title: 'OASIS - Report', sections: reportSections, name: item => item.title },
- votes: { title: 'OASIS - Votation', sections: voteSections, name: item => item.question },
- events: { title: 'OASIS - Event', sections: eventSections, name: item => item.title },
- tasks: { title: 'OASIS - Task', sections: taskSections, name: item => item.title },
- calendars: { title: 'OASIS - Calendar', sections: calendarSections, name: item => item.title },
- cv: { title: 'OASIS - Curriculum', sections: cvSections, name: item => item.name || item.author }
-};
-
-const isSupported = kind => Object.prototype.hasOwnProperty.call(BUILDERS, kind);
-
-const pdfFilename = (kind, item) => {
- const b = BUILDERS[kind];
- const raw = b ? txt(b.name(item || {})) : '';
- const slug = raw.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 40);
- return `oasis-${kind}-${slug || 'document'}.pdf`;
-};
-
-const buildContentPdf = (kind, item, extra = {}, viewerId = null) => {
- const b = BUILDERS[kind];
- if (!b) throw new Error('Unsupported pdf kind');
- return buildDocumentPdf({
- title: b.title,
- issuedToLabel: 'Issued to',
- issuedTo: viewerId || null,
- sections: b.sections(item || {}, extra)
- });
-};
-
-module.exports = { buildContentPdf, pdfFilename, isSupported };
diff --git a/src/backend/content_favorites.js b/src/backend/content_favorites.js
index a3d86b8..1d7540c 100644
--- a/src/backend/content_favorites.js
+++ b/src/backend/content_favorites.js
@@ -1,19 +1,15 @@
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 storePath = () => require("../configs/state-manager").statePath("content_favorites.json");
const DEFAULT = {
+ emergencies: [],
audios: [],
blogs: [],
bookmarks: [],
calendars: [],
+ campaigns: [],
chats: [],
documents: [],
events: [],
@@ -21,20 +17,27 @@ const DEFAULT = {
housing: [],
images: [],
jobs: [],
+ logistics: [],
logs: [],
+ mailing: [],
maps: [],
pads: [],
+ rooms: [],
+ podcasts: [],
polls: [],
projects: [],
reports: [],
+ school: [],
shops: [],
market: [],
shopProducts: [],
tasks: [],
torrents: [],
+ files: [],
transfers: [],
videos: [],
- votes: []
+ votes: [],
+ wiki: []
};
const safeArr = (v) => (Array.isArray(v) ? v : []);
diff --git a/src/backend/dedupe.js b/src/backend/dedupe.js
index c5d9e97..c0d3d5b 100644
--- a/src/backend/dedupe.js
+++ b/src/backend/dedupe.js
@@ -49,4 +49,79 @@ const dedupeByPreferring = (items, keyFn, scoreFn) => {
return order.map(o => (o.solo !== undefined ? o.solo : o.slot.v));
};
-module.exports = { dedupeBy, mergeDuplicatesBy, dedupeByPreferring, norm };
+const versionGroups = (entries) => {
+ const byKey = new Map();
+ for (const e of (entries || [])) if (e && e.key) byKey.set(e.key, e);
+ const memo = new Map();
+ const rootOf = (key) => {
+ if (memo.has(key)) return memo.get(key);
+ const path = [];
+ const seen = new Set([key]);
+ let cur = key;
+ let root = null;
+ while (root === null) {
+ if (memo.has(cur)) { root = memo.get(cur); break; }
+ const e = byKey.get(cur);
+ const p = e && e.replaces;
+ if (!p || !byKey.has(p) || seen.has(p)) { root = cur; break; }
+ path.push(cur);
+ seen.add(p);
+ cur = p;
+ }
+ memo.set(cur, root);
+ for (const k of path) memo.set(k, root);
+ return root;
+ };
+ const isOrphan = (key) => {
+ const e = byKey.get(key);
+ return !!(e && e.replaces && !byKey.has(e.replaces));
+ };
+ const isForeignCopy = (key) => {
+ const e = byKey.get(key);
+ return !!(e && isOrphan(key) && typeof e.claimedAuthor === 'string' && e.claimedAuthor && e.claimedAuthor !== e.author);
+ };
+ const groups = new Map();
+ for (const k of byKey.keys()) {
+ const r = rootOf(k);
+ if (!groups.has(r)) groups.set(r, []);
+ groups.get(r).push(k);
+ }
+ const later = (a, b) => (a.seq || 0) > (b.seq || 0) || ((a.seq || 0) === (b.seq || 0) && (a.ts || 0) >= (b.ts || 0));
+ for (const [r, keys] of Array.from(groups.entries())) {
+ if (!isForeignCopy(r)) continue;
+ const owner = byKey.get(r).claimedAuthor;
+ let first = null;
+ for (const k of keys) { const e = byKey.get(k); if (e.author === owner && (!first || later(byKey.get(first), e))) first = k; }
+ if (!first) continue;
+ groups.delete(r);
+ groups.set(first, keys);
+ for (const k of keys) memo.set(k, first);
+ }
+ const ownerTip = new Map();
+ for (const [r, keys] of groups) {
+ const re = byKey.get(r);
+ for (const k of keys) {
+ const e = byKey.get(k);
+ if (!re || e.author !== re.author) continue;
+ const prev = ownerTip.has(r) ? byKey.get(ownerTip.get(r)) : null;
+ if (!prev || later(e, prev)) ownerTip.set(r, k);
+ }
+ }
+ const isForeign = (key) => {
+ const e = byKey.get(key);
+ const re = byKey.get(rootOf(key));
+ return !!(e && re && e.author !== re.author);
+ };
+ const roots = new Set();
+ for (const r of groups.keys()) if (!isForeignCopy(r)) roots.add(r);
+ const tipOf = (key) => { const r = rootOf(key); return ownerTip.get(r) || r; };
+ return { rootOf, tipOf, roots, groups, isOrphan, isForeign, isForeignCopy };
+};
+
+const versionEntry = (m) => {
+ const v = (m && m.value) || {};
+ const c = v.content || {};
+ return { key: m && m.key, author: v.author, seq: v.sequence || 0, ts: v.timestamp || (m && m.timestamp) || 0, replaces: typeof c.replaces === 'string' ? c.replaces : null, claimedAuthor: typeof c.author === 'string' ? c.author : null };
+};
+
+module.exports = { dedupeBy, mergeDuplicatesBy, dedupeByPreferring, norm, versionGroups, versionEntry };
diff --git a/src/backend/desktopNotify.js b/src/backend/desktopNotify.js
new file mode 100644
index 0000000..c12a6ea
--- /dev/null
+++ b/src/backend/desktopNotify.js
@@ -0,0 +1,80 @@
+const fs = require('fs');
+const path = require('path');
+const { spawn } = require('child_process');
+const { getConfig } = require('../configs/config-manager.js');
+
+const REPEAT_MS = 60000;
+const ICON = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg');
+const recent = new Map();
+
+const onPath = (bin) => (process.env.PATH || '').split(path.delimiter).some(d => d && fs.existsSync(path.join(d, bin)));
+
+const i18nNow = () => {
+ const all = require('../client/assets/translations/i18n');
+ let lang = 'en';
+ try { lang = getConfig().language || 'en'; } catch (_) {}
+ return { ...all.en, ...(all[lang] || {}) };
+};
+
+const displayName = (id, name) => {
+ const n = String(name || '').trim();
+ if (!n || n === 'Redacted' || n === String(id || '').replace(/^@/, '').slice(0, 8)) return String(id || '');
+ return n.startsWith('@') ? n : `@${n}`;
+};
+
+const MOBILE_QUEUE = path.join(__dirname, '..', '..', '.notifications.json');
+const queueForAndroid = (keyword, body, line, key) => {
+ try {
+ let list = [];
+ try { list = JSON.parse(fs.readFileSync(MOBILE_QUEUE, 'utf8')); } catch (_) { list = []; }
+ if (!Array.isArray(list)) list = [];
+ const t = i18nNow();
+ const k = String(keyword || '');
+ const route = k === t.phoneTitle ? '/phone' : k === t.inbox ? '/inbox' : k === t.emergenciesTitle ? '/emergencies' : '/';
+ const entry = { id: Date.now() + '-' + Math.random().toString(36).slice(2, 8), keyword: k || 'Oasis', body, line, route, key: key ? String(key) : null, ts: Date.now() };
+ if (entry.key && entry.key.indexOf('call:') === 0) {
+ const ringing = String(t.phoneIsCalling || '');
+ entry.caller = ringing && body.endsWith(ringing) ? body.slice(0, body.length - ringing.length).trim() : body;
+ entry.accept = String(t.phoneAnswer || '');
+ entry.reject = String(t.phoneReject || '');
+ }
+ list.push(entry);
+ while (list.length > 20) list.shift();
+ fs.writeFileSync(MOBILE_QUEUE, JSON.stringify(list));
+ return true;
+ } catch (_) {
+ return false;
+ }
+};
+
+const notify = (keyword, text, key = null, opts = {}) => {
+ const onMobile = process.env.OASIS_MOBILE === '1';
+ if (!onMobile && !onPath('notify-send')) return false;
+ const body = String(text || '').replace(/\s+/g, ' ').trim().replace(/[.。!…]+$/, '').slice(0, 200);
+ const line = `${String(keyword || 'Oasis').toUpperCase()}: ${body}...`;
+ const now = Date.now();
+ const dedupe = key || line;
+ for (const [k, t] of recent) if (now - t > REPEAT_MS) recent.delete(k);
+ if (recent.has(dedupe)) return false;
+ recent.set(dedupe, now);
+ if (onMobile) return queueForAndroid(keyword, body, line, key);
+ const actions = Array.isArray(opts.actions) ? opts.actions.filter(x => x && x.key && x.label) : [];
+ const extra = [
+ ...(opts.timeoutMs > 0 ? ['-t', String(Math.round(opts.timeoutMs))] : []),
+ ...actions.flatMap(x => ['-A', `${x.key}=${x.label}`])
+ ];
+ try {
+ const p = spawn('notify-send', ['-a', 'Oasis', ...(fs.existsSync(ICON) ? ['-i', ICON] : []), ...extra, line], { stdio: ['ignore', actions.length ? 'pipe' : 'ignore', 'ignore'] });
+ p.on('error', () => {});
+ if (actions.length && typeof opts.onAction === 'function') {
+ let out = '';
+ p.stdout.on('data', (d) => { out += d; });
+ p.on('close', () => { const chosen = out.trim(); if (actions.some(x => x.key === chosen)) opts.onAction(chosen); });
+ }
+ return true;
+ } catch (_) {
+ return false;
+ }
+};
+
+module.exports = { notify, i18nNow, displayName };
diff --git a/src/backend/logsPdf.js b/src/backend/logsPdf.js
deleted file mode 100644
index 676ac90..0000000
--- a/src/backend/logsPdf.js
+++ /dev/null
@@ -1,206 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-
-const LOGO_PATH = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg');
-
-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;
-
-const splitSegments = (line) => {
- const segs = [];
- let last = 0;
- const re = new RegExp(linkPattern.source, 'g');
- let m;
- while ((m = re.exec(line)) !== null) {
- if (m.index > last) segs.push({ t: line.slice(last, m.index), l: false });
- segs.push({ t: m[0], l: true });
- last = m.index + m[0].length;
- }
- if (last < line.length) segs.push({ t: line.slice(last), l: false });
- return segs;
-};
-
-const wrap = (txt, max = 82) => {
- const out = [];
- for (const raw of String(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;
-};
-
-function buildLogsPdf(entries, oasisId, opts = {}) {
- const pageW = 612;
- const pageH = 792;
- const marginX = 50;
- const headerH = 90;
- const footerH = 40;
- const bodyTop = pageH - headerH - 22;
- const bodyBottom = footerH + 10;
- const lineH = 12;
- const maxBodyLines = Math.floor((bodyTop - bodyBottom) / lineH);
-
- let logoBuf = null;
- let logoDims = null;
- try {
- logoBuf = fs.readFileSync(LOGO_PATH);
- logoDims = readJpegDims(logoBuf);
- } catch (_) {}
-
- const allLines = [];
- for (const e of entries) {
- const ts = new Date(e.ts);
- const when = ts.toISOString().replace('T', ' ').slice(0, 19);
- allLines.push({ kind: 'header', text: `[${when}]:` });
- allLines.push({ kind: 'blank', text: '' });
- for (const l of wrap(e.text, 82)) allLines.push({ kind: 'text', text: l });
- allLines.push({ kind: 'blank', text: '' });
- }
- if (!allLines.length) allLines.push({ kind: 'text', text: '(no entries)' });
-
- const pages = [];
- for (let i = 0; i < allLines.length; i += maxBodyLines) {
- pages.push(allLines.slice(i, i + maxBodyLines));
- }
- if (!pages.length) pages.push([{ kind: 'text', text: '(no entries)' }]);
-
- 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 colorSpace = logoDims.c === 1 ? '/DeviceGray' : '/DeviceRGB';
- const dict = `<< /Type /XObject /Subtype /Image /Width ${logoDims.w} /Height ${logoDims.h} /ColorSpace ${colorSpace} /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);
- const logoX = marginX;
- const logoY = pageH - headerH + 15;
- parts.push(`q\n${logoW} 0 0 ${logoH} ${logoX} ${logoY} 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('OASIS - Experience logs')}) Tj\nET`);
- const inhabitantPrefix = 'Inhabitant: ';
- const inhabitantPrefixW = inhabitantPrefix.length * 5.4;
- parts.push(`BT\n/F1 9 Tf\n${titleX} ${titleY - 16} Td\n(${escapePdf(inhabitantPrefix)}) Tj\nET`);
- parts.push(`BT\n/F2 9 Tf\n${titleX + inhabitantPrefixW} ${titleY - 16} Td\n(${escapePdf(String(oasisId || ''))}) 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;
- const charW = 6;
- for (const ln of pg) {
- if (ln.kind === 'header') {
- parts.push(`BT\n/F2 10 Tf\n1 0.647 0 rg\n${marginX} ${y} Td\n(${escapePdf(ln.text)}) Tj\nET`);
- } else if (ln.text) {
- const segs = splitSegments(ln.text);
- let x = marginX;
- for (const s of segs) {
- if (!s.t) continue;
- const color = s.l ? '0 0 1 rg' : '0 0 0 rg';
- parts.push(`BT\n/F1 10 Tf\n${color}\n${x} ${y} Td\n(${escapePdf(s.t)}) Tj\nET`);
- x += s.t.length * charW;
- }
- }
- 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 = { buildLogsPdf };
diff --git a/src/backend/long_text.js b/src/backend/long_text.js
new file mode 100644
index 0000000..c4095ad
--- /dev/null
+++ b/src/backend/long_text.js
@@ -0,0 +1,195 @@
+const crypto = require('crypto');
+
+const CHUNK_TYPE = 'textChunk';
+const TEXT_CAP = 60000;
+const CONTENT_BYTES = { plain: 6500, boxed: 4500, sealed: 3300 };
+const MIN_HEAD_BYTES = 200;
+const CACHE_MAX = 400;
+const KEY_RE = /^%[A-Za-z0-9+/]{43}=?\.sha256$/;
+const KEY_SAMPLE = '%' + 'A'.repeat(44) + '.sha256';
+
+const byteLength = (s) => Buffer.byteLength(String(s == null ? '' : s), 'utf8');
+const contentBytes = (content) => { try { return byteLength(JSON.stringify(content)); } catch (_) { return Infinity; } };
+const isChunkKey = (k) => typeof k === 'string' && KEY_RE.test(k);
+const tooLong = (text) => String(text == null ? '' : text).length > TEXT_CAP;
+
+const cutAt = (text, maxBytes) => {
+ let i = 0, bytes = 0;
+ while (i < text.length) {
+ const cp = text.codePointAt(i);
+ const len = cp < 0x80 ? 1 : cp < 0x800 ? 2 : cp < 0x10000 ? 3 : 4;
+ if (bytes + len > maxBytes) break;
+ bytes += len;
+ i += cp >= 0x10000 ? 2 : 1;
+ }
+ if (i >= text.length) return text.length;
+ const min = Math.floor(i / 2);
+ const para = text.lastIndexOf('\n\n', i);
+ if (para > min) return para + 2;
+ const line = text.lastIndexOf('\n', i);
+ if (line > min) return line + 1;
+ const space = text.lastIndexOf(' ', i);
+ if (space > min) return space + 1;
+ return Math.max(i, 1);
+};
+
+const splitText = (text, maxBytes, firstMax = maxBytes) => {
+ const s = String(text == null ? '' : text);
+ const out = [];
+ let rest = s;
+ let limit = Math.max(1, firstMax);
+ while (rest.length) {
+ const cut = cutAt(rest, limit);
+ out.push(rest.slice(0, cut));
+ rest = rest.slice(cut);
+ limit = Math.max(1, maxBytes);
+ }
+ return out.length ? out : [''];
+};
+
+const chunkTemplate = (extra) => ({ type: CHUNK_TYPE, text: '', index: 999, total: 999, group: 'g'.repeat(16), ...extra });
+const chunkBudget = (extra, maxBytes) => maxBytes - contentBytes(chunkTemplate(extra));
+const headBudget = (content, field, maxBytes, count) => maxBytes - contentBytes({ ...content, [field]: '', chunks: new Array(count).fill(KEY_SAMPLE) });
+
+const needsChunking = (content, maxBytes = CONTENT_BYTES.plain) => contentBytes(content) > maxBytes;
+
+const planPieces = (content, field, { maxBytes = CONTENT_BYTES.plain, extra = {} } = {}) => {
+ const text = String(content[field] == null ? '' : content[field]);
+ if (tooLong(text)) throw new Error('Text too long');
+ if (!needsChunking(content, maxBytes)) return null;
+ const perChunk = chunkBudget(extra, maxBytes);
+ if (perChunk < MIN_HEAD_BYTES) throw new Error('Text does not fit');
+ let count = 0;
+ let pieces = null;
+ for (let guard = 0; guard < 12; guard++) {
+ const head = headBudget(content, field, maxBytes, count);
+ if (head < MIN_HEAD_BYTES) throw new Error('Text does not fit');
+ pieces = splitText(text, perChunk, head);
+ if (pieces.length - 1 <= count) return pieces;
+ count = pieces.length - 1;
+ }
+ return pieces;
+};
+
+const publishChunks = async (pieces, publish, { extra = {}, group } = {}) => {
+ const g = group || crypto.randomBytes(8).toString('hex');
+ const total = pieces.length;
+ const keys = [];
+ for (let i = 0; i < pieces.length; i++) {
+ const r = await publish({ type: CHUNK_TYPE, text: pieces[i], index: i + 1, total, group: g, ...extra });
+ const key = r && typeof r === 'object' ? r.key : r;
+ if (!isChunkKey(key)) throw new Error('Chunk publish failed');
+ keys.push(key);
+ }
+ return keys;
+};
+
+const chunkContent = async (content, field, { maxBytes = CONTENT_BYTES.plain, extra = {}, publish } = {}) => {
+ const base = { ...content };
+ delete base.chunks;
+ const pieces = planPieces(base, field, { maxBytes, extra });
+ if (!pieces) return base;
+ const keys = await publishChunks(pieces.slice(1), publish, { extra });
+ return { ...base, [field]: pieces[0], chunks: keys };
+};
+
+const chunkOf = (author, c) => {
+ if (!c || typeof c !== 'object' || typeof c.text !== 'string') return null;
+ if (c.type !== CHUNK_TYPE && c.k !== CHUNK_TYPE) return null;
+ return { author, text: c.text, index: Number(c.index) || 0, total: Number(c.total) || 0, group: String(c.group || '') };
+};
+
+const joinText = (head, keys, lookup, author) => {
+ let out = String(head == null ? '' : head);
+ if (!Array.isArray(keys) || !keys.length) return out;
+ let group = null;
+ for (let i = 0; i < keys.length; i++) {
+ const k = keys[i];
+ if (!isChunkKey(k)) break;
+ const ch = lookup(k);
+ if (!ch || (author && ch.author !== author)) break;
+ if (group === null) group = ch.group; else if (ch.group !== group) break;
+ if (ch.index !== i + 1 || ch.total !== keys.length) break;
+ out += ch.text;
+ }
+ return out;
+};
+
+const hasChunks = (content) => !!content && Array.isArray(content.chunks) && content.chunks.length > 0;
+
+const resolveField = (content, field, author, lookup) => {
+ if (!hasChunks(content)) return content;
+ return { ...content, [field]: joinText(content[field], content.chunks, lookup, author) };
+};
+
+const indexChunks = (messages, decode) => {
+ const index = new Map();
+ for (const m of messages || []) {
+ const v = m && m.value;
+ if (!v || !m.key) continue;
+ const raw = v.content;
+ const c = decode ? decode(raw, m) : raw;
+ const ch = chunkOf(v.author, c);
+ if (ch) index.set(m.key, ch);
+ }
+ return index;
+};
+
+const lookupIn = (index) => (k) => index.get(k) || null;
+
+const caches = new WeakMap();
+const cacheFor = (ssb) => {
+ let c = caches.get(ssb);
+ if (!c) { c = new Map(); caches.set(ssb, c); }
+ return c;
+};
+const remember = (cache, key, value) => {
+ if (cache.has(key)) cache.delete(key);
+ cache.set(key, value);
+ while (cache.size > CACHE_MAX) cache.delete(cache.keys().next().value);
+ return value;
+};
+
+const fetchChunk = async (ssb, key, unbox) => {
+ const cache = cacheFor(ssb);
+ if (cache.has(key)) { const v = cache.get(key); cache.delete(key); cache.set(key, v); return v; }
+ const raw = await new Promise((resolve) => { try { ssb.get(key, (err, m) => resolve(err ? null : m)); } catch (_) { resolve(null); } });
+ if (!raw) return null;
+ let content = raw.content;
+ if (typeof content === 'string' && unbox) { try { content = unbox(content); } catch (_) { content = null; } }
+ const ch = chunkOf(raw.author, content);
+ return ch ? remember(cache, key, ch) : null;
+};
+
+const joinChunks = async (ssb, content, author, { field = 'text', unbox = null } = {}) => {
+ if (!hasChunks(content)) return content;
+ const found = new Map();
+ for (const k of content.chunks) {
+ if (!isChunkKey(k)) break;
+ const ch = await fetchChunk(ssb, k, unbox);
+ if (!ch) break;
+ found.set(k, ch);
+ }
+ return resolveField(content, field, author, lookupIn(found));
+};
+
+module.exports = {
+ CHUNK_TYPE,
+ TEXT_CAP,
+ CONTENT_BYTES,
+ byteLength,
+ contentBytes,
+ tooLong,
+ splitText,
+ needsChunking,
+ planPieces,
+ publishChunks,
+ chunkContent,
+ chunkOf,
+ joinText,
+ hasChunks,
+ resolveField,
+ indexChunks,
+ lookupIn,
+ joinChunks
+};
diff --git a/src/backend/opinion_categories.js b/src/backend/opinion_categories.js
index a6e314d..f55ea30 100644
--- a/src/backend/opinion_categories.js
+++ b/src/backend/opinion_categories.js
@@ -46,5 +46,31 @@ const all = [...positive, ...constructive, ...moderation];
all.positive = positive;
all.constructive = constructive;
all.moderation = moderation;
+all.messageTypes = {
+ bookmark: 'bookmarkOpinion',
+ votes: 'votesOpinion',
+ poll: 'pollOpinion',
+ transfer: 'transferOpinion',
+ feed: 'feedOpinion',
+ image: 'imageOpinion',
+ audio: 'audioOpinion',
+ video: 'videoOpinion',
+ document: 'documentOpinion',
+ torrent: 'torrentOpinion',
+ file: 'fileOpinion',
+ industry: 'industryOpinion',
+ project: 'projectOpinion',
+ report: 'reportOpinion',
+ task: 'taskOpinion',
+ event: 'eventOpinion',
+ shopProduct: 'shopOpinion',
+ housing: 'housingOpinion',
+ market: 'marketOpinion',
+ schoolCourse: 'schoolOpinion',
+ podcast: 'podcastOpinion',
+ podcastEpisode: 'podcastOpinion',
+ campaign: 'campaignOpinion',
+ logisticsRoute: 'logisticsOpinion'
+};
module.exports = all;
diff --git a/src/backend/pdf.js b/src/backend/pdf.js
new file mode 100644
index 0000000..10da631
--- /dev/null
+++ b/src/backend/pdf.js
@@ -0,0 +1,1485 @@
+const fs = require('fs');
+const path = require('path');
+const zlib = require('zlib');
+const { plainText } = require('./renderStyledText');
+const { MAP_W, MAP_H, makeView, fitView, toScreen, tileCoverage } = require('../maps/map_renderer');
+
+const LOGO_PATH = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg');
+const TILES_DIR = path.join(__dirname, '..', 'maps', 'tiles');
+
+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 decodePng = (buf) => {
+ if (!Buffer.isBuffer(buf) || buf.length < 33 || buf.readUInt32BE(0) !== 0x89504e47) return null;
+ let pos = 8;
+ let w = 0, h = 0, depth = 0, colorType = 0, interlace = 0;
+ let palette = null;
+ const idat = [];
+ while (pos + 8 <= buf.length) {
+ const len = buf.readUInt32BE(pos);
+ const type = buf.toString('ascii', pos + 4, pos + 8);
+ const data = buf.slice(pos + 8, pos + 8 + len);
+ if (type === 'IHDR') { w = data.readUInt32BE(0); h = data.readUInt32BE(4); depth = data[8]; colorType = data[9]; interlace = data[12]; }
+ else if (type === 'PLTE') palette = data;
+ else if (type === 'IDAT') idat.push(data);
+ else if (type === 'IEND') break;
+ pos += 12 + len;
+ }
+ if (!w || !h || depth !== 8 || interlace !== 0 || !idat.length) return null;
+ if (w > 8192 || h > 8192 || w * h > 20 * 1024 * 1024) return null;
+ const channels = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 }[colorType];
+ if (!channels) return null;
+ let raw;
+ try { raw = zlib.inflateSync(Buffer.concat(idat), { maxOutputLength: (w * channels + 1) * h }); } catch (_) { return null; }
+ const stride = w * channels;
+ const out = Buffer.alloc(w * h * 3);
+ let prev = Buffer.alloc(stride);
+ let inPos = 0;
+ for (let y = 0; y < h; y++) {
+ const filter = raw[inPos++];
+ const cur = Buffer.from(raw.slice(inPos, inPos + stride));
+ inPos += stride;
+ for (let i = 0; i < stride; i++) {
+ const a = i >= channels ? cur[i - channels] : 0;
+ const b = prev[i];
+ const c = i >= channels ? prev[i - channels] : 0;
+ let v = cur[i];
+ if (filter === 1) v += a;
+ else if (filter === 2) v += b;
+ else if (filter === 3) v += Math.floor((a + b) / 2);
+ else if (filter === 4) { const p = a + b - c; const pa = Math.abs(p - a), pb = Math.abs(p - b), pc = Math.abs(p - c); v += (pa <= pb && pa <= pc) ? a : (pb <= pc ? b : c); }
+ cur[i] = v & 0xff;
+ }
+ for (let x = 0; x < w; x++) {
+ const o = (y * w + x) * 3;
+ const s = x * channels;
+ if (colorType === 2 || colorType === 6) { out[o] = cur[s]; out[o + 1] = cur[s + 1]; out[o + 2] = cur[s + 2]; }
+ else if (colorType === 0 || colorType === 4) { out[o] = out[o + 1] = out[o + 2] = cur[s]; }
+ else if (colorType === 3 && palette) { const pi = cur[s] * 3; out[o] = palette[pi]; out[o + 1] = palette[pi + 1]; out[o + 2] = palette[pi + 2]; }
+ if (colorType === 6 || colorType === 4) {
+ const alpha = cur[s + channels - 1] / 255;
+ out[o] = Math.round(out[o] * alpha + 255 * (1 - alpha));
+ out[o + 1] = Math.round(out[o + 1] * alpha + 255 * (1 - alpha));
+ out[o + 2] = Math.round(out[o + 2] * alpha + 255 * (1 - alpha));
+ }
+ }
+ prev = cur;
+ }
+ return { w, h, rgb: out };
+};
+
+const imageXObject = (buf) => {
+ if (!Buffer.isBuffer(buf) || buf.length < 4) return null;
+ if (buf[0] === 0xff && buf[1] === 0xd8) {
+ const dims = readJpegDims(buf);
+ if (!dims) return null;
+ const cs = dims.c === 1 ? '/DeviceGray' : '/DeviceRGB';
+ return { w: dims.w, h: dims.h, dict: `<< /Type /XObject /Subtype /Image /Width ${dims.w} /Height ${dims.h} /ColorSpace ${cs} /BitsPerComponent 8 /Filter /DCTDecode /Length ${buf.length} >>`, stream: buf };
+ }
+ const png = decodePng(buf);
+ if (!png) return null;
+ const compressed = zlib.deflateSync(png.rgb);
+ return { w: png.w, h: png.h, dict: `<< /Type /XObject /Subtype /Image /Width ${png.w} /Height ${png.h} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${compressed.length} >>`, stream: compressed };
+};
+
+const rasterXObject = (raster) => {
+ if (!raster || !raster.w || !raster.h || !Buffer.isBuffer(raster.rgb) || raster.rgb.length !== raster.w * raster.h * 3) return null;
+ const compressed = zlib.deflateSync(raster.rgb);
+ return { w: raster.w, h: raster.h, dict: `<< /Type /XObject /Subtype /Image /Width ${raster.w} /Height ${raster.h} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Interpolate false /Filter /FlateDecode /Length ${compressed.length} >>`, stream: compressed };
+};
+
+const jpegXObject = (buf) => {
+ if (!Buffer.isBuffer(buf) || buf[0] !== 0xff || buf[1] !== 0xd8) return null;
+ const dims = readJpegDims(buf);
+ if (!dims) return null;
+ return { w: dims.w, h: dims.h, dict: `<< /Type /XObject /Subtype /Image /Width ${dims.w} /Height ${dims.h} /ColorSpace ${dims.c === 1 ? '/DeviceGray' : '/DeviceRGB'} /BitsPerComponent 8 /Filter /DCTDecode /Length ${buf.length} >>`, stream: buf };
+};
+
+const tileXObject = (t) => {
+ try { return jpegXObject(fs.readFileSync(path.join(TILES_DIR, String(t.z), `${t.x}_${t.y}.jpg`))); } catch (_) { return null; }
+};
+
+const MAP_PIN_R = 4.5;
+const MAP_LABEL_MAX = 28;
+
+const mapBlock = (pins) => {
+ const pts = (Array.isArray(pins) ? pins : []).filter(p => p && isFinite(Number(p.lat)) && isFinite(Number(p.lng)));
+ if (!pts.length) return null;
+ const fit = fitView(pts, { singleZoom: 8 });
+ const view = makeView(fit.lat, fit.lng, fit.zoom);
+ const tiles = tileCoverage(view).map(t => ({ ...t, xo: tileXObject(t) })).filter(t => t.xo);
+ if (!tiles.length) return null;
+ const marks = pts.map(p => {
+ const s = toScreen(view, Number(p.lat), Number(p.lng));
+ const line = String(p.label || '').split(/\r?\n/)[0].trim();
+ return { x: s.x, y: s.y, main: !!p.main, label: line.length > MAP_LABEL_MAX ? line.slice(0, MAP_LABEL_MAX - 1) + '…' : line };
+ });
+ return { kind: 'map', w: MAP_W, h: MAP_H, zoom: view.zoom, tiles, pins: marks };
+};
+
+const circlePath = (cx, cy, r) => {
+ const k = 0.5523 * r;
+ return `${cx + r} ${cy} m ${cx + r} ${cy + k} ${cx + k} ${cy + r} ${cx} ${cy + r} c ${cx - k} ${cy + r} ${cx - r} ${cy + k} ${cx - r} ${cy} c ${cx - r} ${cy - k} ${cx - k} ${cy - r} ${cx} ${cy - r} c ${cx + k} ${cy - r} ${cx + r} ${cy - k} ${cx + r} ${cy} c`;
+};
+
+const mapContent = (ln, x0, y0, box, tileIds) => {
+ const s = box.w / ln.w;
+ const f = v => Math.round(v * 100) / 100;
+ const parts = [`q ${f(x0)} ${f(y0)} ${f(box.w)} ${f(box.h)} re W n`];
+ for (const t of ln.tiles) {
+ parts.push(`q ${f(t.size * s + 0.5)} 0 0 ${f(t.size * s + 0.5)} ${f(x0 + t.sx * s)} ${f(y0 + (ln.h - t.sy - t.size) * s)} cm /Im${tileIds.get(t)} Do Q`);
+ }
+ const at = p => ({ x: x0 + p.x * s, y: y0 + (ln.h - p.y) * s });
+ for (const p of ln.pins) {
+ const c = at(p);
+ parts.push(`q ${p.main ? '0.95 0.55 0' : '0.85 0.15 0.15'} rg 1 1 1 RG 1 w ${circlePath(f(c.x), f(c.y), MAP_PIN_R)} h B Q`);
+ }
+ for (const p of ln.pins) {
+ if (!p.label) continue;
+ const c = at(p);
+ const tw = p.label.length * 4.2;
+ parts.push(`q 1 1 1 rg ${f(c.x + MAP_PIN_R + 2)} ${f(c.y - 5)} ${f(tw + 4)} 10 re f Q`);
+ parts.push(`BT /F1 7 Tf 0 0 0 rg ${f(c.x + MAP_PIN_R + 4)} ${f(c.y - 2.5)} Td (${escapePdf(p.label)}) Tj ET`);
+ }
+ parts.push(`q 0.4 0.4 0.4 RG 0.5 w ${f(x0)} ${f(y0)} ${f(box.w)} ${f(box.h)} re S Q`);
+ parts.push('Q');
+ return parts.join('\n');
+};
+
+const flattenSections = (sections) => {
+ const lines = [];
+ for (const s of Array.isArray(sections) ? sections : []) {
+ if (!s) continue;
+ if (s.kind === 'image') {
+ const xo = s.raster ? rasterXObject(s.raster) : imageXObject(s.buffer);
+ if (xo) lines.push({ kind: 'image', xo, caption: s.caption || '', maxW: s.maxW, maxH: s.maxH });
+ else if (s.caption) lines.push({ kind: 'kv', text: `[image: ${s.caption}]` });
+ } else if (s.kind === 'map') {
+ const block = mapBlock(s.pins);
+ if (block) lines.push(block);
+ } else 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(plainText(s.text), 82)) lines.push({ kind: 'kv', text: w });
+ } else {
+ lines.push({ kind: s.kind, text: s.text });
+ }
+ }
+ return lines;
+};
+
+const licenseFooter = (id) => {
+ const l = require('../views/clearnet_view').licenseInfo(id);
+ return l ? `License: ${l.name}` : '';
+};
+
+function buildDocumentPdf({ title, issuedToLabel, issuedTo, sections, license = '' } = {}) {
+ const footerNote = licenseFooter(license);
+ 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 maxImgW = 240;
+ const maxImgH = 160;
+ const imageBox = (ln) => {
+ const scale = Math.min(1, (ln.maxW || maxImgW) / ln.xo.w, (ln.maxH || maxImgH) / ln.xo.h);
+ return { w: Math.round(ln.xo.w * scale), h: Math.round(ln.xo.h * scale) };
+ };
+ const mapBox = (ln) => {
+ const scale = Math.min(1, (pageW - 2 * marginX) / ln.w);
+ return { w: Math.round(ln.w * scale), h: Math.round(ln.h * scale) };
+ };
+ const heightOf = (ln) => ln.kind === 'image' ? imageBox(ln).h + lineH : ln.kind === 'map' ? mapBox(ln).h + lineH : lineH;
+
+ const bodyHeight = bodyTop - bodyBottom;
+ const pages = [];
+ let current = [];
+ let used = 0;
+ for (const ln of lines) {
+ const hgt = Math.min(heightOf(ln), bodyHeight);
+ if (used + hgt > bodyHeight && current.length) { pages.push(current); current = []; used = 0; }
+ current.push(ln);
+ used += hgt;
+ }
+ pages.push(current);
+
+ 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 imageIds = new Map();
+ for (const ln of lines) {
+ if (ln.kind === 'map') {
+ for (const t of ln.tiles) imageIds.set(t, addObj({ dict: t.xo.dict, stream: t.xo.stream }));
+ continue;
+ }
+ if (ln.kind !== 'image') continue;
+ const id = addObj({ dict: ln.xo.dict, stream: ln.xo.stream });
+ imageIds.set(ln, id);
+ }
+
+ 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`);
+ } else if (ln.kind === 'image') {
+ const box = imageBox(ln);
+ parts.push(`q\n${box.w} 0 0 ${box.h} ${marginX} ${y - box.h + lineH - 4} cm\n/Im${imageIds.get(ln)} Do\nQ`);
+ y -= box.h;
+ } else if (ln.kind === 'map') {
+ const box = mapBox(ln);
+ parts.push(mapContent(ln, marginX, y - box.h + lineH - 4, box, imageIds));
+ y -= box.h;
+ }
+ 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`);
+ if (footerNote) parts.push(`BT\n/F1 8 Tf\n${marginX} ${footerH - 21} Td\n(${escapePdf(footerNote)}) 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);
+ });
+
+ const imageRefs = Array.from(imageIds.values()).map(id => `/Im${id} ${id} 0 R`).join(' ');
+ for (let i = 0; i < pageIds.length; i++) {
+ const xobjects = [logoXObjId ? `/Logo ${logoXObjId} 0 R` : '', imageRefs].filter(Boolean).join(' ');
+ const resources = xobjects
+ ? `<< /Font << /F1 ${fontId} 0 R /F2 ${fontBoldId} 0 R >> /XObject << ${xobjects} >> >>`
+ : `<< /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);
+}
+
+const fmtDate = v => {
+ if (!v) return '';
+ const d = new Date(v);
+ return isNaN(d.getTime()) ? String(v) : d.toISOString().replace('T', ' ').slice(0, 19) + ' UTC';
+};
+
+const fmtDay = v => {
+ if (!v) return '';
+ const d = new Date(v);
+ return isNaN(d.getTime()) ? String(v) : d.toISOString().slice(0, 10);
+};
+
+const asList = v => (Array.isArray(v) ? v : []);
+const txt = v => (v == null ? '' : String(v));
+
+const humanLabel = (key) => String(key || '')
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
+ .replace(/^./, c => c.toUpperCase());
+
+const pushMeta = (out, item) => {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'METADATA' });
+ if (item.id) out.push({ kind: 'kv', label: 'Content ID', value: item.id });
+ const author = item.author || item.organizer || item.createdBy || item.from || '';
+ if (author) out.push({ kind: 'kv', label: 'Author', value: author });
+ if (item.createdAt) out.push({ kind: 'kv', label: 'Created At', value: fmtDate(item.createdAt) });
+ if (item.updatedAt) out.push({ kind: 'kv', label: 'Updated At', value: fmtDate(item.updatedAt) });
+};
+
+const pushOpinions = (out, item) => {
+ const op = item.opinions && typeof item.opinions === 'object' ? item.opinions : {};
+ const entries = Object.entries(op).filter(([, n]) => Number(n) > 0);
+ if (!entries.length) return;
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'OPINIONS' });
+ for (const [cat, n] of entries) out.push({ kind: 'kv', label: humanLabel(cat), value: String(n) });
+};
+
+const pushTags = (out, item) => {
+ const tags = asList(item.tags).filter(Boolean);
+ if (tags.length) out.push({ kind: 'kv', label: 'Tags', value: tags.join(', ') });
+};
+
+const reportSections = (report) => {
+ const out = [];
+ out.push({ kind: 'title', text: `Report: ${txt(report.title) || '-'}` });
+ out.push({ kind: 'blank' });
+
+ out.push({ kind: 'section', text: 'CLASSIFICATION' });
+ out.push({ kind: 'kv', label: 'Category', value: txt(report.category).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Severity', value: txt(report.severity).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Status', value: txt(report.status).toUpperCase() });
+ pushTags(out, report);
+
+ if (txt(report.description).trim()) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'text', text: report.description });
+ }
+
+ const tpl = report.template && typeof report.template === 'object' ? report.template : {};
+ const tplEntries = Object.entries(tpl).filter(([, v]) => txt(v).trim());
+ if (tplEntries.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DETAILS' });
+ for (const [k, v] of tplEntries) out.push({ kind: 'kv', label: humanLabel(k), value: v });
+ }
+
+ const confirmations = asList(report.confirmations);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'CONFIRMATIONS' });
+ out.push({ kind: 'kv', label: 'Confirmed', value: String(confirmations.length) });
+ for (const c of confirmations) out.push({ kind: 'kv', label: 'Confirmed by', value: c });
+
+ pushOpinions(out, report);
+ pushMeta(out, report);
+ return out;
+};
+
+const voteSections = (vote) => {
+ const out = [];
+ out.push({ kind: 'title', text: `Votation: ${txt(vote.question) || '-'}` });
+ out.push({ kind: 'blank' });
+
+ out.push({ kind: 'section', text: 'TERMS' });
+ out.push({ kind: 'kv', label: 'Status', value: txt(vote.status).toUpperCase() });
+ if (vote.deadline) out.push({ kind: 'kv', label: 'Deadline', value: fmtDate(vote.deadline) });
+ pushTags(out, vote);
+
+ const votes = vote.votes && typeof vote.votes === 'object' ? vote.votes : {};
+ const total = Number(vote.totalVotes) || asList(vote.voters).length;
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'RESULTS' });
+ out.push({ kind: 'kv', label: 'Total votes', value: String(total) });
+ for (const [choice, n] of Object.entries(votes)) {
+ const count = Number(n) || 0;
+ const pct = total > 0 ? Math.round((count / total) * 100) : 0;
+ out.push({ kind: 'kv', label: choice, value: `${count} (${pct}%)` });
+ }
+
+ pushOpinions(out, vote);
+ pushMeta(out, vote);
+ return out;
+};
+
+const eventSections = (event) => {
+ const out = [];
+ out.push({ kind: 'title', text: `Event: ${txt(event.title) || '-'}` });
+ out.push({ kind: 'blank' });
+
+ out.push({ kind: 'section', text: 'SCHEDULE' });
+ out.push({ kind: 'kv', label: 'Date', value: fmtDate(event.date) });
+ out.push({ kind: 'kv', label: 'Status', value: txt(event.status).toUpperCase() });
+ if (event.location) out.push({ kind: 'kv', label: 'Location', value: event.location });
+ if (event.mapUrl) out.push({ kind: 'kv', label: 'Map', value: event.mapUrl });
+ if (Number(event.price) > 0) out.push({ kind: 'kv', label: 'Price', value: `${Number(event.price)} ECO` });
+ out.push({ kind: 'kv', label: 'Privacy', value: txt(event.isPublic).toUpperCase() });
+ if (event.url) out.push({ kind: 'kv', label: 'Url', value: event.url });
+ pushTags(out, event);
+
+ if (txt(event.description).trim()) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'text', text: event.description });
+ }
+
+ const attendees = asList(event.attendees);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'ATTENDEES' });
+ out.push({ kind: 'kv', label: 'Total', value: String(attendees.length) });
+ for (const a of attendees) out.push({ kind: 'kv', label: 'Attendee', value: a });
+
+ pushOpinions(out, event);
+ pushMeta(out, event);
+ return out;
+};
+
+const taskSections = (task) => {
+ const out = [];
+ out.push({ kind: 'title', text: `Task: ${txt(task.title) || '-'}` });
+ out.push({ kind: 'blank' });
+
+ out.push({ kind: 'section', text: 'SCHEDULE' });
+ out.push({ kind: 'kv', label: 'Status', value: txt(task.status).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Priority', value: txt(task.priority).toUpperCase() });
+ if (task.startTime) out.push({ kind: 'kv', label: 'Starts', value: fmtDate(task.startTime) });
+ if (task.endTime) out.push({ kind: 'kv', label: 'Ends', value: fmtDate(task.endTime) });
+ if (task.location) out.push({ kind: 'kv', label: 'Location', value: task.location });
+ out.push({ kind: 'kv', label: 'Privacy', value: txt(task.isPublic).toUpperCase() });
+ pushTags(out, task);
+
+ if (txt(task.description).trim()) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'text', text: task.description });
+ }
+
+ const assignees = asList(task.assignees);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'ASSIGNEES' });
+ out.push({ kind: 'kv', label: 'Total', value: String(assignees.length) });
+ for (const a of assignees) out.push({ kind: 'kv', label: 'Assignee', value: a });
+
+ pushOpinions(out, task);
+ pushMeta(out, task);
+ return out;
+};
+
+const calendarSections = (calendar, extra = {}) => {
+ const dates = asList(extra.dates);
+ const notesByDate = extra.notesByDate && typeof extra.notesByDate === 'object' ? extra.notesByDate : {};
+
+ const out = [];
+ out.push({ kind: 'title', text: `Calendar: ${txt(calendar.title) || '-'}` });
+ out.push({ kind: 'blank' });
+
+ out.push({ kind: 'section', text: 'SUMMARY' });
+ out.push({ kind: 'kv', label: 'Status', value: calendar.isClosed ? 'CLOSED' : txt(calendar.status).toUpperCase() });
+ if (calendar.deadline) out.push({ kind: 'kv', label: 'Deadline', value: fmtDate(calendar.deadline) });
+ if (calendar.mapUrl) out.push({ kind: 'kv', label: 'Map', value: calendar.mapUrl });
+ out.push({ kind: 'kv', label: 'Participants', value: String(asList(calendar.participants).length) });
+ out.push({ kind: 'kv', label: 'Dates', value: String(dates.length) });
+ const noteTotal = Object.values(notesByDate).reduce((n, arr) => n + asList(arr).length, 0);
+ out.push({ kind: 'kv', label: 'Notes', value: String(noteTotal) });
+ pushTags(out, calendar);
+
+ const participants = asList(calendar.participants);
+ if (participants.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'PARTICIPANTS' });
+ for (const p of participants) out.push({ kind: 'kv', label: 'Participant', value: p });
+ }
+
+ if (dates.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DATES' });
+ for (const d of dates) {
+ const day = fmtDay(d && d.date) || txt(d && d.date);
+ out.push({ kind: 'kv', label: day, value: txt(d && d.label) });
+ for (const note of asList(notesByDate[d && d.key])) {
+ const noteText = txt(note && note.text);
+ if (noteText) out.push({ kind: 'text', text: ` - ${noteText}` });
+ }
+ }
+ }
+
+ pushMeta(out, calendar);
+ return out;
+};
+
+const cvSections = (cv) => {
+ const out = [];
+ out.push({ kind: 'title', text: `Curriculum: ${txt(cv.name) || txt(cv.author) || '-'}` });
+ out.push({ kind: 'blank' });
+
+ out.push({ kind: 'section', text: 'PROFILE' });
+ if (cv.location) out.push({ kind: 'kv', label: 'Location', value: cv.location });
+ if (cv.status) out.push({ kind: 'kv', label: 'Status', value: txt(cv.status).toUpperCase() });
+ if (cv.preferences) out.push({ kind: 'kv', label: 'Preferences', value: txt(cv.preferences).toUpperCase() });
+ if (cv.languages) out.push({ kind: 'kv', label: 'Languages', value: cv.languages });
+
+ if (txt(cv.description).trim()) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'text', text: cv.description });
+ }
+
+ const blocks = [
+ ['PERSONAL', cv.personalExperiences, cv.personalSkills],
+ ['EDUCATION', cv.educationExperiences, cv.educationalSkills],
+ ['PROFESSIONAL', cv.professionalExperiences, cv.professionalSkills],
+ ['OASIS', cv.oasisExperiences, cv.oasisSkills]
+ ];
+
+ for (const [heading, experiences, skills] of blocks) {
+ const skillList = asList(skills).filter(Boolean);
+ const body = txt(experiences).trim();
+ if (!body && !skillList.length) continue;
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: heading });
+ if (body) out.push({ kind: 'text', text: body });
+ if (skillList.length) out.push({ kind: 'kv', label: 'Skills', value: skillList.join(', ') });
+ }
+
+ pushMeta(out, cv);
+ return out;
+};
+
+const IMAGE_MD = /^\s*!\[image:([^\]]*)\]\((&[^)]+)\)\s*$/;
+const MEDIA_MD = /^\s*\[(audio|video|pdf|torrent):([^\]]*)\]\((&[^)]+)\)\s*$/;
+const inlineMarkdown = (line) => String(line || '')
+ .replace(/\[\[([^\]|]+)\|([^\]]+)\]\]/g, '$2')
+ .replace(/\[\[([^\]]+)\]\]/g, (m, t) => t.replace(/^.*:/, ''))
+ .replace(/!\[image:([^\]]*)\]\((&[^)]+)\)/g, '[image: $1]')
+ .replace(/\[(audio|video|pdf|torrent):([^\]]*)\]\((&[^)]+)\)/g, '[$1: $2]')
+ .replace(/!\[([^\]]*)\]\([^)]*\)/g, '$1')
+ .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)')
+ .replace(/(\*\*|__)(.*?)\1/g, '$2')
+ .replace(/(\*|_)(.*?)\1/g, '$2')
+ .replace(/`([^`]*)`/g, '$1')
+ .replace(/^\s{0,3}>\s?/, '| ');
+
+const pushWikiBody = (out, body, images = {}) => {
+ const lines = String(body || '').replace(/\r\n/g, '\n').split('\n');
+ let paragraph = [];
+ const flush = () => { if (paragraph.length) { out.push({ kind: 'text', text: paragraph.join('\n') }); paragraph = []; } };
+ for (const raw of lines) {
+ const img = raw.match(IMAGE_MD);
+ if (img) {
+ flush();
+ const buf = images && images[img[2]];
+ if (buf) out.push({ kind: 'image', buffer: buf, caption: txt(img[1]) });
+ else out.push({ kind: 'text', text: `[image: ${txt(img[1])}]` });
+ continue;
+ }
+ const media = raw.match(MEDIA_MD);
+ if (media) { flush(); out.push({ kind: 'text', text: `[${media[1]}: ${txt(media[2])}]` }); continue; }
+ const heading = raw.match(/^\s{0,3}#{1,6}\s+(.*)$/);
+ if (heading) { flush(); out.push({ kind: 'blank' }); out.push({ kind: 'section', text: inlineMarkdown(heading[1]).toUpperCase() }); continue; }
+ if (!raw.trim()) { flush(); out.push({ kind: 'blank' }); continue; }
+ paragraph.push(inlineMarkdown(raw));
+ }
+ flush();
+};
+
+const padSections = (pad, extra = {}) => {
+ const out = [];
+ out.push({ kind: 'title', text: txt(pad.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Author', value: txt(pad.author) });
+ out.push({ kind: 'kv', label: 'Created', value: fmtDate(pad.createdAt) });
+ out.push({ kind: 'kv', label: 'Status', value: txt(pad.status).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Members', value: String(Array.isArray(pad.members) ? pad.members.length : 0) });
+ out.push({ kind: 'kv', label: 'Versions', value: String(Array.isArray(pad.versions) ? pad.versions.length : 0) });
+ pushTags(out, pad);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'CONTENT' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'text', text: String(pad.text || '').replace(/\r\n/g, '\n') });
+ const versions = Array.isArray(pad.versions) ? pad.versions : [];
+ if (versions.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'VERSION HISTORY' });
+ out.push({ kind: 'blank' });
+ for (const v of versions.slice().reverse().slice(0, 50)) out.push({ kind: 'kv', label: fmtDate(v.createdAt), value: txt(v.author) });
+ }
+ return out;
+};
+
+const wikiSections = (page, extra = {}) => {
+ const out = [];
+ out.push({ kind: 'title', text: txt(page.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Author', value: txt(page.author) });
+ out.push({ kind: 'kv', label: 'Updated', value: fmtDate(page.updatedAt) });
+ out.push({ kind: 'kv', label: 'Versions', value: String(page.versionCount || 1) });
+ pushTags(out, page);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'CONTENT' });
+ out.push({ kind: 'blank' });
+ pushWikiBody(out, page.body, (extra && extra.images) || {});
+ return out;
+};
+
+const emergencySections = (item, extra = {}) => {
+ const out = [];
+ out.push({ kind: 'title', text: txt(item.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Status', value: txt(item.status).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Severity', value: `${txt(item.severity).toUpperCase()} (${Number(item.confirmationCount) || 0} confirmations)` });
+ out.push({ kind: 'kv', label: 'Category', value: txt(item.category).toUpperCase() });
+ if (item.expiresAt) out.push({ kind: 'kv', label: 'Expires', value: fmtDate(item.expiresAt) });
+ out.push({ kind: 'kv', label: 'Author', value: txt(item.author) });
+ out.push({ kind: 'kv', label: 'Created', value: fmtDate(item.createdAt) });
+ if (item.mapUrl) out.push({ kind: 'kv', label: 'Map', value: txt(item.mapUrl) });
+ pushTags(out, item);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'CONTENT' });
+ out.push({ kind: 'blank' });
+ pushWikiBody(out, item.text, (extra && extra.images) || {});
+ const updates = asList(item.updates);
+ if (updates.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'LAST UPDATES' });
+ for (const u of updates) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: fmtDate(u.createdAt), value: txt(u.author) });
+ pushWikiBody(out, u.text, (extra && extra.images) || {});
+ }
+ }
+ return out;
+};
+
+const campaignSections = (item, extra = {}) => {
+ const out = [];
+ out.push({ kind: 'title', text: txt(item.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Status', value: txt(item.status).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Category', value: txt(item.category).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Signatures', value: `${Number(item.signatureCount) || 0} / ${Number(item.goal) || 0} (${Number(item.progress) || 0}%)` });
+ if (item.deadline) out.push({ kind: 'kv', label: 'Deadline', value: fmtDate(item.deadline) });
+ out.push({ kind: 'kv', label: 'Promoter', value: txt(item.author) });
+ out.push({ kind: 'kv', label: 'Created', value: fmtDate(item.createdAt) });
+ if (item.mapUrl) out.push({ kind: 'kv', label: 'Map', value: txt(item.mapUrl) });
+ pushTags(out, item);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'CONTENT' });
+ out.push({ kind: 'blank' });
+ pushWikiBody(out, item.text, (extra && extra.images) || {});
+ const updates = asList(item.updates);
+ if (updates.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'LAST UPDATES' });
+ for (const u of updates) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: fmtDate(u.createdAt), value: txt(u.author) });
+ pushWikiBody(out, u.text, (extra && extra.images) || {});
+ }
+ }
+ const signatures = asList(item.signatures);
+ if (signatures.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: `SUPPORTERS (${signatures.length})` });
+ for (const s of signatures) out.push({ kind: 'kv', label: fmtDate(s.createdAt), value: `${txt(s.author)}${s.text ? ' - ' + txt(s.text) : ''}` });
+ }
+ return out;
+};
+
+const logisticsSections = (item, extra = {}) => {
+ const out = [];
+ out.push({ kind: 'title', text: txt(item.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Type', value: `${txt(item.kind).toUpperCase()} - ${txt(item.mode).toUpperCase()}` });
+ out.push({ kind: 'kv', label: 'Status', value: txt(item.status).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Route', value: `${txt(item.origin)} -> ${txt(item.destination)}` });
+ if (item.date) out.push({ kind: 'kv', label: 'Date', value: `${fmtDate(item.date)}${item.recurrence && item.recurrence !== 'NONE' ? ' (' + txt(item.recurrence) + ')' : ''}` });
+ if (item.kind === 'TRIP' && item.seats) out.push({ kind: 'kv', label: 'Seats', value: `${Number(item.seatsLeft) || 0} / ${Number(item.seats) || 0}` });
+ if (item.size) out.push({ kind: 'kv', label: 'Size', value: txt(item.size) });
+ if (item.weight) out.push({ kind: 'kv', label: 'Weight', value: txt(item.weight) });
+ out.push({ kind: 'kv', label: 'Price', value: item.priceType === 'FREE' || !(Number(item.price) > 0) ? 'FREE' : `${item.price} ${txt(item.priceType)}` });
+ if (item.orderRef) out.push({ kind: 'kv', label: 'Order', value: txt(item.orderRef) });
+ if (item.mapUrl) out.push({ kind: 'kv', label: 'Map', value: txt(item.mapUrl) });
+ out.push({ kind: 'kv', label: 'Author', value: txt(item.author) });
+ out.push({ kind: 'kv', label: 'Created', value: fmtDate(item.createdAt) });
+ pushTags(out, item);
+ if (txt(item.description).trim()) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'blank' });
+ pushWikiBody(out, item.description, (extra && extra.images) || {});
+ }
+ const bookings = asList(item.bookings);
+ if (bookings.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: `BOOKINGS (${bookings.length})` });
+ for (const b of bookings) out.push({ kind: 'kv', label: `${fmtDate(b.createdAt)} ${txt(b.status)}`, value: `${txt(b.booker)}${b.seats ? ' x' + b.seats : ''}${b.notes ? ' - ' + txt(b.notes) : ''}${b.receipt ? ' [' + txt(b.receipt) + ']' : ''}` });
+ }
+ const ratings = asList(item.ratings);
+ if (ratings.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: `RATINGS (${ratings.length}) - ${Number(item.ratingAvg) || 0}/5` });
+ for (const r of ratings) out.push({ kind: 'kv', label: `${'*'.repeat(Number(r.score) || 0)} ${fmtDate(r.createdAt)}`, value: `${txt(r.author)}${r.text ? ' - ' + txt(r.text) : ''}` });
+ }
+ return out;
+};
+
+const mailingSections = (item, extra = {}) => {
+ const out = [];
+ out.push({ kind: 'title', text: txt(item.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Type', value: txt(item.listType).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Status', value: txt(item.status).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Subscribers', value: String(Number(item.participantCount) || 0) });
+ out.push({ kind: 'kv', label: 'Messages', value: String(Number(item.messageCount) || 0) });
+ out.push({ kind: 'kv', label: 'Author', value: txt(item.author) });
+ out.push({ kind: 'kv', label: 'Created', value: fmtDate(item.createdAt) });
+ pushTags(out, item);
+ if (txt(item.description).trim()) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'blank' });
+ pushWikiBody(out, item.description, (extra && extra.images) || {});
+ }
+ const history = asList(item.history);
+ if (history.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: `HISTORY (${history.length})` });
+ for (const m of history) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: fmtDate(m.sentAt), value: `${txt(m.author)} - ${txt(m.subject)}` });
+ pushWikiBody(out, m.text, {});
+ }
+ }
+ return out;
+};
+
+const PIXELIA_EMPTY = [0x1a, 0x1a, 0x1a];
+const PIXELIA_GRID = [0x33, 0x33, 0x33];
+const PIXELIA_PAGE_W = 512;
+const PIXELIA_PAGE_H = 520;
+const PIXELIA_MAX_CELL = 24;
+
+const pixeliaCells = (pixels, cols, rows) => {
+ const cells = new Map();
+ for (const px of asList(pixels)) {
+ const key = `${px.x},${px.y}`;
+ const hex = /^#[0-9a-f]{6}$/i.test(String(px.color || '')) ? String(px.color).slice(1) : null;
+ if (!hex || cells.has(key) || px.x < 1 || px.x > cols || px.y < 1 || px.y > rows) continue;
+ cells.set(key, [0, 2, 4].map(i => parseInt(hex.slice(i, i + 2), 16)));
+ }
+ return cells;
+};
+
+const pixeliaRaster = (cells, x0, y0, cols, rows, block) => {
+ const w = cols * block;
+ const h = rows * block;
+ const rgb = Buffer.alloc(w * h * 3);
+ const segment = (c, edge) => {
+ const seg = Buffer.alloc(block * 3);
+ for (let i = 0; i < block; i++) {
+ const col = edge || i === block - 1 ? PIXELIA_GRID : c;
+ seg[i * 3] = col[0]; seg[i * 3 + 1] = col[1]; seg[i * 3 + 2] = col[2];
+ }
+ return seg;
+ };
+ const gridSeg = segment(PIXELIA_GRID, true);
+ const segs = new Map();
+ for (let cy = 0; cy < rows; cy++) {
+ for (let cx = 0; cx < cols; cx++) {
+ const c = cells.get(`${x0 + cx},${y0 + cy}`) || PIXELIA_EMPTY;
+ const key = c.join(',');
+ if (!segs.has(key)) segs.set(key, segment(c, false));
+ const seg = segs.get(key);
+ for (let py = 0; py < block; py++) {
+ rgb.set(py === block - 1 ? gridSeg : seg, (((cy * block + py) * w) + cx * block) * 3);
+ }
+ }
+ }
+ return { w, h, rgb };
+};
+
+const pixeliaSections = (canvas) => {
+ const out = [];
+ const pixels = asList(canvas.pixels);
+ const cols = Number(canvas.width) || 1;
+ const rows = Number(canvas.height) || 1;
+ const contributors = [...new Set(pixels.flatMap(px => asList(px.contributors_inhabitants)))];
+ const cells = pixeliaCells(pixels, cols, rows);
+ const cell = Math.min(PIXELIA_MAX_CELL, PIXELIA_PAGE_W / cols);
+ const block = Math.max(6, Math.ceil(cell * 2));
+ const perPage = Math.max(1, Math.floor(PIXELIA_PAGE_H / cell));
+ out.push({ kind: 'title', text: 'Pixelia' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Total pixels', value: String(pixels.length) });
+ out.push({ kind: 'kv', label: 'Contributors', value: String(contributors.length) });
+ out.push({ kind: 'blank' });
+ for (let y = 1; y <= rows; y += perPage) {
+ const n = Math.min(perPage, rows - y + 1);
+ out.push({ kind: 'image', raster: pixeliaRaster(cells, 1, y, cols, n, block), maxW: cols * cell, maxH: n * cell });
+ }
+ if (contributors.length) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'CONTRIBUTORS' });
+ out.push({ kind: 'blank' });
+ for (const id of contributors) out.push({ kind: 'text', text: txt(id) });
+ }
+ return out;
+};
+
+const mapPins = (item) => [{
+ lat: item.lat, lng: item.lng, main: true,
+ label: txt(item.markerLabel) || txt(item.description) || txt(item.title) || 'Marker',
+ image: txt(item.image), author: item.author, createdAt: item.createdAt
+}].concat(asList(item.markers).map(mk => ({ lat: mk.lat, lng: mk.lng, main: false, label: txt(mk.label), image: txt(mk.image), author: mk.author, createdAt: mk.createdAt })));
+
+const mapSections = (item, extra = {}) => {
+ const names = (extra && extra.names) || {};
+ const images = (extra && extra.images) || {};
+ const who = id => names[id] ? `${names[id]} (${id})` : txt(id);
+ const coords = (lat, lng) => `${(Number(lat) || 0).toFixed(4)}, ${(Number(lng) || 0).toFixed(4)}`;
+ const out = [];
+ out.push({ kind: 'title', text: txt(item.title) || '-' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: 'Type', value: txt(item.mapType).toUpperCase() });
+ out.push({ kind: 'kv', label: 'Location', value: coords(item.lat, item.lng) });
+ out.push({ kind: 'kv', label: 'Author', value: who(item.author) });
+ out.push({ kind: 'kv', label: 'Created', value: fmtDate(item.createdAt) });
+ if (item.updatedAt && item.updatedAt !== item.createdAt) out.push({ kind: 'kv', label: 'Updated', value: fmtDate(item.updatedAt) });
+ pushTags(out, item);
+ if (txt(item.description)) {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'DESCRIPTION' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'text', text: String(item.description).replace(/\r\n/g, '\n') });
+ }
+ const pins = mapPins(item);
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: 'MAP' });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'map', pins });
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'section', text: `MARKERS (${pins.length})` });
+ pins.forEach((p, i) => {
+ out.push({ kind: 'blank' });
+ out.push({ kind: 'kv', label: i === 0 ? 'Main marker' : `Marker ${i}`, value: p.label });
+ out.push({ kind: 'kv', label: 'Coordinates', value: coords(p.lat, p.lng) });
+ out.push({ kind: 'kv', label: 'Author', value: who(p.author) });
+ if (p.createdAt) out.push({ kind: 'kv', label: 'Date', value: fmtDate(p.createdAt) });
+ if (p.image && images[p.image]) out.push({ kind: 'image', buffer: images[p.image], caption: p.label, maxW: 200, maxH: 140 });
+ });
+ return out;
+};
+
+const BUILDERS = {
+ maps: { title: 'OASIS - Map', sections: mapSections, name: item => item.title },
+ wiki: { title: 'OASIS - Wiki', sections: wikiSections, name: item => item.title },
+ pads: { title: 'OASIS - Pad', sections: padSections, name: item => item.title },
+ campaigns: { title: 'OASIS - Campaign', sections: campaignSections, name: item => item.title },
+ logistics: { title: 'OASIS - Route', sections: logisticsSections, name: item => item.title },
+ mailing: { title: 'OASIS - Mailing List', sections: mailingSections, name: item => item.title },
+ emergencies: { title: 'OASIS - Emergency', sections: emergencySections, name: item => item.title },
+ reports: { title: 'OASIS - Report', sections: reportSections, name: item => item.title },
+ votes: { title: 'OASIS - Votation', sections: voteSections, name: item => item.question },
+ events: { title: 'OASIS - Event', sections: eventSections, name: item => item.title },
+ tasks: { title: 'OASIS - Task', sections: taskSections, name: item => item.title },
+ calendars: { title: 'OASIS - Calendar', sections: calendarSections, name: item => item.title },
+ cv: { title: 'OASIS - Curriculum', sections: cvSections, name: item => item.name || item.author },
+ pixelia: { title: 'OASIS - Pixelia', sections: pixeliaSections, name: () => 'canvas' }
+};
+
+const isSupported = kind => Object.prototype.hasOwnProperty.call(BUILDERS, kind);
+
+const pdfFilename = (kind, item) => {
+ const b = BUILDERS[kind];
+ const raw = b ? txt(b.name(item || {})) : '';
+ const slug = raw.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 40);
+ return `oasis-${kind}-${slug || 'document'}.pdf`;
+};
+
+const buildContentPdf = (kind, item, extra = {}, viewerId = null) => {
+ const b = BUILDERS[kind];
+ if (!b) throw new Error('Unsupported pdf kind');
+ return buildDocumentPdf({
+ title: b.title,
+ issuedToLabel: 'Issued to',
+ issuedTo: viewerId || null,
+ sections: b.sections(item || {}, extra),
+ license: (item && item.license) || ''
+ });
+};
+
+function buildSmartContractPdf({ transfer, block, viewerId }) {
+ 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 t = transfer || {};
+ const b = block || {};
+ const fmt = v => (v === undefined || v === null) ? '' : String(v);
+ const fmtAmount = () => {
+ const cat = String(t.category || 'ECONOMIC').toUpperCase();
+ const unit = cat === 'TIME' ? 'h' : cat === 'TRUST' ? 'trust' : 'ECO';
+ return `${Number(t.amount || 0).toFixed(6)} ${unit}`;
+ };
+ const fmtDate = v => v ? new Date(v).toISOString().replace('T', ' ').slice(0, 19) + ' UTC' : '';
+ const confirmedBy = Array.isArray(t.confirmedBy) ? t.confirmedBy : [];
+ const settledUbi = (Array.isArray(t.tags) ? t.tags : []).some(x => String(x).toUpperCase() === 'UBI') && /^[0-9a-f]{64}$/i.test(String(t.txid || ''));
+ const required = (t.from === t.to || settledUbi) ? 1 : 2;
+ const confirmedCount = confirmedBy.length;
+ const tags = Array.isArray(t.tags) ? t.tags.join(', ') : '';
+
+ const sections = [];
+ sections.push({ kind: 'title', text: `Concept: ${t.concept || '-'}` });
+ sections.push({ kind: 'blank' });
+
+ sections.push({ kind: 'section', text: 'OASIS IDs' });
+ sections.push({ kind: 'kv', label: 'From', value: fmt(t.from) });
+ sections.push({ kind: 'kv', label: 'To', value: fmt(t.to) });
+ sections.push({ kind: 'blank' });
+
+ sections.push({ kind: 'section', text: 'TERMS' });
+ sections.push({ kind: 'kv', label: 'Category', value: String(t.category || 'ECONOMIC').toUpperCase() });
+ if (String(t.category || '').toUpperCase() !== 'TRUST') sections.push({ kind: 'kv', label: 'Amount', value: fmtAmount() });
+ sections.push({ kind: 'kv', label: 'Status', value: fmt(t.status) });
+ if (t.deadline) sections.push({ kind: 'kv', label: 'Deadline', value: fmtDate(t.deadline) });
+ if (tags) sections.push({ kind: 'kv', label: 'Tags', value: tags });
+ sections.push({ kind: 'blank' });
+
+ sections.push({ kind: 'section', text: 'CONFIRMATIONS' });
+ sections.push({ kind: 'kv', label: 'Required', value: String(required) });
+ sections.push({ kind: 'kv', label: 'Confirmed', value: String(confirmedCount) });
+ if (confirmedBy.length) {
+ for (const f of confirmedBy) sections.push({ kind: 'kv', label: 'Signed by', value: fmt(f) });
+ }
+ sections.push({ kind: 'blank' });
+
+ sections.push({ kind: 'section', text: 'BLOCK VERIFICATION' });
+ if (b && b.id) {
+ sections.push({ kind: 'kv', label: 'Block ID', value: fmt(b.id) });
+ if (b.ts) sections.push({ kind: 'kv', label: 'Block Timestamp', value: fmtDate(b.ts) });
+ if (b.type) sections.push({ kind: 'kv', label: 'Block Type', value: String(b.type).toUpperCase() });
+ if (b.author) sections.push({ kind: 'kv', label: 'Block Author', value: fmt(b.author) });
+ if (b.size) sections.push({ kind: 'kv', label: 'Block Size', value: `${b.size} bytes` });
+ } else {
+ sections.push({ kind: 'kv', label: 'Block ID', value: fmt(t.id) });
+ }
+ sections.push({ kind: 'blank' });
+
+ sections.push({ kind: 'section', text: 'METADATA' });
+ sections.push({ kind: 'kv', label: 'Transfer ID', value: fmt(t.id) });
+ if (t.createdAt) sections.push({ kind: 'kv', label: 'Created At', value: fmtDate(t.createdAt) });
+ if (t.updatedAt) sections.push({ kind: 'kv', label: 'Updated At', value: fmtDate(t.updatedAt) });
+
+ const lines = [];
+ for (const s of sections) {
+ if (s.kind === 'kv') {
+ const txt = `${s.label}: ${s.value}`;
+ for (const w of wrap(txt, 82)) lines.push({ kind: 'kv', text: w });
+ } else {
+ lines.push(s);
+ }
+ }
+
+ 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('OASIS - Smart Contract')}) Tj\nET`);
+ const prefix = '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(viewerId || ''))}) 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`);
+ parts.push(`BT\n/F1 8 Tf\n${marginX} ${footerH - 21} Td\n(${escapePdf(licenseFooter(''))}) 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);
+}
+
+function buildCertificatePdf({ cert, course, studentName, teacherName }) {
+ const pageW = 792;
+ const pageH = 612;
+ const margin = 40;
+
+ let logoBuf = null;
+ let logoDims = null;
+ try {
+ logoBuf = fs.readFileSync(LOGO_PATH);
+ logoDims = readJpegDims(logoBuf);
+ } catch (_) {}
+
+ const c = cert || {};
+ const courseTitle = String((course && course.title) || c.courseTitle || 'Oasis Course');
+ const issued = c.createdAt ? new Date(c.createdAt) : new Date();
+ const issuedStr = issued.toISOString().slice(0, 10);
+
+ const charW = (size) => size * 0.6;
+ const centered = (text, size, font, y, rgb = '0 0 0') => {
+ const t = String(text || '');
+ const x = Math.max(margin, (pageW - t.length * charW(size)) / 2);
+ return `BT\n/${font} ${size} Tf\n${rgb} rg\n${x} ${y} Td\n(${escapePdf(t)}) Tj\nET`;
+ };
+
+ const parts = [];
+
+ parts.push(`q\n0.85 0.65 0.1 RG\n3 w\n${margin} ${margin} ${pageW - margin * 2} ${pageH - margin * 2} re\nS\nQ`);
+ parts.push(`q\n0.3 0.3 0.3 RG\n1 w\n${margin + 8} ${margin + 8} ${pageW - (margin + 8) * 2} ${pageH - (margin + 8) * 2} re\nS\nQ`);
+
+ if (logoBuf && logoDims) {
+ const logoH = 64;
+ const logoW = Math.round((logoDims.w / logoDims.h) * logoH);
+ parts.push(`q\n${logoW} 0 0 ${logoH} ${(pageW - logoW) / 2} ${pageH - 140} cm\n/Logo Do\nQ`);
+ }
+
+ parts.push(centered('OASIS', 26, 'F2', pageH - 175));
+ parts.push(centered('CERTIFICATE OF COMPLETION', 16, 'F2', pageH - 205, '0.55 0.4 0.05'));
+
+ parts.push(centered('This certifies that', 11, 'F1', pageH - 250, '0.25 0.25 0.25'));
+ parts.push(centered(studentName || c.student || '', 18, 'F2', pageH - 280));
+ if (studentName && c.student && studentName !== c.student) {
+ parts.push(centered(c.student, 7, 'F1', pageH - 296, '0.45 0.45 0.45'));
+ }
+
+ parts.push(centered('has successfully completed the course', 11, 'F1', pageH - 330, '0.25 0.25 0.25'));
+ parts.push(centered(courseTitle, 16, 'F2', pageH - 360));
+
+ parts.push(centered(`Issued on ${issuedStr}`, 10, 'F1', pageH - 400, '0.25 0.25 0.25'));
+
+ const sigY = 135;
+ parts.push(`q\n0.3 0.3 0.3 RG\n0.7 w\n${margin + 60} ${sigY + 14} m\n${margin + 280} ${sigY + 14} l\nS\nQ`);
+ parts.push(`BT\n/F2 11 Tf\n0 0 0 rg\n${margin + 60} ${sigY} Td\n(${escapePdf(teacherName || c.author || '')}) Tj\nET`);
+ parts.push(`BT\n/F1 8 Tf\n0.35 0.35 0.35 rg\n${margin + 60} ${sigY - 13} Td\n(${escapePdf('Teacher')}) Tj\nET`);
+ if (teacherName && c.author && teacherName !== c.author) {
+ parts.push(`BT\n/F1 6 Tf\n0.45 0.45 0.45 rg\n${margin + 60} ${sigY - 24} Td\n(${escapePdf(c.author)}) Tj\nET`);
+ }
+
+ parts.push(centered('Cryptographically signed on the Oasis P2P network — verifiable by anyone', 8, 'F1', margin + 30, '0.35 0.35 0.35'));
+ if (c.id) parts.push(centered(`Certificate ID: ${c.id}`, 6, 'F1', margin + 18, '0.45 0.45 0.45'));
+ parts.push(centered(licenseFooter(''), 6, 'F1', margin + 42, '0.45 0.45 0.45'));
+
+ const content = parts.join('\n');
+
+ 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 stream = `<< /Length ${Buffer.byteLength(content, 'latin1')} >>\nstream\n${content}\nendstream`;
+ const contentId = addObj(stream);
+ const pageId = addObj(null);
+
+ 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[pageId - 1] = `<< /Type /Page /Parent ${pagesId} 0 R /MediaBox [0 0 ${pageW} ${pageH}] /Contents ${contentId} 0 R /Resources ${resources} >>`;
+ objects[catalogId - 1] = `<< /Type /Catalog /Pages ${pagesId} 0 R >>`;
+ objects[pagesId - 1] = `<< /Type /Pages /Kids [${pageId} 0 R] /Count 1 >>`;
+
+ 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);
+}
+
+const linkPattern = /(?:https?:\/\/[^\s]+|www\.[^\s]+|@[A-Za-z0-9+/=.\-]+\.ed25519|[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})/g;
+
+const splitSegments = (line) => {
+ const segs = [];
+ let last = 0;
+ const re = new RegExp(linkPattern.source, 'g');
+ let m;
+ while ((m = re.exec(line)) !== null) {
+ if (m.index > last) segs.push({ t: line.slice(last, m.index), l: false });
+ segs.push({ t: m[0], l: true });
+ last = m.index + m[0].length;
+ }
+ if (last < line.length) segs.push({ t: line.slice(last), l: false });
+ return segs;
+};
+
+function buildLogsPdf(entries, oasisId, opts = {}) {
+ const pageW = 612;
+ const pageH = 792;
+ const marginX = 50;
+ const headerH = 90;
+ const footerH = 40;
+ const bodyTop = pageH - headerH - 22;
+ const bodyBottom = footerH + 10;
+ const lineH = 12;
+ const maxBodyLines = Math.floor((bodyTop - bodyBottom) / lineH);
+
+ let logoBuf = null;
+ let logoDims = null;
+ try {
+ logoBuf = fs.readFileSync(LOGO_PATH);
+ logoDims = readJpegDims(logoBuf);
+ } catch (_) {}
+
+ const allLines = [];
+ for (const e of entries) {
+ const ts = new Date(e.ts);
+ const when = ts.toISOString().replace('T', ' ').slice(0, 19);
+ allLines.push({ kind: 'header', text: `[${when}]:` });
+ allLines.push({ kind: 'blank', text: '' });
+ for (const l of wrap(e.text, 82)) allLines.push({ kind: 'text', text: l });
+ allLines.push({ kind: 'blank', text: '' });
+ }
+ if (!allLines.length) allLines.push({ kind: 'text', text: '(no entries)' });
+
+ const pages = [];
+ for (let i = 0; i < allLines.length; i += maxBodyLines) {
+ pages.push(allLines.slice(i, i + maxBodyLines));
+ }
+ if (!pages.length) pages.push([{ kind: 'text', text: '(no entries)' }]);
+
+ 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 colorSpace = logoDims.c === 1 ? '/DeviceGray' : '/DeviceRGB';
+ const dict = `<< /Type /XObject /Subtype /Image /Width ${logoDims.w} /Height ${logoDims.h} /ColorSpace ${colorSpace} /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);
+ const logoX = marginX;
+ const logoY = pageH - headerH + 15;
+ parts.push(`q\n${logoW} 0 0 ${logoH} ${logoX} ${logoY} 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('OASIS - Experience logs')}) Tj\nET`);
+ const inhabitantPrefix = 'Inhabitant: ';
+ const inhabitantPrefixW = inhabitantPrefix.length * 5.4;
+ parts.push(`BT\n/F1 9 Tf\n${titleX} ${titleY - 16} Td\n(${escapePdf(inhabitantPrefix)}) Tj\nET`);
+ parts.push(`BT\n/F2 9 Tf\n${titleX + inhabitantPrefixW} ${titleY - 16} Td\n(${escapePdf(String(oasisId || ''))}) 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;
+ const charW = 6;
+ for (const ln of pg) {
+ if (ln.kind === 'header') {
+ parts.push(`BT\n/F2 10 Tf\n1 0.647 0 rg\n${marginX} ${y} Td\n(${escapePdf(ln.text)}) Tj\nET`);
+ } else if (ln.text) {
+ const segs = splitSegments(ln.text);
+ let x = marginX;
+ for (const s of segs) {
+ if (!s.t) continue;
+ const color = s.l ? '0 0 1 rg' : '0 0 0 rg';
+ parts.push(`BT\n/F1 10 Tf\n${color}\n${x} ${y} Td\n(${escapePdf(s.t)}) Tj\nET`);
+ x += s.t.length * charW;
+ }
+ }
+ 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`);
+ parts.push(`BT\n/F1 8 Tf\n${marginX} ${footerH - 21} Td\n(${escapePdf(licenseFooter(''))}) 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);
+}
+
+const buildRecoveryKitPdf = (kit, { qr = null, labels = {} } = {}) => {
+ const sections = [];
+ sections.push({ kind: 'title', text: labels.title || 'RECOVERY' });
+ sections.push({ kind: 'blank' });
+ sections.push({ kind: 'kv', label: labels.id || 'Oasis ID', value: kit.id || '' });
+ sections.push({ kind: 'kv', label: labels.date || 'Generated', value: fmtDate(kit.createdAt) });
+ if (qr) { sections.push({ kind: 'blank' }); sections.push({ kind: 'image', buffer: qr, caption: '' }); }
+ sections.push({ kind: 'blank' });
+ sections.push({ kind: 'section', text: 'SECRET' });
+ sections.push({ kind: 'blank' });
+ for (const line of String(kit.secret || '').split('\n')) sections.push({ kind: 'text', text: line });
+ return buildDocumentPdf({ title: 'OASIS - Recovery', issuedToLabel: labels.id || 'Oasis ID', issuedTo: kit.id || '', sections });
+};
+
+module.exports = { buildDocumentPdf, escapePdf, wrap, buildContentPdf, pdfFilename, isSupported, buildSmartContractPdf, buildCertificatePdf, buildLogsPdf, buildRecoveryKitPdf };
diff --git a/src/backend/pdfDocument.js b/src/backend/pdfDocument.js
deleted file mode 100644
index 4e3dc3e..0000000
--- a/src/backend/pdfDocument.js
+++ /dev/null
@@ -1,199 +0,0 @@
-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 6b69b8a..d6dd9e5 100644
--- a/src/backend/pm_policy.js
+++ b/src/backend/pm_policy.js
@@ -11,7 +11,7 @@ const isRecipientAllowed = ({ pmVisibility, viewerId, recipientId, relationship
};
const announceSeenPath = () => {
- try { return require('../server/ssb_config').statePath(ANNOUNCE_SEEN_FILE); } catch (_) { return null; }
+ try { return require('../configs/state-manager').statePath(ANNOUNCE_SEEN_FILE); } catch (_) { return null; }
};
const readAnnounceSeen = () => {
diff --git a/src/backend/renderStyledText.js b/src/backend/renderStyledText.js
new file mode 100644
index 0000000..baf8879
--- /dev/null
+++ b/src/backend/renderStyledText.js
@@ -0,0 +1,325 @@
+const { a, img, video, audio, span, strong, em, u, s: strike, code, div, textarea } = require("../server/node_modules/hyperaxe");
+const i18nBase = require("../client/assets/translations/i18n");
+const { WIKILINK_RE, slugify, linkTarget } = require("../models/wiki_model");
+
+let zoomSeq = 0;
+
+function getI18n() {
+ try {
+ const { i18n } = require("../views/main_views");
+ return i18n;
+ } catch (_) {
+ return i18nBase['en'] || {};
+ }
+}
+
+const ESCAPE_RE = /\\([\\*_~`#>\-\[\]!])/g;
+const CODE_BLOCK_RE = /```([\s\S]*?)```[ \t]*(?:\n(?:[ \t]*\n)*|$)/g;
+const RULE_RE = /^[ \t]*---[ \t]*(?:\n(?:[ \t]*\n)*|$)/gm;
+const HEADER_CLOSED_RE = /^[ \t]*(#{1,6})[ \t]*([^\n]{1,200}?)[ \t]*\1[ \t]*(?:\n(?:[ \t]*\n)*|$)/gm;
+const HEADER_SPACED_RE = /^[ \t]*(#{1,6})[ \t]+([^\n]{1,200}?)[ \t]*#*[ \t]*(?:\n(?:[ \t]*\n)*|$)/gm;
+const QUOTE_RE = /^[ \t]*>[ \t]?([^\n]*)(?:\n(?:[ \t]*\n)*|$)/gm;
+const BULLET_RE = /^([ \t]*)-[ \t]+([^\n]+)(?:\n(?:[ \t]*\n)*|$)/gm;
+const NUMBER_RE = /^([ \t]*)(\d{1,3})([.)])[ \t]+([^\n]+)(?:\n(?:[ \t]*\n)*|$)/gm;
+const BOLD_RE = /\*\*(?!\s)((?:[^*\n]|\*(?!\*))+?)(? { mentionResolver = typeof fn === 'function' ? fn : null; };
+const bareMentionName = (token) => (/\.ed25519$/i.test(token) ? '' : token.replace(/[.\-]+$/, ''));
+const MSG_REF_RE = /%[A-Za-z0-9+/=]{44}\.sha256/g;
+const MD_LINK_RE = /!?\[([^\]\n]{1,160})\]\((https?:\/\/[^)\s]+|\/(?![\/\\])[^)\s]*)\)/g;
+const URL_RE = /\b(?:https?:\/\/|www\.)[^\s<>"'`]+/gi;
+const EMAIL_RE = /\b[A-Za-z0-9][A-Za-z0-9._%+-]{0,63}@(?:[A-Za-z0-9-]{1,63}\.)+[A-Za-z]{2,24}\b/g;
+const HASHTAG_RE = /#[\w\u0080-\uFFFF]{1,32}(?![\w\u0080-\uFFFF])/g;
+const URL_TAIL_RE = /[.,;:!?»"')\]}>]+$/;
+const SELF_HOST_RE = /^https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?(?:[/?#]|$)/i;
+const INTERNAL_PATHS = [
+ 'agenda','ai','audios','author','backup','banking','blockexplorer','blogs','bookmarks','calendars','campaigns',
+ 'chats','cipher','courts','cv','dev','docs','emergencies','events','favorites','feed','files','forum','games','graphos',
+ 'hashtag','housing','images','industry','inbox','inhabitants','invites','jobs','larp','logistics','logs','mailing',
+ 'maps','market','melody','mentions','modules','multiverse','opinions','pads','parliament','rooms','peers','pixelia','pm',
+ 'podcasts','polls','popular','profile','projects','publish','reports','school','search','settings','shops','spread',
+ 'stats','tags','tasks','thread','torrents','transfers','trending','tribes','tribe','videos','votes','votations','wallet','wiki'
+];
+const INTERNAL_PATH_SET = new Set(INTERNAL_PATHS);
+const SSB_ID_RE = /^(?:%[A-Za-z0-9+/=]{20,}\.sha256|@[A-Za-z0-9+/=]{20,}\.ed25519|&[A-Za-z0-9+/=]{20,}\.sha256)$/;
+
+const internalTargetOf = (url) => {
+ let parsed = null;
+ try { parsed = new URL(url); } catch (_) { return null; }
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;
+ const segments = parsed.pathname.split('/').filter(Boolean).map(seg => { try { return decodeURIComponent(seg); } catch (_) { return seg; } });
+ if (!segments.length || !INTERNAL_PATH_SET.has(segments[0].toLowerCase())) return null;
+ const sameHost = SELF_HOST_RE.test(url);
+ const hasSsbId = segments.slice(1).some(seg => SSB_ID_RE.test(seg));
+ if (!sameHost && !hasSsbId) return null;
+ const id = segments.slice(1).find(seg => SSB_ID_RE.test(seg)) || segments[1] || '';
+ return { href: `${parsed.pathname}${parsed.search}${parsed.hash}`, kind: segments[0].toLowerCase(), id };
+};
+
+const shortInternalId = (id) => {
+ const value = String(id || '');
+ if (!value) return '';
+ const sigil = /^[%@&]/.test(value) ? value[0] : '';
+ const body = sigil ? value.slice(1) : value;
+ return body.length > 8 ? `${sigil}${body.slice(0, 8)}…` : `${sigil}${body}`;
+};
+const MAX_DEPTH = 8;
+
+const headerLevel = (hashes) => Math.min(3, String(hashes || '#').length);
+
+const indentLevel = (indent) => {
+ const width = String(indent || '').replace(/\t/g, ' ').length;
+ return Math.min(4, Math.floor(width / 2) + 1);
+};
+
+const codeBlockBody = (raw) => {
+ const s = String(raw);
+ const nl = s.indexOf('\n');
+ if (nl === -1) return s;
+ return s.slice(nl + 1).replace(/\n[ \t]*$/, '');
+};
+
+function renderStyledText(value, opts = {}) {
+ if (typeof value !== 'string') return value === null || value === undefined ? [] : [String(value)];
+ const text = value.indexOf('\r') === -1 ? value : value.replace(/\r\n?/g, '\n');
+ const depth = Number(opts.depth) || 0;
+ if (depth > MAX_DEPTH) return [text];
+ const allMatches = [];
+ const push = (m, extra) => allMatches.push({ index: m.index, length: m[0].length, ...extra });
+ for (const m of text.matchAll(ESCAPE_RE)) push(m, { type: 'escaped', body: m[1] });
+ for (const m of text.matchAll(WIKILINK_RE)) push(m, { type: 'wikilink', target: linkTarget(m[1]), label: (m[2] || linkTarget(m[1])).trim() });
+ for (const m of text.matchAll(CODE_BLOCK_RE)) push(m, { type: 'code-block', body: codeBlockBody(m[1]) });
+ for (const m of text.matchAll(RULE_RE)) push(m, { type: 'rule' });
+ for (const m of text.matchAll(HEADER_CLOSED_RE)) push(m, { type: 'header', level: headerLevel(m[1]), body: m[2] });
+ for (const m of text.matchAll(HEADER_SPACED_RE)) push(m, { type: 'header', level: headerLevel(m[1]), body: m[2] });
+ for (const m of text.matchAll(QUOTE_RE)) push(m, { type: 'quote', body: m[1] });
+ for (const m of text.matchAll(BULLET_RE)) push(m, { type: 'bullet', level: indentLevel(m[1]), body: m[2] });
+ for (const m of text.matchAll(NUMBER_RE)) push(m, { type: 'number', level: indentLevel(m[1]), marker: `${m[2]}${m[3]}`, body: m[4] });
+ for (const m of text.matchAll(BLOB_IMAGE_RE)) push(m, { type: 'blob-image', name: m[1], blob: m[2] });
+ for (const m of text.matchAll(BLOB_VIDEO_RE)) push(m, { type: 'blob-video', name: m[1], blob: m[2] });
+ for (const m of text.matchAll(BLOB_AUDIO_RE)) push(m, { type: 'blob-audio', name: m[1], blob: m[2] });
+ for (const m of text.matchAll(BLOB_PDF_RE)) push(m, { type: 'blob-pdf', name: m[1], blob: m[2] });
+ for (const m of text.matchAll(BLOB_TORRENT_RE)) push(m, { type: 'blob-file', name: m[1], blob: m[2] });
+ for (const m of text.matchAll(BLOB_FILE_RE)) push(m, { type: 'blob-file', name: m[1], blob: m[2] });
+ for (const m of text.matchAll(MD_MENTION_RE)) push(m, { type: 'md-mention', name: m[1], feedId: m[2] });
+ for (const m of text.matchAll(RAW_MENTION_RE)) push(m, { type: 'raw-mention', feedId: m[1] });
+ for (const m of text.matchAll(BARE_MENTION_RE)) {
+ const name = bareMentionName(m[2]);
+ if (name) allMatches.push({ index: m.index + m[1].length, length: name.length + 1, type: 'bare-mention', name });
+ }
+ for (const m of text.matchAll(MSG_REF_RE)) push(m, { type: 'msg-ref', id: m[0] });
+ for (const m of text.matchAll(MD_LINK_RE)) push(m, { type: 'md-link', label: m[1], href: m[2] });
+ for (const m of text.matchAll(BOLD_RE)) push(m, { type: 'bold', body: m[1] });
+ for (const m of text.matchAll(UNDERLINE_RE)) push(m, { type: 'underline', body: m[1] });
+ for (const m of text.matchAll(STRIKE_RE)) push(m, { type: 'strike', body: m[1] });
+ for (const m of text.matchAll(ITALIC_RE)) push(m, { type: 'italic', body: m[1] });
+ for (const m of text.matchAll(INLINE_CODE_RE)) push(m, { type: 'inline-code', body: m[1] });
+ for (const m of text.matchAll(URL_RE)) {
+ const trimmed = m[0].replace(URL_TAIL_RE, '');
+ if (trimmed) allMatches.push({ index: m.index, length: trimmed.length, type: 'url', text: trimmed });
+ }
+ for (const m of text.matchAll(EMAIL_RE)) push(m, { type: 'email', text: m[0] });
+ for (const m of text.matchAll(HASHTAG_RE)) push(m, { type: 'hashtag', tag: m[0].slice(1) });
+ allMatches.sort((x, y) => x.index - y.index);
+ const filtered = [];
+ let lastEnd = 0;
+ for (const m of allMatches) {
+ if (m.index < lastEnd) continue;
+ filtered.push(m);
+ lastEnd = m.index + m.length;
+ }
+ const blobHref = (id) => `${opts.blobPrefix || '/blob/'}${encodeURIComponent(id)}`;
+ const linksOn = opts.links !== false;
+ const internalOn = opts.internalLinks !== false;
+ const plain = (value) => opts.plainUrlClass ? span({ class: opts.plainUrlClass }, value) : value;
+ const inner = (body) => renderStyledText(body, { ...opts, depth: depth + 1 });
+ const result = [];
+ let cursor = 0;
+ for (const m of filtered) {
+ if (cursor < m.index) result.push(text.slice(cursor, m.index));
+ if (m.type === 'escaped') {
+ result.push(m.body);
+ } else if (m.type === 'msg-ref') {
+ result.push(internalOn ? a({ href: `/thread/${encodeURIComponent(m.id)}`, class: 'styled-link' }, m.id.slice(0, 10) + '...') : m.id);
+ } else if (m.type === 'wikilink') {
+ result.push(typeof opts.wikiLink === 'function'
+ ? opts.wikiLink(m.target, slugify(m.target), m.label)
+ : internalOn
+ ? a({ href: `/wiki/${encodeURIComponent(slugify(m.target))}`, class: 'wiki-link' }, m.label)
+ : m.label);
+ } else if (m.type === 'code-block') {
+ result.push(span({ class: 'rt-code-block' }, m.body));
+ } else if (m.type === 'rule') {
+ result.push(span({ class: 'rt-rule' }));
+ } else if (m.type === 'header') {
+ result.push(span({ class: `rt-header rt-header-${m.level}` }, ...inner(m.body)));
+ } else if (m.type === 'quote') {
+ result.push(span({ class: 'rt-quote' }, ...inner(m.body)));
+ } else if (m.type === 'bullet') {
+ result.push(span({ class: `rt-item rt-item-${m.level}` }, ...inner(m.body)));
+ } else if (m.type === 'number') {
+ result.push(span({ class: `rt-item rt-item-number rt-item-${m.level}` }, `${m.marker} `, ...inner(m.body)));
+ } else if (m.type === 'bold') {
+ result.push(strong(...inner(m.body)));
+ } else if (m.type === 'underline') {
+ result.push(u(...inner(m.body)));
+ } else if (m.type === 'strike') {
+ result.push(strike(...inner(m.body)));
+ } else if (m.type === 'italic') {
+ result.push(em(...inner(m.body)));
+ } else if (m.type === 'inline-code') {
+ result.push(code({ class: 'rt-code' }, m.body));
+ } else if (m.type === 'blob-image') {
+ const imageSrc = blobHref(m.blob);
+ if (opts.zoomImages) {
+ zoomSeq = (zoomSeq + 1) % 1000000;
+ const zoomId = `rtzoom-${zoomSeq}-${String(m.blob).replace(/[^a-zA-Z0-9]/g, '').slice(-10)}`;
+ result.push(a({ href: `#${zoomId}`, id: `${zoomId}-src`, class: 'zoom-link' }, img({ src: imageSrc, alt: m.name || '', class: 'post-image' })));
+ result.push(span({ id: zoomId, class: 'lightbox' },
+ a({ href: `${imageSrc}${imageSrc.includes('?') ? '&' : '?'}download=1`, class: 'lightbox-download', title: getI18n().fileShareDownload || 'Download' }, '\u2913'),
+ a({ href: `#${zoomId}-src`, class: 'lightbox-close' }, '\u00d7'),
+ img({ src: imageSrc, alt: m.name || '', class: 'lightbox-image' })
+ ));
+ } else {
+ result.push(img({ src: imageSrc, alt: m.name || '', class: 'post-image' }));
+ }
+ } else if (m.type === 'blob-video') {
+ result.push(video({ controls: true, class: 'post-video', src: blobHref(m.blob) }));
+ } else if (m.type === 'blob-audio') {
+ result.push(audio({ controls: true, class: 'post-audio', src: blobHref(m.blob) }));
+ } else if (m.type === 'blob-pdf') {
+ const i18n = getI18n();
+ result.push(a({ href: blobHref(m.blob), class: 'post-pdf', target: '_blank', rel: 'noopener noreferrer' }, m.name || i18n.pdfFallbackLabel || 'PDF'));
+ } else if (m.type === 'blob-file') {
+ result.push(a({ href: blobHref(m.blob), class: 'post-pdf', target: '_blank', rel: 'noopener noreferrer' }, m.name || m.blob.slice(1, 9)));
+ } else if (m.type === 'md-mention') {
+ result.push(internalOn ? a({ href: `/author/${encodeURIComponent('@' + m.feedId)}`, class: 'mention' }, '@' + m.name) : '@' + m.name);
+ } else if (m.type === 'raw-mention') {
+ result.push(internalOn ? a({ href: `/author/${encodeURIComponent('@' + m.feedId)}`, class: 'mention' }, '@' + m.feedId.slice(0, 8) + '...') : '@' + m.feedId.slice(0, 8) + '...');
+ } else if (m.type === 'bare-mention') {
+ const feedId = internalOn && mentionResolver ? mentionResolver(m.name) : null;
+ result.push(feedId ? a({ href: `/author/${encodeURIComponent(feedId)}`, class: 'mention' }, '@' + m.name) : '@' + m.name);
+ } else if (m.type === 'md-link') {
+ const external = /^https?:\/\//.test(m.href) && !SELF_HOST_RE.test(m.href);
+ result.push(external
+ ? (linksOn ? a({ href: m.href, class: 'styled-link', target: '_blank', rel: 'noopener noreferrer' }, ...inner(m.label)) : plain(m.label))
+ : (internalOn ? a({ href: m.href, class: 'styled-link' }, ...inner(m.label)) : m.label));
+ } else if (m.type === 'url') {
+ const schemeMatch = m.text.match(/^(https?):\/\//i);
+ const href = schemeMatch ? `${schemeMatch[1].toLowerCase()}://${m.text.slice(schemeMatch[0].length)}` : `https://${m.text}`;
+ const internalTarget = internalTargetOf(href);
+ if (!linksOn) result.push(plain(m.text));
+ else if (internalTarget) {
+ result.push(internalOn
+ ? a({ href: internalTarget.href, class: 'internal-link' },
+ span({ class: 'internal-link-kind' }, internalTarget.kind.toUpperCase()),
+ internalTarget.id ? span({ class: 'internal-link-id' }, shortInternalId(internalTarget.id)) : null
+ )
+ : plain(internalTarget.href));
+ }
+ else if (SELF_HOST_RE.test(href)) result.push(a({ href }, m.text));
+ else result.push(a({ href, target: '_blank', rel: 'noopener noreferrer' }, m.text));
+ } else if (m.type === 'email') {
+ result.push(linksOn ? a({ href: `mailto:${m.text}` }, m.text) : plain(m.text));
+ } else if (m.type === 'hashtag') {
+ const tagHref = typeof opts.hashtagHref === 'function' ? opts.hashtagHref(m.tag) : (internalOn ? `/search?query=%23${encodeURIComponent(m.tag)}` : null);
+ result.push(tagHref ? a({ href: tagHref, class: 'tag-link tag-inline' }, `#${m.tag}`) : `#${m.tag}`);
+ }
+ cursor = m.index + m.length;
+ }
+ if (cursor < text.length) result.push(text.slice(cursor));
+ return result;
+}
+
+const safeExternalHref = (url) => {
+ const value = String(url || '').trim();
+ const lower = value.toLowerCase();
+ if (lower.startsWith('http://') || lower.startsWith('https://') || lower.startsWith('mailto:')) return value;
+ return '';
+};
+
+const escapeHtml = (value) => String(value)
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+
+function renderStyledHtml(text, opts = {}) {
+ if (text === null || text === undefined || text === '') return '';
+ return renderStyledText(String(text), opts)
+ .map(node => (node && typeof node === 'object' && node.outerHTML) ? node.outerHTML : escapeHtml(node))
+ .join('');
+}
+
+function plainText(text) {
+ if (text === null || text === undefined) return '';
+ return String(text)
+ .replace(/```[\s\S]*?```/g, '')
+ .replace(/^[ \t]*>[ \t]?/gm, '')
+ .replace(/^[ \t]*---[ \t]*$/gm, '')
+ .replace(/^[ \t]*#{1,6}[ \t]*/gm, '')
+ .replace(/[ \t]*#{1,6}[ \t]*$/gm, '')
+ .replace(/^[ \t]*- /gm, '')
+ .replace(/^[ \t]*\d{1,3}[.)] /gm, '')
+ .replace(/\*\*(.*?)\*\*/g, '$1')
+ .replace(/__(.*?)__/g, '$1')
+ .replace(/~~(.*?)~~/g, '$1')
+ .replace(/\*(.*?)\*/g, '$1')
+ .replace(/`([^`]+)`/g, '$1')
+ .replace(/!?\[[^\]\n]{0,160}\]\(\s*&[^)\s\n]{1,120}\.sha256\s*\)/g, '')
+ .replace(/\[(?:video|audio|pdf):[^\]\n]{0,160}\]\([^)\n]{0,200}\)/g, '')
+ .replace(/\[\[([^\]|\n]{1,120})(?:\|([^\]\n]{1,120}))?\]\]/g, (m, target, label) => label || target)
+ .replace(/!?\[([^\]\n]{1,160})\]\(([^)\s\n]{0,200})\)/g, (m, label, href) => href ? `${label} (${href})` : label)
+ .replace(/\\([\\*_~`#>\-\[\]!])/g, '$1')
+ .trim();
+}
+
+function renderTextPreview(text, maxLength = 220) {
+ const preview = plainText(text).replace(/\n+/g, ' ').trim();
+ return preview.length > maxLength ? preview.slice(0, maxLength) + '...' : preview;
+}
+
+const FORMAT_MARKS = [
+ { mark: '**bold**', style: 'bold' },
+ { mark: '*italic*', style: 'italic' },
+ { mark: '__underline__', style: 'underline' },
+ { mark: '~~strike~~', style: 'strike' },
+ { mark: '`code`', style: 'code' },
+ { mark: '### title ###', style: 'header' },
+ { mark: '- list', style: 'item' },
+ { mark: '> quote', style: 'quote' },
+ { mark: '[[wiki]]', style: 'wiki' }
+];
+
+function renderFormatBar() {
+ const i18n = getI18n();
+ const marks = [];
+ FORMAT_MARKS.forEach((m, i) => {
+ if (i) marks.push(span({ class: 'rt-sep' }, '|'));
+ marks.push(span({ class: `rt-mark rt-mark-${m.style}` }, m.mark));
+ });
+ return div({ class: 'rt-toolbar' },
+ span({ class: 'rt-toolbar-label' }, `${i18n.formatBarLabel || 'Format'}:`),
+ ...marks
+ );
+}
+
+function richTextarea(attrs, ...children) {
+ return [renderFormatBar(), textarea(attrs, ...children)];
+}
+
+module.exports = { renderStyledText, renderStyledHtml, renderTextPreview, plainText, escapeHtml, safeExternalHref, renderFormatBar, richTextarea, setMentionResolver, INTERNAL_PATHS };
diff --git a/src/backend/renderTextWithStyles.js b/src/backend/renderTextWithStyles.js
deleted file mode 100644
index c403a45..0000000
--- a/src/backend/renderTextWithStyles.js
+++ /dev/null
@@ -1,139 +0,0 @@
-const i18nBase = require("../client/assets/translations/i18n");
-
-function getI18n() {
- try {
- const { i18n } = require("../views/main_views");
- return i18n;
- } catch (_) {
- return i18nBase['en'] || {};
- }
-}
-
-function renderTextPreview(text, maxLength = 220) {
- if (!text) return ''
-
- let preview = String(text)
-
- preview = preview
- .replace(/```[\s\S]*?```/g, '')
- .replace(/^>.*$/gm, '')
- .replace(/^#{1,6}\s*/gm, '')
- .replace(/^- /gm, '')
- .replace(/^\d+\. /gm, '')
- .replace(/\*\*(.*?)\*\*/g, '$1')
- .replace(/\*(.*?)\*/g, '$1')
- .replace(/`([^`]+)`/g, '$1')
- .replace(/!\[.*?\]\(.*?\)/g, '')
- .replace(/\[.*?\]\(.*?\)/g, '')
- .replace(/\n+/g, ' ')
- .trim()
-
- if (preview.length > maxLength) {
- preview = preview.slice(0, maxLength) + '...'
- }
-
- return preview
-}
-
-function renderTextWithStyles(text) {
- if (!text) return ''
- const i18n = getI18n()
-
- let html = String(text)
-
- html = html
- .replace(/&/g, '&')
- .replace(//g, '>')
-
- html = html
- .replace(/```([\s\S]*?)```/gim, '$1
')
- .replace(/^> (.*)$/gim, '$1
')
- .replace(/^---$/gim, '
')
- .replace(/^### (.*)$/gim, '$1
')
- .replace(/^## (.*)$/gim, '$1
')
- .replace(/^# (.*)$/gim, '$1
')
-
- html = html
- .replace(/\*\*(.*?)\*\*/gim, '$1')
- .replace(/\*(.*?)\*/gim, '$1')
- .replace(/`([^`]+)`/gim, '$1')
-
- html = html
- .replace(/!\[([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, alt, blob) =>
- `
`
- )
- .replace(/\[video:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, _name, blob) =>
- ``
- )
- .replace(/\[audio:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, _name, blob) =>
- ``
- )
- .replace(/\[pdf:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g, (_, name, blob) =>
- `${name || i18n.pdfFallbackLabel || 'PDF'}`
- )
-
- html = html
- .replace(/\[@([^\]]+)\]\(@?([A-Za-z0-9+/=.\-]+\.ed25519)\)/g, (_, name, id) =>
- `
@${name}`
- )
- .replace(/@([A-Za-z0-9+/=.\-]+\.ed25519)/g, (_, id) =>
- `
@${id}`
- )
-
- const escAttr = (s) => String(s).replace(/"/g, '"').replace(/'/g, ''')
- html = html
- .replace(/#(\w+)/g, (_, tag) =>
- `
#${escAttr(tag)}`
- )
- .replace(/(https?:\/\/[^\s"'<>]+)/g, url =>
- `
${escAttr(url)}`
- )
- .replace(/([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/g, email =>
- `
${escAttr(email)}`
- )
-
- const lines = html.split('\n')
- let result = ''
- let inUL = false
- let inOL = false
-
- for (let line of lines) {
- if (/^- /.test(line)) {
- if (!inUL) {
- result += '
'
- inUL = true
- }
- result += `- ${line.replace(/^- /, '')}
`
- continue
- }
-
- if (/^\d+\. /.test(line)) {
- if (!inOL) {
- result += ''
- inOL = true
- }
- result += `- ${line.replace(/^\d+\. /, '')}
`
- continue
- }
-
- if (inUL) {
- result += '
'
- inUL = false
- }
-
- if (inOL) {
- result += ''
- inOL = false
- }
-
- result += line + '
'
- }
-
- if (inUL) result += ''
- if (inOL) result += ''
-
- return result
-}
-
-module.exports = { renderTextWithStyles, renderTextPreview }
diff --git a/src/backend/renderUrl.js b/src/backend/renderUrl.js
deleted file mode 100644
index 9267768..0000000
--- a/src/backend/renderUrl.js
+++ /dev/null
@@ -1,92 +0,0 @@
-const { a, img, video, audio } = require("../server/node_modules/hyperaxe");
-const i18nBase = require("../client/assets/translations/i18n");
-
-function getI18n() {
- try {
- const { i18n } = require("../views/main_views");
- return i18n;
- } catch (_) {
- return i18nBase['en'] || {};
- }
-}
-
-function renderUrl(text) {
- if (typeof text !== 'string') return [text];
- const blobImageRegex = /!\[([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g;
- const blobVideoRegex = /\[video:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g;
- const blobAudioRegex = /\[audio:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g;
- const blobPdfRegex = /\[pdf:([^\]]*)\]\(\s*(&[^)\s]+\.sha256)\s*\)/g;
- const mdMentionRegex = /\[@([^\]]+)\]\(@?([A-Za-z0-9+/=.\-]+\.ed25519)\)/g;
- const rawMentionRegex = /@([A-Za-z0-9+/=.\-]+\.ed25519)/g;
- const urlRegex = /\b(?:https?:\/\/|www\.)[^\s]+/g;
- const emailRegex = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z]{2,}\b/gi;
- const allMatches = [];
- for (const m of text.matchAll(blobImageRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'blob-image', name: m[1], blob: m[2] });
- }
- for (const m of text.matchAll(blobVideoRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'blob-video', name: m[1], blob: m[2] });
- }
- for (const m of text.matchAll(blobAudioRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'blob-audio', name: m[1], blob: m[2] });
- }
- for (const m of text.matchAll(blobPdfRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'blob-pdf', name: m[1], blob: m[2] });
- }
- for (const m of text.matchAll(mdMentionRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'md-mention', name: m[1], feedId: m[2] });
- }
- for (const m of text.matchAll(rawMentionRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'raw-mention', feedId: m[1] });
- }
- for (const m of text.matchAll(urlRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'url', text: m[0] });
- }
- for (const m of text.matchAll(emailRegex)) {
- allMatches.push({ index: m.index, length: m[0].length, type: 'email', text: m[0] });
- }
- allMatches.sort((a, b) => a.index - b.index);
- const filtered = [];
- let lastEnd = 0;
- for (const m of allMatches) {
- if (m.index < lastEnd) continue;
- filtered.push(m);
- lastEnd = m.index + m.length;
- }
- const result = [];
- let cursor = 0;
- for (const m of filtered) {
- if (cursor < m.index) {
- result.push(text.slice(cursor, m.index));
- }
- if (m.type === 'blob-image') {
- result.push(img({ src: `/blob/${encodeURIComponent(m.blob)}`, alt: m.name || '', class: 'post-image' }));
- } else if (m.type === 'blob-video') {
- result.push(video({ controls: true, class: 'post-video', src: `/blob/${encodeURIComponent(m.blob)}` }));
- } else if (m.type === 'blob-audio') {
- result.push(audio({ controls: true, class: 'post-audio', src: `/blob/${encodeURIComponent(m.blob)}` }));
- } else if (m.type === 'blob-pdf') {
- const i18n = getI18n();
- const label = m.name || i18n.pdfFallbackLabel || 'PDF';
- result.push(a({ href: `/blob/${encodeURIComponent(m.blob)}`, class: 'post-pdf', target: '_blank' }, label));
- } else if (m.type === 'md-mention') {
- const feedWithAt = '@' + m.feedId;
- result.push(a({ href: `/author/${encodeURIComponent(feedWithAt)}`, class: 'mention' }, '@' + m.name));
- } else if (m.type === 'raw-mention') {
- const feedWithAt = '@' + m.feedId;
- result.push(a({ href: `/author/${encodeURIComponent(feedWithAt)}`, class: 'mention' }, '@' + m.feedId.slice(0, 8) + '...'));
- } else if (m.type === 'url') {
- const href = m.text.startsWith('http') ? m.text : `https://${m.text}`;
- result.push(a({ href, target: '_blank', rel: 'noopener noreferrer' }, m.text));
- } else if (m.type === 'email') {
- result.push(a({ href: `mailto:${m.text}` }, m.text));
- }
- cursor = m.index + m.length;
- }
- if (cursor < text.length) {
- result.push(text.slice(cursor));
- }
- return result;
-}
-
-module.exports = { renderUrl };
diff --git a/src/backend/request_guards.js b/src/backend/request_guards.js
new file mode 100644
index 0000000..bc62e3e
--- /dev/null
+++ b/src/backend/request_guards.js
@@ -0,0 +1,99 @@
+const MSG_KEY_RE = /^%[A-Za-z0-9+/]{43}=\.sha256$/;
+
+const isMsgKey = (value) => typeof value === 'string' && MSG_KEY_RE.test(value);
+
+const pickMsgKeys = (value) => {
+ const list = Array.isArray(value) ? value : (value == null ? [] : [value]);
+ return Array.from(new Set(list.filter(isMsgKey)));
+};
+
+const isLocalPath = (value) => {
+ if (typeof value !== 'string' || !value.startsWith('/')) return false;
+ if (value.startsWith('//') || value.startsWith('/\\')) return false;
+ if (/[\r\n\0]/.test(value)) return false;
+ return true;
+};
+
+const SHARED_RETURN_PAGES = ['/activity', '/agenda', '/search', '/trending', '/favorites', '/opinions', '/mentions', '/melody', '/author', '/inhabitant', '/tribe'];
+const isSharedReturnPage = (rt) => SHARED_RETURN_PAGES.some(p => rt === p || (rt.startsWith(p) && /^[?#/]/.test(rt.slice(p.length))));
+const safeReturnTo = (ctx, fallback, allowedPrefixes) => {
+ const rt = ctx?.request?.body?.returnTo || ctx?.query?.returnTo;
+ if (!isLocalPath(rt)) return fallback;
+ if (isSharedReturnPage(rt)) return rt;
+ return Array.isArray(allowedPrefixes) && allowedPrefixes.some(p => rt.startsWith(p)) ? rt : fallback;
+};
+
+const refererPath = (referer, host) => {
+ if (!referer) return null;
+ try {
+ const u = new URL(referer);
+ if ((u.protocol !== 'http:' && u.protocol !== 'https:') || u.host !== host) return null;
+ const target = u.pathname + u.search + u.hash;
+ return isLocalPath(target) ? target : null;
+ } catch (_) {
+ return null;
+ }
+};
+
+const safeRefererRedirect = (ctx, fallback = '/') => {
+ const target = refererPath(ctx.request.header.referer, ctx.host);
+ ctx.redirect(target || fallback);
+};
+
+const isClearnetPath = (request) => {
+ const url = String((request && request.url) || '');
+ return url === '/c' || url.startsWith('/c/') || url.startsWith('/c?');
+};
+
+const isTrustedRequest = (request, validHosts) => {
+ if (isClearnetPath(request)) return request.method === 'GET';
+ if (!Array.isArray(validHosts) || !validHosts.includes(request.hostname)) return false;
+ if (request.method === 'GET') return true;
+ const origin = request.header && request.header.origin;
+ const source = origin && origin !== 'null' ? origin : (request.header && request.header.referer);
+ if (source == null) return false;
+ try {
+ const u = new URL(source);
+ if ((u.protocol !== 'http:' && u.protocol !== 'https:') || !validHosts.includes(u.hostname)) return false;
+ if (u.host !== String(request.host || '')) return false;
+ if (u.pathname.startsWith('/blob/')) return false;
+ } catch (_) {
+ return false;
+ }
+ return true;
+};
+
+const publicModeGuard = ({ isPublic, onBlocked }) => async (ctx, next) => {
+ if (isPublic && ctx.method !== 'GET') { onBlocked(ctx); return; }
+ await next();
+};
+
+const buildCsp = (isClearnet, { frames = false } = {}) => (isClearnet
+ ? [
+ "default-src 'self'",
+ "script-src 'none'",
+ "style-src 'self' 'unsafe-inline'",
+ "img-src 'self' data:",
+ "media-src 'self' blob:",
+ "connect-src 'self'",
+ "frame-src 'none'",
+ "form-action 'self'",
+ "object-src 'none'",
+ "base-uri 'none'",
+ "frame-ancestors 'none'"
+ ]
+ : [
+ "default-src 'self'",
+ "script-src 'self' http://localhost:3000/js",
+ "style-src 'self'",
+ "img-src 'self'",
+ "media-src 'self' blob:",
+ "worker-src 'self' blob:",
+ frames ? "frame-src 'self'" : "frame-src 'none'",
+ "form-action 'self'",
+ "object-src 'none'",
+ "base-uri 'none'",
+ "frame-ancestors 'none'"
+ ]).join('; ');
+
+module.exports = { isMsgKey, pickMsgKeys, isLocalPath, safeReturnTo, refererPath, safeRefererRedirect, isClearnetPath, isTrustedRequest, publicModeGuard, buildCsp };
diff --git a/src/backend/sanitizeHtml.js b/src/backend/sanitizeHtml.js
index 85bb4b4..bb8f6ed 100644
--- a/src/backend/sanitizeHtml.js
+++ b/src/backend/sanitizeHtml.js
@@ -1,14 +1,32 @@
"use strict";
-const { JSDOM } = require('../server/node_modules/jsdom');
-const DOMPurify = require('../server/node_modules/dompurify');
-const window = new JSDOM('').window;
-const purify = DOMPurify(window);
+const SAFE_SRC = /^\/(?:blob|image)\/[^\s"'<>]+$/i;
+const SAFE_HREF = /^(?:https?:\/\/|\/(?!\/)|#|mailto:)/i;
+const SAFE_CLASS = /^(?:rt-[a-z0-9-]+|styled-link|mention|tag-link|zoom-link|pm-quote|wiki-link(?:-missing)?|internal-link(?:-id|-kind)?|lightbox(?:-[a-z]+)?|post-(?:audio|image|pdf|video))$/;
+let purifier = null;
+const getPurify = () => {
+ if (purifier) return purifier;
+ const { JSDOM } = require('../server/node_modules/jsdom');
+ const DOMPurify = require('../server/node_modules/dompurify');
+ const purify = DOMPurify(new JSDOM('').window);
+ purify.addHook('uponSanitizeAttribute', (node, data) => {
+ const name = String(data.attrName || '').toLowerCase();
+ const value = String(data.attrValue || '').trim();
+ if (name === 'src' && !SAFE_SRC.test(value)) data.keepAttr = false;
+ if (name === 'href' && !SAFE_HREF.test(value)) data.keepAttr = false;
+ if (name === 'class') {
+ const kept = value.split(/\s+/).filter(c => SAFE_CLASS.test(c));
+ if (kept.length) data.attrValue = kept.join(' '); else data.keepAttr = false;
+ }
+ });
+ purifier = purify;
+ return purifier;
+};
+const dropControlChars = (html) => String(html).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g, '');
const stripDangerousTags = (input) => {
if (typeof input !== 'string') return '';
- return purify.sanitize(input, {
- USE_PROFILES: { html: true },
+ return dropControlChars(getPurify().sanitize(input, {
ALLOWED_TAGS: [
'p', 'br',
'b', 'strong', 'i', 'em', 'u',
@@ -19,13 +37,12 @@ const stripDangerousTags = (input) => {
ALLOWED_ATTR: [],
FORBID_TAGS: ['svg', 'math', 'iframe', 'object', 'embed', 'form', 'input', 'textarea', 'select', 'button', 'script'],
FORBID_ATTR: ['style']
- });
+ }));
};
const sanitizeHtml = (input) => {
if (typeof input !== 'string') return '';
- return purify.sanitize(input, {
- USE_PROFILES: { html: true },
+ return dropControlChars(getPurify().sanitize(input, {
ALLOWED_TAGS: [
'p', 'br', 'hr',
'b', 'strong', 'i', 'em', 'u', 's', 'del',
@@ -39,7 +56,7 @@ const sanitizeHtml = (input) => {
ALLOWED_ATTR: ['href', 'class', 'target', 'rel', 'src', 'alt', 'title', 'controls'],
FORBID_TAGS: ['svg', 'math', 'iframe', 'object', 'embed', 'form', 'input', 'textarea', 'select', 'button', 'script', 'style', 'link', 'meta'],
FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover', 'onfocus', 'onblur', 'onsubmit', 'onchange', 'style']
- });
+ }));
};
module.exports = { stripDangerousTags, sanitizeHtml };
diff --git a/src/backend/smartContractPdf.js b/src/backend/smartContractPdf.js
deleted file mode 100644
index e396747..0000000
--- a/src/backend/smartContractPdf.js
+++ /dev/null
@@ -1,228 +0,0 @@
-const fs = require('fs');
-const path = require('path');
-
-const LOGO_PATH = path.join(__dirname, '..', 'client', 'assets', 'images', 'snh-oasis.jpg');
-
-const { escapePdf } = require('./pdfDocument');
-
-const wrap = (txt, max = 82) => {
- const out = [];
- for (const raw of String(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;
-};
-
-function buildSmartContractPdf({ transfer, block, viewerId }) {
- 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 t = transfer || {};
- const b = block || {};
- const fmt = v => (v === undefined || v === null) ? '' : String(v);
- const fmtAmount = () => {
- const cat = String(t.category || 'ECONOMIC').toUpperCase();
- const unit = cat === 'TIME' ? 'h' : cat === 'TRUST' ? 'trust' : 'ECO';
- return `${Number(t.amount || 0).toFixed(6)} ${unit}`;
- };
- const fmtDate = v => v ? new Date(v).toISOString().replace('T', ' ').slice(0, 19) + ' UTC' : '';
- const confirmedBy = Array.isArray(t.confirmedBy) ? t.confirmedBy : [];
- const required = t.from === t.to ? 1 : 2;
- const confirmedCount = confirmedBy.length;
- const tags = Array.isArray(t.tags) ? t.tags.join(', ') : '';
-
- const sections = [];
- sections.push({ kind: 'title', text: `Concept: ${t.concept || '-'}` });
- sections.push({ kind: 'blank' });
-
- sections.push({ kind: 'section', text: 'OASIS IDs' });
- sections.push({ kind: 'kv', label: 'From', value: fmt(t.from) });
- sections.push({ kind: 'kv', label: 'To', value: fmt(t.to) });
- sections.push({ kind: 'blank' });
-
- sections.push({ kind: 'section', text: 'TERMS' });
- sections.push({ kind: 'kv', label: 'Category', value: String(t.category || 'ECONOMIC').toUpperCase() });
- if (String(t.category || '').toUpperCase() !== 'TRUST') sections.push({ kind: 'kv', label: 'Amount', value: fmtAmount() });
- sections.push({ kind: 'kv', label: 'Status', value: fmt(t.status) });
- if (t.deadline) sections.push({ kind: 'kv', label: 'Deadline', value: fmtDate(t.deadline) });
- if (tags) sections.push({ kind: 'kv', label: 'Tags', value: tags });
- sections.push({ kind: 'blank' });
-
- sections.push({ kind: 'section', text: 'CONFIRMATIONS' });
- sections.push({ kind: 'kv', label: 'Required', value: String(required) });
- sections.push({ kind: 'kv', label: 'Confirmed', value: String(confirmedCount) });
- if (confirmedBy.length) {
- for (const f of confirmedBy) sections.push({ kind: 'kv', label: 'Signed by', value: fmt(f) });
- }
- sections.push({ kind: 'blank' });
-
- sections.push({ kind: 'section', text: 'BLOCK VERIFICATION' });
- if (b && b.id) {
- sections.push({ kind: 'kv', label: 'Block ID', value: fmt(b.id) });
- if (b.ts) sections.push({ kind: 'kv', label: 'Block Timestamp', value: fmtDate(b.ts) });
- if (b.type) sections.push({ kind: 'kv', label: 'Block Type', value: String(b.type).toUpperCase() });
- if (b.author) sections.push({ kind: 'kv', label: 'Block Author', value: fmt(b.author) });
- if (b.size) sections.push({ kind: 'kv', label: 'Block Size', value: `${b.size} bytes` });
- } else {
- sections.push({ kind: 'kv', label: 'Block ID', value: fmt(t.id) });
- }
- sections.push({ kind: 'blank' });
-
- sections.push({ kind: 'section', text: 'METADATA' });
- sections.push({ kind: 'kv', label: 'Transfer ID', value: fmt(t.id) });
- if (t.createdAt) sections.push({ kind: 'kv', label: 'Created At', value: fmtDate(t.createdAt) });
- if (t.updatedAt) sections.push({ kind: 'kv', label: 'Updated At', value: fmtDate(t.updatedAt) });
-
- const lines = [];
- for (const s of sections) {
- if (s.kind === 'kv') {
- const txt = `${s.label}: ${s.value}`;
- for (const w of wrap(txt, 82)) lines.push({ kind: 'kv', text: w });
- } else {
- lines.push(s);
- }
- }
-
- 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('OASIS - Smart Contract')}) Tj\nET`);
- const prefix = '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(viewerId || ''))}) 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 = { buildSmartContractPdf };
diff --git a/src/backend/updater.js b/src/backend/updater.js
index bb2d660..2f6f3b3 100644
--- a/src/backend/updater.js
+++ b/src/backend/updater.js
@@ -1,12 +1,50 @@
-const fetch = require('../server/node_modules/node-fetch');
const { existsSync, readFileSync, writeFileSync, unlinkSync } = require('fs');
const { join } = require('path');
const localpackage = join(__dirname, '../server/package.json');
-const remoteUrl = 'https://code.03c8.net/KrakensLab/oasis/raw/master/src/server/package.json'; // Official SNH-Oasis
-const remoteUrl2 = 'https://raw.githubusercontent.com/epsylon/oasis/refs/heads/main/src/server/package.json'; // Mirror SNH-Oasis
+const remoteUrl = 'https://code.03c8.net/KrakensLab/oasis/raw/master/src/server/package.json';
+const remoteUrl2 = 'https://raw.githubusercontent.com/epsylon/oasis/refs/heads/main/src/server/package.json';
let printed = false;
+const repoRoot = join(__dirname, '..', '..');
+const updateFlagFile = join(__dirname, '../server/.update_required');
+
+const git = (args, cwd = repoRoot) => new Promise((resolve) => {
+ require('child_process').execFile('git', args, { cwd, timeout: 60000, env: { ...process.env, GIT_TERMINAL_PROMPT: '0' } }, (err, out) => resolve(err ? '' : String(out || '').trim()));
+});
+const commitOf = (line) => {
+ const [hash, date, ...rest] = String(line || '').split('\t');
+ return hash ? { hash, date: date || '', subject: rest.join('\t') } : null;
+};
+const cleanOrigin = (url) => String(url || '').replace(/\/\/[^@\/]*@/, '//').replace(/\.git$/, '');
+
+async function collectDetails(root = repoRoot) {
+ if (!existsSync(join(root, '.git'))) return null;
+ const installed = commitOf(await git(['log', '-1', '--format=%h%x09%cI%x09%s'], root));
+ await git(['fetch', '--quiet'], root);
+ const upstream = (await git(['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{u}'], root)) || 'origin/master';
+ const available = commitOf(await git(['log', '-1', '--format=%h%x09%cI%x09%s', upstream], root));
+ const commits = (await git(['log', '--format=%h%x09%cI%x09%s', '-n', '10', `HEAD..${upstream}`], root)).split('\n').map(commitOf).filter(Boolean);
+ const count = Number(await git(['rev-list', '--count', `HEAD..${upstream}`], root)) || commits.length;
+ const stat = await git(['diff', '--shortstat', 'HEAD', upstream], root);
+ const num = (re) => { const m = stat.match(re); return m ? Number(m[1]) : 0; };
+ return {
+ installed, available, commits, count,
+ files: num(/(\d+) files? changed/), insertions: num(/(\d+) insertions?/), deletions: num(/(\d+) deletions?/),
+ origin: cleanOrigin(await git(['remote', 'get-url', 'origin'], root))
+ };
+}
+exports.collectDetails = collectDetails;
+
+exports.readUpdateInfo = () => {
+ if (!existsSync(updateFlagFile)) return null;
+ try {
+ const info = JSON.parse(readFileSync(updateFlagFile, 'utf8'));
+ return info && info.required ? info : { required: true };
+ } catch (_) {
+ return { required: true };
+ }
+};
async function extractVersionFromText(text) {
try {
@@ -33,11 +71,22 @@ async function diffVersion(body, callback) {
const updateFlagPath = join(__dirname, "../server/.update_required");
if (remoteVersion !== localVersion) {
- writeFileSync(updateFlagPath, JSON.stringify({ required: true }));
+ const alreadyKnown = existsSync(updateFlagPath);
+ writeFileSync(updateFlagPath, JSON.stringify({ required: true, version: remoteVersion, installedVersion: localVersion }));
+ collectDetails().then((details) => {
+ if (details && existsSync(updateFlagPath)) writeFileSync(updateFlagPath, JSON.stringify({ required: true, version: remoteVersion, installedVersion: localVersion, details }));
+ }).catch(() => {});
+ if (!alreadyKnown) {
+ try {
+ const { notify, i18nNow } = require('./desktopNotify');
+ const i18n = i18nNow();
+ notify(i18n.notifyUpdateLabel, `${i18n.updateBannerText} (${remoteVersion})`);
+ } catch (_) {}
+ }
callback("required");
} else {
if (existsSync(updateFlagPath)) unlinkSync(updateFlagPath);
- callback(""); // no updates required
+ callback("");
}
} catch (error) {
console.error("Error comparing versions:", error.message);
@@ -49,15 +98,8 @@ async function checkMirror(callback) {
try {
const response = await fetch(remoteUrl2, {
method: 'GET',
- headers: {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- 'Accept': 'application/json, text/plain, */*',
- 'Accept-Language': 'en-US,en;q=0.9',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Connection': 'keep-alive',
- 'Referer': 'https://raw.githubusercontent.com',
- 'Origin': 'https://raw.githubusercontent.com'
- }
+ headers: { 'Accept': 'application/json, text/plain, */*' },
+ signal: AbortSignal.timeout(20000)
});
if (!response.ok) {
@@ -72,20 +114,154 @@ async function checkMirror(callback) {
}
}
+const networkAllowed = () => {
+ if (process.argv.includes('--offline') || process.env.OASIS_NETWORK_PAUSED === '1') return false;
+ try { if (require('../server/ssb_config').offline === true) return false; } catch (_) {}
+ try { if (require('../configs/config-manager.js').getConfig().networkPaused === true) return false; } catch (_) {}
+ return true;
+};
+
+const MOBILE_RELEASE_SOURCES = [
+ { url: 'https://code.03c8.net/KrakensLab/oasis/releases', type: 'html' },
+ { url: 'https://api.github.com/repos/epsylon/oasis/releases?per_page=20', type: 'json' }
+];
+const MOBILE_APK_RE = /^oasis-v(\d+\.\d+\.\d+)\.apk$/i;
+const MOBILE_APK_HTML_RE = /oasis-v(\d+\.\d+\.\d+)\.apk/i;
+const ECOIN_RELEASES_API = 'https://api.github.com/repos/epsylon/ecoin/releases?per_page=20';
+const ECOIN_RELEASES_PAGE = 'https://github.com/epsylon/ecoin/releases';
+const ECOIN_APK_RE = /^ecoin-wallet-v(\d+(?:\.\d+)*)\.apk$/i;
+const MOBILE_FETCH_HEADERS = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
+ 'Accept-Language': 'en-US,en;q=0.9'
+};
+
+let ecoinWalletApk = '';
+
+const versionParts = (v) => String(v || '').split('.').map(n => parseInt(n, 10) || 0);
+
+const isNewerVersion = (remote, local) => {
+ const a = versionParts(remote), b = versionParts(local);
+ const len = Math.max(a.length, b.length, 3);
+ for (let i = 0; i < len; i++) {
+ if ((a[i] || 0) !== (b[i] || 0)) return (a[i] || 0) > (b[i] || 0);
+ }
+ return false;
+};
+
+const localMobileVersion = () => {
+ const fromEnv = String(process.env.OASIS_ANDROID_VERSION || '').split('-')[0].trim();
+ if (fromEnv) return fromEnv;
+ try {
+ return JSON.parse(readFileSync(localpackage, 'utf8')).version || '';
+ } catch (error) {
+ return '';
+ }
+};
+
+const pickReleaseFromJson = (releases) => {
+ for (const rel of Array.isArray(releases) ? releases : []) {
+ if (!rel || rel.draft) continue;
+ for (const asset of Array.isArray(rel.assets) ? rel.assets : []) {
+ const match = MOBILE_APK_RE.exec(String((asset && asset.name) || ''));
+ if (match) {
+ return {
+ version: match[1],
+ page: String(rel.html_url || ''),
+ apk: String(asset.browser_download_url || '')
+ };
+ }
+ }
+ }
+ return null;
+};
+
+const pickReleaseFromHtml = (html, pageUrl) => {
+ const match = MOBILE_APK_HTML_RE.exec(String(html || ''));
+ return match ? { version: match[1], page: pageUrl, apk: '' } : null;
+};
+
+const fetchMobileRelease = async (source) => {
+ const isHtml = source.type === 'html';
+ const response = await fetch(source.url, {
+ method: 'GET',
+ headers: { ...MOBILE_FETCH_HEADERS, 'Accept': isHtml ? 'text/html,application/xhtml+xml' : 'application/json, text/plain, */*' }
+ });
+ if (!response.ok) throw new Error(`Request failed with status ${response.status}`);
+ return isHtml
+ ? pickReleaseFromHtml(await response.text(), source.url)
+ : pickReleaseFromJson(await response.json());
+};
+
+const refreshEcoinWalletApk = async () => {
+ try {
+ const response = await fetch(ECOIN_RELEASES_API, {
+ method: 'GET',
+ headers: { ...MOBILE_FETCH_HEADERS, 'Accept': 'application/json, text/plain, */*' }
+ });
+ if (!response.ok) return;
+ const releases = await response.json();
+ let best = null;
+ for (const rel of Array.isArray(releases) ? releases : []) {
+ if (!rel || rel.draft) continue;
+ for (const asset of Array.isArray(rel.assets) ? rel.assets : []) {
+ const match = ECOIN_APK_RE.exec(String((asset && asset.name) || ''));
+ if (!match || !asset.browser_download_url) continue;
+ if (!best || isNewerVersion(match[1], best.version)) best = { version: match[1], apk: String(asset.browser_download_url) };
+ }
+ }
+ if (best) ecoinWalletApk = best.apk;
+ } catch (error) {}
+};
+
+exports.ecoinWalletDownloadUrl = () => {
+ if (String(process.env.OASIS_ANDROID_INSTALLER || '') === 'com.android.vending') return ECOIN_RELEASES_PAGE;
+ if (!ecoinWalletApk) refreshEcoinWalletApk();
+ return ecoinWalletApk || ECOIN_RELEASES_PAGE;
+};
+
+exports.getMobileRemoteVersion = async () => {
+ await refreshEcoinWalletApk();
+ if (String(process.env.OASIS_ANDROID_INSTALLER || '') === 'com.android.vending') return;
+ const localVersion = localMobileVersion();
+ if (!localVersion) return;
+ const updateFlagPath = join(__dirname, '../server/.update_required');
+ const found = [];
+ for (const source of MOBILE_RELEASE_SOURCES) {
+ try {
+ const candidate = await fetchMobileRelease(source);
+ if (candidate) found.push(candidate);
+ } catch (error) {}
+ }
+ if (!found.length) return;
+ const top = found.reduce((best, r) => (isNewerVersion(r.version, best.version) ? r : best), found[0]);
+ const sameVersion = found.filter(r => r.version === top.version);
+ const withApk = sameVersion.find(r => r.apk);
+ const release = { version: top.version, page: sameVersion[0].page, apk: withApk ? withApk.apk : '' };
+ if (isNewerVersion(release.version, localVersion)) {
+ try {
+ writeFileSync(updateFlagPath, JSON.stringify({
+ required: true,
+ version: release.version,
+ installedVersion: localVersion,
+ page: release.page || release.apk,
+ apk: release.apk
+ }));
+ } catch (error) {}
+ console.log(`\noasis@version: Oasis ${release.version} is available at ${release.apk || release.page}\n`);
+ } else if (existsSync(updateFlagPath)) {
+ try { unlinkSync(updateFlagPath); } catch (error) {}
+ }
+};
+
exports.getRemoteVersion = async () => {
- if (existsSync('../../.git')) {
+ if (process.env.OASIS_MOBILE === '1') return exports.getMobileRemoteVersion();
+ if (!networkAllowed()) return;
+ if (existsSync(join(__dirname, '..', '..', '.git'))) {
try {
const response = await fetch(remoteUrl, {
method: 'GET',
- headers: {
- 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
- 'Accept': 'application/json, text/plain, */*',
- 'Accept-Language': 'en-US,en;q=0.9',
- 'Accept-Encoding': 'gzip, deflate, br',
- 'Connection': 'keep-alive',
- 'Referer': 'https://code.03c8.net',
- 'Origin': 'https://code.03c8.net'
- }
+ headers: { 'Accept': 'application/json, text/plain, */*' },
+ signal: AbortSignal.timeout(20000)
});
if (!response.ok) {
diff --git a/src/backend/vote_tally.js b/src/backend/vote_tally.js
index 54f02af..d8e4599 100644
--- a/src/backend/vote_tally.js
+++ b/src/backend/vote_tally.js
@@ -1,116 +1,119 @@
-const buildVoteTally = (messages) => {
- const nodes = new Map();
- const ballots = [];
+const INSTITUTIONAL_VOTE_TAG = /^(gov|govMethod|courtsCase|courtsMethod):/;
- for (const m of messages) {
+const msOf = (v) => {
+ const t = Date.parse(v);
+ return Number.isFinite(t) ? t : null;
+};
+
+const isLater = (a, b) => a.ts > b.ts || (a.ts === b.ts && a.seq > b.seq);
+
+const legacyChoice = (kid, parent, options) => {
+ const kVoters = Array.isArray(kid.content.voters) ? kid.content.voters : [];
+ const pVoters = Array.isArray(parent.content.voters) ? parent.content.voters : [];
+ if (!kVoters.includes(kid.author) || pVoters.includes(kid.author)) return null;
+ const kVotes = kid.content.votes || {};
+ const pVotes = parent.content.votes || {};
+ let choice = null;
+ for (const o of options) {
+ const d = (Number(kVotes[o]) || 0) - (Number(pVotes[o]) || 0);
+ if (d === 0) continue;
+ if (d !== 1 || choice !== null) return null;
+ choice = o;
+ }
+ return choice;
+};
+
+const buildVoteResults = (messages) => {
+ const nodes = new Map();
+ const ballotsByTarget = new Map();
+
+ for (const m of messages || []) {
const v = m && m.value;
const c = v && v.content;
if (!c) continue;
- if (c.type === 'votesVote') { if (c.target) ballots.push({ target: c.target, author: v.author, choice: c.choice }); continue; }
+ const ts = Number(v.timestamp || m.timestamp || 0) || 0;
+ const seq = Number(v.sequence || 0) || 0;
+ if (c.type === 'votesVote') {
+ if (typeof c.target !== 'string' || !v.author) continue;
+ if (!ballotsByTarget.has(c.target)) ballotsByTarget.set(c.target, []);
+ ballotsByTarget.get(c.target).push({ author: v.author, choice: c.choice, ts, seq });
+ continue;
+ }
if (c.type !== 'votes') continue;
- nodes.set(m.key, { key: m.key, author: v.author, content: c, ts: v.timestamp || m.timestamp || 0 });
+ nodes.set(m.key, { key: m.key, author: v.author, content: c, ts, seq });
}
const prev = new Map();
for (const [k, n] of nodes) {
const t = n.content.replaces;
- if (typeof t === 'string' && nodes.has(t)) prev.set(k, t);
- }
- const childrenOf = new Map();
- for (const [k, p] of prev) {
- if (!childrenOf.has(p)) childrenOf.set(p, []);
- childrenOf.get(p).push(k);
+ if (typeof t === 'string' && t !== k && nodes.has(t)) prev.set(k, t);
}
const rootOf = (k) => { let x = k, g = 0; while (prev.has(x) && g++ < 100000) x = prev.get(x); return x; };
const groups = new Map();
for (const k of nodes.keys()) { const r = rootOf(k); if (!groups.has(r)) groups.set(r, []); groups.get(r).push(k); }
- const tallyByKey = new Map();
+ const results = new Map();
for (const [root, keys] of groups.entries()) {
const rootNode = nodes.get(root);
if (!rootNode) continue;
- const options = Array.isArray(rootNode.content.options) ? rootNode.content.options : [];
- let votesMap = Object.assign({}, rootNode.content.votes || {});
- let voters = Array.isArray(rootNode.content.voters) ? rootNode.content.voters.slice() : [];
- for (const o of options) if (!(o in votesMap)) votesMap[o] = 0;
-
- let cur = root;
- let g = 0;
- let creatorChoice = null;
- let creatorCounted = false;
- while (g++ < 100000) {
- const kids = (childrenOf.get(cur) || []).map(k => nodes.get(k)).filter(Boolean).sort((a, b) => a.ts - b.ts);
- if (!kids.length) break;
- let advanced = false;
- for (const kid of kids) {
- const kVotes = Object.assign({}, kid.content.votes || {});
- const kVoters = Array.isArray(kid.content.voters) ? kid.content.voters.slice() : [];
- for (const o of options) if (!(o in kVotes)) kVotes[o] = 0;
- if (kid.author === rootNode.author) {
- if (!creatorCounted && kVoters.includes(rootNode.author) && !voters.includes(rootNode.author)) {
- creatorCounted = true;
- let inc = null;
- let incCount = 0;
- for (const o of options) {
- const d = (Number(kVotes[o]) || 0) - (Number(votesMap[o]) || 0);
- if (d >= 1) { inc = o; incCount++; }
- }
- if (incCount === 1) creatorChoice = inc;
- }
- votesMap = kVotes;
- voters = kVoters;
- cur = kid.key;
- advanced = true;
- break;
- }
- if (voters.includes(kid.author)) continue;
- if (kVoters.length !== voters.length + 1) continue;
- const added = kVoters.filter(x => !voters.includes(x));
- if (added.length !== 1 || added[0] !== kid.author) continue;
- let deltas = 0;
- let deltaOk = true;
- for (const o of options) {
- const d = (Number(kVotes[o]) || 0) - (Number(votesMap[o]) || 0);
- if (d === 0) continue;
- if (d === 1) { deltas++; continue; }
- deltaOk = false;
- break;
- }
- if (!deltaOk || deltas !== 1) continue;
- votesMap = kVotes;
- voters = kVoters;
- cur = kid.key;
- advanced = true;
- break;
+ const creator = rootNode.author;
+ const tags = Array.isArray(rootNode.content.tags) ? rootNode.content.tags : [];
+ const frozen = tags.some(t => INSTITUTIONAL_VOTE_TAG.test(String(t)));
+ let current = rootNode;
+ if (!frozen) {
+ for (const k of keys) {
+ const n = nodes.get(k);
+ if (n.author === creator && isLater(n, current)) current = n;
}
- if (!advanced) break;
+ }
+ const options = Array.isArray(current.content.options) ? current.content.options.filter(o => typeof o === 'string') : [];
+ const deadline = typeof current.content.deadline === 'string' ? current.content.deadline : null;
+ const opensAt = rootNode.ts;
+ const closesAt = deadline ? msOf(deadline) : null;
+
+ const cast = [];
+ for (const k of keys) {
+ for (const b of ballotsByTarget.get(k) || []) cast.push(b);
+ const n = nodes.get(k);
+ if (n.author === creator || !prev.has(k)) continue;
+ const choice = legacyChoice(n, nodes.get(prev.get(k)), options);
+ if (choice !== null) cast.push({ author: n.author, choice, ts: n.ts, seq: n.seq });
}
- if (voters.includes(rootNode.author)) {
- voters = voters.filter(x => x !== rootNode.author);
- if (creatorChoice && (Number(votesMap[creatorChoice]) || 0) > 0) votesMap[creatorChoice] = votesMap[creatorChoice] - 1;
- }
-
- const voterSet = new Set(voters);
- let totalVotes = voters.length;
- const chainKeys = new Set(keys);
- for (const b of ballots) {
- if (!chainKeys.has(b.target)) continue;
- if (b.author === rootNode.author) continue;
- if (!b.author || voterSet.has(b.author)) continue;
+ const latest = new Map();
+ for (const b of cast) {
+ if (!b.author || b.author === creator) continue;
if (!options.includes(b.choice)) continue;
- voterSet.add(b.author);
- voters.push(b.author);
- votesMap[b.choice] = (votesMap[b.choice] || 0) + 1;
- totalVotes += 1;
+ if (b.ts < opensAt) continue;
+ if (closesAt !== null && b.ts > closesAt) continue;
+ const known = latest.get(b.author);
+ if (!known || isLater(b, known)) latest.set(b.author, b);
}
- const tally = { votes: votesMap, voters, totalVotes };
- for (const k of keys) tallyByKey.set(k, tally);
+ const votes = {};
+ for (const o of options) votes[o] = 0;
+ const voters = [];
+ for (const b of [...latest.values()].sort((a, b) => a.ts - b.ts || a.seq - b.seq)) {
+ votes[b.choice] = (votes[b.choice] || 0) + 1;
+ voters.push(b.author);
+ }
+
+ const result = { votes, voters, totalVotes: voters.length, creator, rootId: root, deadline, options };
+ for (const k of keys) results.set(k, result);
}
+ return results;
+};
+
+const buildVoteTally = (messages) => {
+ const shared = new Map();
+ const tallyByKey = new Map();
+ for (const [k, r] of buildVoteResults(messages)) {
+ if (!shared.has(r)) shared.set(r, { votes: r.votes, voters: r.voters, totalVotes: r.totalVotes });
+ tallyByKey.set(k, shared.get(r));
+ }
return tallyByKey;
};
-module.exports = { buildVoteTally };
+module.exports = { buildVoteTally, buildVoteResults };
diff --git a/src/backend/wallet_addresses.js b/src/backend/wallet_addresses.js
deleted file mode 100644
index ada6f20..0000000
--- a/src/backend/wallet_addresses.js
+++ /dev/null
@@ -1,17 +0,0 @@
-const fs = require("fs");
-const path = require("path");
-
-const STORAGE_DIR = path.join(__dirname, "..", "configs");
-const ADDR_PATH = path.join(STORAGE_DIR, "wallet-addresses.json");
-
-function ensure() {
- if (!fs.existsSync(STORAGE_DIR)) fs.mkdirSync(STORAGE_DIR, { recursive: true });
- if (!fs.existsSync(ADDR_PATH)) fs.writeFileSync(ADDR_PATH, "{}");
-}
-function readAll() { ensure(); return JSON.parse(fs.readFileSync(ADDR_PATH, "utf8")); }
-function writeAll(m) { fs.writeFileSync(ADDR_PATH, JSON.stringify(m, null, 2)); }
-
-async function getAddress(userId) { const m = readAll(); return m[userId] || null; }
-async function setAddress(userId, address) { const m = readAll(); m[userId] = address; writeAll(m); return true; }
-
-module.exports = { getAddress, setAddress };
diff --git a/src/client/assets/images/theme-clear-snh.png b/src/client/assets/images/theme-clear-snh.png
new file mode 100644
index 0000000..b759e6b
Binary files /dev/null and b/src/client/assets/images/theme-clear-snh.png differ
diff --git a/src/client/assets/images/theme-dark-snh.png b/src/client/assets/images/theme-dark-snh.png
new file mode 100644
index 0000000..76c9fa0
Binary files /dev/null and b/src/client/assets/images/theme-dark-snh.png differ
diff --git a/src/client/assets/images/theme-matrix-snh.png b/src/client/assets/images/theme-matrix-snh.png
new file mode 100644
index 0000000..a3b8d41
Binary files /dev/null and b/src/client/assets/images/theme-matrix-snh.png differ
diff --git a/src/client/assets/images/theme-purple-snh.png b/src/client/assets/images/theme-purple-snh.png
new file mode 100644
index 0000000..ab9fffc
Binary files /dev/null and b/src/client/assets/images/theme-purple-snh.png differ
diff --git a/src/client/assets/images/ux-feed.png b/src/client/assets/images/ux-feed.png
new file mode 100644
index 0000000..cdcb882
Binary files /dev/null and b/src/client/assets/images/ux-feed.png differ
diff --git a/src/client/assets/images/ux-phone.png b/src/client/assets/images/ux-phone.png
new file mode 100644
index 0000000..f160c47
Binary files /dev/null and b/src/client/assets/images/ux-phone.png differ
diff --git a/src/client/assets/images/world-map.svg b/src/client/assets/images/world-map.svg
deleted file mode 100644
index cf308be..0000000
--- a/src/client/assets/images/world-map.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-
diff --git a/src/client/assets/images/worldmap-z2.png b/src/client/assets/images/worldmap-z2.png
deleted file mode 100644
index ce8e6ac..0000000
Binary files a/src/client/assets/images/worldmap-z2.png and /dev/null differ
diff --git a/src/client/assets/styles/mobile.css b/src/client/assets/styles/mobile.css
index 81cc969..d21d651 100644
--- a/src/client/assets/styles/mobile.css
+++ b/src/client/assets/styles/mobile.css
@@ -261,7 +261,7 @@ h3 { font-size: 1em !important; }
display: flex !important;
flex-direction: row !important;
flex-wrap: wrap !important;
- justify-content: center !important;
+ justify-content: flex-start !important;
align-items: center !important;
width: 100% !important;
max-width: 100% !important;
@@ -288,8 +288,8 @@ h3 { font-size: 1em !important; }
}
.inhabitant-action .filter-btn {
min-height: 0 !important;
- padding: 7px 12px !important;
- font-size: 13px !important;
+ padding: 2px 9px !important;
+ font-size: .75em !important;
white-space: nowrap !important;
}
.profile-sensors-box {
@@ -315,8 +315,8 @@ h3 { font-size: 1em !important; }
.activity-filter-col .filter-btn,
.activity-sub-filter .filter-btn {
min-height: 0 !important;
- padding: 7px 12px !important;
- font-size: 13px !important;
+ padding: 2px 9px !important;
+ font-size: .75em !important;
white-space: nowrap !important;
}
@@ -450,10 +450,6 @@ h3 { font-size: 1em !important; }
grid-template-columns: repeat(2, 1fr) !important;
}
-.tribe-media-grid {
- grid-template-columns: repeat(2, 1fr) !important;
-}
-
.tribe-overview-grid {
grid-template-columns: 1fr !important;
}
@@ -466,24 +462,11 @@ h3 { font-size: 1em !important; }
height: 180px !important;
}
-.tribe-votation-option {
- flex-direction: column !important;
- align-items: flex-start !important;
-}
-
.tribe-content-header {
flex-direction: column !important;
gap: 8px !important;
}
-.tribe-content-filters {
- flex-wrap: wrap !important;
-}
-
-.tribe-media-filters {
- flex-wrap: wrap !important;
-}
-
.forum-card {
flex-direction: column !important;
}
@@ -626,6 +609,7 @@ a.filter-btn,
width: 100% !important;
max-width: 100% !important;
min-width: 0 !important;
+ flex: 0 0 auto !important;
height: 42px !important;
font-size: 16px !important;
box-sizing: border-box !important;
@@ -672,7 +656,7 @@ a.filter-btn,
padding: 9px 16px !important;
}
.filters .ui-toolbar--filters {
- justify-content: center !important;
+ justify-content: flex-start !important;
align-items: center !important;
gap: 6px !important;
}
@@ -728,6 +712,15 @@ a.filter-btn,
max-width: 100% !important;
overflow-wrap: anywhere !important;
}
+.card-field .card-value.user-link,
+.card-field .card-value .user-link {
+ display: inline-block !important;
+ vertical-align: bottom !important;
+ max-width: 100% !important;
+ white-space: nowrap !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+}
.market-grid,
.shop-products-grid,
@@ -817,14 +810,14 @@ a.filter-btn,
margin-left: 0 !important;
}
-.oasis-id-copy {
+input.oasis-id-copy[readonly] {
width: 100% !important;
max-width: 100% !important;
box-sizing: border-box !important;
font-family: monospace !important;
- font-size: 12px !important;
+ font-size: clamp(8px, 2.5vw, 12px) !important;
text-align: center !important;
- padding: 8px !important;
+ padding: 8px 6px !important;
border: 1px solid #FFA500 !important;
border-radius: 8px !important;
background: rgba(255, 165, 0, 0.08) !important;
@@ -849,6 +842,7 @@ a.create-button {
.peers-list .block-info-table,
.peers-technical-block .block-info-table,
+.parliament-rows-table,
.gov-overview {
display: block !important;
width: 100% !important;
@@ -859,17 +853,20 @@ a.create-button {
}
.peers-list .block-info-table tbody,
.peers-technical-block .block-info-table tbody,
+.parliament-rows-table tbody,
.gov-overview tbody {
display: block !important;
width: 100% !important;
}
-.gov-overview thead { display: none !important; }
+.gov-overview thead,
+.parliament-rows-table thead { display: none !important; }
.peers-list .block-info-table tr:first-child,
.peers-technical-block .block-info-table tr:first-child {
display: none !important;
}
.peers-list .block-info-table tr,
.peers-technical-block .block-info-table tr,
+.parliament-rows-table tbody tr,
.gov-overview tbody tr {
display: block !important;
width: 100% !important;
@@ -882,6 +879,7 @@ a.create-button {
}
.peers-list .block-info-table td,
.peers-technical-block .block-info-table td,
+.parliament-rows-table tbody td,
.gov-overview tbody td {
display: flex !important;
justify-content: space-between !important;
@@ -897,6 +895,7 @@ a.create-button {
}
.peers-list .block-info-table td::before,
.peers-technical-block .block-info-table td::before,
+.parliament-rows-table tbody td::before,
.gov-overview tbody td::before {
content: attr(data-label);
flex: 0 0 auto !important;
@@ -913,6 +912,121 @@ a.create-button {
.peers-technical-block .block-info-table td[data-label=""]::before { content: none !important; }
.peers-list .block-info-table td .peer-key,
.peers-technical-block .block-info-table td .peer-key { text-align: right !important; }
+.phone-history td.phone-dir,
+.phone-contact .phone-dir,
+.phone-dir {
+ display: none !important;
+}
+.phone-contact {
+ gap: 6px !important;
+ padding: 8px !important;
+}
+.phone-contact .user-link {
+ flex: 1 1 100% !important;
+ min-width: 0 !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+}
+.phone-contact .date-link {
+ flex: 0 1 auto !important;
+ font-size: 12px !important;
+}
+.phone-history,
+.phone-history tbody {
+ display: block !important;
+ width: 100% !important;
+}
+.phone-history tr:first-child {
+ display: none !important;
+}
+.phone-history tr {
+ display: block !important;
+ width: 100% !important;
+ box-sizing: border-box !important;
+ border: 1px solid #444 !important;
+ border-radius: 10px !important;
+ margin: 0 0 8px 0 !important;
+ padding: 4px 10px !important;
+}
+.phone-history td {
+ display: flex !important;
+ justify-content: space-between !important;
+ align-items: baseline !important;
+ gap: 10px !important;
+ width: 100% !important;
+ border: 0 !important;
+ padding: 3px 0 !important;
+ font-size: 12px !important;
+ text-align: right !important;
+}
+.phone-history td::before {
+ content: attr(data-label);
+ flex: 0 0 auto !important;
+ font-weight: 700 !important;
+ text-transform: uppercase;
+ font-size: 10px !important;
+ letter-spacing: .03em;
+ opacity: .7 !important;
+ text-align: left !important;
+ white-space: nowrap !important;
+}
+.phone-history td.phone-row-actions {
+ justify-content: flex-end !important;
+ padding: 0 !important;
+ margin-top: -6px !important;
+}
+.phone-history .phone-row-delete .btn-singleview,
+.phone-latest-row .phone-row-delete .btn-singleview {
+ width: 32px !important;
+ height: 32px !important;
+ min-width: 0 !important;
+ min-height: 0 !important;
+ line-height: 1 !important;
+ padding: 0 !important;
+ font-size: 14px !important;
+}
+.phone-history td.phone-row-actions::before {
+ content: none !important;
+}
+.phone-latest-row .phone-row-delete {
+ margin-left: auto !important;
+}
+.phone-history td .user-link {
+ min-width: 0 !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+}
+.peers-list .block-info-table td .ubi-tick-ok,
+.peers-list .block-info-table td .peer-tor-no,
+.peers-technical-block .block-info-table td .ubi-tick-ok,
+.peers-technical-block .block-info-table td .peer-tor-no {
+ padding: 0 !important;
+ line-height: 1.2 !important;
+}
+
+.conn-actions,
+.peers-conn-actions {
+ display: flex !important;
+ flex-direction: row !important;
+ flex-wrap: wrap !important;
+ gap: 8px !important;
+ width: 100% !important;
+}
+.conn-actions form,
+.peers-conn-actions form {
+ flex: 1 1 45% !important;
+ min-width: 130px !important;
+ max-width: 100% !important;
+ margin: 0 !important;
+ display: block !important;
+}
+.conn-actions form button,
+.peers-conn-actions form button {
+ width: 100% !important;
+ min-width: 0 !important;
+}
.relationship-status .relationship-actions { flex-direction: column !important; align-items: stretch !important; gap: 8px !important; }
.relationship-status .relationship-actions form,
@@ -921,10 +1035,21 @@ a.create-button {
.profile-sensors-box { align-items: center !important; text-align: center !important; }
.profile-sensors-box > * { margin-left: auto !important; margin-right: auto !important; justify-content: center !important; }
-.tribe-feed .refeed-column,
-.tribe-feed-full .refeed-column { align-self: center !important; align-items: center !important; justify-content: center !important; }
-.tribe-feed .card-footer,
-.tribe-feed-full .card-footer { display: flex !important; flex-direction: column !important; align-items: center !important; text-align: center !important; gap: 2px !important; }
+.profile-layout,
+.profile-layout .tribe-side,
+.profile-layout .tribe-main {
+ width: 100% !important;
+ max-width: 100% !important;
+ min-width: 0 !important;
+ box-sizing: border-box !important;
+}
+.profile-side-description,
+.profile-side-description p,
+.trending-card .card-section,
+.feed-text {
+ word-break: normal !important;
+ overflow-wrap: break-word !important;
+}
.invite-qr-card { display: flex !important; justify-content: center !important; border: none !important; background: transparent !important; padding: 0 !important; box-shadow: none !important; margin: 0 auto !important; }
.invite-qr-img { display: block; margin: 0 auto; }
@@ -942,3 +1067,445 @@ a.create-button {
.chat-messages-list { padding: 0 !important; }
.chat-message { max-width: 92% !important; }
.chat-message.chat-poll { max-width: 97% !important; }
+.feed-workspace {
+ display: block !important;
+}
+.feed-side {
+ display: none !important;
+}
+.tribe-info-table,
+.tribe-info-table tbody,
+.tribe-info-table tr,
+.tribe-info-table td {
+ display: block !important;
+ width: 100% !important;
+ max-width: 100% !important;
+ box-sizing: border-box !important;
+ text-align: left !important;
+ overflow: visible !important;
+}
+.tribe-info-table td .user-link {
+ display: inline-block !important;
+ max-width: 100% !important;
+ white-space: nowrap !important;
+ overflow: hidden !important;
+ text-overflow: ellipsis !important;
+}
+.school-lesson-summary {
+ flex-wrap: wrap !important;
+}
+.school-lesson-summary-title {
+ flex: 1 1 100% !important;
+ min-width: 0 !important;
+ white-space: normal !important;
+ overflow-wrap: anywhere !important;
+}
+.school-lesson-summary-meta {
+ flex: 1 1 100% !important;
+ white-space: normal !important;
+}
+.feed-votes-summary {
+ flex-wrap: wrap !important;
+ max-width: 100% !important;
+ min-width: 0 !important;
+}
+.feed-votes-summary .vote-category {
+ white-space: nowrap !important;
+ flex: 0 0 auto !important;
+}
+.tribe-open-invite-code {
+ font-size: .85em !important;
+}
+
+.school-progress-row {
+ flex-direction: column !important;
+ align-items: flex-start !important;
+ gap: 6px !important;
+}
+.school-progress-issue {
+ width: 100% !important;
+}
+.school-progress-issue input[type="text"] {
+ max-width: 100% !important;
+ flex: 1 1 100% !important;
+}
+
+.subscription-box-block {
+ display: flex !important;
+ flex-wrap: wrap !important;
+ align-items: center !important;
+ gap: 8px !important;
+}
+.subscription-box-block .subscription-form { margin: 0 !important; }
+
+.profile-module-section,
+.profile-module-section .trending-card,
+.profile-module-section .card-body,
+.profile-module-section .card-section {
+ width: 100% !important;
+ max-width: 100% !important;
+ min-width: 0 !important;
+ box-sizing: border-box !important;
+}
+.card-section-action {
+ display: flex !important;
+ justify-content: center !important;
+ width: 100% !important;
+}
+.card-section-action .keep-reading-link {
+ text-align: center !important;
+}
+.card-field.image-container,.card-field.video-container,.card-field.audio-container { justify-content: center !important; }
+.card-field.media-left { justify-content: flex-start !important; }
+
+.card-footer .date-link,
+.card-footer .user-link { padding: 0 10px !important; font-size: 12px !important; }
+.card-meta-row .opinions-summary,
+.card-meta-row .comments-summary-link { padding: 0 10px !important; font-size: 12px !important; }
+
+.parliament-rows-table tbody td[data-label=""] { justify-content: center !important; }
+.parliament-rows-table tbody td[data-label=""]::before { content: none !important; }
+.parliament-rows-table tbody td .parliament-avatar-cell {
+ display: flex !important;
+ align-items: center !important;
+ gap: 8px !important;
+ justify-content: flex-end !important;
+}
+.parliament-rows-table tbody td .parliament-leader-avatar { width: 32px !important; height: 32px !important; }
+.parliament-rows-table tbody td .parliament-method-img { max-height: 28px !important; width: auto !important; }
+.parliament-rows-table tbody td form { margin: 0 !important; }
+
+.hemi-legend {
+ flex-direction: column !important;
+ align-items: flex-start !important;
+ gap: 6px !important;
+ justify-content: flex-start !important;
+}
+.hemi-legend-item {
+ width: 100% !important;
+ flex-wrap: nowrap !important;
+ justify-content: flex-start !important;
+}
+.hemi-legend-count { margin-left: auto !important; }
+.hemi-modes { flex-wrap: wrap !important; }
+.room-item .mailing-archive-head{flex-wrap:wrap}
+
+.oasis-nav-side-toggle {
+ position: absolute !important;
+ width: 1px !important;
+ height: 1px !important;
+ opacity: 0 !important;
+ pointer-events: none !important;
+}
+.oasis-nav-side-toggle ~ .header {
+ display: flex !important;
+ flex-direction: row !important;
+ flex-wrap: wrap !important;
+ align-items: center !important;
+ gap: 8px 6px !important;
+ padding: 8px 8px 4px !important;
+ min-height: 60px !important;
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: 0 !important;
+ z-index: 900 !important;
+ box-sizing: border-box !important;
+}
+.oasis-nav-side-toggle ~ .header + * ,
+.oasis-nav-side-toggle ~ .header ~ .update-banner:first-of-type {
+ margin-top: 0 !important;
+}
+body:has(.oasis-nav-side-toggle) {
+ padding-top: 64px !important;
+}
+body:has(:is(input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]), textarea, select):focus) .oasis-nav-side-toggle ~ .header {
+ position: absolute !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left,
+.oasis-nav-side-toggle ~ .header .top-bar-right,
+.oasis-nav-side-toggle ~ .header .top-bar-mid {
+ display: contents !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left a.logo-icon {
+ order: 1 !important;
+ flex: 0 0 auto !important;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left a.logo-icon img.logo-icon {
+ width: 44px !important;
+ height: 44px !important;
+ margin: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-mobile-menus {
+ order: 2 !important;
+ display: flex !important;
+ flex: 1 1 auto !important;
+ flex-wrap: nowrap !important;
+ justify-content: flex-end !important;
+ align-items: center !important;
+ gap: 5px !important;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-menu-slot {
+ display: inline-flex !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-menu-btn {
+ display: inline-flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ gap: 4px !important;
+ min-height: 44px !important;
+ padding: 6px 9px !important;
+ white-space: nowrap !important;
+ cursor: pointer !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-menu-slot .oasis-menu-close {
+ display: none !important;
+}
+#nav-left-toggle:checked ~ .header .oasis-menu-slot-left .oasis-menu-open,
+#nav-right-toggle:checked ~ .header .oasis-menu-slot-right .oasis-menu-open {
+ display: none !important;
+}
+#nav-left-toggle:checked ~ .header .oasis-menu-slot-left .oasis-menu-close,
+#nav-right-toggle:checked ~ .header .oasis-menu-slot-right .oasis-menu-close {
+ display: inline-flex !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav {
+ order: 3 !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-right nav {
+ order: 4 !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav,
+.oasis-nav-side-toggle ~ .header .top-bar-right nav {
+ flex: 1 1 calc(50% - 4px) !important;
+ width: auto !important;
+ min-width: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav ul,
+.oasis-nav-side-toggle ~ .header .top-bar-right nav ul {
+ display: grid !important;
+ grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
+ gap: 4px !important;
+ list-style: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav ul li,
+.oasis-nav-side-toggle ~ .header .top-bar-right nav ul li {
+ margin: 0 !important;
+ min-width: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav ul li a,
+.oasis-nav-side-toggle ~ .header .top-bar-right nav ul li a {
+ position: relative !important;
+ display: flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ width: 100% !important;
+ min-height: 50px !important;
+ padding: 0 !important;
+ font-size: 0 !important;
+ text-decoration: none !important;
+ box-sizing: border-box !important;
+}
+.oasis-nav-side-toggle ~ .header nav ul li a .nav-text {
+ display: none !important;
+}
+.oasis-nav-side-toggle ~ .header nav ul li a .emoji {
+ font-size: 1.6rem !important;
+ line-height: 1 !important;
+ margin: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header nav ul li a .inbox-badge {
+ position: absolute !important;
+ top: 3px !important;
+ right: 3px !important;
+ margin: 0 !important;
+ font-size: 0.66rem !important;
+}
+.oasis-nav-side-toggle ~ .main-content {
+ display: flex !important;
+ flex-direction: column !important;
+}
+.oasis-nav-side-toggle ~ .main-content .main-column {
+ order: 0 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .sidebar-left,
+.oasis-nav-side-toggle ~ .main-content .sidebar-right {
+ display: none !important;
+}
+#nav-left-toggle:checked ~ .main-content .sidebar-left,
+#nav-right-toggle:checked ~ .main-content .sidebar-right {
+ display: block !important;
+ order: -1 !important;
+ width: 100% !important;
+ max-width: 100% !important;
+ padding: 0 4px !important;
+ margin: 0 0 8px 0 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-header {
+ margin: 0 0 6px 0 !important;
+ padding: 12px !important;
+}
+.oasis-nav-side-toggle ~ .main-content .sidebar-left .oasis-nav-list,
+.oasis-nav-side-toggle ~ .main-content .sidebar-right .oasis-nav-list {
+ display: grid !important;
+ grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
+ gap: 8px !important;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-list li {
+ margin: 0 !important;
+ padding: 0 !important;
+ min-width: 0 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-list li a {
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ justify-content: center !important;
+ gap: 6px !important;
+ min-height: 74px !important;
+ height: 100% !important;
+ padding: 8px 4px !important;
+ margin: 0 !important;
+ text-align: center !important;
+ font-size: 0.72rem !important;
+ opacity: 1 !important;
+ box-sizing: border-box !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-list li a .emoji {
+ width: auto !important;
+ font-size: 1.5rem !important;
+ line-height: 1 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-list li a .nav-text {
+ line-height: 1.15 !important;
+ overflow-wrap: anywhere !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav,
+.oasis-nav-side-toggle ~ .header .top-bar-right nav {
+ position: fixed !important;
+ bottom: 0 !important;
+ height: 66px !important;
+ width: 50% !important;
+ flex: none !important;
+ z-index: 900 !important;
+ margin: 0 !important;
+ box-sizing: border-box !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav {
+ left: 0 !important;
+ right: auto !important;
+ padding: 6px 2px 6px 6px !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-right nav {
+ right: 0 !important;
+ left: auto !important;
+ padding: 6px 6px 6px 2px !important;
+}
+.oasis-nav-side-toggle ~ .oasis-footer {
+ padding-bottom: 84px !important;
+}
+body:has(:is(input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]), textarea, select):focus) .oasis-nav-side-toggle ~ .header .top-bar-left nav,
+body:has(:is(input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]), textarea, select):focus) .oasis-nav-side-toggle ~ .header .top-bar-right nav {
+ display: none !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-left nav {
+ width: calc(300% / 7) !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-right nav {
+ width: calc(400% / 7) !important;
+}
+.oasis-nav-side-toggle ~ .header .top-bar-right nav ul {
+ grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
+}
+.oasis-nav-side-toggle ~ .main-content .sidebar-left nav > ul,
+.oasis-nav-side-toggle ~ .main-content .sidebar-right nav > ul {
+ display: grid !important;
+ grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
+ grid-auto-flow: row dense !important;
+ gap: 8px !important;
+ list-style: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-group {
+ display: contents !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-group > .oasis-nav-header {
+ display: flex !important;
+ flex-direction: column !important;
+ align-items: center !important;
+ justify-content: center !important;
+ gap: 6px !important;
+ min-height: 74px !important;
+ margin: 0 !important;
+ padding: 8px 4px !important;
+ text-align: center !important;
+ font-size: 0.68rem !important;
+ box-sizing: border-box !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-group > .oasis-nav-header .emoji {
+ width: auto !important;
+ font-size: 1.5rem !important;
+ line-height: 1 !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-group > .oasis-nav-header .nav-text {
+ flex: 0 0 auto !important;
+ line-height: 1.15 !important;
+ overflow-wrap: anywhere !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-group > .oasis-nav-header .oasis-nav-arrow {
+ display: none !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-group > .oasis-nav-list {
+ grid-column: 1 / -1 !important;
+ max-height: none !important;
+ overflow: visible !important;
+}
+.oasis-nav-side-toggle ~ .main-content .oasis-nav-toggle:not(:checked) + .oasis-nav-header + .oasis-nav-list {
+ display: none !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-phone-state {
+ order: 1 !important;
+ flex: 1 1 0 !important;
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+ align-self: center !important;
+ margin: 0 !important;
+ padding: 0 !important;
+ min-width: 0 !important;
+}
+.oasis-nav-side-toggle ~ .header:has(.oasis-phone-state) .oasis-mobile-menus {
+ flex: 0 1 auto !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-phone-state-btn {
+ appearance: none !important;
+ -webkit-appearance: none !important;
+ font: inherit !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ gap: 3px !important;
+ min-height: 0 !important;
+ justify-content: center !important;
+ width: 38px !important;
+ height: 38px !important;
+ padding: 0 !important;
+ font-size: 8.5px !important;
+ line-height: 1.2 !important;
+ white-space: nowrap !important;
+ border-radius: 999px !important;
+ cursor: pointer !important;
+}
+.oasis-nav-side-toggle ~ .header .oasis-phone-state-btn .pm-exposition-icon {
+ font-size: 22px !important;
+ line-height: 1 !important;
+ margin: 0 !important;
+}
diff --git a/src/client/assets/styles/style.css b/src/client/assets/styles/style.css
index 1382cff..3b5835a 100644
--- a/src/client/assets/styles/style.css
+++ b/src/client/assets/styles/style.css
@@ -394,6 +394,9 @@ nav ul li a:hover {
min-width: 0;
max-width: 100vw;
}
+.main-content > .sidebar-left { order: 1; }
+.main-content > .main-column { order: 2; }
+.main-content > .sidebar-right { order: 3; }
.main-column pre,
.main-column code {
@@ -665,6 +668,49 @@ table th {
background-color: #222;
}
+.main-column table th {
+ overflow-wrap: normal;
+ word-break: normal;
+ hyphens: auto;
+ white-space: normal;
+ line-height: 1.25;
+}
+
+.main-column table td {
+ word-break: normal;
+ overflow-wrap: anywhere;
+}
+
+.table-wrap {
+ max-width: 100%;
+ overflow-x: auto;
+}
+
+.gov-overview {
+ table-layout: fixed;
+ width: 100%;
+}
+
+.gov-overview th,
+.gov-overview td {
+ padding: 8px 3px;
+ overflow-wrap: break-word;
+}
+
+.gov-overview th {
+ font-size: 10.5px;
+ letter-spacing: 0;
+}
+
+.gov-overview th:first-child,
+.gov-overview td:first-child {
+ width: 15%;
+}
+
+.gov-overview td:first-child {
+ font-size: 14px;
+}
+
table tr:nth-child(even) {
background-color: #444;
}
@@ -966,9 +1012,18 @@ article img {
border-radius: 8px;
margin: 8px 0;
}
+.trending-card .post-image {
+ width: auto;
+ max-height: 480px;
+ margin-left: auto;
+ margin-right: auto;
+}
.post-video {
+ width: 100%;
max-width: 100%;
+ max-height: 480px;
+ height: auto;
display: block;
border-radius: 8px;
margin: 8px 0;
@@ -980,11 +1035,17 @@ article img {
margin: 8px 0;
}
+.trending-card .post-image,.trending-card .post-video{margin-left:auto;margin-right:auto}
+.trending-card .zoom-link:not(.zoom-inline){display:block;text-align:center}
+.trending-card .zoom-link:not(.zoom-inline) img{display:inline-block}
+
.feed-container .post-image{max-width:100%;width:auto;max-height:480px;height:auto}
.feed-container .post-video,.feed-container .video-container video{width:100%;max-width:720px;max-height:480px;height:auto}
.feed-container .post-audio,.feed-container .audio-container audio{width:100%}
.fediverse-network{border-radius:8px;padding:18px 22px;margin-top:10px;display:flex;flex-direction:column;gap:16px}
+.fediverse-network > p,.fediverse-network form > p{margin:0}
+.fediverse-network form{margin:0}
.fediverse-network h3{margin:0}
.fediverse-profile{display:flex;flex-direction:column;gap:24px}
.fediverse-namerow{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
@@ -1013,6 +1074,13 @@ article img {
.fediverse-profile,.fediverse-profile-id,.fediverse-namerow,.fediverse-stat,.fediverse-name,.fediverse-compact-actions,.fediverse-author,.fediverse-head,.fediverse-bio,.fediverse-stats,.fediverse-field,.fediverse-field-value,.fediverse-actions,.fediverse-compose,.fediverse-compose-actions,.fediverse-media,.fediverse-reach,.fediverse-preview-card,.fediverse-preview-head,.fediverse-disconnected{border:none !important;background:none !important;padding:0 !important;margin:0 !important;box-shadow:none !important;border-radius:0 !important}
.fediverse-empty{text-align:center;padding:24px}
.fediverse-error{color:#ff6b6b;margin:8px 0}
+.telegram-unread-badge{background:#ffa300;color:#111;border-radius:10px;padding:1px 8px;font-size:.8em;font-weight:bold}
+.telegram-preview{margin:0;opacity:.85}
+.telegram-dialog .fediverse-avatar{width:44px;height:44px;border-radius:50%}
+.telegram-message.telegram-out{border-left:3px solid #ffa300}
+.telegram-text{white-space:pre-wrap}
+.telegram-chat-title{display:flex;align-items:center;gap:10px;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;margin:0 0 10px 0}
+.telegram-chat-title h3{margin:0}
.fediverse-compose{display:flex;flex-direction:column;gap:8px;margin-bottom:18px}
.fediverse-compose textarea{width:100%;box-sizing:border-box;resize:vertical}
.fediverse-compose-actions{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
@@ -1127,6 +1195,7 @@ button.create-button:hover {
.bookmark-url:hover {
text-decoration: underline;
}
+.card-section.bookmark .bookmark-url{font-size:.95em;font-weight:600;margin:0;overflow-wrap:anywhere}
.filter-box {
display: flex;
@@ -1150,18 +1219,12 @@ button.create-button:hover {
vertical-align: middle;
}
-div:has(> .filter-box) {
- border: none !important;
- background: transparent !important;
- padding: 0 !important;
- box-shadow: none !important;
-}
-
.filter-box div {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 0 !important;
+ margin: 0 !important;
}
.filter-box__controls .filter-box__input,
@@ -1205,8 +1268,9 @@ div:has(> .filter-box) {
}
.filter-box__input {
- width: 100%;
- flex: 1 1 100%;
+ width: auto;
+ flex: 0 1 320px;
+ min-width: 160px;
box-sizing: border-box;
height: 42px;
padding: 10px 12px;
@@ -1226,7 +1290,7 @@ div:has(> .filter-box) {
gap: 12px;
align-items: center;
margin-top: 0;
- flex: 1 1 100%;
+ flex: 0 1 auto;
flex-wrap: wrap;
}
@@ -1294,6 +1358,10 @@ div:has(> .filter-box) {
.error-page-message{margin:8px 0 16px;white-space:pre-wrap;word-break:break-word}
.error-page-actions{margin-top:16px}
+.inline-error-box{border:1px solid #d9534f !important;display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
+.inline-error-box .error-page-message{margin:0;color:#d9534f;font-weight:bold}
+.inline-error-box .inline-error-dismiss{display:inline-flex;align-items:center;padding:4px 14px;border:1px solid #d9534f;border-radius:6px;background:transparent;color:#d9534f;font-weight:700;font-size:.9em;text-decoration:none;cursor:pointer}
+.inline-error-box .inline-error-dismiss:hover{background:#d9534f;color:#1a1a1a}
.tags-container {
display: flex;
@@ -1309,6 +1377,12 @@ div:has(> .filter-box) {
margin-right: 1em;
margin-bottom: 0.5em;
}
+.tag-inline {
+ display: inline;
+ padding: 0;
+ margin: 0;
+ font-size: inherit;
+}
.tag-checkboxes-table {
margin-top: 1rem;
@@ -1343,14 +1417,36 @@ div:has(> .filter-box) {
width: 300px;
flex: 0 0 300px;
}
+.inhabitants-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
+@media (max-width: 900px){.inhabitants-grid{grid-template-columns:1fr}}
+.tribe-main .inhabitants-grid{grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr))}
+.inhabitants-grid > .inhabitants-card{margin:0;min-width:0}
+.inhabitants-grid .inhabitants-card-body,.inhabitants-grid .inhabitant-card{padding:0 !important;margin:0 !important;border:0 !important;background:transparent !important;box-shadow:none !important}
+.inhabitants-grid .inhabitant-card{flex-direction:column;align-items:stretch}
+.inhabitants-grid .inhabitant-left{width:auto;flex:1 1 auto;min-width:0}
+.inhabitants-grid .inhabitant-left > a:first-of-type{width:160px;height:160px}
+.inhabitants-grid .inhabitant-photo-details{width:160px !important;height:160px !important}
.inhabitant-left > a:first-of-type { margin-bottom: 0 !important; }
.inhabitant-left > .status.you { margin: 0; }
.inhabitant-left .profile-sensors-box { margin: 0; }
.inhabitant-left .profile-sensors-box .profile-reach { margin: 0; }
+.inhabitant-left .profile-reach {
+ margin: 0;
+ padding: 0 !important;
+ border: 0 !important;
+ background: transparent !important;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ width: auto;
+}
+.inhabitant-left .profile-reach .invite-qr-card { margin: 0; }
.inhabitant-left > a:first-of-type {
display: block;
- width: 100%;
+ width: 256px;
+ height: 256px;
}
.inhabitant-left .profile-sensors-box a {
display: inline;
@@ -1371,6 +1467,7 @@ div:has(> .filter-box) {
margin: 0 auto;
}
+.inhabitant-left-name{margin:6px 0 0 0;text-align:center;font-weight:bold}
.inhabitant-photo-details {
width: 100% !important;
height: 100% !important;
@@ -1424,6 +1521,10 @@ div:has(> .filter-box) {
color: #e74c3c;
}
+.module-stats-line .stat-label-green{color:#2ecc71}
+.module-stats-line .stat-label-orange{color:#f39c12}
+.module-stats-line .stat-label-red{color:#e74c3c}
+
.profile-last-seen,
.profile-device {
display: block;
@@ -1453,7 +1554,12 @@ div:has(> .filter-box) {
.activity-search-input{min-width:240px;max-width:520px;width:100%}
.post-text-pre{white-space:pre-wrap}
.activity-image-thumb{width:100%;max-width:720px;height:auto;border-radius:14px;object-fit:cover}
-.activity-avatar{width:256px;height:256px;}
+.activity-avatar{width:256px;height:256px;object-fit:cover}
+.about-card-cols{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.about-card-cols > div{background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.about-card-col-img{flex:0 0 auto}
+.about-card-col-desc{flex:1 1 240px;min-width:200px}
+.about-card-header{margin:0 0 8px 0}
.activity-pub{display:flex;flex-direction:column;gap:10px;align-items:flex-start}
.activity-pub-title{margin:0}
.activity-pub-title .user-link{display:inline}
@@ -1500,6 +1606,11 @@ div:has(> .filter-box) {
box-shadow: 0 0 8px rgba(0, 0, 0, 0.2);
}
+.pdf-canvas-wrap {
+ height: 420px;
+ overflow: auto;
+}
+
.pdf-viewer-container canvas {
display: block;
margin: 0 auto;
@@ -1507,7 +1618,7 @@ div:has(> .filter-box) {
background-color: #fff;
}
-.pdf-viewer-container div {
+.pdf-viewer-container .pdf-controls {
margin-top: 1rem;
}
@@ -1550,11 +1661,6 @@ div:has(> .filter-box) {
padding: 20px;
}
-.no-cv {
- padding: 20px;
- text-align: center;
-}
-
.checkbox-oasisContributor {
display: table-cell;
align-items: center;
@@ -1587,6 +1693,21 @@ div:has(> .filter-box) {
}
.opinions-voting-collapse { margin: 8px 0; }
+.card-meta-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;overflow:visible}
+.card-meta-row .opinions-voting-collapse:not([open]){display:flex}
+.card-meta-row .opinions-voting-collapse:not([open]) summary{display:inline-flex;align-items:center}
+.card-meta-row .card-footer{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
+.card-footer .date-link,
+.card-footer .user-link{display:inline-flex;align-items:center;box-sizing:border-box;height:34px;max-width:100%;min-width:0;margin:0;padding:0 14px;border:1px solid transparent;border-radius:5px;font-size:13px;line-height:32px;white-space:nowrap;flex:0 1 auto}
+.card-footer .user-link{overflow:hidden;text-overflow:ellipsis}
+.card-meta-row .opinions-voting-collapse{margin:0;width:auto;flex:0 1 auto;background:transparent;border:0;padding:0}
+.card-meta-row .opinions-voting-collapse[open]{flex:1 1 100%;width:100%;margin-bottom:8px}
+.card-meta-row .voting-buttons{margin:10px 0 0 0;padding:0}
+.card-meta-row .voting-buttons form{margin:0;padding:0;background:transparent;border:0}
+.card-meta-row .card-footer{margin:0 !important;padding:0 !important;border:0 !important;flex:1 1 auto;min-width:0}
+.card-meta-row .opinions-summary{display:inline-flex !important;align-items:center;box-sizing:border-box;height:34px;padding:0 14px !important;border-radius:5px;font-size:13px;line-height:32px;flex:0 0 auto}
+.card-meta-row .comments-summary-link{display:inline-flex;align-items:center;gap:4px;box-sizing:border-box;height:34px;padding:0 14px;border:1px solid rgba(128,128,128,.5);border-radius:5px;background:rgba(128,128,128,.12);font-size:13px;line-height:32px;text-decoration:none;flex:0 0 auto}
+.card-meta-row .comments-summary-link:hover{background:rgba(128,128,128,.25);text-decoration:none}
.opinions-summary {
display: inline-block !important;
width: auto !important;
@@ -1621,6 +1742,8 @@ details[open] > .opinions-summary::after { content: " \25B4"; }
list-style: none;
}
.comments-summary:hover { background: rgba(128, 128, 128, .25) !important; }
+.keep-reading-link { text-decoration: none; color: inherit; }
+.keep-reading-link::after { content: ""; }
.comments-summary::-webkit-details-marker { display: none; }
.comments-summary::after { content: " \25BE"; opacity: 0.85; }
details[open] > .comments-summary::after { content: " \25B4"; }
@@ -1687,39 +1810,12 @@ display:flex; gap:8px; margin-top:16px;
margin-bottom: 8px;
}
-.tribe-feed {
- background-color: #111;
- padding: 16px;
- border-radius: 8px;
-}
-
-.tribe-feed-full {
- width: 100%;
- background-color: #222;
- padding: 16px;
- border-radius: 8px;
- box-sizing: border-box;
-}
-
-.feed-actions {
- display: flex;
- gap: 8px;
- margin-bottom: 16px;
-}
-
.vote-actions {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
-.feed-list {
- display: flex;
- flex-direction: column;
- gap: 12px;
- margin-bottom: 16px;
-}
-
.feed-item {
background-color: #1c1c1c;
padding: 12px;
@@ -1749,50 +1845,38 @@ display:flex; gap:8px; margin-top:16px;
cursor: not-allowed;
}
-.tribe-feed .feed-row,
-.tribe-feed-full .feed-row {
- display: flex;
- align-items: flex-start;
- gap: 12px;
-}
-
-.tribe-feed .refeed-column,
-.tribe-feed-full .refeed-column {
- flex: 0 0 68px;
- min-width: 68px;
- max-width: 68px;
+.refeed-column {
+ flex: 0 0 80px;
+ min-width: 80px;
+ max-width: 80px;
padding: 10px 8px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 88px;
+ box-sizing: border-box;
+ gap: 6px;
}
-.tribe-feed .refeed-column h1,
-.tribe-feed-full .refeed-column h1 {
- margin: 0 0 8px 0;
+.refeed-column h1 {
+ margin: 0;
font-size: 24px;
}
-.tribe-feed .refeed-btn,
-.tribe-feed-full .refeed-btn {
- padding: 6px 8px;
+.refeed-btn {
+ padding: 6px 4px;
font-size: 12px;
width: 100%;
-}
-
-.tribe-feed .feed-main,
-.tribe-feed-full .feed-main {
- flex: 1 1 auto;
- min-width: 0;
+ white-space: normal;
overflow-wrap: anywhere;
- word-break: break-word;
+ line-height: 1.15;
}
@media (max-width: 720px) {
- .tribe-feed .feed-row,
- .tribe-feed-full .feed-row {
- flex-direction: column;
- }
+
- .tribe-feed .refeed-column,
- .tribe-feed-full .refeed-column {
+ .refeed-column {
width: 100%;
min-width: 0;
max-width: none;
@@ -1800,60 +1884,10 @@ display:flex; gap:8px; margin-top:16px;
}
}
-.tribe-feed .feed-actions,
-.tribe-feed-full .feed-actions {
- display: flex;
- gap: 8px;
- flex-wrap: wrap;
- margin-bottom: 8px;
-}
-
-.tribe-feed .feed-actions form,
-.tribe-feed-full .feed-actions form,
-.tribe-feed .refeed-column form,
-.tribe-feed-full .refeed-column form {
+.refeed-column form {
margin: 0;
}
-.tribe-feed-compose {
- display: grid;
- grid-template-columns: 1fr auto;
- gap: 12px;
- margin-top: 14px;
- align-items: end;
-}
-
-.tribe-feed-compose textarea {
- width: 100%;
- min-width: 0;
- padding: 12px;
- border-radius: 10px;
- border: 1px solid #444;
- background: #222;
- color: #eee;
- resize: vertical;
- min-height: 120px;
- line-height: 1.45;
- box-sizing: border-box;
-}
-
-.tribe-feed-compose .tribe-feed-send {
- height: 40px;
- padding: 0 14px;
- border-radius: 10px;
- white-space: nowrap;
-}
-
-@media (max-width: 720px) {
- .tribe-feed-compose {
- grid-template-columns: 1fr;
- }
-
- .tribe-feed-compose .tribe-feed-send {
- width: 100%;
- }
-}
-
.tribes-container{
display:grid; grid-template-columns:repeat(auto-fill,minmax(400px,1fr)); gap:20px; margin-top:16px;
}
@@ -2024,22 +2058,40 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
}
.zoom-link{display:inline-block;border:none !important;background:transparent !important;padding:0 !important}
+.internal-link{display:inline-flex;align-items:center;gap:6px;padding:2px 8px;border:1px solid rgba(128,128,128,.5);border-radius:10px;background:rgba(128,128,128,.12);text-decoration:none;vertical-align:baseline}
+.internal-link:hover{background:rgba(128,128,128,.25);text-decoration:none}
+.internal-link-kind{font-weight:700;letter-spacing:1px;font-size:.8em}
+.internal-link-id{font-family:monospace;opacity:.75;font-size:.8em}
.zoom-link img{cursor:zoom-in}
+.link-lightbox .link-box{display:flex;flex-direction:column;gap:10px;width:min(92vw,640px);background:#1e1f23;border:1px solid #333;border-radius:10px;padding:18px;box-sizing:border-box}
+.link-box-row{display:flex;flex-direction:column;gap:4px}
+.link-box-label{font-weight:700;font-size:.8em;letter-spacing:.5px;text-transform:uppercase}
+.link-box-input{width:100%;box-sizing:border-box;font-family:monospace;margin:0}
-.lightbox-close {
+.lightbox-close,
+.lightbox-download {
position: absolute;
top: 15px;
- right: 60px;
width: 42px;
height: 42px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
background: rgba(0, 0, 0, 0.6);
border-radius: 50%;
color: #fff;
font-size: 1.5em;
- text-align: center;
- line-height: 32px;
+ line-height: 1;
text-decoration: none;
}
+.lightbox-close {
+ right: 60px;
+}
+.lightbox-download {
+ right: 112px;
+ font-size: 1.15em;
+}
/* Opinions */
.voting-buttons {
@@ -2098,9 +2150,13 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
.conn-actions {
display: flex;
+ flex-wrap: wrap;
+ align-items: center;
gap: 10px;
margin-top: 10px;
}
+.conn-actions form { margin: 0; padding: 0; border: none; background: transparent; box-shadow: none; }
+.peers-paused-note { margin: 0; color: #ffa500; }
.inhabitant-action {
display: flex;
@@ -2216,6 +2272,8 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
background: transparent !important;
}
+.doc-export-actions.doc-export-left { justify-content: flex-start; }
+
.doc-export-actions form {
border: none !important;
background: transparent !important;
@@ -2244,12 +2302,6 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
margin-top: 10px;
}
-.feed-actions {
- display: flex;
- gap: 10px;
- margin-top: 10px;
-}
-
.image-actions {
display: flex;
gap: 10px;
@@ -2420,7 +2472,9 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
margin-top: 10px;
background-color: #FFA500;
border: none;
- padding: 6px 12px;
+ padding: 4px 12px;
+ font-size: 20px;
+ line-height: 1.2;
border-radius: 6px;
font-weight: bold;
color: #000;
@@ -2535,7 +2589,6 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
}
.market-tribe-card .market-card-kind{display:inline-block;font-size:10px;letter-spacing:2px;color:#888;text-transform:uppercase;font-weight:600;margin-bottom:4px}
-.market-tribe-card .market-card-price{font-size:16px;color:#FFD700;font-weight:600;margin-top:6px}
.market-tribe-card .market-card-seller{font-size:13px;color:#bbb;margin-top:4px;word-break:break-all;border:none;background:transparent;padding:0}
.market-tribe-card .market-card-seller-label{color:#ff9800;font-weight:600}
@@ -2668,14 +2721,14 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
display: flex;
flex-direction: column;
align-items: center;
- gap: 10px;
+ gap: 8px;
width: 100%;
- margin-top: 10px;
- padding: 10px !important;
- border: 1px solid rgba(128, 128, 128, .25) !important;
- border-radius: 8px;
+ margin-top: 0;
+ padding: 0 !important;
+ border: 0 !important;
background: transparent !important;
}
+.inhabitant-user-actions .filter-btn{margin-right:0}
.inhabitant-user-actions form {
background: transparent !important;
@@ -3032,7 +3085,7 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
display: flex;
flex-direction: row;
align-items: flex-start;
- margin-bottom: 1.5em;
+ margin-bottom: 10px;
}
.mode-buttons-cols {
flex: 1;
@@ -3055,7 +3108,12 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
.comment-header {
display: flex;
align-items: center;
- justify-content: space-between;
+ justify-content: flex-start;
+ gap: 10px;
+}
+
+.comment-header .comment-votes {
+ margin-left: auto;
}
.comment-body-row {
@@ -3203,10 +3261,6 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
margin-bottom: 16px;
}
-.tribe-forum-reply-form {
- margin-top: 12px;
- margin-bottom: 16px;
-}
.forum-comment.level-4 { margin-left: 80px; }
/*blockexplorer*/
@@ -3407,7 +3461,11 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
background: #1e1f23;
border: none;
border-radius: 50%;
- padding: 7px 12px;
+ min-width: 36px;
+ height: 36px;
+ box-sizing: border-box;
+ line-height: 1;
+ padding: 0 11px;
cursor: pointer;
font-size: 1.14em;
color: #ffa300;
@@ -3422,6 +3480,7 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0;
.btn-singleview:hover {
background: #2d2e34;
color: #ffd740;
+ text-decoration: none;
}
.btn-datagram {
@@ -3738,68 +3797,9 @@ a.pm-btn:hover { text-decoration: none }
}
/*banking*/
-.addr-form-card, .addr-list-card {
- border: 1px solid rgba(255,255,255,0.1);
- border-radius: 12px;
- background: rgba(255,255,255,0.03);
- padding: 20px;
-}
-
-.addr-form-card.wide {
- padding: 22px;
-}
-
-.addr-form .form-row {
- display: grid;
- grid-template-columns: 140px 1fr;
- gap: 10px;
- align-items: center;
- margin-bottom: 12px;
-}
-
-.addr-form .form-input {
- padding: 0 14px;
-}
-
-.addr-form .form-input.xl {
- height: 50px;
- font-size: 16px;
-}
-
-.addr-form .form-actions {
- display: flex;
- margin-top: 8px;
-}
-
-.addr-list-card .form-row {
- display: grid;
- grid-template-columns: 150px 1fr;
- gap: 10px;
- align-items: center;
-}
-
-.addr-list-card .form-input {
- padding: 0 14px;
-}
-
-.addr-search input[type="text"]:focus,
-.addr-form .form-input:focus {
- outline: none;
- border-color: #ffa300;
-}
-
-.addr-form .form-actions .mini-btn {
- background: #ffa300;
- border: none;
- color: #fff;
- padding: 9px 14px;
- border-radius: 8px;
- cursor: pointer;
-}
-
-.addr-form .form-actions .mini-btn:hover {
- background: #ff7f00;
-}
+.bank-form{max-width:560px}
+.bank-form input[type="text"]{width:100%;box-sizing:border-box}
+.no-content-box{border:1px solid #333;border-radius:10px;padding:18px;margin:12px 0;opacity:.85}
.bank-summary .bank-info-table tbody tr .synced {
color: green;
@@ -3812,11 +3812,21 @@ a.pm-btn:hover { text-decoration: none }
}
.bank-claim-ubi{margin:16px 0}
-.bank-claim-card{border:1px solid #FFA500;border-radius:8px;padding:16px;margin:8px 0}
+.bank-claim-card{background:transparent;border:0;box-shadow:none;padding:0;margin:0 0 14px}
.bank-claim-card p{margin:4px 0}
.bank-claim-btn{font-size:16px;padding:10px 24px;margin-top:8px}
+.bank-claim-actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.bank-claim-actions form{margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
.bank-eco-chart-block{margin:24px 0;border:1px solid #2a2a2a;border-radius:8px;padding:16px;background:#111}
+.bank-eco-chart-zoom-link{display:block;cursor:zoom-in;text-decoration:none;border:0 !important;background:transparent !important;padding:0 !important}
+.bank-range-tabs{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 12px;background:transparent !important;border:0 !important;padding:0 !important}
+.bank-chart-empty-note{margin:6px 0 0;font-size:.9em;opacity:.75}
+.bank-rules-list{margin:6px 0 14px 18px;padding:0}
+.bank-rules-list li{margin:4px 0}
+.bank-eco-chart-lightbox .bank-eco-chart-canvas-zoom{width:92vw;max-width:1400px;background:#111;border:1px solid #2a2a2a;border-radius:8px;padding:16px;box-sizing:border-box}
+.bank-eco-chart-lightbox .bank-eco-chart-svg{width:100%;height:auto;display:block}
+.addr-card-head .content-actions{margin:0;padding:0 !important}
.bank-eco-chart-title{font-size:16px;margin:0 0 12px 0;color:#FFA500}
.bank-eco-chart-canvas{width:100%;overflow:hidden}
.bank-eco-chart-svg{width:100%;height:auto;display:block}
@@ -3854,6 +3864,10 @@ a.pm-btn:hover { text-decoration: none }
.eco-tax-chip-low .eco-tax-chip-value{color:#9aff9a}
.eco-tax-chip-low:hover{background:#143820;border-color:#5aa066}
.eco-tax-chip-mid{background:#2a2410;border-color:#a39134;color:#ffd95a}
+.eco-value-chip{margin-left:8px;vertical-align:middle}
+.log-window-note{display:flex;justify-content:center;margin:16px 0 8px 0}
+.mobile-counters{display:none}
+.log-window-chip .eco-tax-chip-value{font-family:inherit}
.eco-tax-chip-mid .eco-tax-chip-label{color:#ffe9a0}
.eco-tax-chip-mid .eco-tax-chip-value{color:#ffd95a}
.eco-tax-chip-mid:hover{background:#3a3416;border-color:#c5b14e}
@@ -3884,13 +3898,26 @@ a.pm-btn:hover { text-decoration: none }
.melody-upload-submit{width:auto;display:inline-block;padding:6px 18px;align-self:flex-start}
.melody-upload-label{color:#FFD700;font-size:13px;font-weight:600;display:inline-block;margin-top:6px}
.melody-bcs-list{display:flex;flex-direction:column;gap:14px;margin-top:14px;background:transparent !important;border:0 !important;padding:0 !important}
-.audio-container{display:flex;flex-direction:column;gap:8px;align-items:stretch;width:100%;background:transparent !important;border:0 !important;padding:0 !important}
-.audio-container audio{width:100%}
+.video-container{display:flex;flex-direction:column;align-items:center;width:100%;background:transparent !important;border:0 !important;padding:0 !important}
+.video-container video{width:100%;max-width:720px;max-height:480px;height:auto}
.audio-transcode-form{display:inline-block;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.audio-container{display:flex;flex-direction:row;align-items:center;gap:10px;width:100%;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;margin:0 0 8px 0}
+.audio-container audio{flex:1 1 auto;min-width:0;width:100%}
+.card-section .card-field.audio-container,
+.trending-card .card-field.audio-container,
+.opinions-card .card-field.audio-container{display:flex}
+.card-section .card-field.video-container,
+.trending-card .card-field.video-container,
+.opinions-card .card-field.video-container{display:block}
+.audio-transcode-form .filter-btn{background:transparent;color:inherit;font-size:.75em;padding:3px 10px;border:1px solid #555;border-radius:12px;white-space:nowrap;line-height:1.5}
+.audio-transcode-form .filter-btn:hover{border-color:#ffa300;color:#ffa300;background:transparent}
+.audio-transcode-form .create-button{margin:0;font-size:.75em;padding:3px 12px;border-radius:12px;border:1px solid #ffcc00;background:#ffcc00;color:#111;font-weight:bold;line-height:1.5;cursor:pointer}
+.audio-transcode-run-form{margin:6px 0 16px 0 !important}
.melody-bcs-card{background:#161616;border:1px solid #2a2a2a;border-radius:6px;padding:12px 16px}
.melody-bcs-head{display:flex;flex-direction:column;gap:4px;background:transparent !important;border:0 !important;padding:0 !important}
.melody-bcs-title{color:#FFA500;margin:0;font-size:17px}
-.melody-bcs-meta{color:#bbb;font-size:13px;background:transparent !important;border:0 !important;padding:0 !important}
+.melody-bcs-meta{color:#bbb;font-size:13px;background:transparent !important;border:0 !important;padding:0 !important;display:flex;align-items:center;gap:10px;margin:6px 0 0 0}
+.melody-bcs-date{opacity:.75}
.melody-bcs-player{margin:10px 0;background:transparent !important;border:0 !important;padding:0 !important}
.melody-bcs-desc{color:#ccc;font-size:13px;margin:6px 0 0 0;line-height:1.5}
.melody-bcs-actions{margin-top:10px;background:transparent !important;border:0 !important;padding:0 !important}
@@ -3907,11 +3934,10 @@ a.pm-btn:hover { text-decoration: none }
.pub-item{border:1;border-radius:10px;background:none}
.snh-invite-box{border:1px solid currentColor;border-radius:8px;padding:16px;margin:12px 0;font-family:monospace}
.snh-invite-name{margin:0 0 8px 0}
+.snh-invite-code{word-break:break-all}
.snh-invite-date{font-size:13px;opacity:0.7;margin:0 0 10px 0}
.snh-invite-btn{display:block;word-break:break-all;font-size:14px;margin:0;cursor:pointer;background:none;border:1px solid #FFA500;color:#FFA500;padding:10px;border-radius:5px;width:auto;text-align:left;font-family:monospace}
.error-box{background:#222326;border:none;color:#f5c242;padding:12px;border-radius:8px;margin-top:8px}
-.error-title{margin:0 0 6px 0;font-weight:600}
-.error-pre{margin:0;white-space:pre-wrap;font-family:monospace}
.shop-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;margin:8px 0}
.shop-card{border:1px solid #333;border-radius:8px;overflow:hidden;display:flex;flex-direction:column}
@@ -3938,8 +3964,9 @@ a.pm-btn:hover { text-decoration: none }
.shop-product-media{max-height:180px;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#111}
.shop-product-media img{width:100%;max-height:180px;object-fit:cover}
.shop-product-body{padding:10px;display:flex;flex-direction:column;gap:6px}
-.shop-product-price{font-size:18px;font-weight:bold;color:#FFA500}
-.shop-product-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
+.price-chip{display:inline-flex;align-items:center;width:auto;max-width:max-content;box-sizing:border-box;border-radius:10px;font-size:14px;font-weight:700;border:1px solid #a39134;background:#3a2300;color:#ffd700;padding:4px 12px;margin:6px 0 0 0;box-shadow:none;white-space:nowrap}
+.time-chip{display:inline-flex;align-items:center;width:auto;max-width:100%;box-sizing:border-box;border-radius:10px;font-size:14px;font-weight:700;line-height:1.4;border:1px solid #5a5a5a;background:#3a3a3a;color:#ffd740;padding:4px 12px;margin:6px 0 0 0;box-shadow:none;white-space:normal;overflow-wrap:anywhere}
+.shop-product-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px;padding:0;border:0;background:transparent;box-shadow:none}
.shop-add-product{border:1px dashed #555;border-radius:8px;padding:16px;margin:12px 0}
.shop-featured-products{display:flex;gap:8px;flex-wrap:wrap;margin:8px 0}
.shop-featured-item{display:flex;flex-direction:column;align-items:center;width:72px;text-decoration:none;border:1px solid #333;border-radius:6px;overflow:hidden;background:#111}
@@ -3960,6 +3987,7 @@ a.pm-btn:hover { text-decoration: none }
/* carbon footprint chart */
.carbon-section-title{font-size:18px;color:#555;margin:8px 0;font-weight:600}
#carbon{scroll-margin-top:16px}
+#wallet,#language,#ux,#theme,#wish,#workflows,#home-page,#ai,#logstream,#replication,#lan,#pm-visibility,#multiverse,#verification,#indexes,#export,#panic{scroll-margin-top:16px}
.carbon-chart{margin:12px 0;background:transparent !important;border:none !important}
.carbon-bar-label{display:flex;justify-content:space-between;font-size:14px;margin:4px 0 2px;background:transparent !important;border:none !important}
.carbon-bar-track{background:#3a3a3a !important;border-radius:6px;height:22px;overflow:hidden;border:none !important}
@@ -4202,12 +4230,22 @@ a.pm-btn:hover { text-decoration: none }
.jobs-grid .tribe-card-title,
.tribe-grid .tribe-card-title,
-.trending-card .tribe-card-title {
+.trending-card .tribe-card-title,
+.trending-card .card-section > h2,
+.data-card-title,
+.job-section-title,
+.melody-bcs-title {
+ overflow-wrap: anywhere;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
+.data-reasons-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px;background:transparent !important;border:0 !important;padding:0 !important}
+.data-section{margin-top:18px;background:transparent !important;border:0 !important;padding:0 !important}
+.data-section-title{margin:0 0 8px 0;font-size:.95em;letter-spacing:.06em;color:#ffa500}
+.data-top-best{margin-top:6px}
+.data-reason-chip{opacity:1;border-color:rgba(255,163,0,.6)}
.tribe-card-footer {
display: flex;
@@ -4270,6 +4308,8 @@ a.pm-btn:hover { text-decoration: none }
gap: 6px;
}
.tribe-side-actions form > * { margin: 0 }
+.tribe-side-center { flex-direction: column; justify-content: center; }
+.tribe-enter-invite { border: none !important; background: transparent !important; box-shadow: none !important; padding: 0; }
.tribe-side-actions select,
.tribe-side-actions input[type="number"],
.tribe-side-actions input[type="text"] { height: 36px; box-sizing: border-box }
@@ -4329,7 +4369,8 @@ a.pm-btn:hover { text-decoration: none }
.tribe-mode-buttons {
display: flex;
gap: 8px;
- margin-top: 16px;
+ margin-top: 0;
+ margin-bottom: 10px;
}
.tribe-card-image-wrapper {
@@ -4394,18 +4435,30 @@ a.pm-btn:hover { text-decoration: none }
}
.tribe-open-invite {
- border: none;
+ display: block;
+ border: none !important;
border-radius: 4px;
- padding: 8px;
+ padding: 0 !important;
margin: 6px 0;
- background: #1e1f23;
- text-align: center;
+ background: transparent !important;
+ box-shadow: none;
+ text-align: left;
}
.tribe-open-invite-code {
- font-family: monospace;
+ display: block;
+ font-family: 'JetBrains Mono', monospace;
+ font-size: .95em;
+ color: #FFD700;
+ margin: 8px 0 10px;
+ user-select: all;
+ overflow-wrap: anywhere;
word-break: break-all;
- font-weight: bold;
- margin-left: 6px;
+ background: #111 !important;
+ border: 1px dashed rgba(255, 163, 0, .5) !important;
+ border-radius: 6px;
+ padding: 8px 10px !important;
+ text-align: center;
+ box-shadow: none;
}
.tribe-open-invite-panel { margin: 6px 0; }
.profile-side-version { margin: 4px 0 8px; font-size: 0.9em; text-align: center; }
@@ -4454,15 +4507,24 @@ a.pm-btn:hover { text-decoration: none }
.tribe-action-btn {
padding: 6px 16px;
border-radius: 6px;
+ font-family: inherit;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.5px;
+ line-height: 1.2;
cursor: pointer;
border: 1px solid #ffa300;
background: transparent;
color: #ffa300;
+ text-decoration: none;
+ display: inline-block;
+ appearance: none;
+ -webkit-appearance: none;
transition: background 0.15s, color 0.15s;
}
+.tribe-action-btn:hover {
+ text-decoration: none;
+}
.tribe-action-btn.danger-btn,
.tribe-card-actions .tribe-action-btn.danger-btn,
.tribe-side-actions .tribe-action-btn.danger-btn,
@@ -4492,6 +4554,8 @@ a.pm-btn:hover { text-decoration: none }
color: #000;
}
.tribe-action-btn.danger-btn { border-color: #d9534f; color: #d9534f; }
+.tribe-action-btn.success-btn { border-color: #2ecc71; color: #2ecc71; }
+.tribe-action-btn.success-btn:hover { background: #2ecc71; color: #000; }
.tribe-action-btn.danger-btn:hover { background: #d9534f; color: #000; }
.calendar-interval-block { margin: 8px 0 16px; }
@@ -4523,22 +4587,6 @@ a.pm-btn:hover { text-decoration: none }
object-fit: cover;
}
-.tribe-feed-compose {
- display: flex;
- flex-direction: column;
- gap: 8px;
- margin-bottom: 16px;
-}
-
-.tribe-feed-compose textarea {
- width: 100%;
- box-sizing: border-box;
-}
-
-.tribe-feed-compose .tribe-feed-send {
- align-self: flex-end;
-}
-
.tribe-parent-box {
margin-bottom: 12px;
text-align: center;
@@ -4591,9 +4639,12 @@ a.pm-btn:hover { text-decoration: none }
.tribe-grid {
display: grid;
- grid-template-columns: repeat(3, 1fr);
+ grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 20px;
}
+@media (max-width: 900px) {
+ .tribe-grid { grid-template-columns: 1fr; }
+}
.tribe-section-nav {
display: flex;
@@ -4630,16 +4681,6 @@ a.pm-btn:hover { text-decoration: none }
border-right: none;
}
-.tribe-section-nav .filter-btn {
- padding: 8px 12px;
- text-transform: uppercase;
-}
-
-.tribe-section-nav .filter-btn.active {
- background: #ffcc00;
- color: #000;
-}
-
.tribe-content-card {
background: #1c1c1c;
border: 1px solid #333;
@@ -4654,7 +4695,7 @@ a.pm-btn:hover { text-decoration: none }
.tribe-content-grid {
display: grid;
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 16px;
}
@@ -4670,13 +4711,6 @@ a.pm-btn:hover { text-decoration: none }
align-items: center;
margin-bottom: 16px;
}
-.tribe-search-form{display:flex;gap:10px;align-items:center}
-
-.tribe-content-filters {
- display: flex;
- gap: 8px;
- margin-bottom: 12px;
-}
.tribe-content-status {
display: inline-block;
@@ -4740,68 +4774,6 @@ a.pm-btn:hover { text-decoration: none }
object-fit: cover;
}
-.tribe-votation-options {
- display: flex;
- flex-direction: column;
- gap: 8px;
- margin: 12px 0;
-}
-
-.tribe-votation-option {
- display: flex;
- align-items: center;
- gap: 12px;
-}
-
-.tribe-votation-bar {
- background: #333;
- border-radius: 4px;
- height: 24px;
- position: relative;
- overflow: hidden;
- flex: 1;
-}
-
-.tribe-votation-fill {
- background: #ff6600;
- height: 100%;
- border-radius: 4px;
- transition: width 0.3s ease;
-}
-
-.tribe-fill-0 { width: 0%; }
-.tribe-fill-5 { width: 5%; }
-.tribe-fill-10 { width: 10%; }
-.tribe-fill-15 { width: 15%; }
-.tribe-fill-20 { width: 20%; }
-.tribe-fill-25 { width: 25%; }
-.tribe-fill-30 { width: 30%; }
-.tribe-fill-35 { width: 35%; }
-.tribe-fill-40 { width: 40%; }
-.tribe-fill-45 { width: 45%; }
-.tribe-fill-50 { width: 50%; }
-.tribe-fill-55 { width: 55%; }
-.tribe-fill-60 { width: 60%; }
-.tribe-fill-65 { width: 65%; }
-.tribe-fill-70 { width: 70%; }
-.tribe-fill-75 { width: 75%; }
-.tribe-fill-80 { width: 80%; }
-.tribe-fill-85 { width: 85%; }
-.tribe-fill-90 { width: 90%; }
-.tribe-fill-95 { width: 95%; }
-.tribe-fill-100 { width: 100%; }
-
-.tribe-votation-label {
- min-width: 120px;
- color: #ccc;
-}
-
-.tribe-votation-count {
- min-width: 40px;
- text-align: right;
- color: #9aa3b2;
-}
-
.tribe-forum-thread {
background: #1c1c1c;
border: 1px solid #333;
@@ -4818,33 +4790,6 @@ a.pm-btn:hover { text-decoration: none }
border-radius: 0 8px 8px 0;
}
-.tribe-forum-reply-form {
- margin-top: 16px;
-}
-
-.tribe-media-grid {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
- gap: 18px;
-}
-
-.tribe-media-item {
- background: #1c1c1c;
- border-radius: 8px;
- overflow: hidden;
- border: 1px solid #333;
- transition: border-color .2s;
- padding-bottom: 8px;
-}
-
-.tribe-media-item:hover {
- border-color: #ffa500;
-}
-
-.tribe-media-item a {
- display: block;
-}
-
.tribe-media-thumb {
width: 100%;
height: 160px;
@@ -4859,50 +4804,6 @@ a.pm-btn:hover { text-decoration: none }
box-sizing: border-box;
}
-.tribe-media-item img {
- width: 100%;
- height: 160px;
- object-fit: cover;
-}
-
-.tribe-media-item video {
- width: 100%;
- height: 160px;
- object-fit: cover;
-}
-
-.tribe-media-title-link {
- color: #ffa500;
- font-weight: bold;
- text-decoration: none;
- display: block;
- margin-bottom: 4px;
-}
-
-.tribe-media-title-link:hover {
- text-decoration: underline;
-}
-
-.tribe-media-item-info {
- padding: 12px;
-}
-
-.tribe-media-date {
- margin: 6px 0 2px 0;
- font-size: 0.85em;
-}
-
-.tribe-media-author {
- margin: 0 0 6px 0;
- font-size: 0.85em;
-}
-
-.tribe-media-filters {
- display: flex;
- gap: 8px;
- margin-bottom: 12px;
-}
-
.tribe-overview-grid {
display: grid;
grid-template-columns: 1fr 1fr;
@@ -4940,22 +4841,6 @@ a.pm-btn:hover { text-decoration: none }
color: #88cc88;
}
-.tribe-feed-compose {
- display: flex;
- flex-direction: column;
- gap: 8px;
- margin-bottom: 16px;
-}
-
-.tribe-feed-compose textarea {
- width: 100%;
- box-sizing: border-box;
-}
-
-.tribe-feed-compose .tribe-feed-send {
- align-self: flex-end;
-}
-
.comment-submit-btn {
width: auto;
max-width: 200px;
@@ -5077,6 +4962,19 @@ a.pm-btn:hover { text-decoration: none }
font-size: 1.15rem;
font-weight: 600;
}
+.tag-cloud-item[data-weight="5"] {
+ font-size: 1.3rem;
+ font-weight: 700;
+}
+.tag-cloud-item[data-weight="1"] { color: hsl(200,70%,60%); }
+.tag-cloud-item[data-weight="2"] { color: hsl(230,70%,60%); }
+.tag-cloud-item[data-weight="3"] { color: hsl(260,70%,60%); }
+.tag-cloud-item[data-weight="4"] { color: hsl(290,70%,60%); }
+.tag-cloud-item[data-weight="5"] { color: hsl(320,70%,60%); }
+.vote-outcome{font-weight:bold}
+.vote-outcome-yes{color:#4caf50}
+.vote-outcome-no{color:#e53935}
+.vote-outcome-none{color:#ffcc00}
.stats-karma-block {
background-color: #222;
@@ -5144,20 +5042,6 @@ a.pm-btn:hover { text-decoration: none }
word-break: break-all;
}
-.map-wrap {
- margin-right: 30px;
- position: relative;
- border: 0px;
-}
-
-.map-img {
- display: block;
- width: 100% !important;
- height: 100% !important;
- max-width: none !important;
- border: none !important;
-}
-
.map-bar {
display: flex;
align-items: center;
@@ -5481,80 +5365,552 @@ a.pm-btn:hover { text-decoration: none }
.map-markers-list h3 {
margin-bottom: 4px;
}
-.map-osm-embed {
- width: 100%;
- height: 450px;
- border: 1px solid #444;
- border-radius: 8px;
- margin: 12px 0;
+.map-viewer,
+.map-stage,
+.map-stage div,
+.map-hero,
+.map-toolbar,
+.map-toolbar div,
+.map-place-results,
+.map-markers-list,
+.map-markers-list div,
+.map-detail-grid,
+.map-picked,
+.map-card-thumb .map-viewer {
+ margin: 0;
+ padding: 0;
+ background: transparent;
+ border: 0;
+ box-shadow: none;
+ border-radius: 0;
+ overflow: visible;
+}
+.map-marker-meta {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ flex-wrap: wrap;
+ font-size: 0.75rem;
+}
+.map-marker-meta a.user-link {
+ padding: 2px 8px;
+ font-size: 0.7rem;
+ border-width: 1px;
}
.map-viewer {
width: 100%;
- overflow-x: auto;
- overflow-y: hidden;
border: 0px;
}
-.map-popup {
- display: none;
- position: fixed;
- top: 0; left: 0; right: 0; bottom: 0;
- background: rgba(0,0,0,0.65);
- z-index: 1000;
- align-items: center;
- justify-content: center;
+.map-toolbar label {
+ display: inline-block;
+ width: auto;
+ white-space: nowrap;
}
-.map-popup:target {
- display: flex;
+.map-toolbar .filter-btn,
+.map-place-result,
+.map-center-link {
+ white-space: nowrap;
}
-.map-popup-box {
- background: #222;
- border: 1px solid #555;
- border-radius: 10px;
- padding: 20px 24px;
- max-width: 360px;
- width: 90%;
- color: #ddd;
+.map-stage {
position: relative;
+ width: 100%;
+ background: #16232e;
+ border: 1px solid #333;
+ border-radius: 8px;
+ overflow: hidden;
+ line-height: 0;
}
-.map-popup-close {
+.map-stage-thumb {
+ border: 0;
+ border-radius: 0;
+}
+.map-svg {
+ display: block;
+ width: 100%;
+ height: auto;
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
+}
+.map-pins-layer {
position: absolute;
- top: 10px; right: 14px;
- color: #FFA500;
- text-decoration: none;
- font-size: 1.2rem;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 4;
+ pointer-events: none;
+}
+.map-pins-layer a {
+ pointer-events: auto;
+}
+.map-ocean { fill: #a7c6de; }
+.map-tile { image-rendering: auto; }
+.map-grat { fill: none; stroke: rgba(255, 255, 255, 0.4); stroke-width: 0.6; }
+.map-border { fill: none; stroke: rgba(72, 52, 32, 0.65); stroke-width: 0.8; stroke-linejoin: round; }
+.map-lake { fill: none; stroke: rgba(36, 86, 128, 0.7); stroke-width: 0.7; stroke-linejoin: round; }
+.map-state { fill: none; stroke: rgba(72, 52, 32, 0.5); stroke-width: 0.6; stroke-dasharray: 3 2; }
+.map-coast { fill: none; stroke: rgba(36, 86, 128, 0.75); stroke-width: 0.8; stroke-linejoin: round; }
+.map-label-country { fill: #262c31; font-size: 14px; font-weight: 600; letter-spacing: 0.6px; text-anchor: middle; paint-order: stroke; stroke: rgba(255, 255, 255, 0.85); stroke-width: 3px; stroke-linejoin: round; }
+.map-place-dot { fill: #1f252a; stroke: #ffffff; stroke-width: 1; }
+.map-place-capital { fill: #d35400; }
+.map-place-label { fill: #1f252a; font-size: 12px; paint-order: stroke; stroke: rgba(255, 255, 255, 0.85); stroke-width: 3px; stroke-linejoin: round; }
+.map-place-label-capital { font-weight: 700; }
+.map-pin-body { fill: #3498db; stroke: #ffffff; stroke-width: 1.5; }
+.map-pin-main .map-pin-body { fill: #e74c3c; }
+.map-pin-focus .map-pin-body { fill: #FFA500; stroke: #ffffff; stroke-width: 2.2; }
+.map-pin-eye { fill: #ffffff; }
+.map-pin-label-bg { fill: rgba(8, 12, 16, 0.86); stroke: rgba(255, 255, 255, 0.35); stroke-width: 0.6; }
+.map-pin-focus .map-pin-label-bg { stroke: #FFA500; stroke-width: 1.2; }
+.map-pin-label { fill: #ffffff; font-size: 12px; font-weight: 700; text-anchor: middle; }
+.map-pin-img-frame { fill: #ffffff; }
+.map-pins-layer a:hover .map-pin-body, .map-pins a:hover .map-pin-body { fill: #FFA500; }
+.map-cluster-ring { fill: rgba(255, 165, 0, 0.28); }
+.map-cluster-dot { fill: #FFA500; stroke: #ffffff; stroke-width: 1.6; }
+.map-cluster-count { fill: #000000; font-size: 13px; font-weight: 700; text-anchor: middle; }
+a:hover .map-cluster-dot { fill: #ffffff; }
+.map-pick-ring { fill: none; stroke: #FFA500; stroke-width: 2; }
+.map-pick-cross { fill: none; stroke: #FFA500; stroke-width: 2; stroke-linecap: round; }
+.map-pick-center { fill: #ffffff; }
+.map-scale-line { fill: none; stroke: #1f252a; stroke-width: 1.6; }
+.map-scale-text { fill: #1f252a; font-size: 11px; font-weight: 600; paint-order: stroke; stroke: rgba(255, 255, 255, 0.85); stroke-width: 3px; }
+.map-attrib { fill: #3b434a; font-size: 9px; text-anchor: end; paint-order: stroke; stroke: rgba(255, 255, 255, 0.75); stroke-width: 2px; }
+.map-pick-grid {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: grid;
+ grid-template-columns: repeat(24, 1fr);
+ grid-template-rows: repeat(15, 1fr);
+}
+.map-pick-cell {
+ display: block;
+ background: transparent;
+ border: 0;
+ margin: 0;
+ padding: 0;
+ min-width: 0;
+ min-height: 0;
+ width: 100%;
+ height: 100%;
+ cursor: crosshair;
+ border-radius: 0;
+ box-shadow: none;
+}
+.map-pick-cell:hover {
+ background: rgba(255, 165, 0, 0.22);
+ outline: 1px solid rgba(255, 165, 0, 0.7);
+ outline-offset: -1px;
+}
+.map-controls {
+ position: absolute;
+ z-index: 3;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
line-height: 1;
}
-.map-popup-label {
- font-weight: 600;
- font-size: 1rem;
- color: #eee;
- margin-bottom: 6px;
+.map-controls-zoom {
+ top: 10px;
+ left: 10px;
}
-.map-popup-coords {
- font-family: monospace;
- font-size: 0.85rem;
- color: white;
+.map-controls-pan {
+ top: 10px;
+ right: 10px;
+ display: grid;
+ grid-template-columns: repeat(3, 30px);
+ grid-template-rows: repeat(3, 30px);
+ gap: 2px;
}
-.map-popup-link {
+.map-ctrl {
+ width: 30px;
+ height: 30px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(18, 18, 18, 0.88);
color: #FFA500;
- text-decoration: underline;
- word-break: break-all;
+ border: 1px solid #555;
+ border-radius: 6px;
+ text-decoration: none;
+ font-size: 17px;
+ font-weight: 700;
+ font-family: inherit;
+ margin: 0;
+ padding: 0;
+ cursor: pointer;
+ box-sizing: border-box;
+}
+.map-ctrl:hover {
+ background: #FFA500;
+ color: #000;
+ border-color: #FFA500;
+}
+.map-ctrl-off {
+ opacity: 0.35;
+ cursor: default;
+}
+.map-ctrl-off:hover {
+ background: rgba(18, 18, 18, 0.88);
+ color: #FFA500;
+ border-color: #555;
+}
+.map-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 10px;
+ margin: 10px 0;
+}
+.map-toolbar form {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ margin: 0;
+}
+.map-toolbar label {
+ margin: 0;
+}
+.map-toolbar select,
+.map-toolbar input[type="text"] {
+ height: 34px;
+ box-sizing: border-box;
+ margin: 0;
+}
+.map-toolbar .filter-btn {
+ height: 34px;
+ box-sizing: border-box;
+ display: inline-flex;
+ align-items: center;
+ margin: 0;
+}
+.map-place-search input[type="text"] {
+ min-width: 220px;
+}
+.map-place-results {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ margin: 6px 0;
+ align-items: center;
+}
+.map-place-result {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 4px 10px;
+ border: 1px solid #555;
+ border-radius: 14px;
+ color: #FFA500;
+ text-decoration: none;
+ font-size: 0.85rem;
+ background: transparent;
+ font-family: inherit;
+ cursor: pointer;
+ line-height: 1.3;
+}
+.map-place-result:hover {
+ background: #FFA500;
+ color: #000;
+ border-color: #FFA500;
+}
+.map-place-result-country {
+ opacity: 0.75;
+ font-size: 0.8em;
+}
+.map-place-none {
+ color: #888;
+ font-size: 0.85rem;
+}
+.map-hero {
+ margin: 0 0 12px 0;
+}
+.map-detail-grid {
+ display: flex;
+ gap: 24px;
+ align-items: flex-start;
+}
+.map-detail-side {
+ width: 320px;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+.map-detail-main {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+}
+@media (max-width: 900px) {
+ .map-detail-grid {
+ flex-direction: column;
+ }
+ .map-detail-side {
+ width: 100%;
+ }
+}
+.map-markers-list .map-marker-row {
+ display: grid;
+ grid-template-columns: 28px minmax(0, 1fr) auto;
+ align-items: center;
+ gap: 12px;
+ padding: 10px 12px;
+ border-bottom: 1px solid #333;
+ text-align: left;
+}
+.map-markers-list .map-marker-row:last-child {
+ border-bottom: 0;
+}
+.map-marker-body {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ min-width: 0;
+}
+.map-marker-date {
+ color: #888;
+}
+.map-marker-meta a.user-link {
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: inline-block;
+ box-sizing: border-box;
+}
+.map-form-actions {
+ margin-top: 14px;
+}
+.map-form-actions .create-button,
+.map-form-actions .filter-btn {
+ height: 36px;
+ margin: 0;
+ padding: 0 18px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ box-sizing: border-box;
+ font-size: 0.9em;
+ line-height: 1;
+ white-space: nowrap;
+ text-decoration: none;
+}
+.map-popup {
+ pointer-events: auto;
+}
+.map-popup-pointer {
+ fill: #1e1f23;
+ stroke: #555;
+ stroke-width: 1;
+}
+.map-stage .map-popup-wrap {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-end;
+ line-height: 1.35;
+ font-family: inherit;
+}
+.map-stage .map-popup--below .map-popup-wrap {
+ justify-content: flex-start;
+}
+.map-stage .map-popup-card {
+ background: #1e1f23;
+ border: 1px solid #555;
+ border-radius: 8px;
+ padding: 10px 12px;
+ color: #fff;
+ font-size: 13px;
+ box-sizing: border-box;
+ max-height: 100%;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ text-align: left;
+}
+.map-stage .map-popup-card > * {
+ flex-shrink: 0;
+}
+.map-stage .map-popup-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 8px;
+}
+.map-popup-close {
+ color: #aaa;
+ text-decoration: none;
+ font-size: 20px;
+ line-height: 1;
+}
+.map-popup-close:hover {
+ color: #FFA500;
+ text-decoration: none;
}
.map-popup-img {
- display: block;
- max-width: 180px;
+ width: 100%;
max-height: 120px;
object-fit: cover;
border-radius: 4px;
- margin: 6px auto;
-}
-.map-marker-img {
display: block;
- max-width: 120px;
- max-height: 80px;
+}
+.map-stage .map-popup-text {
+ color: #ddd;
+ word-break: break-word;
+ display: -webkit-box;
+ -webkit-line-clamp: 4;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+.map-popup-text img {
+ max-width: 100%;
+ max-height: 100px;
+}
+.map-popup-coords {
+ font-family: monospace;
+ font-size: 12px;
+ color: #fff;
+}
+.map-stage .map-popup-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+ align-items: center;
+ font-size: 12px;
+ color: #aaa;
+}
+.map-popup-meta a.user-link {
+ padding: 2px 8px;
+ font-size: 0.7rem;
+ border-width: 1px;
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: inline-block;
+ box-sizing: border-box;
+}
+.map-stage .map-popup-actions {
+ display: flex;
+ gap: 6px;
+ align-items: center;
+}
+.map-stage .map-popup-actions form {
+ margin: 0;
+}
+.map-popup-actions .btn-singleview {
+ min-width: 30px;
+ height: 30px;
+ font-size: 1em;
+}
+.map-markers-list .map-marker-row--focus {
+ background: rgba(255, 165, 0, 0.08);
+ box-shadow: inset 3px 0 0 #FFA500;
+}
+.map-marker-idx {
+ min-width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: #3498db;
+ color: #fff;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.75rem;
+ font-weight: 700;
+ flex-shrink: 0;
+}
+.map-marker-idx--main {
+ background: #e74c3c;
+}
+.map-marker-row--focus .map-marker-idx {
+ background: #FFA500;
+ color: #000;
+}
+.map-marker-thumb {
+ width: 44px;
+ height: 44px;
object-fit: cover;
border-radius: 4px;
- margin: 4px 0;
+ flex-shrink: 0;
+}
+.map-marker-text {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+.map-marker-label {
+ font-weight: 600;
+ color: #ffa300;
+ word-break: break-word;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+}
+.map-marker-actions {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+ gap: 6px;
+ justify-self: end;
+}
+.map-marker-actions .btn-singleview {
+ align-self: center;
+}
+.map-marker-actions form {
+ margin: 0;
+}
+.map-marker-actions .btn-singleview {
+ min-width: 32px;
+ height: 32px;
+ font-size: 1em;
+}
+.map-center-link {
+ color: #FFA500;
+ text-decoration: none;
+ font-size: 0.85rem;
+ border: 1px solid #555;
+ border-radius: 6px;
+ padding: 0 10px;
+ height: 32px;
+ display: inline-flex;
+ align-items: center;
+ box-sizing: border-box;
+ white-space: nowrap;
+}
+.map-center-link:hover {
+ background: #FFA500;
+ color: #000;
+ border-color: #FFA500;
+}
+.map-picked {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 8px;
+ margin: 8px 0;
+ padding: 8px 12px;
+ background: #222;
+ border-radius: 6px;
+ color: #FFA500;
+ font-family: monospace;
+ font-size: 0.9rem;
+}
+.map-picked-near {
+ color: #ddd;
+ font-family: inherit;
+}
+.map-pick-hint {
+ color: #888;
+ font-size: 0.85rem;
+ margin: 6px 0;
}
.map-zoom-info {
display: block;
@@ -5568,10 +5924,6 @@ a.pm-btn:hover { text-decoration: none }
.map-embed-url .map-location-link {
font-size: 0.8rem;
}
-.map-zone {
- display: block;
-}
-.map-popup-container { height: 0; overflow: hidden; border: 0px; }
.project-maploc {
margin: 6px 0;
}
@@ -5630,13 +5982,58 @@ a.pm-btn:hover { text-decoration: none }
.chat-messages-list{display:flex;flex-direction:column;gap:6px}
.chat-bubble-row{display:flex;justify-content:flex-start;border:none !important;background:transparent !important;padding:0 !important}
.chat-bubble-row-self{justify-content:flex-end}
-.chat-message{max-width:85%;padding:7px 12px 5px;border-radius:14px 14px 14px 4px;background:#23242a;word-break:break-word;border:none}
+.chat-message{position:relative;max-width:85%;padding:7px 12px 5px;border-radius:14px 14px 14px 4px;background:#23242a;word-break:break-word;border:none}
.chat-message-author{background:#1f1800}
.chat-bubble-row-self .chat-message{border-radius:14px 14px 4px 14px;background:#2f2510}
.chat-bubble-sender{display:block;font-size:0.78rem;font-weight:bold;color:#7fb3ff;text-decoration:none;margin-bottom:2px;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-bubble-sender:hover{text-decoration:underline}
.chat-bubble-sender-owner{color:#ffa300}
.chat-bubble-time{display:block;font-size:0.68rem;color:#888;text-align:right;margin-top:2px;line-height:1}
+.chat-reply-quote{display:block;border-left:3px solid #FFA500;background:rgba(255,163,0,.08);border-radius:4px;padding:2px 8px;margin-bottom:4px;font-size:.78rem;color:#ccc;text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:420px}
+.chat-reply-quote:hover{background:rgba(255,163,0,.16)}
+.chat-reply-author{color:#7fb3ff;font-weight:bold}
+.chat-replying-banner{display:flex;align-items:center;gap:6px;border:0 !important;border-left:3px solid #FFA500 !important;background:rgba(255,163,0,.08) !important;border-radius:4px;padding:4px 10px !important;margin:0 0 6px;box-shadow:none;font-size:.8rem;color:#ccc;overflow:hidden}
+.chat-replying-banner .chat-reply-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
+.chat-reply-cancel{color:#ff6b6b;text-decoration:none;font-weight:bold;margin-left:auto}
+.chat-msg-actions{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin:4px 0 0;padding:0 !important;background:transparent !important;border:0 !important;border-radius:0;box-shadow:none}
+.chat-react-form{display:inline;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.chat-react-btn{display:inline-flex;align-items:center;justify-content:center;font-size:.72rem;line-height:1.4;padding:1px 7px;border:1px solid rgba(128,128,128,.4);border-radius:10px;background:rgba(128,128,128,.12);color:#eee;cursor:pointer;text-decoration:none;font-family:"Noto Color Emoji","Apple Color Emoji","Segoe UI Emoji",sans-serif}
+.chat-react-btn:hover{background:rgba(128,128,128,.3)}
+.chat-reply-btn{margin-left:auto}
+.chat-react-active{border-color:#FFA500;color:#FFA500}
+.chat-message-pinned{border:1px solid #FFA500 !important;background:#332a14 !important}
+.chat-pin-toggle{position:absolute;top:4px;right:6px}
+.chat-has-pin-toggle{padding-right:38px}
+.chat-pinned-link{margin-right:8px}
+.btn-singleview.btn-delete{color:#ff6b6b !important;border-color:rgba(255,107,107,.55) !important}
+.btn-singleview.btn-delete:hover{background:rgba(255,107,107,.15) !important}
+.feed-opinions-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:transparent !important;border:0 !important;padding:0 !important;margin:6px 0;box-shadow:none}
+.feed-opinions-count{font-weight:bold;color:#FFA500}
+.feed-votes-summary{display:flex;gap:6px;flex-wrap:wrap;background:transparent !important;border:0 !important;padding:0 !important;margin:6px 0;box-shadow:none}
+.feed-votes-summary .vote-category{font-size:.75em;padding:2px 9px;border:1px solid rgba(255,163,0,.45);border-radius:10px;background:rgba(255,163,0,.08);color:#FFD700;white-space:nowrap}
+.school-invite-code-block{display:block}
+.school-lesson-details{background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none}
+.school-lesson-summary{cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:10px;list-style:none;font-weight:bold}
+.school-lesson-summary-title{flex:1 1 auto;min-width:0}
+.school-lesson-summary::-webkit-details-marker{display:none}
+.school-lesson-summary-title{color:#ffa300}
+.school-lesson-summary-title::after{content:" \25BE";opacity:.7}
+details[open] > .school-lesson-summary .school-lesson-summary-title::after{content:" \25B4"}
+.school-lesson-summary-meta{font-size:.78em;color:#888;white-space:nowrap;font-weight:normal}
+.school-lesson-body{background:transparent !important;border:0 !important;padding:10px 0 0 !important;margin:0;box-shadow:none}
+.school-lesson-actions{display:flex;gap:8px;align-items:center;margin-top:8px;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.feed-workspace{display:grid;grid-template-columns:230px minmax(0,1fr) 230px;gap:18px;align-items:start;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;margin:0;overflow:visible}
+.feed-workspace-center{min-width:0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;margin:0;overflow:visible}
+.feed-side{position:sticky;top:12px;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;margin:0;overflow:visible}
+.feed-side-box{background:#1c1c1c;border:1px solid #333;border-radius:12px;padding:14px 16px;margin:0;box-shadow:none;overflow:hidden}
+.feed-side-title{font-size:1em;margin:0 0 10px;color:#FFA500}
+.feed-side-tags{display:flex;flex-wrap:wrap;gap:6px;background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none}
+.feed-side-users{display:flex;flex-direction:column;gap:8px;background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none}
+.feed-side-user{display:flex;align-items:center;gap:8px;background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none;overflow:hidden}
+.feed-side-avatar{width:28px;height:28px;border-radius:50%;object-fit:cover;flex:0 0 auto}
+.feed-side-user .user-link{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:160px}
+.chat-time-inline{margin:0 0 0 6px;line-height:1.4}
+.chat-time-push{margin-left:auto}
.chat-day-separator{display:flex;justify-content:center;margin:10px 0 4px;border:none !important;background:transparent !important;padding:0 !important}
.chat-day-chip{font-size:0.72rem;padding:2px 12px;border-radius:10px;background:#1a1a1a;color:#aaa;border:1px solid #333}
.chat-message.chat-poll{max-width:92%}
@@ -5688,6 +6085,73 @@ a.pm-btn:hover { text-decoration: none }
.pad-readonly-colored{background:#fff;color:#111;padding:12px;border-radius:4px;min-height:120px;white-space:pre-wrap;word-break:break-word;font-family:inherit;font-size:.95rem;border:1px solid #aaa;margin-bottom:10px}
.pad-author-span{padding:1px 2px;border-radius:2px}
.pad-members-section{margin-top:12px;border:none}
+.feed-error-msg{margin:8px 0 12px;padding:10px 14px;border-left:4px solid #e74c3c;background:rgba(231,76,60,.12);border-radius:6px}
+.feed-error-msg p{margin:0}
+.pad-workspace{display:flex;flex-direction:column;gap:14px;width:100%}
+.pad-workspace-main{min-width:0;width:100%}
+.pad-workspace-side{display:flex;flex-direction:column;gap:14px}
+.pad-editor{width:100%;box-sizing:border-box;min-height:62vh;background:#fff;color:#111;border:1px solid #aaa;border-radius:4px;padding:12px;font-family:monospace;font-size:.95rem;line-height:1.45;resize:vertical}
+.pad-editor-bar{display:flex;justify-content:flex-end;align-items:center;gap:10px;margin-top:8px}
+.pad-page .tribe-main .pad-document{width:100%;box-sizing:border-box}
+.pad-editor-hint{color:#888;font-size:.8rem}
+.pad-attribution{margin-top:10px}
+.pad-attribution summary{cursor:pointer;color:#aaa;font-size:.8rem;text-transform:uppercase;letter-spacing:1px;padding:4px 0}
+.pad-document{background:#fff;color:#111;padding:14px;border-radius:4px;min-height:40vh;white-space:pre-wrap;word-break:break-word;font-family:monospace;font-size:.95rem;line-height:1.45}
+.pad-users h4,.pad-history h4{margin:0 0 6px 0;color:#aaa;font-size:.8rem;text-transform:uppercase;letter-spacing:1px}
+.pad-user-item{display:flex;align-items:center;gap:6px;padding:3px 0;font-size:.9rem;min-width:0}
+.pad-user-item a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.pad-history{max-height:40vh;overflow:auto}
+.pad-history-item{width:100%;box-sizing:border-box}
+.pad-line-placeholder{color:#888;font-style:italic}
+.pad-page .tribe-side .pad-meta{flex-basis:100%}
+.pad-history-item{display:flex;align-items:center;gap:6px;padding:4px 0;font-size:.85rem;border-bottom:1px solid rgba(128,128,128,.15);min-width:0}
+.pad-history-item .pad-version-link{color:#aaa;text-decoration:none;font-family:monospace;white-space:nowrap}
+.pad-history-item .pad-version-link.active{color:#FFA500}
+.pad-history-item a.user-link{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.tribe-details.pad-page{flex-direction:column;gap:16px}
+.pad-page .tribe-side{width:100%;flex-direction:row;flex-wrap:wrap;align-items:center;gap:10px 18px;padding:12px 16px;box-sizing:border-box}
+.pad-page .tribe-side > *{margin:0}
+.pad-page .tribe-side > div:not(.tribe-info-table),.pad-page .tribe-side > form{border:none;background:transparent;padding:2px}
+.pad-page .tribe-side .tribe-side-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
+.pad-page .tribe-side .card-header{border:none;background:transparent;padding:0}
+.pad-page .tribe-side .shop-title-row{border:none;background:transparent;padding:0}
+.pad-page .tribe-side .tribe-card-title{margin:0}
+.pad-page .tribe-side .tribe-info-table{margin:0}
+.pad-page .tribe-side form{display:inline-block}
+.pad-page .tribe-main{width:100%;border:none;background:transparent;padding:0}
+.pad-page .tribe-main,.pad-page .pad-workspace,.pad-page .pad-workspace div{padding:0;margin:0;border:none;border-radius:0;background:transparent;box-shadow:none;overflow:visible;box-sizing:border-box}
+.pad-page .pad-workspace .pad-editor-wrap{display:flex;width:100%;background:#fff;border:1px solid #aaa;border-radius:4px;overflow:hidden}
+.pad-page .pad-workspace .pad-gutter{padding:12px 8px 12px 10px;background:#f4f4f4;border-right:1px solid #ddd}
+.pad-page .pad-workspace .pad-document{width:100%;padding:12px 14px 12px 4px;background:#fff;border-radius:4px;min-height:40vh}
+.pad-page .pad-workspace .pad-readonly-colored{padding:12px 14px 12px 4px;background:#fff;border-radius:4px}
+.pad-page .pad-workspace .pad-workspace-side > div{border:1px solid #333;background:#1A1A1A;border-radius:8px;padding:10px 12px}
+.pad-page .pad-workspace .pad-history-item{padding:4px 0;border-bottom:1px solid rgba(128,128,128,.15)}
+.pad-page .pad-workspace .pad-editor-bar{margin-top:8px}
+.pad-page .pad-workspace .pad-editor-wrap .pad-editor{margin:0;min-height:0;padding:12px;line-height:1.45;font-size:.95rem}
+.pad-page .pad-workspace .pad-attribution{margin-top:10px}
+.pad-workspace .pad-document,.pad-workspace .pad-readonly-colored{background:#fff}
+.pad-meta{display:flex;align-items:center;gap:6px 10px;flex-wrap:wrap;font-size:.9em}
+.pad-meta .user-link{display:inline-block;width:auto}
+.pad-page .tribe-side .pad-members-details{flex-basis:100%;border:none;background:transparent;padding:0}
+.pad-members-details summary{cursor:pointer;display:inline-block}
+.pad-members-chips{display:flex;flex-wrap:wrap;gap:6px 12px;padding:8px 0 2px;max-height:150px;overflow:auto;border:none;background:transparent}
+.pad-page .tribe-side div form{border:none;background:transparent;padding:2px}
+.pad-member-chip{display:inline-flex;align-items:center;gap:6px;font-size:.9em;min-width:0}
+.supporters-list{display:flex;flex-wrap:wrap;gap:8px 12px;margin:0;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none}
+.pad-member-chip .user-link{display:inline-block;width:auto;max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.pad-workspace-main form{display:block;width:100%;margin:0}
+.pad-editor-wrap{display:flex;align-items:stretch;width:100%;box-sizing:border-box;background:#fff;border:1px solid #aaa;border-radius:4px;overflow:hidden}
+.pad-gutter{flex:0 0 auto;padding:12px 8px 12px 10px;font-family:monospace;font-size:.95rem;line-height:1.45;color:#999;text-align:right;white-space:pre;user-select:none;border-right:1px solid #ddd;background:#f4f4f4}
+.pad-editor-wrap .pad-editor{flex:1 1 0;min-width:0;width:100%;border:none;border-radius:0;min-height:62vh;resize:vertical;overflow:auto}
+.pad-lines,.pad-document table.pad-lines,.pad-readonly-colored table.pad-lines{border-collapse:collapse;width:100%;background:transparent;border:none;margin:0;box-shadow:none}
+.pad-lines tr,.pad-lines tr:nth-child(even),.pad-lines tr:nth-child(odd),.pad-lines td,.pad-lines th{background:transparent !important;border:none !important;padding:0;vertical-align:top;color:#111}
+.pad-lines .pad-line-num{text-align:right;padding:0 10px 0 2px;width:1%;min-width:40px;white-space:nowrap;user-select:none;border-right:1px solid #ddd;font-family:monospace;line-height:1.45}
+.pad-lines .pad-line-num a{color:#999;text-decoration:none}
+.pad-lines tr:target .pad-line-num a{color:#FFA500;font-weight:700}
+.pad-lines .pad-line-text{padding-left:12px;white-space:pre-wrap;word-break:break-word;font-family:monospace;line-height:1.45;min-height:1.45em}
+.pad-workspace .pad-document{padding:12px 14px 12px 4px}
+.pad-workspace .pad-readonly-colored{padding:12px 14px 12px 4px;color:#111}
+@media (max-width:720px){.pad-workspace{grid-template-columns:1fr}.pad-editor{min-height:50vh}.pad-history{max-height:30vh}}
.pad-members-below-tags{margin-top:12px;border:none}
.pad-member-card{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:0.85rem}
.pad-members-grid{display:flex;flex-direction:column;gap:4px;margin-bottom:12px}
@@ -5717,6 +6181,7 @@ a.pm-btn:hover { text-decoration: none }
.game-iframe-ecoinflow{height:95vh}
.game-iframe-neoninfiltrator{height:95vh}
.game-iframe-audiopendulum{height:95vh}
+.game-iframe-visualdj{height:95vh}
.game-iframe-flipflop{height:720px}
.game-iframe-rockpaperscissors{height:580px}
.game-iframe-tiktaktoe{height:580px}
@@ -5744,10 +6209,11 @@ a.pm-btn:hover { text-decoration: none }
.torrent-table{width:100%;border-collapse:collapse;margin-top:12px}
.torrent-table th,.torrent-table td{padding:8px 12px;text-align:left}
.torrent-table td:has(.filter-btn){width:1%;white-space:nowrap}
+.torrent-table td:nth-child(3){max-width:380px;overflow-wrap:anywhere}
+.torrent-table td:nth-child(4),.torrent-table td:nth-child(6){white-space:nowrap;width:1%}
.torrent-table td .filter-btn{margin:0}
.torrent-table th{background:#1a1a1a;color:#FFA500;font-weight:bold}
-.torrent-download{margin:12px 0}
-.torrent-download .filter-btn{border:none}
+.torrent-download{margin:12px 0;background:transparent;border:0;padding:0;box-shadow:none}
.logs-table{width:100%;border-collapse:collapse;margin-top:12px}
.logs-table th,.logs-table td{padding:8px 12px;text-align:left;vertical-align:middle;border-bottom:1px solid #222}
@@ -5814,7 +6280,7 @@ a.pm-btn:hover { text-decoration: none }
.stats-link-break{color:#ffa500;text-decoration:none;word-break:break-all}
.stats-muted{color:#aaa}
.stats-strong{color:#ffd700;font-weight:600}
-.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:16px;margin-bottom:24px}
+.stats-grid{display:flex;flex-wrap:wrap;gap:6px 28px;margin-bottom:6px;background:transparent !important;border:0 !important;box-shadow:none;padding:0 !important}
.stats-mode-row{justify-content:flex-start;margin-bottom:24px}
.stats-section-h{font-size:18px;color:#ffa500;margin:8px 0;font-weight:600}
.stats-list-reset{list-style-type:none;padding:0;margin:0}
@@ -5834,6 +6300,8 @@ a.pm-btn:hover { text-decoration: none }
.invites-pubs-table td:nth-child(4){width:30%}
.invites-pubs-table tr:first-child td{white-space:nowrap}
.stats-block{background:none;padding:0;border:none;border-radius:0;margin-bottom:16px}
+.stats-block.stats-block-boxed{background:#1c1c1c;border:1px solid #333;border-radius:10px;padding:14px 16px;margin-bottom:16px}
+.stats-block.stats-block-boxed h2{margin-top:0}
.stats-block h2{margin:0 0 10px;font-size:16px;color:#ffa500;font-weight:600}
.stats-block ul{margin:6px 0 0;padding-left:18px}
.stats-block ul li{margin:3px 0;color:#ddd;font-size:14px}
@@ -5849,6 +6317,13 @@ a.pm-btn:hover { text-decoration: none }
.stats-toplist .stats-toplist-name{flex:0 0 auto;color:#FFDD44;font-size:13px;min-width:120px}
.stats-toplist .stats-toplist-num{flex:0 0 auto;color:#FFDD44;font-size:13px;min-width:36px;text-align:right}
.peer-key{word-break:break-all;font-size:12px}
+.peers-list .block-info-table{table-layout:fixed;width:100%}
+.peers-list .block-info-table td{overflow-wrap:anywhere}
+.peers-list .block-info-table td:nth-child(1){width:18%}
+.peers-list .block-info-table td:nth-child(2){width:47%}
+.peers-list .block-info-table td:nth-child(3){width:12%}
+.peers-list .block-info-table td:nth-child(4){width:8%}
+.peers-list .block-info-table td:nth-child(5){width:15%}
.peers-technical-block{margin-top:16px}
.peers-conn-actions{margin-bottom:12px}
.invites-pubs-actions{margin:12px 0}
@@ -5889,7 +6364,7 @@ a.pm-btn:hover { text-decoration: none }
.larp-detail-description{color:#FFDD44;line-height:1.6;font-size:15px;margin:0}
.larp-actions{margin-top:12px;background:transparent !important;border:0 !important;padding:0 !important;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.larp-actions form{margin:0;display:inline-flex;align-items:center}
-.larp-actions .filter-btn,.larp-actions button{height:36px;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;text-decoration:none}
+.larp-actions .filter-btn,.larp-actions button{height:36px;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;text-decoration:none;margin:0;padding:6px 16px;font-family:inherit;font-size:inherit;line-height:1.2;vertical-align:middle}
.larp-members-block{margin-top:24px}
.larp-members-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:6px;background:transparent !important;border:0 !important;padding:0 !important}
.larp-member-row{padding:4px 8px;background:#1A1A1A;border:1px solid #333;border-radius:4px}
@@ -5921,6 +6396,50 @@ a.pm-btn:hover { text-decoration: none }
.lan-checkbox-text{line-height:1}
.larp-sign-block{display:block;line-height:0;margin:0 auto;background:transparent !important;border:0 !important;padding:0 !important;width:180px}
.profile-sensors-box .larp-sign-block{margin-top:14px}
+.wallet-line{display:flex;flex-direction:row;align-items:center;justify-content:center;flex-wrap:wrap;gap:6px;padding:0.2rem 0.6rem !important;border:1px solid #555 !important;border-radius:4px;background-color:#1A1A1A !important;font-size:0.9rem;color:#FFDD44;margin:0;box-shadow:none;overflow:visible}
+.profile-sensors-box .wallet-line a,.inhabitant-left .wallet-line a{color:#FFDD44;text-decoration:none}
+.profile-sensors-box .wallet-line a:hover,.inhabitant-left .wallet-line a:hover{color:#ffa500;text-decoration:underline}
+.wallet-line-head{display:inline-flex;align-items:center;font-weight:700;font-size:1em}
+.wallet-icon{color:#4fc3f7;font-size:1.1em}
+.phone-number-icon{color:#ffa500;font-size:1.1em}
+.wallet-address{display:inline;font-family:monospace;font-size:.85em;font-weight:700;color:#FFDD44;word-break:break-all;background:transparent;border-radius:0;padding:0;cursor:copy;-webkit-user-select:all;user-select:all}
+.wallet-line-link{text-decoration:none;color:inherit}
+.wallet-transfer-ctx{display:flex;flex-direction:column;gap:6px;background:transparent !important;border:0 !important;border-radius:0;padding:0 !important;margin:10px 0;box-shadow:none}
+.wallet-transfer-ctx-line{display:flex;flex-wrap:wrap;align-items:center;gap:6px;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.wallet-transfer-ctx-label{font-weight:700;font-size:.85em;letter-spacing:.5px;text-transform:uppercase}
+.ubi-status{display:flex;flex-direction:column;gap:8px;background:#1e1f23 !important;border:1px solid #333 !important;border-radius:10px;padding:12px 14px !important;margin:0 0 14px}
+.ubi-status-line{display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.ubi-status-note{font-size:.85em;opacity:.75}
+.ubi-status a{text-decoration:none}
+.wallet-chip-link,.wallet-chip-link:hover{text-decoration:none}
+.module-header-line .wallet-chip-link{display:inline-flex}
+.addr-cards.ubi-pub-cards{grid-template-columns:repeat(3,1fr)}
+.ubi-pub-summary{margin:0;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none}
+.ubi-pub-summary .bank-info-table{width:100%;margin:0}
+.ubi-pub-summary .bank-info-table td{padding:6px 8px;font-size:.9em;letter-spacing:0;white-space:nowrap}
+.ubi-pub-summary .bank-info-table td.card-value{width:1%}
+.ubi-tick-ok{color:#7fff7f;font-weight:700}
+.ubi-tick-bad{color:#ff8a8a;font-weight:700}
+.bank-addr-search{margin-bottom:14px}
+.bank-addresses{width:100%;border-collapse:collapse}
+.bank-addresses th,.bank-addresses td{text-align:left;padding:8px 10px;border-bottom:1px solid #333;vertical-align:middle}
+.bank-addresses th{font-size:.85em;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap}
+.bank-addresses .delete-btn{white-space:nowrap}
+.bank-addresses td:last-child,.bank-addresses td:nth-child(4){white-space:nowrap}
+.bank-addresses td:nth-child(3){min-width:290px}
+.bank-address-code{font-family:monospace;font-size:1em;word-break:break-all}
+.bank-summary .module-stats-line{margin:0 0 10px;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none;display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:.72em;white-space:nowrap;text-transform:uppercase}
+.bank-addresses .addr-del{margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
+.ubi-pub-card form{margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
+@media (max-width:900px){.addr-cards.ubi-pub-cards{grid-template-columns:1fr}}
+.ubi-pub-card .ubi-status-line{gap:6px}
+.wallet-line-link:hover .wallet-address{color:#ffa500;text-decoration:underline}
+.addr-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}
+.addr-card{display:flex;flex-direction:column;gap:10px;background:#1e1f23 !important;border:1px solid #333 !important;border-radius:10px;padding:14px !important;margin:0;box-shadow:none;overflow:visible}
+.addr-card-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.addr-card .wallet-line{margin:0}
+.addr-card-owner{margin:0}
+.addr-card .addr-del{margin:0;padding:0;background:transparent;border:0;box-shadow:none;display:flex;justify-content:flex-end}
.larp-sign-large{width:180px;height:180px;object-fit:cover;border-radius:8px;border:2px solid #FFA500;display:block}
.larp-sign-mini-block{display:inline-block;line-height:0;margin:6px 0;background:transparent !important;border:0 !important;padding:0 !important;width:64px}
.larp-sign-mini{width:64px;height:64px;object-fit:cover;border-radius:50%;border:2px solid #FFA500;display:block}
@@ -5985,10 +6504,17 @@ a.pm-btn:hover { text-decoration: none }
.inbox-exposition{margin:12px 0 4px 0;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.inbox-filters-label{color:#FFDD44;font-size:13px;font-weight:600;align-self:center}
.inbox-vis-toggle{background:transparent !important;border:0 !important;padding:0 !important;display:inline-block}
+.inbox-bot-filters{margin-top:-4px}
+.pm-subject-cell{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
+.pm-unread-chip{background:#3a2a00;color:#FFA500;border-color:#FFA500}
+.inbox-bot-label{display:flex;margin:6px 0}
+.pm-title-link{color:inherit;text-decoration:none}
+.mention-actions{margin-top:8px}
.suggested-badge{display:inline-block;background:#FFA500;color:#000;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600;width:fit-content}
.peers-import-form{margin-top:16px;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
-.peers-import-form textarea{width:100%;max-width:720px;font-family:monospace;font-size:12px}
+.peers-import-form textarea{width:100%;max-width:720px;box-sizing:border-box;font-family:monospace;font-size:12px}
.peers-import-label{color:#FFDD44;font-size:13px;font-weight:600}
+.invites-used-table td:nth-child(1),.invites-used-table td:nth-child(3){width:1%;white-space:nowrap}
.graphos-canvas{width:100%;max-width:1100px;margin:12px auto;padding:8px;background:transparent}
.graphos-svg{width:100%;height:auto;min-height:480px;display:block}
.graphos-edge{stroke:#666;stroke-width:1;opacity:.55}
@@ -5996,7 +6522,7 @@ a.pm-btn:hover { text-decoration: none }
.graphos-edge-discovered{stroke:#ffd700;stroke-width:1.5;opacity:.75}
.graphos-edge-unknown{stroke:#888;stroke-width:1;stroke-dasharray:4 4;opacity:.55}
.graphos-node-circle{stroke:#1a1a1a;stroke-width:2;transition:stroke-width .15s,filter .15s}
-.graphos-node-circle-me{fill:#ffa500;stroke:#cc7700;stroke-width:3}
+.graphos-node-circle-me{fill:#3498db;stroke:#1f6391;stroke-width:3}
.graphos-node-circle-online{fill:#2ecc71;stroke:#1e8449}
.graphos-node-circle-discovered{fill:#ffd700;stroke:#b8860b}
.graphos-node-circle-unknown{fill:#888;stroke:#555}
@@ -6004,7 +6530,7 @@ a.pm-btn:hover { text-decoration: none }
.graphos-node-link:hover .graphos-node-circle{stroke-width:4;filter:brightness(1.15)}
.graphos-node-link:hover .graphos-node-label{font-weight:600}
.graphos-node-label{font-size:12px;fill:#ddd;text-anchor:middle;pointer-events:none}
-.graphos-node-label-me{font-weight:600;fill:#ffa500}
+.graphos-node-label-me{font-weight:600;fill:#5dade2}
.graphos-legend{display:flex;gap:18px;flex-wrap:wrap;align-items:center;justify-content:center;font-size:14px;color:#ddd;margin:14px 0 8px}
.graphos-stats .stats-grid{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin-bottom:18px}
.graphos-stats .stats-kpi{background:#1c1c1c;border:1px solid #444;border-radius:8px;padding:12px 14px;box-shadow:0 1px 3px rgba(0,0,0,0.35)}
@@ -6012,13 +6538,43 @@ a.pm-btn:hover { text-decoration: none }
.graphos-stats .stats-kpi-inline .stats-kpi-value{font-size:20px}
.graphos-legend-item{display:flex;align-items:center;gap:6px}
.graphos-legend-dot{display:inline-block;width:12px;height:12px;border-radius:50%;border:2px solid #1a1a1a}
-.graphos-legend-dot.graphos-node-circle-me{background:#ffa500;border-color:#cc7700}
+.graphos-legend-dot.graphos-node-circle-me{background:#3498db;border-color:#1f6391}
.graphos-legend-dot.graphos-node-circle-online{background:#2ecc71;border-color:#1e8449}
.graphos-legend-dot.graphos-node-circle-discovered{background:#ffd700;border-color:#b8860b}
.graphos-legend-dot.graphos-node-circle-unknown{background:#888;border-color:#555}
-.stats-kpi{padding:8px 4px;display:flex;flex-direction:column;gap:4px;background:transparent;border:none}
-.stats-kpi-label{color:#ffa500;font-size:12px;font-weight:600;letter-spacing:.3px}
-.stats-kpi-value{color:#ffd700;font-weight:600;font-size:22px;line-height:1.1;word-break:break-word}
+.graphos-fed-connected{fill:#2ecc71;stroke:#1e8449}
+.graphos-fed-available{fill:#ffd700;stroke:#b8860b}
+.graphos-fed-unreachable{fill:#7f8c8d;stroke:#4d5656}
+.graphos-fed-unknown{fill:#444;stroke:#666}
+.graphos-fed-outdated-ring{fill:none;stroke:#e74c3c;stroke-width:3}
+.graphos-fed-isolated-ring{fill:none;stroke:#e74c3c;stroke-width:1.5;stroke-dasharray:3 3}
+.graphos-fed-link{stroke-width:1.5;opacity:.8}
+.graphos-fed-mutual{stroke:#ffa500}
+.graphos-fed-oneway{stroke:#ffa500;stroke-dasharray:5 5;opacity:.5}
+.graphos-fed-me-live{stroke:#2ecc71;stroke-width:2.5;opacity:.9}
+.graphos-fed-me-follow{stroke:#888;stroke-width:1;stroke-dasharray:2 4;opacity:.6}
+.graphos-fed-tor{font-size:10px;fill:#c9a0ff;font-weight:700;pointer-events:none}
+.graphos-legend-dot.graphos-fed-dot-connected{background:#2ecc71;border-color:#1e8449}
+.graphos-legend-dot.graphos-fed-dot-available{background:#ffd700;border-color:#b8860b}
+.graphos-legend-dot.graphos-fed-dot-unreachable{background:#7f8c8d;border-color:#4d5656}
+.graphos-legend-dot.graphos-fed-dot-outdated{background:transparent;border:3px solid #e74c3c}
+.graphos-legend-line{display:inline-block;width:22px;height:0;border-top:2px solid #ffa500}
+.graphos-legend-line.graphos-fed-line-oneway{border-top-style:dashed;opacity:.6}
+.graphos-fed-table{margin-top:16px}
+.stats-kpi{padding:4px 0 !important;margin:0 !important;display:inline-flex !important;flex-direction:row !important;flex-wrap:nowrap;align-items:baseline !important;gap:6px;background:transparent !important;border:none !important;width:auto !important}
+.stats-kpi-label{color:#ffa500;font-size:15px;font-weight:600;letter-spacing:.3px;padding:0 !important;margin:0 !important;background:transparent !important;border:0 !important;width:auto !important;flex:0 0 auto;white-space:nowrap}
+.stats-kpi-label::after{content:':'}
+.stats-kpi-value{color:#ffd700;font-weight:600;font-size:15px;line-height:1.1;word-break:break-word;padding:0 !important;margin:0 !important;background:transparent !important;border:0 !important;width:auto !important;flex:0 0 auto}
+.ai-ask-row{display:flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:18px;width:100%;max-width:960px;min-width:0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.ai-ask-row .ai-ask-nav{flex:0 0 auto}
+.ai-ask-row .ai-ask-form{flex:1 1 260px;min-width:180px;max-width:480px}
+.ai-ask-row .ai-suggestion-banner{flex:0 1 auto;min-width:0;justify-content:flex-start;border:0 !important;background:transparent !important;padding:0 !important;margin:0;white-space:nowrap;overflow:hidden}
+.ai-ask-row .ai-suggestion-banner .update-banner-link{max-width:28vw}
+.ai-ask-nav ul{display:flex;margin:0;padding:0;list-style:none}
+.ai-ask-nav ul li{margin:0}
+.header .top-bar-center{align-self:center;margin:0 0 20px 0 !important;padding:0 !important;box-shadow:none;overflow:visible}
+.header .ai-ask-row{margin:0 !important;overflow:visible}
+.header .ai-ask-row .ai-suggestion-banner{margin:0 !important}
.stats-kpi-bar{margin-top:6px}
.stats-activity-totals{display:flex;gap:24px;flex-wrap:wrap;color:#ffa500;font-size:13px;margin-top:8px}
.stats-activity-totals strong{color:#ffd700}
@@ -6041,7 +6597,9 @@ a.pm-btn:hover { text-decoration: none }
.prefs-card .tags-header{margin:0 0 10px 0}
.prefs-card .tags-header h2{font-size:16px;color:#FFA500;margin:0 0 4px 0}
.prefs-help{color:#FFD700;font-size:12px;margin:0}
-.pref-pill-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
+.pref-pill-row{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:8px;margin-top:8px}
+@media (max-width:1100px){.pref-pill-row{grid-template-columns:repeat(4,minmax(0,1fr))}}
+@media (max-width:640px){.pref-pill-row{grid-template-columns:repeat(2,minmax(0,1fr))}}
.pref-pill{display:inline-flex;align-items:center;border:1px solid #333;padding:6px 12px;cursor:pointer;background:#161616;color:#888;font-size:13px;user-select:none}
.pref-pill:hover{border-color:#555;color:#bbb}
.pref-pill-input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}
@@ -6100,25 +6658,34 @@ a.pm-btn:hover { text-decoration: none }
}
.inhabitant-stats-grid{
display:grid;
- grid-template-columns:repeat(auto-fill,minmax(120px,1fr));
+ grid-template-columns:repeat(2,minmax(0,1fr));
gap:6px;
}
.inhabitant-stat{
display:flex;
justify-content:space-between;
align-items:center;
- gap:8px;
- padding:5px 10px;
+ gap:4px;
+ min-width:0;
+ padding:4px 7px;
border:1px solid rgba(128,128,128,.35);
border-radius:6px;
+ white-space:nowrap;
}
.inhabitant-stat-label{
- font-size:12px;
+ font-size:11px;
opacity:.85;
+ overflow:hidden;
+ text-overflow:ellipsis;
+}
+.inhabitant-stat-value{
+ flex:0 0 auto;
+ font-size:13px;
}
.inhabitant-stat-value{
font-weight:700;
}
+.profile-side-actions{align-items:center}
.profile-side-actions .btn{
background-color:#FFA500;
color:#000;
@@ -6174,7 +6741,7 @@ a.pm-btn:hover { text-decoration: none }
.inhabitant-left .gpg-line a{color:#FFDD44;text-decoration:none}
a.chip-link{text-decoration:none;display:inline-block}
a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
-.gpg-edit-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:4px}
+.gpg-edit-row{display:flex;flex-direction:column;align-items:flex-start;gap:10px;flex-wrap:wrap;margin-top:4px}
.gpg-edit-row .gpg-remove-btn{background:transparent;border:1px solid #FF6B6B;color:#FF6B6B;cursor:pointer;padding:4px 10px;border-radius:4px;font-family:inherit;font-size:0.9rem}
.gpg-edit-row .gpg-remove-btn:hover{background:#FF6B6B;color:#000}
.profile-sensors-box .inhabitant-last-activity a:hover,
@@ -6207,24 +6774,8 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.btn-spread-on{background:#ffa300;color:#000}
.btn-spread-on:hover{background:#ffb733;color:#000}
.spread-form .btn-singleview{border-radius:16px;padding:7px 12px}
-.welcome-header{margin-bottom:18px}
-.welcome-chat{max-width:760px;margin:0 auto;padding:8px}
-.welcome-ai-header{display:flex;align-items:center;gap:10px;margin-bottom:10px;color:#ffa500;font-weight:600}
-.welcome-ai-avatar{font-size:24px}
-.welcome-ai-name{font-size:16px}
-.welcome-ai-step{margin-left:auto;font-size:12px;color:#888}
-.welcome-bubble{background:#1a1a1a;border:1px solid #333;border-radius:12px;padding:14px 18px;margin-bottom:14px;line-height:1.5}
-.welcome-bubble-ai{border-left:3px solid #ffa500}
-.welcome-bubble-title{margin:0 0 8px;color:#ffd700;font-size:18px}
-.welcome-bubble p{margin:6px 0;color:#ddd}
-.welcome-actions{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0;justify-content:flex-end}
-.welcome-action-primary{background:#ff6600;color:#fff;border-color:#ff3300}
-.welcome-progress{display:flex;justify-content:center;gap:10px;margin:18px 0 6px}
-.welcome-dot{font-size:14px;color:#444;text-decoration:none}
-.welcome-dot-active{color:#ffa500}
-.welcome-skip{text-align:center;margin-top:6px}
-.welcome-skip-link{color:#666;font-size:12px}
.indexing-progress-block{max-width:640px;margin:24px auto;text-align:center}
+.indexing-message{margin:0 0 14px;font-size:16px;line-height:1.4;color:#ffd700}
.indexing-progress{width:100%;height:18px}
.indexing-percent{margin:8px 0 4px;font-size:22px;color:#ffd700}
.indexing-note{color:#888;font-size:12px;margin:0}
@@ -6243,6 +6794,108 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.pm-exposition-whole{background:#3a2300;color:#ffd700;border-color:#a39134}
.pm-exposition-mutuals{background:#1a3a1a;color:#7fff7f;border-color:#3a7f4c}
.pm-exposition-encrypted{background:#0e3320;color:#7fff7f;border-color:#3a7f4c}
+.pm-exposition-transport{background:#132433;color:#8fc7ff;border-color:#35648f}
+.pm-exposition-license{background:#251f33;color:#c8b8ec;border-color:#6a5a96}
+.pm-exposition-tribe{background:#2b1d0a;color:#ffb347;border-color:#a8692a}
+.phone-action-form{display:inline-block;margin:0;padding:0}
+.phone-call-panel{border:1px solid #ffa500;border-radius:8px;padding:14px;margin:12px 0}
+.phone-call-panel div{background:transparent}
+.phone-call-who{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:16px;font-weight:600;padding:0;margin:8px 0;border:none;box-shadow:none}
+.phone-call-icon{font-size:22px}
+.phone-call-clock{font-family:monospace;color:#ffa500}
+.phone-call-actions{display:flex;gap:10px;flex-wrap:wrap;padding:0;margin:8px 0 0 0;border:none;box-shadow:none}
+.phone-block{padding:14px 18px;margin:0 0 14px 0;background:transparent}
+.phone-block > h2{margin:0 0 12px 0}
+.phone-block > .phone-empty{margin:0}
+.phone-contacts{display:flex;flex-direction:column;gap:8px;padding:0;margin:8px 0 0 0;background:transparent;border:none !important;box-shadow:none}
+.phone-contact{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 10px;margin:0;border:1px solid #333;border-radius:6px}
+.phone-contact .phone-action-form{margin-left:auto}
+.phone-record audio{width:100%;max-width:520px;display:block;margin:8px 0}
+.phone-record .phone-record-pending{display:flex;align-items:center;min-height:40px;margin:8px 0}
+.phone-number-chooser{margin:0 0 12px 0;padding:0;border:none;background:transparent}
+.phone-number-chooser > p{margin:0 0 8px 0}
+.phone-call-ringing{font-size:14px;color:#888;padding:0;margin:4px 0}
+.phone-history{width:100%;border-collapse:collapse}
+.phone-history th,.phone-history td{padding:6px 8px;border-bottom:1px solid #333;text-align:left}
+.phone-dir{font-size:16px;width:24px}
+.phone-empty{color:#888}
+.phone-banner{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
+.phone-banner{gap:10px 12px;padding:8px 16px}
+.phone-banner .update-banner-link{font-size:1.05em;text-decoration:none;border-bottom:1px dotted currentColor}
+.phone-banner-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:#2ecc71;box-shadow:0 0 6px #2ecc71;flex:0 0 auto}
+.phone-banner-chip{white-space:nowrap}
+.phone-banner-chip .live-clock{line-height:1.2em}
+.phone-banner .phone-action-form{margin:0;display:inline-flex;align-items:center}
+.phone-banner .tribe-action-btn{padding:4px 12px;font-size:11px}
+.phone-banner button{margin:0}
+.live-clock{display:inline-flex;align-items:flex-end;white-space:nowrap;line-height:1.2em}
+.live-clock-win{display:inline-block;height:1.2em;line-height:1.2em;overflow:hidden;vertical-align:bottom;font-variant-numeric:tabular-nums;padding:0}
+.live-clock-roll{display:block;animation:live-clock-roll 60s steps(60) infinite;padding:0}
+.live-clock-roll>span{display:block;height:1.2em;line-height:1.2em;padding:0}
+.live-clock-min{animation-duration:3600s;animation-iteration-count:1;animation-fill-mode:forwards}
+.live-clock-once{animation-iteration-count:1;animation-fill-mode:forwards}
+@keyframes live-clock-roll{to{transform:translateY(-100%)}}
+.lc-d1{animation-delay:-1s}
+.lc-d2{animation-delay:-2s}
+.lc-d3{animation-delay:-3s}
+.lc-d4{animation-delay:-4s}
+.lc-d5{animation-delay:-5s}
+.lc-d6{animation-delay:-6s}
+.lc-d7{animation-delay:-7s}
+.lc-d8{animation-delay:-8s}
+.lc-d9{animation-delay:-9s}
+.lc-d10{animation-delay:-10s}
+.lc-d11{animation-delay:-11s}
+.lc-d12{animation-delay:-12s}
+.lc-d13{animation-delay:-13s}
+.lc-d14{animation-delay:-14s}
+.lc-d15{animation-delay:-15s}
+.lc-d16{animation-delay:-16s}
+.lc-d17{animation-delay:-17s}
+.lc-d18{animation-delay:-18s}
+.lc-d19{animation-delay:-19s}
+.lc-d20{animation-delay:-20s}
+.lc-d21{animation-delay:-21s}
+.lc-d22{animation-delay:-22s}
+.lc-d23{animation-delay:-23s}
+.lc-d24{animation-delay:-24s}
+.lc-d25{animation-delay:-25s}
+.lc-d26{animation-delay:-26s}
+.lc-d27{animation-delay:-27s}
+.lc-d28{animation-delay:-28s}
+.lc-d29{animation-delay:-29s}
+.lc-d30{animation-delay:-30s}
+.lc-d31{animation-delay:-31s}
+.lc-d32{animation-delay:-32s}
+.lc-d33{animation-delay:-33s}
+.lc-d34{animation-delay:-34s}
+.lc-d35{animation-delay:-35s}
+.lc-d36{animation-delay:-36s}
+.lc-d37{animation-delay:-37s}
+.lc-d38{animation-delay:-38s}
+.lc-d39{animation-delay:-39s}
+.lc-d40{animation-delay:-40s}
+.lc-d41{animation-delay:-41s}
+.lc-d42{animation-delay:-42s}
+.lc-d43{animation-delay:-43s}
+.lc-d44{animation-delay:-44s}
+.lc-d45{animation-delay:-45s}
+.lc-d46{animation-delay:-46s}
+.lc-d47{animation-delay:-47s}
+.lc-d48{animation-delay:-48s}
+.lc-d49{animation-delay:-49s}
+.lc-d50{animation-delay:-50s}
+.lc-d51{animation-delay:-51s}
+.lc-d52{animation-delay:-52s}
+.lc-d53{animation-delay:-53s}
+.lc-d54{animation-delay:-54s}
+.lc-d55{animation-delay:-55s}
+.lc-d56{animation-delay:-56s}
+.lc-d57{animation-delay:-57s}
+.lc-d58{animation-delay:-58s}
+.lc-d59{animation-delay:-59s}
+.update-changes{margin:0;padding:0 0 0 18px}
+.update-changes li{margin:0 0 4px 0}
.pm-double-enc-chip{background:#2a1633;border-color:#7a4b9c}
.pm-double-enc-chip,.pm-double-enc-chip .pm-exposition-icon,.pm-double-enc-chip .pm-exposition-text{color:#d59bff}
.pm-exposition-closed{background:#3a0e0e;color:#ff8a8a;border-color:#b04040}
@@ -6251,7 +6904,8 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.pm-exposition-lifespan-green{background:#0e2a16;color:#9aff9a;border-color:#3a7f4c}
.pm-exposition-lifespan-orange{background:#2a1f10;color:#ffb84d;border-color:#a37a34}
.pm-exposition-lifespan-red{background:#2a0e0e;color:#ff7f7f;border-color:#b04040}
-.jobs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:20px}
+.jobs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(max(300px,calc((100% - 40px)/3)),1fr));gap:20px}
+.blogs-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(max(300px,calc((100% - 40px)/3)),1fr));gap:20px}
.jobs-grid .tribe-card,.tribe-grid .tribe-card{margin-bottom:0}
.tribe-card .card-comments-summary{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px}
.tribe-card .card-comments-summary .inline-form{margin:0}
@@ -6260,7 +6914,6 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.jobs-info-table .tribe-info-value{white-space:normal;word-break:normal;overflow-wrap:anywhere}
.job-section{margin-bottom:12px;padding:0}
.job-section-title{margin:0 0 8px 0;color:#ffa500;font-size:1.05em}
-.job-card .tribe-card-members{background:transparent;padding:4px 0;text-align:left}
.job-card .card-field{border-bottom:none}
.job-card .confirmations-block{margin:6px 0}
.job-meta-line{margin:0;color:#9aa3b2;font-size:12px;letter-spacing:1px;text-transform:uppercase}
@@ -6289,20 +6942,6 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.tribe-main .job-section{border:none;background:transparent}
.profile-reach{display:flex;flex-direction:column;align-items:center;gap:8px;margin:12px 0;text-align:center;border:none !important;background:none !important}
.profile-reach .shop-clearnet-url{margin:0;text-align:center;border:none !important;background:none !important}
-.profile-reach-toggle{margin:0}
-.profile-reach-toggle .btn{
- background-color:#FFA500;
- color:#000;
- padding:8px 16px;
- border-radius:5px;
- text-align:center;
- text-decoration:none;
- border:none;
- cursor:pointer;
- font-family:inherit;
- font-size:inherit;
-}
-.profile-reach-toggle .btn:hover{background-color:#FFD700}
/* Unified item card aesthetic — applied to per-module containers that previously had no card styling. Existing rules (.market-card, .feed-card, .tribe-card, etc.) keep their own look via cascade. */
.card,
@@ -6330,8 +6969,6 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.post-card,
.mention-card,
.trending-card,
-.bank-claim-card,
-.addr-list-card,
.shop-product-card,
.cv-item,
.transfer-item,
@@ -6583,9 +7220,9 @@ a.chip-link:hover .pm-exposition-chip{filter:brightness(1.2)}
.activity-card-header{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px;border:none;background:transparent;padding:0}
.activity-card-header .card-chips-row{margin:0}
.content-actions{display:flex;justify-content:right;align-items:center;gap:12px;flex-wrap:wrap;border:none;background:transparent;padding:0}
-.tribe-side .content-actions{flex-wrap:nowrap;gap:6px}
+.tribe-side .content-actions{flex-wrap:wrap;gap:6px}
.tribe-side .content-actions .btn-singleview{padding:6px 9px;font-size:1em}
-.trending-card.own-content{box-shadow:inset 3px 0 0 #ffa300}
+.trending-card.own-content,.addr-card.ubi-pub-card.own-content{box-shadow:inset 3px 0 0 #ffa300}
.trending-dominant-sep{margin:0 8px;opacity:0.5}
.trending-dominant-text,.trending-total-count{font-weight:700}
.comment-file-upload{display:flex;flex-direction:column;align-items:flex-start;gap:6px;background:transparent !important;border:0 !important;padding:0 !important;margin:8px 0}
@@ -6601,11 +7238,11 @@ div .header-content{width:100%}
.card-section{border:none;padding:10px 0 0 16px}
.card-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:0;margin-top:8px;padding-top:0;border:none}
.card-label{font-weight:bold;letter-spacing:1.5px;line-height:1.2;margin-bottom:0}
-.card-footer{margin-top:6px;font-weight:500;font-size:1.07em;display:flex;align-items:center;gap:8px;background:none;border:none;padding-top:0}
+.card-footer{margin-top:6px;font-weight:500;font-size:1.07em;display:flex;flex-wrap:wrap;align-items:center;gap:8px;background:none;border:none;padding-top:0}
.card-body{margin-top:0;padding:0}
.card-field{display:flex;align-items:baseline;padding:0;margin-bottom:0;border:none;background:none}
.card-tags{margin:5px 0 3px 0;display:flex;flex-wrap:wrap;gap:9px}
-.card-tags a.tag-link{text-decoration:none;padding:5px 13px 4px 13px;border-radius:7px;font-size:.98em;border:none;font-weight:bold}
+.tribe-side .card-tags{background-color:#222 !important;border:none !important;border-radius:10px;padding:20px !important;margin:0 0 20px 0;box-shadow:0 4px 6px rgba(0,0,0,.1);gap:8px}
a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bold;text-decoration:none;display:inline-block;border:2px solid transparent;font-size:.8em}
.date-link{padding:8px 16px;border-radius:5px;margin-left:8px}
.activitySpreadInhabitant2,.activityVotePost{padding:8px 16px;border-radius:5px;font-weight:bold;text-decoration:none;display:inline-block;border:2px solid transparent}
@@ -6644,7 +7281,7 @@ a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bol
.industry-hero-image,.tribe-card-hero-image{max-width:100%;height:auto;border-radius:6px}
.industry-search{margin:8px 0}
.industry-card-noimage{display:flex;align-items:center;justify-content:center;min-height:120px;font-size:48px;opacity:.5}
-.industry-bot-notification .pm-title,.housing-bot-notification .pm-title{margin-top:4px}
+.industry-bot-notification .pm-title,.housing-bot-notification .pm-title,.banking-bot-notification .pm-title{margin-top:4px}
.industry-table{width:100%;border-collapse:collapse;margin:8px 0}
.industry-table th,.industry-table td{text-align:left;padding:6px 8px;border-bottom:1px solid rgba(128,128,128,.3)}
.industry-contrib-form{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:6px 0}
@@ -6670,9 +7307,8 @@ a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bol
.industry-build-notes{margin:22px 0}
.industry-dates-row{border:none;background:transparent;padding:0;box-shadow:none;border-radius:0;margin:8px 0}
.industry-dates-row p{margin:0}
-.dev-breadcrumb,.dev-stats,.dev-file-meta,.dev-file-head,.dev-listing,.dev-pager,.dev-actions,.dev-result-text,.dev-result-head,.dev-desktop{border:none;background:transparent;padding:0;box-shadow:none;border-radius:0}
-.dev-stats{margin:12px 0}
-.dev-stats p,.dev-file-meta p{margin:4px 0;line-height:1.9}
+.dev-breadcrumb,.dev-file-meta,.dev-file-head,.dev-listing,.dev-pager,.dev-actions,.dev-result-text,.dev-result-head,.dev-desktop{border:none;background:transparent;padding:0;box-shadow:none;border-radius:0}
+.dev-file-meta p{margin:4px 0;line-height:1.9}
.dev-label{font-weight:bold}
.dev-sep{opacity:.45}
.dev-hint{opacity:.75;font-style:italic}
@@ -6716,48 +7352,39 @@ a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bol
.dev-code-row td{border:none;vertical-align:top}
.dev-code-num{text-align:right;padding:0 14px 0 4px;width:1%;min-width:52px;white-space:nowrap;opacity:.5;user-select:none;border-right:1px solid rgba(128,128,128,.25) !important}
.dev-code-line{padding-left:16px}
-.ai-suggestion-banner .update-banner-link{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60vw}
+.ai-suggestion-banner .update-banner-link{display:inline-block;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60vw}
+.welcome-banner .welcome-banner-start{display:inline-flex;align-items:center;margin:0 10px;padding:6px 18px;font-size:1em;text-decoration:none;white-space:nowrap}
.welcome-banner .welcome-banner-close{margin:0;padding:0;border:none;background:transparent;box-shadow:none;display:inline-flex;align-items:center}
.welcome-banner-close-btn{background:transparent;border:none;color:inherit;cursor:pointer;font-size:1em;line-height:1;padding:0 4px;margin:0;opacity:.6}
.welcome-banner-close-btn:hover{opacity:1}
-.welcome-ux-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;border:none !important;background:transparent !important}
+.welcome-ux-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;border:none !important;background:transparent !important;max-width:680px}
.welcome-ux-option{display:flex;flex-direction:column;gap:6px;align-items:center;border:1px solid rgba(128,128,128,.35);border-radius:8px;padding:10px;cursor:pointer;background:transparent}
.welcome-ux-option:has(input:checked){border-color:#ffa300;background:rgba(255,163,0,.07)}
.welcome-ux-option input{margin:0}
-.welcome-ux-shot{width:100%;border-radius:6px;border:1px solid rgba(128,128,128,.25)}
+.welcome-ux-shot{width:100%;max-width:320px;border-radius:6px;border:1px solid rgba(128,128,128,.25)}
.welcome-ux-label{font-weight:bold}
@media (max-width: 700px){.welcome-ux-grid{grid-template-columns:1fr}}
-.welcome-progress,.welcome-steps,.welcome-complete,.welcome-footer,.welcome-action,.welcome-step-head{border:none !important;background:transparent !important;padding:0 !important;box-shadow:none !important;border-radius:0 !important}
-.welcome-progress{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px;margin:12px 0}
-.welcome-progress p{margin:0}
-.welcome-progress form{margin:0;padding:0;border:none;background:transparent}
-.welcome-progress-label{font-weight:bold}
-.welcome-optional{opacity:.75;font-style:italic;margin:0 0 18px 0}
-.welcome-steps{display:flex;flex-direction:column;gap:14px;margin:16px 0}
+.welcome-complete,.welcome-action{border:none !important;background:transparent !important;padding:0 !important;box-shadow:none !important;border-radius:0 !important}
.welcome-step{border:1px solid rgba(128,128,128,.3) !important;border-radius:8px;padding:14px 16px !important;margin:0}
-.welcome-step-done{opacity:.72}
-.welcome-step-head{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 6px 0}
-.welcome-step-number{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;border:1px solid rgba(128,128,128,.5);font-size:.85em;flex:0 0 auto}
-.welcome-step-title{margin:0;font-size:1.05em}
-.welcome-step-text{margin:0 0 12px 0}
-.welcome-chip{border:1px solid rgba(128,128,128,.4);border-radius:12px;padding:2px 10px;font-size:.78em;opacity:.8}
-.welcome-chip-done{opacity:1;font-weight:bold}
+.welcome-step summary{cursor:pointer}
+.welcome-step summary h2{display:inline;margin:0 10px 0 0}
+.welcome-step-text{font-size:.95em;opacity:.85}
+.welcome-step[open] summary{margin-bottom:10px}
.welcome-action{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0}
-.welcome-action form,.welcome-language-form{margin:0;padding:0;border:none;background:transparent}
-.welcome-language-form select{width:auto;min-width:170px;height:38px;box-sizing:border-box;margin:0}
+.welcome-action form{margin:0;padding:0;border:none;background:transparent}
.welcome-action .filter-btn{margin:0;height:38px;padding:0 20px;display:inline-flex;align-items:center;justify-content:center}
.welcome-complete{margin:16px 0}
-.welcome-footer{margin:20px 0 0 0}
-.welcome-footer form{margin:0;padding:0;border:none;background:transparent}
-.welcome-profile-form,.welcome-greeting-form{margin:0;padding:0;border:none;background:transparent;box-shadow:none}
+.welcome-profile-form,.welcome-greeting-form,.welcome-ux-form,.welcome-select-form,.welcome-community-form{margin:0;padding:0;border:none;background:transparent;box-shadow:none}
+.welcome-pick{display:flex;align-items:flex-start;gap:10px;cursor:pointer}
+.welcome-pick input[type="checkbox"]{margin:18px 0 0 0;flex:0 0 auto;width:auto !important;min-width:0 !important}
+.welcome-pick .snh-invite-box{flex:1 1 auto;min-width:0;margin:6px 0}
+.welcome-select-form select{width:auto;min-width:220px;margin:0 0 14px 0}
.welcome-profile-form label{display:block;margin:10px 0 4px 0}
.welcome-profile-form input[type="text"],.welcome-profile-form textarea,.welcome-greeting-form textarea{width:100%;box-sizing:border-box;display:block;margin:0}
.welcome-profile-form input[type="file"]{margin:0;width:auto}
+.welcome-profile-form input[type="text"]{max-width:420px}
.welcome-profile-form .welcome-action,.welcome-greeting-form .welcome-action{margin-top:14px}
.welcome-profile-avatar{display:block;width:96px;height:96px;object-fit:cover;border-radius:6px;margin:0 0 10px 0}
-.welcome-step-warning{margin:0 0 12px 0}
-.welcome-oasisid{border:none !important;background:transparent !important;padding:0 !important;box-shadow:none !important;margin:0 0 14px 0;word-break:break-all}
-.welcome-oasisid .user-link{user-select:all}
.housing-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:20px}
.housing-grid .tribe-card{margin-bottom:0}
.housing-card .card-field{border-bottom:none}
@@ -6776,7 +7403,6 @@ a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bol
.tribe-main .housing-opinions{border:none;background:transparent}
.housing-form input[type="file"]{width:auto}
.vote-form-error{margin:0 0 14px 0}
-.vote-form-error .error-title{margin:0 0 4px 0;font-weight:bold}
.vote-form-error p{margin:0}
.media-file-row{border:none !important;background:transparent !important;padding:0 !important;box-shadow:none !important;display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 6px 0}
.media-file-row input[type="file"]{width:auto;margin:0}
@@ -6806,6 +7432,8 @@ a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bol
.stats-kpi-inline .stats-kpi-value{font-size:16px}
.stats-kpi-inline .stats-kpi-label{white-space:nowrap}
.content-actions .content-action-form{margin:0;display:inline-flex}
+.content-actions .btn-donate{font-family:inherit;line-height:1;text-decoration:none}
+.btn-singleview>*{line-height:1}
.content-actions .btn-pin-on{background:#ffa300;color:#000}
.content-actions .btn-pin-on:hover{background:#ffb733;color:#000}
.content-actions .spread-form{margin:0;display:inline-flex}
@@ -6990,6 +7618,10 @@ a.user-link{padding:8px 16px;border-radius:5px;text-align:center;font-weight:bol
display: flex;
flex-direction: column;
align-items: flex-start;
+ background: transparent !important;
+ border: 0 !important;
+ padding: 0 !important;
+ margin: 0;
}
.chat-poll-form input[type="text"],
@@ -7086,7 +7718,9 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
font-weight: bold;
}
-.forum-reply-body {
+.forum-reply-body,
+.trending-card .forum-reply-body {
+ display: block;
margin-bottom: 12px;
}
@@ -7095,6 +7729,17 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
overflow-wrap: anywhere;
}
+.forum-reply-text img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+}
+
+.trending-card .card-field > .forum-reply-text {
+ grid-column: 1 / -1;
+ min-width: 0;
+}
+
.chat-thread-details,
.chat-thread-meta {
border: none !important;
@@ -7178,10 +7823,28 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
background: transparent !important;
}
+.poll-ballot-actions {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 8px;
+ margin-top: 6px;
+}
+
+.chat-poll-close-form:empty,
+.chat-poll-close-form:not(:has(button)) {
+ margin: 0;
+ padding: 0;
+}
+
.report-category-select {
width: auto;
max-width: 260px;
}
+.apply-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:8px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.apply-row select{margin:0}
+.apply-row .create-button{margin:0}
+.form-sep{border:0;border-top:1px solid #444;margin:14px 0}
.data-search {
margin-top: 10px;
@@ -7274,7 +7937,6 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
.data-list { grid-template-columns: 1fr; }
}
-
.data-card {
display: flex;
flex-direction: column;
@@ -7360,7 +8022,6 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
font-size: 1.15em;
}
-
.data-card-author {
font-size: .78em;
opacity: .7;
@@ -7392,6 +8053,11 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
min-width: 0;
}
+.card-engage > .feed-votes-summary {
+ grid-column: 1 / -1;
+ margin: 0;
+}
+
.card-engage > details[open] {
grid-column: 1 / -1;
}
@@ -7532,10 +8198,42 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
.ai-prompt-form{margin-bottom:0}
.ai-submit-row{display:flex;gap:1.5em;justify-content:flex-end;align-items:center;margin-top:.7em}
-.ai-clear-row{display:flex;justify-content:flex-end;margin-bottom:2em}
.ai-clear-form{display:inline}
-.ai-clear-btn{background:#b80c09;color:#fff;border:none;padding:.4em 1.2em;border-radius:6px;cursor:pointer;font-size:1em;margin-left:1em}
-.user-prompt{margin-bottom:2em;font-size:.95em;color:#888}
+.ai-clear-btn{background:transparent;color:#d9534f;border:1px solid #d9534f;padding:.4em 1.2em;border-radius:6px;cursor:pointer;font-size:1em}
+.ai-clear-btn:hover{background:#d9534f;color:#fff}
+.user-prompt{margin-right:auto;font-size:.85em;color:#888;align-self:center}
+.ai-workspace{display:flex;flex-direction:column;gap:12px;background:transparent;border:0;padding:0}
+.ai-submit-row{background:transparent;border:0;padding:8px 0 0 0}
+.ai-messages-list{padding:10px 14px;gap:14px}
+.ai-row .chat-message{padding:10px 14px 8px}
+.ai-row.chat-bubble-row-self .chat-message{max-width:85%;margin-left:auto;background:#23242a}
+.ai-row:not(.chat-bubble-row-self) .chat-message{max-width:70%;margin-right:auto}
+.ai-bubble-user{background:#2f2510}
+.ai-chip{background:#1a2a3a;color:#9fd0ff;border-color:#3a6a8f;align-self:center}
+.ai-submit-row .ai-chip-waiting{margin-right:auto}
+.ai-messages-list .ai-chip-thinking{background:#2a2410;color:#ffd95a;border-color:#a39134;align-self:flex-end;margin-top:4px}
+.ai-messages-list .ai-chip-thinking:not(:last-child){display:none}
+.ai-bubble-user .chat-message-text,.ai-bubble-42 .chat-message-text{background:transparent;border:0;padding:0;margin:0}
+.ai-bubble-42 .ai-answer-line{background:transparent;border:0;padding:0}
+.ai-bubble-42{max-width:92%}
+.ai-bubble-data{border-left:3px solid #7fb3ff}
+.ai-bubble-network{border-left:3px solid #3a7f4c}
+.ai-bubble-error{border-left:3px solid #d9534f}
+.ai-answer-line{margin:0 0 4px 0}
+.ai-rating{display:flex;align-items:center;gap:6px;margin-top:4px;background:transparent;border:0;padding:0}
+.ai-stars{flex-direction:row-reverse;justify-content:flex-end}
+.ai-star-btn{background:transparent;border:0;color:#555;font-size:18px;line-height:1;padding:0 1px;cursor:pointer}
+.ai-star-btn:hover,.ai-star-btn:hover ~ .ai-star-btn{color:#ffa300}
+.ai-stars-static{color:#ffa300;font-size:16px;letter-spacing:1px}
+.ai-rating-label{font-size:11px;color:#888}
+.ai-status{padding:8px 12px;border-radius:6px;font-size:13px;margin-bottom:8px}
+.ai-status-loading{background:#2a2410;color:#ffd95a;border:1px solid #a39134}
+.ai-status-missing{background:#3a1a1a;color:#ffb3b3;border:1px solid #d9534f}
+.ai-export-btn{margin-left:8px}
+.blob-cache-clean-btn{margin-left:8px}
+.blob-cache-usage{margin:4px 0 10px 0}
+.blob-cache-notice{margin:0 0 10px 0;font-weight:bold}
+.peers-connect-error{margin:0 0 12px 0;padding:8px 12px;border:1px solid #d9534f;border-radius:6px;color:#d9534f;font-weight:bold}
.user-prompt-text{font-style:italic}
.chat-entry{margin-bottom:2em;position:relative;background:#191919;border-radius:10px;box-shadow:0 0 8px #0004;padding-top:1.8em}
.chat-entry-timestamp{position:absolute;top:.5em;right:1.3em;font-size:.92em;color:#888}
@@ -7547,13 +8245,13 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
.ai-train-approved{color:#5ad25a;font-weight:600}
.ai-train-rejected{color:#ff6b6b;font-weight:600}
-.modules-counts{margin-bottom:16px}
-.modules-count-value{color:#888}
+.modules-counts{display:flex;flex-wrap:wrap;gap:18px;align-items:baseline;padding:10px 0 !important;margin-bottom:10px;border:0 !important}
+.modules-count-value{color:#ffa300}
.modules-count-list{list-style-type:none;padding:0;margin:0}
-.modules-count-item{font-size:18px;color:#555;margin:8px 0}
+.modules-count-item{margin:0}
.modules-preset-form{display:inline;margin:0}
.module-status-cell{text-align:center}
-.save-button-container{margin-top:20px;text-align:center}
+.save-button-container{margin-top:20px;text-align:left}
.votes-count-negative{margin-left:12px}
.forum-thread-header{display:flex;align-items:flex-start}
@@ -7566,7 +8264,8 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
.card-field-row{display:flex;gap:.6em;flex-wrap:wrap}
.card-section-action{margin-top:6px}
.card-section-text{margin:.4rem 0}
-.post-text-clamped{max-height:180px;overflow:hidden}
+.post-text-clamped{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:16;overflow:hidden;max-height:none}
+.post-text-clamped:has(video,audio,iframe,embed,object){display:block;-webkit-line-clamp:unset;max-height:none;overflow:visible}
.reply-context{border-left:3px solid #666;padding-left:10px;margin-bottom:8px;opacity:.85}
.reply-context-label{font-size:.85em}
.reply-context-text{font-size:.85em;max-height:80px;overflow:hidden;margin-top:4px}
@@ -7581,8 +8280,12 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
.feed-vote-sep{margin:0 8px;opacity:.5}
.feed-vote-dominant{font-weight:700}
.image-container-row,.video-container-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
-.video-container-row{flex-direction:column;align-items:stretch;width:100%}
-.video-container-row video{width:100%;max-height:640px}
+.image-card .image-container-row,
+.card-section .card-field.image-container,
+.trending-card .card-field.image-container,
+.opinions-card .card-field.image-container{display:block;text-align:center}
+.video-container-row{flex-direction:column;align-items:center;width:100%}
+.video-container-row video{width:100%;max-height:640px;margin:0 auto}
.vote-no-quorum{color:#ffcc00;font-weight:bold}
.pixelia-swatch-000000{background-color:#000000}
@@ -7601,3 +8304,573 @@ details[open] > .chat-poll-summary::after { content: " \25B4"; }
.pixelia-swatch-00bfff{background-color:#00bfff}
.pixelia-swatch-d3d3d3{background-color:#d3d3d3}
.pixelia-swatch-ff6347{background-color:#ff6347}
+
+.school-lesson-header{display:flex;justify-content:space-between;align-items:flex-start;gap:10px;flex-wrap:wrap}
+.school-lesson-header h3{margin:0}
+.school-lesson-header form{margin:0}
+.school-complete-btn--done{border-color:#2ecc71;color:#2ecc71}
+
+.school-invited-list{border:none !important;background:transparent !important;box-shadow:none !important;padding:0;margin:0}
+.stacked-action-row{flex-direction:column;align-items:flex-start;gap:6px}
+.school-invite-students form{flex-direction:column;align-items:stretch;width:100%}
+.school-invite-students form br{display:none}
+.school-invite-students input[type="text"]{width:100%}
+.school-invite-students form button{align-self:flex-start}
+.stacked-action-row .subscription-form{margin:0}
+.subscription-actions{display:flex;align-items:center;gap:8px;background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none !important}
+.subscription-label-row{display:flex;align-items:center;gap:8px;background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none !important}
+.pm-list-row{background:transparent !important;border:0 !important;padding:0 !important;margin:8px 0;box-shadow:none !important}
+.school-progress-row{border:none !important;background:transparent !important;box-shadow:none !important;padding:0;margin:0 0 10px 0;display:flex;flex-wrap:wrap;align-items:center;gap:10px}
+.school-progress-row p{margin:0}
+.school-progress-issue{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0}
+.school-progress-issue input[type="text"]{max-width:220px}
+.school-progress-failed{font-size:0.85em;color:#e57373;cursor:help}
+.school-lessons .school-lesson,.school-exams .school-lesson{background:transparent !important;border:0 !important;box-shadow:none;padding:0 !important;margin:0 0 16px 0}
+.school-exam-question{background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;margin:0 0 14px 0}
+.top-bar-center .ai-ask-form{flex:1 1 auto;min-width:220px}
+.ai-suggestion-inline{display:inline-flex;align-items:center;gap:6px;background:transparent !important;border:0 !important;padding:0 !important;margin:0 0 0 12px !important;box-shadow:none;font-size:.85em;white-space:nowrap;flex:0 1 auto;min-width:0;overflow:hidden}
+.ai-suggestion-inline .update-banner-link{display:inline-block;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}
+.ai-suggestion-inline .welcome-banner-close{margin:0;padding:0;background:transparent;border:0;box-shadow:none;display:inline}
+.activity-update-title{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
+.tags-header:not(.module-header-line):not(.activity-header-line) > h2{display:inline-block;margin:0 12px 8px 0;vertical-align:middle}
+.tags-header:not(.module-header-line):not(.activity-header-line) > h2 + p{display:inline-block;margin:0 0 8px 0;font-size:.9em;opacity:.8;vertical-align:middle}
+.activity-header-line,.module-header-line{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:12px 20px}
+.activity-header-line h2,.module-header-line h2{margin:0;line-height:1.1}
+.activity-header-line p,.module-header-line p{margin:0;font-size:.9em;opacity:.8;line-height:1.2;padding-top:2px}
+.module-header-line .pm-exposition-chip,.module-header-line .pm-exposition-chip-link{align-self:center}
+.tribe-mode-buttons,.ui-toolbar--filters,.mode-buttons,.mode-buttons-row,.mode-buttons-cols,.filters,.inhabitant-action{display:flex;flex-wrap:wrap;gap:5px !important;align-items:center}
+.tribe-mode-buttons .filter-btn,.ui-toolbar--filters .filter-btn,.mode-buttons .filter-btn,.mode-buttons-row .filter-btn,.mode-buttons-cols .filter-btn,.filters .filter-btn,.inhabitant-action .filter-btn,.tribe-section-nav .filter-btn{background:transparent;color:inherit;font-size:.75em;padding:2px 9px;border:1px solid #555;border-radius:12px;white-space:nowrap;line-height:1.5}
+.tribe-mode-buttons .filter-btn:hover,.ui-toolbar--filters .filter-btn:hover,.mode-buttons .filter-btn:hover,.mode-buttons-row .filter-btn:hover,.mode-buttons-cols .filter-btn:hover,.filters .filter-btn:hover,.inhabitant-action .filter-btn:hover,.tribe-section-nav .filter-btn:hover{border-color:#ffa300;color:#ffa300;background:transparent}
+.tribe-mode-buttons .filter-btn.active,.ui-toolbar--filters .filter-btn.active,.mode-buttons .filter-btn.active,.mode-buttons-row .filter-btn.active,.mode-buttons-cols .filter-btn.active,.filters .filter-btn.active,.inhabitant-action .filter-btn.active,.tribe-section-nav .filter-btn.active{background:#ffa300;border-color:#ffa300;color:#111;font-weight:bold}
+.tribe-mode-buttons .create-button,.ui-toolbar--filters .create-button,.mode-buttons .create-button,.mode-buttons-row .create-button,.filters .create-button{font-size:.75em;padding:2px 10px;border-radius:12px;border:1px solid #ffcc00;line-height:1.5;background:#ffcc00;color:#111;font-weight:bold}
+.filter-box{padding:0;justify-content:flex-end;border:none;background:transparent}
+.filter-box input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]),.filter-box select,.filter-box button{height:32px !important}
+.filter-box input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not([type="submit"]),.filter-box select{height:32px;padding:0 12px}
+.activity-filter-chips{display:flex;flex-wrap:wrap;align-items:center;gap:5px;padding:10px 14px !important;margin-bottom:10px}
+.activity-chip{text-decoration:none;font-size:.75em;padding:2px 9px;border:1px solid #555;border-radius:12px;color:inherit;white-space:nowrap;line-height:1.5}
+.activity-chip:hover{border-color:#ffa300;color:#ffa300}
+.activity-chip.active{background:#ffa300;border-color:#ffa300;color:#111;font-weight:bold}
+.activity-toolbar-row{margin-top:-4px;max-width:100%;box-sizing:border-box}
+.activity-toolbar-row .filter-box{margin-left:auto;flex:0 1 auto;flex-wrap:nowrap;max-width:100%;min-width:0}
+.activity-toolbar-row .filter-box select{flex:0 1 auto !important;width:auto !important;max-width:220px;height:32px !important}
+.activity-toolbar-row .filter-box .transfer-range{flex:0 1 auto !important;width:auto !important;min-width:0 !important;display:flex;gap:8px}
+.activity-toolbar-row .filter-box .transfer-range input{flex:0 1 130px;min-width:90px;width:auto !important}
+.activity-toolbar-row .filter-box__controls{gap:8px !important;justify-content:flex-end !important}
+.activity-toolbar-row .filter-box__controls > *{margin:0 !important;flex:0 1 auto !important;width:auto !important}
+.activity-toolbar-row .filter-box__controls > .transfer-range{min-width:0 !important}
+.activity-toolbar-row .inbox-exposition{margin:0 !important;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none;display:flex;align-items:center;gap:8px}
+.activity-toolbar-row .module-stats-line{margin:0 !important;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none;display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:.72em;white-space:nowrap;text-transform:uppercase}
+.module-stats-line strong{text-transform:none}
+.activity-toolbar-row .inbox-exposition .btn{margin:0;padding:2px 10px;font-size:.75em;border-radius:12px;line-height:1.5}
+.activity-toolbar-row .inbox-exposition form{margin:0;padding:0;background:transparent;border:0;box-shadow:none}
+.activity-toolbar-row .filter-box > input[type="number"]{flex:0 0 150px;min-width:150px}
+.activity-toolbar-row .filter-box > .housing-place-input{flex:0 1 220px;min-width:140px}
+.activity-toolbar-row .filter-box__controls{flex-wrap:nowrap;flex:0 0 auto}
+.activity-toolbar-row .filter-box .filter-box__input{min-width:0}
+.activity-toolbar-row .filter-box__controls{flex:0 0 auto}
+.filters{padding:10px 14px;margin-bottom:10px}
+.filters,.mode-buttons,.mode-buttons-row,.tribe-mode-buttons,.inhabitant-action,.activity-filter-chips,.activity-sub-filter,.filter-group,.activity-filter-grid,.logs-toolbar-wrap{border:0 !important}
+.mode-buttons-row,.mode-buttons,.tribe-mode-buttons,.inhabitant-action{padding:10px 14px !important;margin-bottom:10px !important}
+.mode-buttons-cols{display:contents !important}
+.filters > form:not(.filter-box),.inhabitant-action > form,.tribe-mode-buttons > form,.mode-buttons > form,.mode-buttons-row > form,.filter-group > form,.activity-filter-grid > form{display:contents}
+.mode-buttons .column,.mode-buttons-row .column,.mode-buttons-row .filter-column,.mode-buttons-cols .filter-column,.mode-buttons-row .filter-group,.mode-buttons .filter-group,.forum-create-col,.activity-filter-col{display:contents !important}
+.activity-filter-grid,.filter-group,.activity-sub-filter{display:flex !important;flex-wrap:wrap;gap:5px !important;align-items:center;padding:10px 14px !important;margin-bottom:10px !important;grid-template-columns:none !important}
+.activity-filter-grid form,.filter-group form,.activity-sub-filter form,.sub-filter-form{margin:0 !important;padding:0 !important;background:transparent !important;border:none !important;box-shadow:none !important}
+.activity-filter-grid .filter-btn,.filter-group .filter-btn,.activity-sub-filter .filter-btn{margin:0;background:transparent;color:inherit;font-size:.75em;padding:2px 9px;border:1px solid #555;border-radius:12px;white-space:nowrap;line-height:1.5}
+.activity-filter-grid .filter-btn.active,.filter-group .filter-btn.active,.activity-sub-filter .filter-btn.active{background:#ffa300;border-color:#ffa300;color:#111;font-weight:bold}
+.filter-group .create-button,.activity-sub-filter .create-button,.activity-filter-grid .create-button{margin:0;font-size:.75em;padding:2px 10px;border-radius:12px;border:1px solid #ffcc00;background:#ffcc00;color:#111;font-weight:bold;line-height:1.5}
+.mode-buttons-row form,.mode-buttons form,.tribe-mode-buttons form{margin:0 !important;padding:0 !important;background:transparent !important;border:none !important;box-shadow:none !important}
+.mode-buttons-row .filter-btn,.mode-buttons-row .create-button,.mode-buttons .filter-btn,.mode-buttons .create-button,.tribe-mode-buttons .filter-btn,.tribe-mode-buttons .create-button{margin:0}
+.filters form{margin:0;padding:0;background:transparent;border:none;box-shadow:none}
+.filters .filter-btn,.filters .create-button,.ui-toolbar--filters .filter-btn,.ui-toolbar--filters .create-button{margin:0}
+.activity-subchip-label{color:#ffa300;font-weight:bold}
+.transfers-subfilters{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0 0;background:transparent !important;border:0 !important;padding:0 !important}
+.activity-update-counts{white-space:nowrap}
+.activity-update-msg{margin:10px 15px 0 0}
+.activity-update-msg .post-text{margin:0}
+.school-exam-question p{margin:2px 0}
+.school-exam-correct{color:#2ecc71}
+.school-exam-option-row{color:#999}
+.school-panel-box{border:1px solid #444;border-radius:8px;margin:0 0 14px 0}
+.school-panel-box h3{margin:0 0 10px 0;color:#ffa300;font-size:.9em;text-transform:uppercase;letter-spacing:1px}
+.school-students-table{width:100%;border-collapse:collapse}
+.school-students-table th{text-align:left;color:#ffa300;font-size:.85em;text-transform:uppercase;letter-spacing:1px;padding:6px 10px;border-bottom:1px solid #444}
+.school-students-table td{padding:6px 10px;border-bottom:1px solid #333;vertical-align:middle}
+.school-students-table tr.school-row-passed td{background:rgba(46,204,113,.08)}
+.school-students-table .school-progress-issue input[type="text"]{max-width:160px}
+.school-progress-bar{flex:1 1 auto;min-width:100px;height:12px;accent-color:#ffa300}
+.school-progress-count{font-size:.85em;white-space:nowrap}
+.school-unit{background:transparent !important;border:0 !important;padding:0 !important;margin:0 0 14px 0;box-shadow:none}
+.school-unit-summary{cursor:pointer;list-style:none;font-weight:bold;color:#ffa300;text-transform:uppercase;letter-spacing:1px;margin:0 0 8px 0}
+.school-unit-summary::-webkit-details-marker{display:none}
+.school-unit-summary::after{content:" \25BE";opacity:.7}
+details[open] > .school-unit-summary::after{content:" \25B4"}
+.school-lessons .school-lesson-next{border-left:3px solid #ffa300 !important;padding-left:10px !important}
+.school-pending-block{border:none !important;background:transparent !important;box-shadow:none !important;padding:0;margin:0}
+.school-pending-row{justify-content:center;border:none !important;background:transparent !important;box-shadow:none !important;padding:0;margin:0}
+.school-pending-block .doc-export-actions{margin-top:8px;margin-bottom:0}
+
+.wiki-body{line-height:1.55}
+.wiki-paragraph{margin:0 0 12px 0}
+.wiki-link{color:#ffd740;text-decoration:underline dotted}
+.wiki-link-missing{color:#e74c3c;border-bottom:1px dashed #e74c3c;text-decoration:none}
+.wiki-page-title{margin:0 0 8px 0;overflow-wrap:anywhere}
+.wiki-version-notice{font-size:.9em;opacity:.85;margin:6px 0 10px 0}
+.wiki-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.wiki-actions form{margin:0;padding:0;background:transparent !important;border:0 !important}
+.wiki-backlinks ul{margin:6px 0 0 18px;padding:0}
+.wiki-backlinks li{margin:2px 0}
+.wiki-diff{font-family:monospace;font-size:.9em;white-space:pre-wrap;overflow-x:auto;background:transparent !important;border:0 !important;padding:0 !important}
+.wiki-diff-line{display:flex;gap:8px;padding:1px 6px;background:transparent !important;border:0 !important;margin:0}
+.wiki-diff-sign{width:1em;flex:0 0 1em;opacity:.7}
+.wiki-diff-add{background:rgba(46,204,113,.16) !important}
+.wiki-diff-del{background:rgba(231,76,60,.16) !important;text-decoration:line-through;opacity:.85}
+.wiki-history .wiki-version,.wiki-changes .wiki-change{margin-bottom:10px}
+.wiki-version-current{border-left:3px solid #ffa500}
+.wiki-change-summary{margin:4px 0;opacity:.9}
+
+.emergency-severity{display:inline-block;font-size:.72em;font-weight:bold;letter-spacing:.06em;padding:2px 9px;border-radius:12px;border:1px solid transparent;white-space:nowrap}
+.emergency-severity-unverified{color:#fff;border-color:#c0392b;background:#c0392b}
+.emergency-severity-low{color:#111;background:#f1c40f;border-color:#f1c40f}
+.emergency-severity-medium{color:#111;background:#e67e22;border-color:#e67e22}
+.emergency-severity-high{color:#fff;background:#e74c3c;border-color:#e74c3c}
+.emergency-card-low{border-left:3px solid #f1c40f}
+.emergency-card-medium{border-left:3px solid #e67e22}
+.emergency-card-high{border-left:3px solid #e74c3c}
+.emergency-title{margin:0 0 8px 0;overflow-wrap:anywhere}
+.emergency-meta{margin:6px 0;font-size:.9em;opacity:.85}
+.emergency-body{line-height:1.5;margin:8px 0}
+.emergency-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.emergency-actions form{margin:0;padding:0;background:transparent !important;border:0 !important}
+.emergency-updates{margin-top:14px}
+.emergency-update{margin:8px 0;padding:8px 12px !important;border-left:2px solid #ffa500}
+.emergency-update-form{margin-top:10px;background:transparent !important;border:0 !important;padding:0 !important}
+.emergency-update-form textarea{width:100%;max-width:640px}
+.emergency-banner-high{border-color:#e74c3c}
+.emergency-banner-medium{border-color:#e67e22}
+.emergency-banner .update-banner-icon{color:#e74c3c}
+
+.mailing-counts{margin:0;opacity:.85}
+.mailing-archive{list-style:none;margin:0;padding:0;background:transparent !important;border:0 !important}
+.mailing-archive-item{margin:0 0 12px 0;padding:12px 14px !important;border-left:2px solid #ffa300}
+.mailing-archive-head{margin:0 0 8px 0}
+.mailing-archive-item>div{margin:0;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none}
+.mailing-archive-head>.content-actions,.mailing-archive-head>.card-header{margin:0;padding:0 !important}
+.mailing-archive-meta{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.mailing-archive-row{margin:0}
+.mailing-archive-meta>.user-link{max-width:100%;overflow-wrap:anywhere}
+.mailing-archive-meta>*{margin:0}
+.mailing-description{margin:6px 0;overflow-wrap:anywhere}
+.mailing-title{margin:0 0 8px 0;overflow-wrap:anywhere}
+.mailing-body{line-height:1.5;margin:8px 0}
+.mailing-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-actions form{margin:0;padding:0;background:transparent !important;border:0 !important}
+.mailing-participants{margin:8px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-participants-list{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:6px;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-participants-list div{background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-history{margin-top:14px}
+.mailing-history .filter-box{margin:8px 0}
+.mailing-message{margin:10px 0;padding:10px 12px !important;border-left:2px solid #8e44ad}
+.mailing-message-head{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;margin-bottom:6px;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-message-subject{font-weight:bold;overflow-wrap:anywhere}
+.mailing-message-text{line-height:1.5;overflow-wrap:anywhere;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-reply-form{margin:6px 0 0 0;padding:0;background:transparent !important;border:0 !important}
+.mailing-thread{margin:8px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-thread-details{margin:0 0 0 16px;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-thread-details summary{cursor:pointer;font-size:.9em;opacity:.85}
+.mailing-author-group{margin:10px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.mailing-author-title{margin:0 0 4px 0;font-size:1em}
+.mailing-author-count{opacity:.7}
+.mailing-compose{margin:14px 0}
+.mailing-compose textarea{width:100%;max-width:640px}
+.mailing-inbox-list{font-weight:bold}
+.mailing-inbox-reply{display:flex;flex-direction:column;gap:6px;align-items:flex-start;width:100%}
+.mailing-inbox-reply-text{width:100%;max-width:640px}
+
+.logistics-route-line{margin:6px 0;font-weight:bold;overflow-wrap:anywhere}
+.logistics-zone{overflow-wrap:anywhere}
+.logistics-zones{align-items:center}
+.logistics-price-unit{width:auto;margin-left:6px}
+.logistics-short{width:120px}
+.logistics-title{margin:0 0 8px 0;overflow-wrap:anywhere}
+.logistics-body{line-height:1.5;margin:8px 0}
+.logistics-rating-line{color:#f1c40f}
+.logistics-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.logistics-actions form{margin:0;padding:0;background:transparent !important;border:0 !important}
+.logistics-book-form{background:transparent !important;border:0 !important;padding:0 !important}
+.logistics-book-form textarea{width:100%;max-width:640px}
+.logistics-bookings{margin-top:14px}
+.logistics-booking{margin:8px 0;padding:8px 12px !important;border-left:2px solid #16a085}
+.logistics-booking-head{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;background:transparent !important;border:0 !important;padding:0 !important}
+.logistics-booking-notes{margin:6px 0;overflow-wrap:anywhere}
+.logistics-receipt{margin:6px 0;font-size:.9em}
+.logistics-booking-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;background:transparent !important;border:0 !important;padding:0 !important}
+.logistics-booking-actions form,.logistics-receipt-form,.logistics-rate-form{margin:6px 0 0 0;padding:0;background:transparent !important;border:0 !important}
+.logistics-receipt-form{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
+.logistics-ratings{margin-top:14px}
+.logistics-rating{margin:8px 0;padding:8px 12px !important;border-left:2px solid #f1c40f}
+.logistics-rating-head{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;background:transparent !important;border:0 !important;padding:0 !important}
+.logistics-stars{color:#f1c40f;letter-spacing:.1em}
+.logistics-rate-form textarea{width:100%;max-width:640px}
+
+.podcast-card-cover{width:100%;max-height:220px;object-fit:cover;border-radius:6px;display:block;margin:0 0 8px 0}
+.podcast-cover{width:120px;height:120px;object-fit:cover;border-radius:6px;display:block}
+.podcast-cover-large{width:220px;height:220px}
+.podcast-page-body{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap}
+.podcast-page-main{flex:1 1 320px;min-width:0;background:transparent !important;border:0 !important;padding:0 !important}
+.podcast-description{margin:6px 0;overflow-wrap:anywhere}
+.podcast-counts{margin:6px 0;opacity:.85}
+.podcast-title{margin:0 0 8px 0;overflow-wrap:anywhere}
+.podcast-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.podcast-actions form{margin:0;padding:0;background:transparent !important;border:0 !important}
+.podcast-episodes{margin-top:14px}
+.podcast-episode-list{background:transparent !important;border:0 !important;padding:0 !important}
+.podcast-episode-row{display:flex;gap:12px;align-items:flex-start;margin:8px 0;padding:8px 12px !important;border-left:2px solid #d35400}
+.podcast-episode-number{font-weight:bold;opacity:.8;flex:0 0 auto}
+.podcast-episode-main{flex:1 1 auto;min-width:0;background:transparent !important;border:0 !important;padding:0 !important}
+.podcast-episode-title{font-weight:bold;overflow-wrap:anywhere;display:inline-block;margin:0}
+.podcast-episode-main .tribe-side-description{margin:0 0 8px 0}
+.podcast-episode-main .card-footer{margin:0}
+.podcast-episode-head{margin:0 0 10px 0}
+.podcast-featured{margin:0 0 16px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.podcast-cover-link{display:inline-block;border:0 !important;background:transparent !important;padding:0 !important}
+.tribe-side .card-tags + .tribe-side-actions{margin-top:0}
+.podcast-episode-head .tribe-card-title{margin:0}
+.podcast-episode-head-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:transparent !important;border:0 !important;padding:0 !important;margin:0}
+.podcast-player{margin:10px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.podcast-player audio{width:100%;max-width:100%}
+.podcast-player.video-container .podcast-video{width:100%;max-width:100%;max-height:640px;display:block}
+@media (max-width:680px){.podcast-cover-large{width:140px;height:140px}}
+
+.campaign-progress{margin:8px 0}
+.campaign-title{margin:0 0 8px 0;overflow-wrap:anywhere}
+.campaign-body{line-height:1.5;margin:8px 0}
+.campaign-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:12px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.campaign-actions form{margin:0;padding:0;background:transparent !important;border:0 !important}
+.campaign-page-body{display:flex;gap:18px;align-items:flex-start;flex-wrap:wrap}
+.campaign-page-main{flex:1 1 320px;min-width:0;background:transparent !important;border:0 !important;padding:0 !important}
+.campaign-signed{text-align:center;margin:8px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.campaign-qr{flex:0 0 auto;text-align:center;background:transparent !important;border:0 !important;padding:0 !important}
+.campaign-qr-img{width:160px;height:160px;display:block;margin:0 auto;background:#fff;border-radius:6px}
+.campaign-qr-caption{font-size:.8em;opacity:.8;max-width:180px;margin:6px auto 0 auto}
+.campaign-sign-form{background:transparent !important;border:0 !important;padding:0 !important}
+.campaign-sign-form textarea,.campaign-update-form textarea{width:100%;max-width:640px}
+.campaign-updates,.campaign-signatures{margin-top:14px}
+.campaign-update{margin:8px 0;padding:8px 12px !important;border-left:2px solid #c0392b}
+.campaign-update-form{margin-top:10px;background:transparent !important;border:0 !important;padding:0 !important}
+.campaign-signature{margin:6px 0;padding:6px 12px !important;border-left:2px solid #27ae60}
+.campaign-signature-head{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;background:transparent !important;border:0 !important;padding:0 !important}
+.campaign-signature-text{margin:4px 0 0 0;overflow-wrap:anywhere}
+.campaign-signature-list{background:transparent !important;border:0 !important;padding:0 !important;margin-bottom:8px}
+.campaign-achieved{border-left:3px solid #27ae60}
+
+.backup-section{background:transparent !important;border:0 !important;padding:0 !important}
+.backup-section-title{margin:0 0 10px 0}
+.backup-estimate{margin:0 0 12px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.backup-hint{font-size:.85em;opacity:.8;margin:4px 0}
+.backup-warning{color:#e74c3c;font-weight:bold}
+.backup-verification ul{margin:6px 0;padding-left:18px}
+.backup-restored{margin-bottom:12px;background:transparent !important;border:0 !important;padding:0 !important}
+.backup-kit{max-width:none;margin:0;background:transparent !important;border:0 !important;padding:0 !important}
+.backup-wrap{background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.backup-kit-line{margin:6px 0;overflow-wrap:anywhere}
+.backup-kit-qr{display:flex;justify-content:center;margin:12px 0;background:transparent !important;border:0 !important;padding:0 !important}
+.backup-kit-qr-img{width:260px;height:260px;background:#fff;border-radius:6px;padding:8px}
+.backup-kit-secret{white-space:pre;overflow-x:auto;font-size:1em;line-height:1.6;padding:10px;border:1px dashed currentColor;border-radius:6px}
+.backup-kit-steps{margin:10px 0 0 0;padding-left:18px}
+.backup-kit .doc-export-actions{margin-top:6px}
+.backup-verification{margin-top:10px}
+.backup-check-ok{color:#27ae60}
+.backup-check-bad{color:#e74c3c}
+.backup-check-warn{color:#f1c40f}
+.backup-fork{overflow-wrap:anywhere;font-size:.9em}
+@media print{nav,.sidebar-left,.sidebar-right,.filters,.report-form,.module-header-line p{display:none !important}.backup-kit{max-width:none}.backup-kit-secret{color:#000;border-color:#000}body{background:#fff;color:#000}}
+.wiki-card-cover{width:100%;max-height:220px;object-fit:cover;border-radius:6px;display:block;margin:0 0 8px 0}
+.wiki-actions-top{justify-content:flex-end;margin:0 0 10px 0}
+.wiki-actions-top .wiki-actions-left{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-right:auto}
+.wiki-version-actions{justify-content:flex-start;margin:6px 0}
+.wiki-preview,.blog-preview{margin:0 0 14px 0}
+.stats-kpi{margin:0 !important;padding:0 !important;box-shadow:none !important;overflow:visible}
+
+.stats-kpi-label{white-space:nowrap}
+.stats-block,.stats-container{box-shadow:none !important}
+.emergency-card-cover{width:100%;max-height:220px;object-fit:cover;border-radius:6px;display:block;margin:0 0 8px 0}
+.trending-card .card-field.media-left{text-align:left;align-items:flex-start}
+.trending-card .media-left .zoom-link:not(.zoom-inline){display:inline-block;text-align:left}
+.trending-card .media-left .post-image{margin-left:0;margin-right:0}
+.campaign-card-cover,.logistics-card-cover{width:100%;max-height:220px;object-fit:cover;border-radius:6px;display:block;margin:0 0 8px 0}
+.campaign-progress .confirmations-progress{width:100%;margin-top:6px}
+.logistics-booking,.logistics-rating,.mailing-message{margin:8px 0}
+.emergency-update-head{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 6px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.emergency-update-head .card-chips-row{margin:0}
+.emergency-update-actions{margin:0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.emergency-update-head .card-chips-row{margin:0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.backup-kit-id{font-family:monospace;font-size:1.1em}
+
+.preview-rendered{white-space:pre-wrap}
+.blog-card-text,
+.blog-detail-text,
+.feed-text,
+.emergency-body,
+.mailing-message-text{white-space:pre-wrap}
+.rt-header{display:block;font-weight:bold;margin:10px 0 4px;line-height:1.3}
+.rt-header-1{font-size:1.5em}
+.rt-header-2{font-size:1.3em}
+.rt-header-3{font-size:1.15em}
+.rt-item{display:block;padding-left:1.4em;text-indent:-0.7em}
+.rt-item-2{padding-left:3em}
+.rt-item-3{padding-left:4.6em}
+.rt-item-4{padding-left:6.2em}
+.rt-item::before{content:"• ";opacity:.7}
+.rt-item-number{text-indent:-1.2em}
+.rt-item-number::before{content:none}
+.rt-item .tag-link{text-indent:0}
+.rt-quote{display:block;border-left:3px solid currentColor;padding-left:10px;margin:6px 0;opacity:.85}
+.rt-rule{display:block;border-top:1px solid currentColor;opacity:.4;margin:10px 0}
+.rt-code{font-family:monospace;background:rgba(128,128,128,.18);padding:1px 4px;border-radius:3px;word-break:break-word}
+.rt-code-block{display:block;font-family:monospace;white-space:pre-wrap;background:rgba(128,128,128,.18);padding:10px;border-radius:5px;margin:8px 0;overflow-x:auto;word-break:break-word}
+.rt-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:fit-content;max-width:100%;margin:14px 0 0 !important;padding:5px 10px !important;font-size:.95em;background:rgba(128,128,128,.13) !important;box-shadow:none !important;border:none !important;border-radius:5px}
+.rt-toolbar-label{font-weight:bold}
+.rt-sep{opacity:.4}
+.rt-mark{font-family:monospace;white-space:nowrap}
+.rt-mark-bold{font-weight:bold}
+.rt-mark-italic{font-style:italic}
+.rt-mark-underline{text-decoration:underline}
+.rt-mark-strike{text-decoration:line-through}
+
+.qr-code{display:flex;justify-content:center;align-items:center;width:100%}
+.wallet-qr-img{max-width:320px;width:100%;height:auto}
+label.wallet-create-transfer{display:flex !important;flex-direction:row !important;align-items:center !important;justify-content:flex-start !important;gap:8px;text-align:left !important;width:100% !important;margin:8px 0}
+label.wallet-create-transfer input[type="checkbox"]{width:auto !important;flex:0 0 auto !important;margin:0 !important}
+.wallet-status{margin:0 0 12px 0}
+.wallet-history .wallet-col-confirmations{width:10%}
+.wallet-history .wallet-col-date{width:34%;white-space:nowrap}
+.torrent-file-info{margin:0 0 10px 0}
+.hemicycle{background:transparent;border:0;padding:0;margin:12px 0}
+.hemicycle-canvas{background:transparent;border:0;padding:0;margin:0 auto;max-width:760px}
+.hemicycle-svg{width:100%;height:auto;display:block}
+.hemi-seat{fill:#444;stroke:#1a1a1a;stroke-width:1}
+.hemi-seat.hemi-leader{stroke:#fff;stroke-width:2.5}
+.hemi-seat.hemi-power{stroke:#ffd700;stroke-width:2}
+.hemi-bloc-gov{fill:#ffa300}
+.hemi-bloc-opp0{fill:#ab47bc}.hemi-bloc-opp1{fill:#ef5350}.hemi-bloc-opp2{fill:#26a69a}.hemi-bloc-opp3{fill:#ec407a}.hemi-bloc-opp4{fill:#8d6e63}.hemi-bloc-opp5{fill:#ffca28}.hemi-bloc-opp6{fill:#4fc3f7}.hemi-bloc-opp7{fill:#9e9e9e}
+.hemi-bloc-none{fill:#2f6fb5}
+.hemi-house-academia{fill:#5c6bc0}.hemi-house-solaris{fill:#ffb300}.hemi-house-arrakis{fill:#d2691e}.hemi-house-terraverde{fill:#43a047}.hemi-house-unsystem{fill:#9e9e9e}.hemi-house-dogma{fill:#8e24aa}.hemi-house-helix{fill:#00acc1}.hemi-house-quark{fill:#e53935}.hemi-house-hermandad{fill:#c0a000}
+.hemi-threshold{stroke:#ddd;stroke-width:1.5;stroke-dasharray:4 3}
+.hemi-threshold-quorum{stroke:#66bb6a}
+.hemi-threshold-pass{stroke:#ffa300}
+.hemi-threshold-label{font-size:11px;font-weight:400;fill:#ddd}
+.hemi-threshold-label.hemi-threshold-quorum{fill:#66bb6a}
+.hemi-threshold-label.hemi-threshold-pass{fill:#ffa300}
+.hemi-modes{padding:0 !important;margin:0 0 8px 0;display:flex;gap:6px;justify-content:center;background:transparent !important;border:0 !important}
+.hemi-legend{list-style:none;margin:10px auto 0;padding:0;display:flex;flex-wrap:wrap;gap:6px 18px;justify-content:center}
+.hemi-legend-item{display:inline-flex;align-items:center;gap:6px;font-size:13px}
+.hemi-swatch{display:inline-block;width:12px;height:12px;border-radius:50%;background:#444}
+.hemi-swatch.hemi-bloc-gov{background:#ffa300}
+.hemi-swatch.hemi-bloc-opp0{background:#ab47bc}.hemi-swatch.hemi-bloc-opp1{background:#ef5350}.hemi-swatch.hemi-bloc-opp2{background:#26a69a}.hemi-swatch.hemi-bloc-opp3{background:#ec407a}.hemi-swatch.hemi-bloc-opp4{background:#8d6e63}.hemi-swatch.hemi-bloc-opp5{background:#ffca28}.hemi-swatch.hemi-bloc-opp6{background:#4fc3f7}.hemi-swatch.hemi-bloc-opp7{background:#9e9e9e}
+.hemi-swatch.hemi-bloc-none{background:#2f6fb5}
+.hemi-swatch.hemi-house-academia{background:#5c6bc0}.hemi-swatch.hemi-house-solaris{background:#ffb300}.hemi-swatch.hemi-house-arrakis{background:#d2691e}.hemi-swatch.hemi-house-terraverde{background:#43a047}.hemi-swatch.hemi-house-unsystem{background:#9e9e9e}.hemi-swatch.hemi-house-dogma{background:#8e24aa}.hemi-swatch.hemi-house-helix{background:#00acc1}.hemi-swatch.hemi-house-quark{background:#e53935}.hemi-swatch.hemi-house-hermandad{background:#c0a000}
+.hemi-legend-link{color:#ffa300;text-decoration:none}
+.hemi-legend-count{color:#ffd700;font-size:12px}
+.hemi-legend-item{color:#ffd700}
+.hemi-note{text-align:center;color:#ffd700;font-size:12px;margin:6px 0 0}
+.torrent-oasis{margin:8px 0 14px}
+.torrent-progress{width:160px;max-width:100%;vertical-align:middle}
+.torrent-progress-text{font-family:monospace;font-size:.85em}
+.torrent-progress-cell{white-space:nowrap}
+.torrent-from-notice p{margin:0 0 10px}
+.btn-torrent{font-weight:700}
+.peertube-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
+.peertube-card{display:flex;flex-direction:column;gap:8px;padding:10px}
+.peertube-thumb{position:relative;display:block;border-radius:6px;overflow:hidden;background:#000}
+.peertube-thumb img{display:block;width:100%;aspect-ratio:16/9;object-fit:cover}
+.peertube-thumb-empty{width:100%;aspect-ratio:16/9;background:#222}
+.peertube-duration{position:absolute;right:6px;bottom:6px;background:rgba(0,0,0,.8);color:#fff;font-size:.78em;padding:1px 6px;border-radius:4px;font-family:monospace}
+.peertube-title{font-weight:700;display:block}
+.peertube-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:.85em;opacity:.9}
+.peertube-channel-avatar{width:22px;height:22px;border-radius:50%;object-fit:cover}
+.peertube-player{width:100%;max-height:70vh;background:#000;border-radius:6px}
+.peertube-watch{gap:10px}
+.peertube-description{white-space:pre-wrap;word-break:break-word}
+.peertube-nostream p{margin:8px 0 0}
+.torrent-table td{vertical-align:middle}
+.torrent-spread-cell{text-align:center;white-space:nowrap}
+.torrent-spread-cell .spread-form{display:inline-block;margin:0;vertical-align:middle}
+.torrent-spread-cell .btn-singleview{margin:0;vertical-align:middle}
+.torrent-detail-section{margin:0 0 18px}
+.torrent-section-title{margin:0 0 8px;font-size:1em;text-transform:uppercase;letter-spacing:1px;opacity:.85}
+.torrent-detail-section .tribe-info-table{margin:0 0 10px}
+.pad-page .tribe-side .pad-actions-top{flex-basis:100%;display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin:0}
+.pad-page .tribe-side .pad-actions-top .card-header{margin:0;padding:0;border:none;background:transparent;box-shadow:none}
+.pad-page .tribe-side .pad-actions-top form{margin:0;padding:0}
+.pad-page .tribe-side .shop-title-row{flex-basis:auto}
+.torrent-card-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:0;margin:0;border:none;background:transparent;box-shadow:none}
+.feed-preview{margin:14px 0}
+.feed-preview-title{font-size:1em;margin:0 0 8px;text-transform:uppercase;letter-spacing:1px;opacity:.85}
+.feed-compose-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:10px}
+.peer-tor-no{color:#888;font-weight:700}
+.room-join-form{display:inline-flex;margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
+.room-join-btn,.room-join-form .room-join-btn{display:inline-flex;align-items:center;gap:4px;border-radius:10px;font-size:12px;font-weight:700;line-height:1.4;padding:2px 10px;margin:0;width:auto;height:auto;min-height:0;border:1px solid #ffa500;background:transparent;color:#ffa500;box-shadow:none;cursor:pointer;text-decoration:none}
+.room-join-btn:hover,.room-join-form .room-join-btn:hover{background:#ffa500;color:#1a1a1a}
+.room-join-form .room-join-btn:disabled{opacity:.5;cursor:default}
+.room-item .mailing-archive-head{flex-wrap:nowrap;align-items:flex-start}
+.room-item .mailing-archive-meta{flex:1 1 0;min-width:0}
+.room-peer{flex-wrap:nowrap;min-width:0}
+.room-peer .user-link{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.room-peer-you{flex:0 0 auto;color:#888;font-size:12px;background:transparent;border:0;padding:0}
+.room-peer-muted{flex:0 0 auto;color:#ff6b6b;font-size:11px;font-weight:700;border:1px solid #ff6b6b;border-radius:10px;padding:0 8px;line-height:1.5}
+.room-peer-hand{flex:0 0 auto;color:#FFA500;font-size:11px;font-weight:700;border:1px solid #FFA500;border-radius:10px;padding:0 5px;line-height:1.5;white-space:nowrap}
+.room-peer-raised{border-left:3px solid #FFA500}
+.tribe-action-btn.room-hand-btn-on{border-color:#FFA500;color:#FFA500}
+.room-peer .phone-action-form{flex:0 0 auto;margin-left:auto}
+.room-live-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end;margin:0;padding:0;border:none;background:transparent;flex:1 0 100%;min-width:0}
+.room-live-controls>form,.room-live-controls>a,.room-live-controls>span{display:inline-flex;align-items:center;margin:0;padding:0;flex:0 0 auto}
+.room-live-controls .tribe-action-btn,.room-live-controls .room-refresh-btn{margin:0;display:inline-flex;align-items:center;justify-content:center;height:28px;line-height:1;padding:0 12px;font-family:inherit;font-size:12px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;white-space:nowrap;width:auto;min-width:0;max-width:none;overflow:visible;box-sizing:border-box;border-width:1px;border-style:solid;border-radius:6px;box-shadow:none;flex:0 0 auto}
+.room-live-controls>*{min-width:0;flex:0 0 auto}
+.room-live-head,.room-live-controls,.room-live-controls>form{overflow:visible}
+.room-live-controls .room-rec-chip{min-width:max-content;padding:2px 8px}
+.room-live-head{flex-wrap:wrap;align-items:center}
+.room-live-head-main{flex:1 1 160px}
+.room-rec-chip{flex:0 0 auto;color:#ff4d4d;font-size:11px;font-weight:700;border:1px solid #ff4d4d;border-radius:10px;padding:0 8px;line-height:1.5;white-space:nowrap}
+.room-notify-off{opacity:.6}
+.room-events{list-style:none;margin:10px 0 0 0;padding:0;display:flex;flex-direction:column;gap:4px;font-size:12px}
+.room-event{display:flex;gap:8px;align-items:center;flex-wrap:nowrap;min-width:0}
+.room-event .date-link{flex:0 0 auto;margin:0}
+.room-event-text{display:flex;gap:6px;align-items:center;flex-wrap:nowrap;min-width:0;white-space:nowrap}
+.room-event-text .user-link{flex:0 1 auto;min-width:0;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}
+.room-recordings{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px}
+.room-recording{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
+.room-peer .phone-action-form .tribe-action-btn{padding:2px 8px;font-size:11px}
+.phone-call-peers{margin:8px 0 0 0}
+.block-info-table .pm-exposition-chip{white-space:nowrap}
+.peers-technical-block .inline-form .filter-btn{white-space:nowrap}
+.peers-technical-block .peer-port{white-space:nowrap}
+.peers-technical-block .peer-host{overflow-wrap:normal;word-break:normal}
+.phone-chip-form{display:inline-flex;margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
+.phone-chip-btn{display:inline-flex;align-items:center;background:transparent !important;border:0 !important;padding:0 !important;margin:0;width:auto;height:auto;min-height:0;box-shadow:none;cursor:pointer;font:inherit;line-height:inherit;color:inherit}
+.phone-chip-btn:hover .pm-exposition-chip,.phone-chip-btn:hover .phone-number-value{filter:brightness(1.2)}
+.phone-flash-anchor{display:none}
+.clearnet-choice{display:block;margin:0 0 10px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.clearnet-choice-options{display:flex;align-items:center;gap:18px;flex-wrap:wrap;margin:6px 0 4px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none !important}
+.clearnet-choice-option{display:inline-flex;align-items:center;gap:8px;cursor:pointer;white-space:nowrap;width:auto;margin:0}
+.clearnet-choice-option input{width:auto;min-width:0;margin:0;flex:0 0 auto}
+.clearnet-choice-option .pm-exposition-chip{margin:0}
+
+.clearnet-switch{display:inline-flex;margin:0;padding:0;border:1px solid #555;border-radius:6px;overflow:hidden;background:transparent !important;box-shadow:none}
+.clearnet-switch-btn{margin:0;border:0;border-radius:0;padding:5px 14px;font-size:12px;font-weight:700;letter-spacing:.5px;background:transparent;color:#bbb;cursor:pointer;min-height:0;width:auto}
+.clearnet-switch-btn+.clearnet-switch-btn{border-left:1px solid #555}
+.clearnet-switch-btn.active{background:#ffa500;color:#000;cursor:default}
+.clearnet-switch-btn:disabled{opacity:1}
+.votations-comment-card,.larp-post{position:relative}
+.larp-post.own-comment > .larp-post-head{padding-right:48px;box-sizing:border-box}
+.comment-delete-form{position:absolute;top:12px;right:12px;margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
+.votations-comment-card.own-comment > .created-at{display:block;padding-right:48px;box-sizing:border-box}
+.comment-form .comment-textarea{display:block;max-width:100%;margin:0}
+.comments-latest-anchor{background:transparent !important;border:0 !important;padding:0 !important;margin:0;box-shadow:none}
+.phone-dial-call .pm-btn{font-size:1.25em;padding:14px 48px;min-width:220px}
+.card-section .card-field.activity-room-title{display:flex;align-items:center;gap:10px}
+.card-section .card-field.activity-room-title>.card-value{flex:0 1 auto}
+.room-live-head,.room-live-head-main{padding:0;margin:0;background:transparent;border:none !important;box-shadow:none;border-radius:0}
+.room-live-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
+.room-live-head-main{flex:1 1 auto;min-width:0}
+.room-live-head-main>.card-chips-row{margin:0}
+.room-live-head-main>.phone-empty{margin:4px 0 0 0}
+.room-refresh-btn{flex:0 0 auto}
+.phone-dialer{display:flex;flex-direction:column;align-items:center;gap:12px;margin:10px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.phone-screen{order:1;width:100%;max-width:320px;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.phone-screen input{width:100%;text-align:center;font-size:22px;letter-spacing:2px;margin:0}
+.phone-dialpad{order:2;display:grid;grid-template-columns:repeat(3,64px);gap:12px;justify-content:center;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.phone-dialpad .phone-key{width:64px;height:64px;min-height:0;border-radius:50%;border:1px solid #ffa500;background:transparent;color:#ffa500;font-size:22px;font-weight:700;padding:0;margin:0;display:flex;align-items:center;justify-content:center;cursor:pointer}
+.phone-dialpad .phone-key:hover{background:#ffa500;color:#1a1a1a}
+.phone-dialpad .phone-key-fn{font-size:18px;color:#ccc;border-color:#555}
+.phone-dialer .phone-dial-add{order:3}
+.phone-recipients{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:center;margin:8px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.phone-recipients>.card-label{flex-basis:100%;text-align:center}
+.phone-row-delete{display:inline-flex;margin:0 0 0 auto;padding:0 !important;background:transparent !important;border:0 !important;box-shadow:none}
+.phone-contact .phone-action-form+.phone-row-delete{margin-left:6px}
+.phone-latest-row{flex-wrap:nowrap;min-width:0}
+.phone-latest-row .user-link{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.phone-latest-row .date-link,.phone-latest-row .phone-action-form,.phone-latest-row .phone-row-delete{flex:0 0 auto}
+.phone-history td.phone-row-actions{text-align:right;width:1%;white-space:nowrap}
+.phone-pam-hint{color:#ffa500;font-weight:600;margin:6px 0}
+.phone-refused{color:#ffa500;margin:8px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none;display:flex;flex-wrap:wrap;align-items:center;gap:6px}
+.phone-dnd-form{display:inline-flex;margin:0;padding:0;background:transparent !important;border:0 !important;box-shadow:none}
+.phone-recipient-list{display:flex;flex-direction:column;align-items:flex-start;gap:8px;margin:0;padding:10px 14px;border:1px solid #ffa500 !important;border-radius:10px;background:transparent !important;box-shadow:none}
+.phone-recipient{display:inline-flex;align-items:center;gap:6px;border:none;padding:0;font-size:13px;background:transparent !important}
+.phone-recipient form{display:inline-flex;margin:0;padding:0;background:transparent !important;border:0 !important}
+.phone-recipient form .phone-recipient-remove{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;min-height:0;padding:0;margin:0;border:1px solid #ff8a8a;border-radius:50%;background:transparent;color:#ff8a8a;font-size:11px;line-height:1;cursor:pointer;box-shadow:none}
+.phone-recipient form .phone-recipient-remove:hover{background:#ff8a8a;color:#1a1a1a}
+.phone-dial-hint{text-align:center;margin:0 0 8px 0}
+.phone-dial-call{display:flex;justify-content:center;margin:0;background:transparent !important;border:0 !important;padding:0 !important}
+.peers-pause-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 12px 0;background:transparent !important;border:0 !important;padding:0 !important;box-shadow:none}
+.peers-pause-row form{margin:0;padding:0;border:0;background:transparent;box-shadow:none}
+.peers-pause-hint{margin:0;color:#ccc;font-size:.9em}
+.tribe-main .tribe-content-list{padding:0;margin:0;background:transparent;border:0;box-shadow:none;gap:0;overflow:visible}
+.tribe-main .jobs-grid{grid-template-columns:repeat(auto-fill,minmax(min(100%,300px),1fr))}
+.tribe-main .feed-row{flex-wrap:wrap}
+.tribe-main .feed-main{flex:1 1 180px;min-width:0}
+.tribe-main .clearnet-switch{flex-wrap:wrap}
+.tribe-main .forum-back-form{margin:0 0 10px 0}
+.tribe-main .feed-container,.tribe-main .jobs-grid,.tribe-main .images-list,.tribe-main .audios-list,.tribe-main .videos-list,.tribe-main .documents-list,.tribe-main .bookmark-list,.tribe-main .inhabitants-list,.tribe-main .forum-thread-container{padding:0;margin:0;background:transparent;border:0;box-shadow:none;overflow:visible}
+.tribe-main .feed-text{margin-right:0}
+.tribe-main .forum-card{flex-wrap:wrap}
+.tribe-main .forum-main-col{flex:1 1 220px;min-width:0}
+.tribe-main .comment-body-row{flex-wrap:wrap}
+.tribe-main .comment-text-col{flex:1 1 200px;min-width:0}
+.tribe-main .tribe-grid{padding:0;margin:0;background:transparent;border:0;box-shadow:none;grid-template-columns:repeat(auto-fill,minmax(min(100%,260px),1fr))}
+.tribe-main .audios-list{overflow-x:auto}
+.tribe-main .torrent-table .user-link,.tribe-main .file-table .user-link{display:inline-block;max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}
+.tribe-main .forum-footer,.tribe-main .forum-meta,.tribe-main .comment-header{flex-wrap:wrap}
+.tribe-main .forum-footer .date-link,.tribe-main .comment-header .date-link{flex:0 0 auto;white-space:nowrap}
+.tribe-main .forum-footer .user-link,.tribe-main .comment-header .user-link{flex:1 1 120px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
+.tribe-main .room-item .mailing-archive-head{flex-wrap:wrap}
+.tribe-main .room-item .mailing-archive-meta{flex:1 1 200px}
+
+.agenda-card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;padding:0;border:0;background:transparent;box-shadow:none}
+.card-section>.card-footer.favorites-meta{border-top:0;padding-top:0;margin-top:6px}
+.agenda-list.jobs-grid{margin-top:12px}
+.oasis-pager{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;margin:24px 0 8px 0}
+.oasis-pager-info{color:#9a8a2e;font-size:12px;margin-right:4px}
+.oasis-pager-sizes{display:flex;align-items:center;flex-wrap:wrap;gap:6px;margin-right:auto;padding:0}
+.oasis-pager-btn{display:inline-block;padding:6px 14px;background:#1C1C1C;color:#E6C200;border:1px solid #333;border-radius:14px;font-size:13px;text-decoration:none;transition:border-color .15s ease,color .15s ease,background .15s ease}
+.oasis-pager-btn:hover,.oasis-pager-btn.active{border-color:#FFD700;color:#FFD700;text-decoration:none}
+.card-title-link{color:inherit;text-decoration:none}
+.card-title-link:hover{text-decoration:underline}
+.graphos-zoom-row{display:flex;justify-content:flex-end;margin:0 0 8px;padding:0;border:0;background:none;box-shadow:none}
+.graphos-lightbox .graphos-canvas-zoom{width:96vw;height:92vh;overflow:auto;background:#111;border:1px solid #2a2a2a;border-radius:8px;box-sizing:border-box;padding:0;margin:0}
+.graphos-lightbox .graphos-zoom-stage,.graphos-lightbox .graphos-zoom-svg{padding:0;margin:0;border:0;border-radius:0;background:none;box-shadow:none}
+.graphos-lightbox .graphos-svg{width:100%;height:auto;max-height:calc(92vh - 4px);min-height:0;display:block}
+.graphos-lightbox .lightbox-close{position:fixed;top:14px;right:22px;z-index:10002;font-size:28px;text-decoration:none}
+.live-lightbox .lightbox-image-link{display:flex;align-items:center;justify-content:center;max-width:100%;max-height:100%;padding:0;margin:0;border:0;background:none}
+.shop-buy-form,.market-item.actions,.market-bid-form,.market-buy-form{border:0;background:transparent;box-shadow:none;padding:0}
+.project-progress-block .confirmations-progress{width:100%}
+.tags-list .tag-table th:last-child,.tags-list .tag-table td:last-child{width:1%;white-space:nowrap;text-align:right}
+.stats-block .tag-table,.stats-card .tag-table{width:100%;border-collapse:collapse;table-layout:fixed}
+.stats-block .tag-table th:first-child,.stats-block .tag-table td:first-child,.stats-card .tag-table th:first-child,.stats-card .tag-table td:first-child{width:70%}
+.stats-block .tag-table th:last-child,.stats-block .tag-table td:last-child,.stats-card .tag-table th:last-child,.stats-card .tag-table td:last-child{width:30%;text-align:right}
+.video-grid{display:flex;flex-wrap:wrap;gap:8px;margin:18px 0 0;padding:0;border:0;background:transparent;box-shadow:none}
+.video-tile{display:flex;flex-direction:column;gap:0;padding:0;margin:0;width:320px;max-width:100%;border:1px solid #333;border-radius:6px;overflow:hidden;background:#000}
+.video-feed{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;background:#000}
+.video-tile .user-link,.video-tile-name{display:block;margin:0;padding:4px 8px;font-size:12px;text-align:left;background:#1a1a1a}
+.video-tile-me .video-feed{transform:scaleX(-1)}
+.room-peer-cam{flex:0 0 auto;color:#ffa300;font-size:11px;font-weight:700;border:1px solid #ffa300;border-radius:4px;padding:1px 6px}
+.room-cam-btn-on{background:#ffa500;color:#000}
+.video-grid-one{flex-direction:column;align-items:flex-start}
+.video-feed-grid{width:auto;max-width:100%;aspect-ratio:auto;border:1px solid #333;border-radius:6px}
+.video-grid-names{display:flex;flex-wrap:wrap;gap:6px;padding:0;margin:0;border:0;background:transparent;box-shadow:none}
+.video-grid-names .user-link,.video-grid-names .video-tile-name{padding:4px 8px;font-size:12px;background:#1a1a1a;border-radius:4px}
+.file-table{width:100%;border-collapse:collapse;margin-top:12px}
+.file-table th,.file-table td{padding:8px 12px;text-align:left;vertical-align:middle}
+.file-table th{background:#1a1a1a;color:#FFA500;font-weight:bold}
+.file-table td:nth-child(1),.file-table td:nth-child(4),.file-table td:nth-child(5),.file-table td:nth-child(6),.file-table td:nth-child(7){white-space:nowrap;width:1%}
+.file-table td:nth-child(3){overflow-wrap:anywhere}
+.file-table td .filter-btn{margin:0}
+.file-table td.torrent-spread-cell{text-align:center}
+.forum-inline-reply{padding:0;margin:6px 0 0;border:0;background:transparent;box-shadow:none}
+.forum-inline-reply-toggle{cursor:pointer;display:inline-block;padding:3px 10px;border:1px solid #ffa500;border-radius:10px;background:#1a1a1a;color:#ffa500;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;list-style:none;width:max-content}
+.forum-inline-reply-toggle::-webkit-details-marker{display:none}
+.forum-inline-reply[open] .forum-inline-reply-toggle{margin-bottom:6px}
+.video-tile .zoom-link,.video-grid-one .zoom-link{display:block;width:100%;border:0 !important;background:transparent !important;padding:0 !important}
+.video-tile-me .lightbox-image{transform:scaleX(-1)}
+.phone-call-panel .live-lightbox{background:rgba(0,0,0,.85)}
+.live-lightbox .lightbox-image{width:min(80vw,880px);height:auto;max-width:none;max-height:80vh;object-fit:contain;cursor:zoom-out}
diff --git a/src/client/assets/themes/Clear-SNH.css b/src/client/assets/themes/Clear-SNH.css
index a04c3f3..28d53ba 100644
--- a/src/client/assets/themes/Clear-SNH.css
+++ b/src/client/assets/themes/Clear-SNH.css
@@ -224,32 +224,23 @@ footer a:hover {
background: none;
}
-.card-tags a.tag-link {
- color: #181818;
- background: #D94F4F;
-}
-.card-tags a.tag-link:hover {
- background: #D94F4F;
- color: #111;
- cursor: pointer;
-}
-a.user-link {
+a.user-link, button.user-link {
background-color: #FFD600;
color: #FFFFFF;
border-color: #FFD600;
transition: background-color 0.3s, color 0.3s, border-color 0.3s;
}
-a.user-link:hover {
+a.user-link:hover, button.user-link:hover {
background-color: #FFD600;
border-color: #FFD600;
color: #FFFFFF;
cursor: pointer;
}
-a.user-link:focus {
+a.user-link:focus, button.user-link:focus {
background-color: #9A2F2F;
border-color: #9A2F2F;
color: #FFFFFF;
@@ -302,7 +293,7 @@ a.user-link:focus {
.stats-kpi-value { color: #007BFF !important; }
.carbon-bar-note, .carbon-bar-formula { color: #007BFF !important; }
.graphos-node-label { fill: #2C2C2C !important; }
-.graphos-node-label-me { fill: #cc7700 !important; }
+.graphos-node-label-me { fill: #1f6391 !important; }
.data-best-label { color: #cc7700 !important; }
.data-best-card { background: #FFF3E0 !important; border: 1px solid rgba(204, 119, 0, .4) !important; }
.graphos-legend { color: #2C2C2C !important; }
@@ -327,6 +318,8 @@ a.user-link:focus {
.btn-singleview:hover { background: #E0E0E0 !important; color: #FF8F00 !important; }
.btn-spread-on, .content-actions .btn-pin-on { background: #FF6F00 !important; color: #FFFFFF !important; }
.btn-spread-on:hover, .content-actions .btn-pin-on:hover { background: #FF8F00 !important; color: #FFFFFF !important; }
+.content-actions .btn-singleview.btn-content { border: 1px solid #FF6F00 !important; }
+.content-actions .btn-singleview.btn-content:hover { background: rgba(255, 111, 0, .18) !important; border-color: #FF6F00 !important; }
.btn-back { background: #FF6F00 !important; color: #FFFFFF !important; }
.btn-back:hover { background: #FF8F00 !important; color: #FFFFFF !important; }
.block-info-table td, .pm-info-table td { border-color: #E0E0E0 !important; }
@@ -383,3 +376,48 @@ a.user-link:focus {
.karvan-msg-self { background-color: #FFEFC2 !important; border-color: #D9A400 !important; }
.karvan-msg .km-from { color: #8A6D00 !important; }
.karvan-msg .km-text { color: #2C2C2C !important; }
+.map-viewer, .map-stage div, .map-hero, .map-toolbar, .map-toolbar div, .map-place-results, .map-markers-list, .map-markers-list div, .map-detail-grid, .map-card-thumb .map-viewer { background: transparent !important; border: 0 !important; }
+.map-pick-cell, .map-pick-cell:hover { border: 0 !important; padding: 0 !important; border-radius: 0 !important; box-shadow: none !important; }
+.map-pick-cell { background: transparent !important; }
+.map-pick-cell:hover { background: rgba(255, 111, 0, 0.18) !important; }
+.map-ctrl, .map-place-result { padding: 0 !important; border-radius: 6px !important; box-shadow: none !important; }
+.map-place-result { padding: 4px 10px !important; border-radius: 14px !important; }
+.map-stage { background: #cfe0ec !important; border: 1px solid #E0E0E0 !important; }
+.map-marker-row { border-bottom: 1px solid #E0E0E0 !important; }
+.map-label-country { fill: #4a4a4a; stroke: #ffffff; }
+.map-place-dot { fill: #333333; stroke: #ffffff; }
+.map-place-capital { fill: #E65100; }
+.map-place-label { fill: #222222; stroke: #ffffff; }
+.map-pin-label-bg { fill: rgba(255, 255, 255, 0.92); stroke: rgba(0, 0, 0, 0.3); }
+.map-pin-label { fill: #222222; }
+.map-pin-focus .map-pin-body, .map-cluster-dot { fill: #FF6F00; }
+.map-pin-focus .map-pin-label-bg { stroke: #FF6F00; }
+.map-cluster-ring { fill: rgba(255, 111, 0, 0.25); }
+.map-pick-ring, .map-pick-cross { stroke: #FF6F00; }
+.map-pins-layer a:hover .map-pin-body, .map-pins a:hover .map-pin-body { fill: #FF6F00; }
+.map-scale-line { stroke: #333333; }
+.map-scale-text { fill: #333333; stroke: #ffffff; }
+.map-attrib { fill: #777777; }
+.map-ctrl { background: rgba(255, 255, 255, 0.92) !important; color: #FF6F00 !important; border-color: #cccccc !important; }
+.map-ctrl:hover { background: #FF6F00 !important; color: #ffffff !important; border-color: #FF6F00 !important; }
+.map-ctrl-off:hover { background: rgba(255, 255, 255, 0.92) !important; color: #FF6F00 !important; border-color: #cccccc !important; }
+.map-pick-cell:hover { background: rgba(255, 111, 0, 0.18); outline-color: rgba(255, 111, 0, 0.7); }
+.map-place-result, .map-center-link { color: #FF6F00 !important; border-color: #cccccc !important; }
+.map-place-result:hover, .map-center-link:hover { background: #FF6F00 !important; color: #ffffff !important; border-color: #FF6F00 !important; }
+.map-picked { background: #F0F0F0 !important; color: #FF6F00 !important; }
+.map-picked-near { color: #555555 !important; }
+.map-markers-list .map-marker-row--focus { background: rgba(255, 111, 0, 0.08) !important; box-shadow: inset 3px 0 0 #FF6F00 !important; }
+.map-marker-row--focus .map-marker-idx { background: #FF6F00 !important; color: #ffffff !important; }
+.map-marker-label { color: #E65100 !important; }
+.map-marker-date { color: #777777 !important; }
+.map-marker-coords { color: #222222 !important; }
+.map-popup-pointer { fill: #ffffff; stroke: #cccccc; }
+.map-stage .map-popup-card { background: #ffffff !important; border: 1px solid #cccccc !important; color: #222222; }
+.map-stage .map-popup-text { color: #333333; }
+.map-popup-coords { color: #222222; }
+.map-stage .map-popup-meta { color: #777777; }
+.map-popup-close { color: #777777; }
+.map-popup-close:hover { color: #FF6F00; }
+.oasis-pager-info { color: #888888; }
+.oasis-pager-btn { background: #FFFFFF; color: #555555 !important; border: 1px solid #E0E0E0; text-decoration: none !important; }
+.oasis-pager-btn:hover, .oasis-pager-btn.active { border-color: #2C2C2C; color: #2C2C2C !important; text-decoration: none !important; }
diff --git a/src/client/assets/themes/Dark-SNH.css b/src/client/assets/themes/Dark-SNH.css
index 7167ffe..335c1d4 100644
--- a/src/client/assets/themes/Dark-SNH.css
+++ b/src/client/assets/themes/Dark-SNH.css
@@ -210,24 +210,9 @@ footer a:hover {
gap: 9px;
}
-.card-tags a.tag-link {
- text-decoration: none;
- color: #181818;
- background: #FFD600;
- padding: 5px 13px 4px 13px;
- border-radius: 7px;
- font-size: .98em;
- border: none;
- font-weight: bold;
-}
-.card-tags a.tag-link:hover {
- background: #ffe86a;
- color: #111;
- cursor: pointer;
-}
-a.user-link {
+a.user-link, button.user-link {
background-color: #FFA500;
color: #000;
padding: 8px 16px;
@@ -241,14 +226,14 @@ a.user-link {
font-size: 0.8em;
}
-a.user-link:hover {
+a.user-link:hover, button.user-link:hover {
background-color: #FFD700;
border-color: #FFD700;
color: #000;
cursor: pointer;
}
-a.user-link:focus {
+a.user-link:focus, button.user-link:focus {
background-color: #007B9F;
border-color: #007B9F;
color: #fff;
@@ -316,7 +301,7 @@ a.user-link:focus {
.stats-kpi-value { color: #FFD700 !important; }
.carbon-bar-note, .carbon-bar-formula { color: #FFD700 !important; }
.graphos-node-label { fill: #ddd !important; }
-.graphos-node-label-me { fill: #ffa500 !important; }
+.graphos-node-label-me { fill: #5dade2 !important; }
.graphos-legend { color: #ddd !important; }
.blockchain-view { background-color: #191b20 !important; color: #FFD700 !important; }
.block { background: #23242a !important; }
@@ -333,6 +318,8 @@ a.user-link:focus {
.btn-singleview:hover { background: #2d2e34 !important; color: #FFD700 !important; }
.btn-spread-on, .content-actions .btn-pin-on { background: #ffa300 !important; color: #000000 !important; }
.btn-spread-on:hover, .content-actions .btn-pin-on:hover { background: #ffb733 !important; color: #000000 !important; }
+.content-actions .btn-singleview.btn-content { border: 1px solid #ffa300 !important; }
+.content-actions .btn-singleview.btn-content:hover { background: rgba(255, 163, 0, .18) !important; border-color: #ffa300 !important; }
.btn-back { background: #21232b !important; color: #ffa300 !important; }
.btn-back:hover { background: #292b36 !important; color: #FFD700 !important; }
.block-info-table td, .pm-info-table td { border-color: #444 !important; }
diff --git a/src/client/assets/themes/Matrix-SNH.css b/src/client/assets/themes/Matrix-SNH.css
index a0cb38d..ebf4f2d 100644
--- a/src/client/assets/themes/Matrix-SNH.css
+++ b/src/client/assets/themes/Matrix-SNH.css
@@ -241,32 +241,23 @@ footer a {
color: #00FF00;
}
-.card-tags a.tag-link {
- color: #00FF00;
- background: #000000;
-}
-.card-tags a.tag-link:hover {
- background: #00FF00;
- color: #000000;
- cursor: pointer;
-}
-a.user-link {
+a.user-link, button.user-link {
background-color: #00FF00;
color: #000000;
border-color: #00FF00;
transition: background-color 0.3s, color 0.3s, border-color 0.3s;
}
-a.user-link:hover {
+a.user-link:hover, button.user-link:hover {
background-color: #000000;
border-color: #00FF00;
color: #00FF00;
cursor: pointer;
}
-a.user-link:focus {
+a.user-link:focus, button.user-link:focus {
background-color: #00FF00;
border-color: #00FF00;
color: #000000;
@@ -310,7 +301,7 @@ a.user-link:focus {
.stats-kpi-value { color: #00FF00 !important; }
.carbon-bar-note, .carbon-bar-formula { color: #00FF00 !important; }
.graphos-node-label { fill: #00FF00 !important; }
-.graphos-node-label-me { fill: #ffa500 !important; font-weight: bold !important; }
+.graphos-node-label-me { fill: #5dade2 !important; font-weight: bold !important; }
.graphos-legend { color: #00FF00 !important; }
.graphos-edge { stroke: #003300 !important; }
/* Blockexplorer */
@@ -329,6 +320,8 @@ a.user-link:focus {
.btn-singleview:hover { background: #00FF00 !important; color: #000000 !important; }
.btn-spread-on, .content-actions .btn-pin-on { background: #00FF00 !important; color: #000000 !important; }
.btn-spread-on:hover, .content-actions .btn-pin-on:hover { background: #66FF66 !important; color: #000000 !important; }
+.content-actions .btn-singleview.btn-content { border: 1px solid #00FF00 !important; }
+.content-actions .btn-singleview.btn-content:hover { background: rgba(0, 255, 0, .18) !important; border-color: #00FF00 !important; }
.btn-back { background: #000000 !important; color: #00FF00 !important; border: 1px solid #00FF00 !important; }
.btn-back:hover { background: #00FF00 !important; color: #000000 !important; }
.block-info-table td, .pm-info-table td { border-color: #00FF00 !important; }
@@ -379,4 +372,47 @@ nav, .sidebar-left nav, .sidebar-right nav, .sidebar-left ul, .sidebar-right ul
.ai-nav-result-card a { color: #00FF00 !important; }
.ai-nav-result-card a:hover { background: #00FF00 !important; color: #000000 !important; }
.ai-nav-query { color: #00FF00 !important; }
-.trending-card.own-content { box-shadow: inset 3px 0 0 #00FF00; }
+.trending-card.own-content, .addr-card.ubi-pub-card.own-content { box-shadow: inset 3px 0 0 #00FF00; }
+.map-stage { background: #000000 !important; border-color: #00FF00 !important; }
+.map-label-country { fill: #00FF00; stroke: #000000; }
+.map-place-dot { fill: #00FF00; stroke: #000000; }
+.map-place-capital { fill: #66FF66; }
+.map-place-label { fill: #00FF00; stroke: #000000; }
+.map-pin-body { fill: #00aa00; stroke: #00FF00; }
+.map-pin-main .map-pin-body { fill: #00FF00; stroke: #000000; }
+.map-pin-focus .map-pin-body { fill: #ffffff; stroke: #00FF00; }
+.map-pin-eye { fill: #000000; }
+.map-pin-label-bg { fill: rgba(0, 0, 0, 0.9); stroke: #00FF00; }
+.map-pin-focus .map-pin-label-bg { stroke: #ffffff; }
+.map-pin-label { fill: #00FF00; }
+.map-pins-layer a:hover .map-pin-body, .map-pins a:hover .map-pin-body { fill: #ffffff; }
+.map-cluster-ring { fill: rgba(0, 255, 0, 0.25); }
+.map-cluster-dot { fill: #00FF00; stroke: #000000; }
+.map-pick-ring, .map-pick-cross { stroke: #00FF00; }
+.map-scale-line { stroke: #00FF00; }
+.map-scale-text { fill: #00FF00; stroke: #000000; }
+.map-attrib { fill: #008800; }
+.map-ctrl { background: rgba(0, 0, 0, 0.9) !important; color: #00FF00 !important; border-color: #00FF00 !important; }
+.map-ctrl:hover { background: #00FF00 !important; color: #000000 !important; }
+.map-ctrl-off:hover { background: rgba(0, 0, 0, 0.9) !important; color: #00FF00 !important; }
+.map-pick-cell:hover { background: rgba(0, 255, 0, 0.18); outline-color: rgba(0, 255, 0, 0.7); }
+.map-place-result, .map-center-link { color: #00FF00 !important; border-color: #00FF00 !important; }
+.map-place-result:hover, .map-center-link:hover { background: #00FF00 !important; color: #000000 !important; }
+.map-picked { background: #050505 !important; color: #00FF00 !important; }
+.map-picked-near { color: #00CC00 !important; }
+.map-markers-list .map-marker-row { border-color: #003300 !important; }
+.map-markers-list .map-marker-row--focus { background: rgba(0, 255, 0, 0.08) !important; box-shadow: inset 3px 0 0 #00FF00 !important; }
+.map-marker-idx { background: #004400 !important; color: #00FF00 !important; }
+.map-marker-idx--main, .map-marker-row--focus .map-marker-idx { background: #00FF00 !important; color: #000000 !important; }
+.map-marker-label { color: #00FF00 !important; }
+.map-marker-date { color: #00AA00 !important; }
+.map-popup-pointer { fill: #000000; stroke: #00FF00; }
+.map-stage .map-popup-card { background: #000000; border-color: #00FF00; color: #00FF00; }
+.map-stage .map-popup-text { color: #00FF00; }
+.map-popup-coords { color: #66FF66; }
+.map-stage .map-popup-meta { color: #00AA00; }
+.map-popup-close { color: #00AA00; }
+.map-popup-close:hover { color: #ffffff; }
+.oasis-pager-info { color: #008800; }
+.oasis-pager-btn { background: #0a0a0a; color: #00CC00; border: 1px solid #00FF00; }
+.oasis-pager-btn:hover, .oasis-pager-btn.active { border-color: #00FF00; color: #00FF00; }
diff --git a/src/client/assets/themes/Purple-SNH.css b/src/client/assets/themes/Purple-SNH.css
index 67cd225..8ebb4a1 100644
--- a/src/client/assets/themes/Purple-SNH.css
+++ b/src/client/assets/themes/Purple-SNH.css
@@ -277,32 +277,23 @@ header {
color: #B86ADE;
}
-.card-tags a.tag-link {
- color: #FFFFFF;
- background: #D94F4F;
-}
-.card-tags a.tag-link:hover {
- background: #B86ADE;
- color: #E5E5E5;
- cursor: pointer;
-}
-a.user-link {
+a.user-link, button.user-link {
background-color: #FFD600;
color: #3C1360;
border-color: #FFD600;
transition: background-color 0.3s, color 0.3s, border-color 0.3s;
}
-a.user-link:hover {
+a.user-link:hover, button.user-link:hover {
background-color: #FFB600;
border-color: #FFB600;
color: #3C1360;
cursor: pointer;
}
-a.user-link:focus {
+a.user-link:focus, button.user-link:focus {
background-color: #9A2F2F;
border-color: #9A2F2F;
color: #E5E5E5;
@@ -346,7 +337,7 @@ a.user-link:focus {
.stats-kpi-value { color: #FFEEDB !important; }
.carbon-bar-note, .carbon-bar-formula { color: #FFEEDB !important; }
.graphos-node-label { fill: #FFEEDB !important; }
-.graphos-node-label-me { fill: #ffa500 !important; }
+.graphos-node-label-me { fill: #5dade2 !important; }
.graphos-legend { color: #FFEEDB !important; }
/* Blockexplorer */
.blockchain-view { background-color: #2D0B47 !important; color: #FFEEDB !important; }
@@ -364,6 +355,8 @@ a.user-link:focus {
.btn-singleview:hover { background: #5A1A85 !important; color: #FFD600 !important; }
.btn-spread-on, .content-actions .btn-pin-on { background: #B86ADE !important; color: #2A0E42 !important; }
.btn-spread-on:hover, .content-actions .btn-pin-on:hover { background: #CE8CE9 !important; color: #2A0E42 !important; }
+.content-actions .btn-singleview.btn-content { border: 1px solid #B86ADE !important; }
+.content-actions .btn-singleview.btn-content:hover { background: rgba(184, 106, 222, .18) !important; border-color: #B86ADE !important; }
.btn-back { background: #A34AD8 !important; color: #FFFFFF !important; }
.btn-back:hover { background: #751E9F !important; color: #FFFFFF !important; }
.block-info-table td, .pm-info-table td { border-color: #B86ADE !important; }
@@ -395,4 +388,41 @@ a.user-link:focus {
.tribe-subtribe-link:hover { background: #5A1A85 !important; }
.tribe-parent-image { border-color: #B86ADE !important; }
.tribe-parent-box { background: #3C1360 !important; }
-.trending-card.own-content { box-shadow: inset 3px 0 0 #B86ADE; }
+.trending-card.own-content, .addr-card.ubi-pub-card.own-content { box-shadow: inset 3px 0 0 #B86ADE; }
+.map-stage { background: #2a0640 !important; border-color: #9B1C96 !important; }
+.map-label-country { fill: #E5E5E5; stroke: #2a0640; }
+.map-place-dot { fill: #ffffff; stroke: #2a0640; }
+.map-place-capital { fill: #B86ADE; }
+.map-place-label { fill: #E5E5E5; stroke: #2a0640; }
+.map-pin-focus .map-pin-body, .map-cluster-dot { fill: #B86ADE; }
+.map-pin-focus .map-pin-label-bg { stroke: #B86ADE; }
+.map-pins-layer a:hover .map-pin-body, .map-pins a:hover .map-pin-body { fill: #B86ADE; }
+.map-cluster-ring { fill: rgba(184, 106, 222, 0.28); }
+.map-pick-ring, .map-pick-cross { stroke: #B86ADE; }
+.map-scale-text { stroke: #2a0640; }
+.map-attrib { fill: #9B7CAA; }
+.map-ctrl { background: rgba(43, 10, 70, 0.9) !important; color: #E5E5E5 !important; border-color: #9B1C96 !important; }
+.map-ctrl:hover { background: #B86ADE !important; color: #000000 !important; border-color: #B86ADE !important; }
+.map-ctrl-off:hover { background: rgba(43, 10, 70, 0.9) !important; color: #E5E5E5 !important; border-color: #9B1C96 !important; }
+.map-pick-cell, .map-pick-cell:hover { border: 0 !important; padding: 0 !important; border-radius: 0 !important; box-shadow: none !important; }
+.map-pick-cell { background: transparent !important; }
+.map-pick-cell:hover { background: rgba(184, 106, 222, 0.22) !important; outline-color: rgba(184, 106, 222, 0.7); }
+.map-place-result, .map-center-link { color: #E5E5E5 !important; border-color: #9B1C96 !important; }
+.map-place-result:hover, .map-center-link:hover { background: #B86ADE !important; color: #000000 !important; border-color: #B86ADE !important; }
+.map-picked { background: #3C1360 !important; color: #E5E5E5 !important; }
+.map-picked-near { color: #C8C8C8 !important; }
+.map-markers-list .map-marker-row { border-color: #5A1A85 !important; }
+.map-markers-list .map-marker-row--focus { background: rgba(184, 106, 222, 0.1) !important; box-shadow: inset 3px 0 0 #B86ADE !important; }
+.map-marker-row--focus .map-marker-idx { background: #B86ADE !important; color: #000000 !important; }
+.map-marker-label { color: #B86ADE !important; }
+.map-marker-date { color: #C8C8C8 !important; }
+.map-popup-pointer { fill: #3C1360; stroke: #9B1C96; }
+.map-stage .map-popup-card { background: #3C1360; border-color: #9B1C96; color: #E5E5E5; }
+.map-stage .map-popup-text { color: #E5E5E5; }
+.map-popup-coords { color: #ffffff; }
+.map-stage .map-popup-meta { color: #C8C8C8; }
+.map-popup-close { color: #C8C8C8; }
+.map-popup-close:hover { color: #B86ADE; }
+.oasis-pager-info { color: #9B7CAA; }
+.oasis-pager-btn { background: #39006D; color: #C8C8C8; border: 1px solid #9B1C96; }
+.oasis-pager-btn:hover, .oasis-pager-btn.active { border-color: #E5E5E5; color: #E5E5E5; }
diff --git a/src/client/assets/translations/i18n.js b/src/client/assets/translations/i18n.js
index 2ed00fb..34ad3a0 100644
--- a/src/client/assets/translations/i18n.js
+++ b/src/client/assets/translations/i18n.js
@@ -1,15 +1,22 @@
const path = require('path');
-let i18n = {};
-const languages = ['en', 'es', 'fr', 'eu', 'de', 'it', 'pt', 'zh', 'ar', 'hi', 'ru'];
+const i18n = {};
+const languages = ['en', 'es', 'ca', 'gl', 'fr', 'eu', 'de', 'it', 'pt', 'zh', 'ar', 'hi', 'ru'];
languages.forEach(language => {
- try {
- const languagePath = path.join(__dirname, `oasis_${language}.js`);
- const languageData = require(languagePath);
- i18n[language] = languageData[language];
- } catch (error) {
- console.error(`Failed to load language file for ${language}:`, error);
- }
+ Object.defineProperty(i18n, language, {
+ enumerable: true,
+ configurable: true,
+ get() {
+ let languageData;
+ try {
+ languageData = require(path.join(__dirname, `oasis_${language}.js`))[language];
+ } catch (error) {
+ console.error(`Failed to load language file for ${language}:`, error);
+ }
+ Object.defineProperty(i18n, language, { value: languageData, enumerable: true, configurable: true, writable: true });
+ return languageData;
+ }
+ });
});
try {
diff --git a/src/client/assets/translations/oasis_ar.js b/src/client/assets/translations/oasis_ar.js
index 6cb95c1..029a94a 100644
--- a/src/client/assets/translations/oasis_ar.js
+++ b/src/client/assets/translations/oasis_ar.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "المشتريات",
shopMyOrdersDescription: "طلبات الشراء الخاصة بك.",
shopMyOrdersEmpty: "ليس لديك مشتريات بعد.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM البائع",
shopOrderSeller: "البائع",
shopOrderInvoice: "فاتورة",
shopOrderInvoiceConcept: "فاتورة",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "قبول",
shopOrderReject: "رفض",
shopOrderMarkShipped: "وضع علامة شُحن",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM المشتري",
shopOrderContractConcept: "طلب متجر",
shopOrdersPending: "طلبات معلّقة",
all: "الكل",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "تحذير المحتوى",
invalidPost: "محتوى غير صالح",
invalidPostHint: "هذه الرسالة تحتوي على نص فارغ/غير صالح.",
- spreadBy: "بواسطة",
spreadChron: "نشر",
spreaded: "تم النشر",
spreadContentUnavailable: "المحتوى غير متاح بعد (في انتظار النسخ)",
filteredByTag: "مُصفّى حسب الوسم",
filteredByTagTitle: "مُصفّى حسب الوسم",
feedPublishedSuccess: "تم نشر التغذية بنجاح!",
+ feedMastodonFailed: "نُشر في Oasis، لكن تعذّر إرساله إلى Mastodon.",
tribeFeedSent: "تم إرسال الرسالة بنجاح!",
tribeContentEncrypted: "محتوى مشفّر",
tribeTorrentsEmpty: "لا توجد تورنتات بعد.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "آخر زيارة",
profileClearnetBookmarksLabel: "الإشارات المرجعية",
invitesPort: "المنفذ",
- currentlyUnrecheable: "خطأ!",
- peerHostValidation: "عنوان IPv4 صالح (مثل 192.168.1.100) أو اسم مضيف (مثل pub.example.com)",
+ peerHostValidation: "عنوان IPv4 صالح (مثل 192.168.1.100) أو اسم مضيف (مثل pub.solarnethub.com)",
peerPortValidation: "المنفذ 1-65535",
peerKeyValidation: "مفتاح SSB ed25519 العام (@<44 حرف base64>=.ed25519)",
inboxJobUnsubscribedTitle: "إلغاء الاشتراk في عرض عملك",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "وصف المهمة",
exportPasswordLabel: "كلمة مرور التصدير",
importPasswordPlaceholder: "أدخل كلمة المرور",
- searchCasesPlaceholder: "البحث عن القضايا…",
+ searchCasesPlaceholder: "ابحث في المحاكم...",
shopBuyDeliveryAddressPlaceholder: "عنوان التسليم",
shopBuyNotesPlaceholder: "ملاحظات",
bankTaxesUserNoteBold: "تخفيض ضريبة ECO مباشرة",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "دعم القضية",
courtsSettlementAcceptBtn: "قبول التسوية",
courtsSupportCount: "المؤيدون",
- courtsVerdictVoteTitle: "التصويت على الحكم",
- courtsVerdictVoteLabel: "تصويت الحكم",
- courtsVerdictVoteAccept: "قبول",
- courtsVerdictVoteReject: "رفض",
- courtsVerdictVoteSubmit: "إرسال التصويت",
reportsSetStatus: "تعيين الحالة",
reportsStatusClosed: "مغلق",
statsAvgPerInhabitant: "المتوسط لكل ساكن",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "الصورة الرمزية",
inhabitants: "السكان",
- peersReplicatedFeeds: "الموجزات المنسوخة",
+ peersReplicatedFeeds: "المنسوخة",
+ peersTorColumn: "TOR",
+ peersTorYes: "يمكن الوصول إليه عبر Tor",
+ peersTorNo: "لا يمكن الوصول إليه عبر Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "الإصدار",
graphos: "غرافوس",
graphosDescription: "خريطة تفاعلية للشبكة من حولك.",
+ graphosFederation: "الاتحاد",
+ graphosFedPubs: "خوادم PUB",
+ graphosFedUnreachable: "غير قابلة للوصول",
+ graphosFedLinks: "روابط متبادلة",
+ graphosFedIsolated: "معزولة",
+ graphosFedNoData: "لا بيانات",
+ graphosFedMutual: "متبادل",
+ graphosFedOneWay: "باتجاه واحد",
+ graphosFedTransport: "الشبكة",
+ graphosFedWith: "متحد مع",
+ graphosZoom: "تكبير",
+ graphosFedInhabitants: "السكان",
+ graphosFedClearnet: "الإنترنت",
+ graphosFedBoth: "الإنترنت + TOR",
+ graphosFedEmpty: "لا تعرف عقدتك أي PUB بعد.",
graphosViewingGraphOf: "عرض",
graphosBackToMine: "← شبكتي",
graphosShowing: "عرض",
@@ -205,6 +219,22 @@ module.exports = {
noMentions: "لم تتلقَّ إشارات @ بعد.",
mentionsSearchPlaceholder: "ابحث في الإشارات...",
privateReminders: "تذكيرات",
+ inboxFilterPms: "رسائل خاصة",
+ inboxFilterNotifications: "إشعارات",
+ inboxMarkRead: "وضع علامة كمقروء",
+ inboxMarkUnread: "وضع علامة كغير مقروء",
+ inboxUnreadChip: "غير مقروء",
+ inboxMarkAllRead: "وضع علامة مقروء على الكل",
+ inboxDeleteShown: "حذف الكل",
+ inboxArchive: "أرشفة",
+ inboxUnarchive: "إلغاء الأرشفة",
+ inboxFilterArchived: "مؤرشف",
+ inboxEarlierMessages: "رسائل سابقة",
+ inboxSortThread: "حسب المحادثة",
+ inboxSortRecent: "الأحدث أولاً",
+ inboxAllBots: "الروبوتات",
+ settingsInboxBotsTitle: "إشعارات صندوق الوارد",
+ settingsInboxBotsDesc: "اختر الروبوتات التي يمكنها إشعارك في صندوق الوارد. الروبوتات غير المحددة تُخفى ولا تُحتسب إشعاراتها.",
inboxFiltersLabel: "المرشحات:",
inboxToggleToMutuals: "التبديل إلى المتبادلين",
inboxToggleToWhole: "التبديل إلى الجميع",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "رد",
pmReplies: "ردود",
inReplyTo: "ردًا على",
+ forumInThread: "في الموضوع",
pmPreview: "معاينة",
pmPreviewTitle: "معاينة الرسالة",
peers: "الأقران",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "من",
searchToLabel: "إلى",
searchQueryLabel: "استعلام",
- searchPerPageLabel: "نتائج لكل صفحة",
+ searchPerPageLabel: "النتائج",
settings: "الإعدادات",
+ settingsDescription: "اضبط بيئة شبكتك.",
continueReading: "متابعة القراءة",
moreComments: "تعليق إضافي",
readThread: "اقرأ بقية المحادثة",
@@ -241,7 +273,6 @@ module.exports = {
profileClearnetHelp: 'الوحدات التي يمكن الوصول إليها من خارج أوازيس.',
profileHubAll: 'الكل',
footerLicenseLabel: 'الترخيص',
- profileSwitchToOasis: 'العودة إلى Oasis',
profileVisibilityFediverse: "الكون المتعدد",
contributorsTitle: "المساهمون",
colorLabel: 'اختر لونًا',
@@ -251,6 +282,7 @@ module.exports = {
modulesViewTitle: "الوحدات",
modulesViewDescription: "اضبط بيئتك بتفعيل أو تعطيل الوحدات.",
inbox: "صندوق الوارد",
+ inboxSearchPlaceholder: "ابحث في صندوق الوارد...",
multiverse: "الكون المتعدد",
fediverse: "الكون المتعدد",
fediverseDescription: "أدر حساباتك الأخرى في الكون المتعدد، بما في ذلك إرسال واستقبال المحتوى.",
@@ -259,9 +291,17 @@ module.exports = {
fediverseSettingsTitle: "الكون المتعدد",
fediverseInstanceLabel: "العنوان",
fediverseTokenLabel: "رمز الوصول",
- fediverseTokenHelp: "اضبط رمز الوصول الخاص بك. سيُستخدم لإدارة حساب ماستودون من داخل أوازيس.",
fediverseConnect: "ربطه",
fediverseConnectedAs: "متصل باسم",
+ nextcloudServerLabel: "الخادم",
+ nextcloudUserLabel: "المستخدم",
+ nextcloudFolderLabel: "المجلد",
+ nextcloudUploadButton: "رفع",
+ nextcloudFileLabel: "اختر ملفًا",
+ fileExternalLink: "رابط خارجي",
+ nextcloudErrConnect: "تعذر الوصول إلى Nextcloud بهذه البيانات.",
+ nextcloudErrUpload: "فشل الرفع إلى Nextcloud.",
+ nextcloudErrShare: "لم يعطِ Nextcloud رابطًا عامًا للملف.",
fediverseDisconnect: "قطع الاتصال",
fediverseEmptyLink: "الإعدادات",
fediverseComposePlaceholder: "بماذا تفكر؟",
@@ -290,6 +330,76 @@ module.exports = {
fediverseErrPost: "تعذّر النشر.",
fediverseErrMedia: "تعذّر رفع الملف.",
fediverseErrEmpty: "اكتب شيئاً أو أرفق ملفاً.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "رقم الهاتف",
+ telegramSendCode: "إرسال الرمز",
+ telegramCodeHelp: "أدخل رمز الدخول الذي أرسله لك تيليغرام للتو (التطبيق أو الرسائل).",
+ telegramCodeLabel: "الرمز",
+ telegramPasswordHelp: "هذا الحساب يستخدم التحقق بخطوتين. أدخل كلمة المرور.",
+ telegramPasswordLabel: "كلمة المرور",
+ telegramVerify: "تحقق",
+ telegramCancel: "إلغاء",
+ telegramChats: "المحادثات",
+ telegramUnread: "غير مقروءة",
+ telegramOpen: "فتح",
+ telegramSend: "إرسال",
+ telegramYou: "أنت",
+ telegramNoChats: "لا توجد محادثات بعد.",
+ telegramNoMessages: "لا توجد رسائل بعد.",
+ telegramComposePlaceholder: "اكتب رسالة…",
+ telegramChannel: "قناة",
+ telegramGroup: "مجموعة",
+ telegramPrivate: "خاص",
+ telegramErrConnect: "تعذر الاتصال بتيليغرام.",
+ telegramErrTimeout: "استغرق تيليغرام وقتاً طويلاً للرد.",
+ telegramErrAuth: "جلسة تيليغرام غير صالحة أو منتهية. أعد الاتصال.",
+ telegramErrFetch: "تعذر تحميل المحادثات.",
+ telegramErrSend: "تعذر إرسال الرسالة.",
+ telegramErrMissing: "مطلوب API ID و API hash ورقم الهاتف.",
+ telegramErrCode: "رمز غير صحيح. حاول مرة أخرى.",
+ telegramErrCodeExpired: "انتهت صلاحية الرمز. ابدأ من جديد.",
+ telegramErrPassword: "كلمة مرور خاطئة.",
+ telegramErrPhone: "رقم هاتف غير صالح.",
+ telegramErrApi: "API ID أو API hash غير صالح.",
+ telegramErrFlood: "محاولات كثيرة جداً. انتظر قليلاً ثم حاول مجدداً.",
+ telegramErrNoLogin: "لا يوجد تسجيل دخول جارٍ. ابدأ من جديد.",
+ peertubeUsernameLabel: "اسم المستخدمة",
+ peertubePasswordLabel: "كلمة المرور",
+ peertubeSubscriptions: "الاشتراكات",
+ peertubeMyVideos: "فيديوهاتي",
+ peertubeVideos: "فيديوهات",
+ peertubeFollowers: "المتابِعات",
+ peertubeViews: "مشاهدة",
+ peertubeLikes: "إعجاب",
+ peertubeQuota: "الحصة",
+ peertubeUpload: "رفع فيديو",
+ peertubeUploadHelp: "اختاري ملف فيديو. يُرفع إلى قناتك ثم يعالجه PeerTube.",
+ peertubeTitleLabel: "العنوان",
+ peertubeDescriptionLabel: "الوصف",
+ peertubePrivacyLabel: "الخصوصية",
+ peertubePrivacyPublic: "عام",
+ peertubePrivacyUnlisted: "غير مدرج",
+ peertubePrivacyPrivate: "خاص",
+ peertubeNoVideos: "لا توجد فيديوهات بعد.",
+ peertubeComments: "التعليقات",
+ peertubeComment: "تعليق",
+ peertubeCommentPlaceholder: "اكتبي تعليقًا…",
+ peertubeNoComments: "لا توجد تعليقات بعد.",
+ peertubeOpen: "فتح على PeerTube",
+ peertubeWatch: "مشاهدة",
+ peertubeChannel: "القناة",
+ peertubeNoStream: "لا يمكن تشغيل هذا الفيديو هنا بعد. افتحيه على PeerTube.",
+ peertubeUploaded: "تم رفع الفيديو. PeerTube يعالجه الآن.",
+ peertubeErrConnect: "تعذر الاتصال بـ PeerTube.",
+ peertubeErrAuth: "اسم المستخدمة أو كلمة المرور غير صحيحة، أو انتهت الجلسة. أعيدي الاتصال.",
+ peertubeErrInstance: "عنوان الخادم غير صالح.",
+ peertubeErrMissing: "يلزم الخادم واسم المستخدمة وكلمة المرور.",
+ peertubeErrFetch: "تعذر تحميل الفيديوهات.",
+ peertubeErrUpload: "تعذر رفع الفيديو.",
+ peertubeErrTitle: "العنوان مطلوب.",
+ peertubeErrComment: "تعذر نشر التعليق.",
+ peertubeErrNoFile: "اختاري ملف فيديو.",
bookmarksLabel: "العلامات المرجعية",
videosLabel: "الفيديوهات",
torrentsLabel: "التورنت",
@@ -312,7 +422,6 @@ module.exports = {
comment: "تعليق",
subtopic: "موضوع فرعي",
json: "JSON",
- createdBy: "بواسطة",
unfollow: "إلغاء الدعم",
follow: "دعم",
block: "حظر",
@@ -328,12 +437,15 @@ module.exports = {
relationshipNone: "أنت لا تدعم",
relationshipBlockingPost: "منشور محظور",
viewLikes: "عرض الانتشارات",
+ viewSupporters: "عرض الداعمين",
spreadedDescription: "قائمة المنشورات التي نشرها الساكن.",
preview: "معاينة",
publish: "كتابة",
contentWarningPlaceholder: "أضف موضوعًا للمنشور (اختياري)",
- publishWarningPlaceholder: "النص محدود بـ 7000 حرفًا.",
+ publishWarningPlaceholder: "اكتب نص مقالتك.",
publishTooLong: "منشورك طويل جدًا. الرجاء تقصيره.",
+ keepTextRetry: "إرسال مرة أخرى",
+ dateInPastError: "لا يمكن أن يكون التاريخ في الماضي",
publishCustomDescription: [
"تذكّر: بسبب تقنية البلوكتشين، بمجرد نشر المنشور لا يمكن تعديله أو حذفه.",
],
@@ -363,9 +475,8 @@ module.exports = {
mentionsMatching: "الإشارات المطابقة",
mentionsName: "الاسم",
mentionsRelationship: "العلاقة",
- updateit: "احصل على التحديثات!",
updateBannerText: "يتوفر إصدار جديد من Oasis.",
- updateBannerAction: "حدّث الآن →",
+ updateBannerAction: "حدّث الآن!",
info: "معلومات",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -373,16 +484,14 @@ module.exports = {
timeAgo: "مضت",
sendTime: "حوالي ",
theme: "السمة",
- legacy: "المفاتيح",
- legacyTitle: "المفاتيح",
- legacyDescription: "إدارة مفتاحك السري (المفتاح الخاص) بسرعة وأمان.",
- legacyExportButton: "تصدير",
- legacyImportButton: "استيراد",
+ backupKeysExportButton: "تصدير",
+ backupKeysImportButton: "استيراد",
ssbLogStream: "البلوكتشين",
ssbLogStreamDescription: "تكوين حد الرسائل لتدفقات البلوكتشين.",
+ logWindowChip: "آخر {n} تدفقات من البلوكتشين",
saveSettings: "حفظ الإعدادات",
exportDescription: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير مفتاحك",
- exportDataTitle: "نسخة احتياطية",
+ exportDataTitle: "نسخة فورية",
exportDataDescription: "تنزيل بياناتك (بدون المفتاح السري!)",
exportDataButton: "تنزيل قاعدة البيانات",
importDescription: "استورد مفتاحك السري المشفر (المفتاح الخاص) لتفعيل صورتك الرمزية",
@@ -391,38 +500,33 @@ module.exports = {
fileInfo: "سيتم تنزيل مفتاحك السري المشفر إلى جهازك (الاسم: oasis.enc)",
developer: "التطوير",
devTitle: "التطوير",
- welcomeBannerText: "أهلًا بك في أواسيس. اتبع هذه الخطوات السريعة لإعداد شخصيتك.",
+ welcomeBannerText: "لم يتم إعداد صورتك الرمزية بعد.",
aiSuggestionBanner: "اقتراح:",
aiSuggestionsEnable: "اقتراحات الذكاء الاصطناعي",
- welcomeBannerAction: "ابدأ!",
+ welcomeBannerAction: "ابدأ",
welcomeTitle: "أهلًا بك",
+ welcomeStepIdentity: "الهوية",
+ welcomeStepType: "النوع",
+ welcomeStepUse: "الاستخدام",
+ welcomeStepLook: "المظهر",
+ welcomeStepCommunity: "المجتمع",
+ welcomeStepIntro: "ترحيب",
+ welcomeHintIdentity: "اسمك وصورتك.",
+ welcomeHintType: "كيف يُفتح Oasis لك.",
+ welcomeHintUse: "الوحدات التي تبقى مفعّلة.",
+ welcomeHintLook: "السمة التي يرتديها Oasis.",
+ welcomeHintCommunity: "انضم إلى PUB للتعرّف على سكان آخرين.",
+ welcomeHintIntro: "أرسل تحية أولى إلى المجتمع.",
+ welcomeStepThemeAction: "استخدم هذه السمة",
+ welcomeJoinPubs: "انضم إلى PUBs",
+ welcomeNoFederation: "بدون اتحاد",
welcomeStepGreetingAction: "إرسال",
- welcomeJoinPubButton: "انضم إلى الـ pub",
- welcomeStepLarpAction: "انضم إلى «الأكاديمية»",
- welcomeStepLarpText: "انضم إلى لعبة تقمص الأدوار الحية الخاصة بنا.",
- welcomeStepLarpTitle: "انضم إلى L.A.R.P.",
- welcomeStepGreetingTitle: "أرسل «مرحبًا يا عالم!»",
- welcomeStepGreetingText: "أرسل رسالة ليتمكن بقية السكان من اكتشافك.",
- welcomeJoinPub: "انضم إلى",
welcomeDescription: "بعض الأمور التي يُستحسن فعلها قبل البدء.",
- welcomeProgress: "مكتمل",
- welcomeStepDone: "تم",
- welcomeStepPending: "معلّق",
welcomeSkip: "ليس الآن",
- welcomeStepLanguageTitle: "اختر لغتك",
- welcomeStepLanguageText: "أواسيس يتحدث عدة لغات. يمكنك تغييرها متى شئت.",
- welcomeStepProfileTitle: "حرّر ملفك الشخصي",
- welcomeStepProfileText: "اختر اسمًا وأضف وصفًا وضع صورة ليتعرّف عليك بقية السكان.",
welcomeStepProfileAction: "حفظ الملف",
- welcomeStepFederationTitle: "انضم إلى الشبكة الرئيسية",
- welcomeStepFederationText: "اتصل بالـ pub الخاص بنا للقاء سكان آخرين والبدء في المزامنة.",
- welcomeStepFederationAction: "الذهاب إلى الدعوات",
- welcomeStepBackupTitle: "انسخ معرّفك احتياطيًا",
- welcomeStepBackupText: "هويتك ملف مفاتيح على هذا الجهاز.",
- welcomeStepBackupWarning: "إذا ضاع، لا يستطيع أحد استعادته لك.",
- welcomeStepBackupAction: "انسخ احتياطيًا!",
+ welcomeBootstrapRunning: "جارٍ تحميل لقطة الـpub. عند الانتهاء يتم الانضمام إلى الـpub تلقائيًا؛ يمكنك متابعة استخدام Oasis في هذه الأثناء.",
welcomeCompleteTitle: "كل شيء جاهز.",
- welcomeCompleteText: "عقدتك جاهزة. من هنا تنمو الشبكة مع من تتابعهم.",
+ welcomeCompleteText: "عقدتك جاهزة. من هنا تنمو الشبكة مع السكان الذين تدعمهم.",
welcomeFindPeople: "ابحث عن السكان",
devFilterFiles: "الملفات",
devFilterSearch: "بحث",
@@ -432,7 +536,7 @@ module.exports = {
devFilterTests: "الاختبارات",
devVersion: "الإصدار",
devNodeVersion: "Node",
- devStatsTests: "مجموعات الاختبار",
+ devStatsTests: "اختبارات",
devParentFolder: "المجلد الأعلى",
devOpenFolder: "فتح",
devDescription: "استكشف الشيفرة المصدرية التي تعمل على هذه العقدة.",
@@ -476,6 +580,27 @@ module.exports = {
"إذا كنت ترغب في استخدام لغة أخرى، اخترها هنا.",
setLanguage: "تعيين اللغة",
peerConnectionsIntro: "إدارة جميع اتصالاتك مع الأقران الآخرين.",
+ peersConnectFailed: "تعذّر الاتصال: {reason}.",
+ peerStateLabel: "الحالة",
+ peerAddressLabel: "العنوان",
+ peerLastChangeLabel: "آخر تغيير",
+ peerStateConnected: "متصل",
+ peerStateConnecting: "جارٍ الاتصال",
+ peerStateStaged: "متاح",
+ peerErrSilent: "لا نشاط",
+ peerErrTimeout: "لا يستجيب",
+ peerErrRefused: "يرفض الاتصال",
+ peerErrNotFound: "عنوان غير معروف",
+ peerErrUnreachable: "الشبكة غير قابلة للوصول",
+ peerErrKeys: "يستخدم مفاتيح مختلفة",
+ peerErrIdentity: "لا يقبل اتصالك",
+ peerErrTor: "TOR فقط",
+ peerErrDropped: "انقطع الاتصال",
+ peerErrPaused: "الشبكة متوقفة مؤقتًا",
+ peerErrOther: "خطأ في الاتصال",
+ peerOutdated: "قديم",
+ peerVersionUnannounced: "لا يعلن عن إصداره: Oasis قديم",
+ peersTorMissing: "هذا الـPUB لا يسمح إلا بالاتصالات عبر TOR.",
peerConnectionsTitle: "الاتصالات",
online: "متصل",
offline: "غير متصل",
@@ -494,22 +619,25 @@ module.exports = {
noConnections: "لا يوجد أقران متصلون.",
noDiscovered: "لم يتم اكتشاف أقران.",
noUnknownPeers: "لا توجد أقران غير معروفة في رسم بياني الأصدقاء.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "لا توجد عقد مسجلة بعد.",
+ peerConnect: "اتصال",
+ peerDisconnect: "قطع الاتصال",
peerRefresh: "تحديث",
peerPruneIdle: "إزالة الخاملة",
+ peersPause: "إيقاف مؤقت",
+ peersResume: "استئناف",
+ peersPausedNote: "متوقف مؤقتًا: لا يتصل Oasis بأحد ولا يمكن لأحد الاتصال به.",
+ peersPauseHint: "يوقف كل الاتصالات: لا يتصل Oasis بعُقد أخرى ولا يقبلها حتى تستأنف.",
peerExport: "تصدير",
peerImport: "استيراد",
peerImportTitle: "استيراد قائمة الأقران",
peerImportPlaceholder: "ألصق عنوان multiserver واحدًا لكل سطر، أو حمّل ملف .txt…",
connectionActionIntro:
"",
- startNetworking: "بدء الشبكة",
- stopNetworking: "إيقاف الشبكة",
- restartNetworking: "إعادة تشغيل الشبكة",
- sync: "مزامنة الشبكة",
indexes: "الفهارس",
+ indexesRebuilt: "أُعيد بناء الفهارس",
+ indexesRebuildFailed: "تعذّر إعادة بناء الفهارس",
+ indexesFiles: "ملفات الفهرس",
indexesDescription:
"إعادة بناء الفهارس آمنة، وقد تصلح بعض أنواع الأخطاء.",
homePageTitle: "الصفحة الرئيسية",
@@ -519,44 +647,33 @@ module.exports = {
invitesDescription: "إدارة وتطبيق رموز الدعوة في شبكتك.",
invitesPubsHint: "ألصق رمز دعوة لخادم pub للاتحاد معه والبدء بنسخ سكانه.",
invitesFederationsHint: "الخوادم المتحدة معك: حدّثها، أزل غير المتاحة أو صدّر القائمة.",
- invitesHousesHint: "أدخل رمز بيت للانضمام إلى بيت في LARP والمشاركة في اقتصاده.",
- invitesTribesHint: "أدخل رمز قبيلة لتصبح عضوًا وتصل إلى محتواها الخاص.",
- invitesChatsHint: "أدخل رمز محادثة للانضمام إلى الحوار ومواضيعه.",
- invitesPadsHint: "أدخل رمز لوح للكتابة مع آخرين في مستند مشترك.",
- invitesCalendarsHint: "أدخل رمز تقويم لمشاركة المواعيد والتذكيرات.",
- invitesEventsHint: "أدخل رمز فعالية للانضمام إلى فعالية خاصة.",
- invitesForumsHint: "أدخل رمز منتدى للقراءة والرد في منتدى خاص.",
- invitesMapsHint: "أدخل رمز خريطة لرؤية الأماكن وإضافتها على خريطة مشتركة.",
- invitesShopsHint: "أدخل رمز متجر للانضمام إلى متجر وكتالوجه.",
- invitesInhabitantsHint: "أدخل رمز ساكن لمتابعة بعضكما وتبادل المحتوى.",
invitesTribesTitle: "القبائل",
- invitesTribeInviteCodePlaceholder: "أدخل رمز دعوة القبيلة",
- invitesTribeJoinButton: "انضم إلى القبيلة",
invitesChatsTitle: "المحادثات",
- invitesChatInviteCodePlaceholder: "أدخل رمز دعوة المحادثة",
- invitesChatJoinButton: "انضم إلى المحادثة",
- invitesPadsTitle: "الوسادات",
- invitesPadInviteCodePlaceholder: "أدخل رمز دعوة الوسادة",
- invitesPadJoinButton: "انضم إلى الوسادة",
+ invitesPadsTitle: "المستندات التعاونية",
invitesCalendarsTitle: "التقاويم",
- invitesCalendarInviteCodePlaceholder: "أدخل رمز دعوة التقويم",
- invitesCalendarJoinButton: "انضم إلى التقويم",
invitesEventsTitle: "الأحداث",
- invitesEventInviteCodePlaceholder: "أدخل رمز دعوة الحدث",
- invitesEventJoinButton: "انضم إلى الحدث",
invitesForumsTitle: "المنتديات",
- invitesForumInviteCodePlaceholder: "أدخل رمز دعوة المنتدى",
- invitesForumJoinButton: "انضم إلى المنتدى",
invitesMapsTitle: "خرائط",
- invitesMapInviteCodePlaceholder: "أدخل رمز دعوة الخريطة",
- invitesMapJoinButton: "انضم إلى الخريطة",
invitesShopsTitle: "المتاجر",
- invitesShopInviteCodePlaceholder: "أدخل رمز دعوة المتجر",
- invitesShopJoinButton: "الانضمام إلى المتجر",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "PUBs مقترحة",
+ invitesFilterOthers: "أخرى",
+ invitesJoinTitle: "الدعوات",
+ invitesJoinHint: "ألصق أي رمز دعوة، أيًّا كان غرضه، أو معرّف Oasis لأحد السكان.",
+ invitesJoinPlaceholder: "رمز دعوة أو معرّف Oasis",
+ invitesJoinButton: "انضمام",
+ invitesUsedTitle: "أحدث الدعوات",
+ invitesUsedEmpty: "لم تستعمل أي دعوة بعد.",
+ invitesUsedType: "النوع",
+ invitesUsedName: "الاسم",
+ invitesUsedDate: "التاريخ",
invitesPubInviteCodePlaceholder: "أدخل رمز دعوة PUB",
invitesAcceptInvite: "انضم إلى PUB",
+ invitesPubUses: "الدعوات المستخدمة",
+ invitesPubExhausted: "لم يتبقَّ لدى هذا الـ PUB أي دعوات.",
invitesAlreadyFederated: "أنت متحد بالفعل مع هذا الخادم.",
+ invitesJoinPubMode: "يعمل Oasis هذا كـ PUB في وضع القراءة فقط. لربطه بـ PUB آخر، استخدم في الطرفية: ./oasis.sh join <رمز الدعوة>",
+ invitesJoinLocalOnly: "لا تُقبل الدعوات إلا من الجهاز الذي يعمل عليه Oasis، أو باستخدام رابط الإدارة الذي يظهر عند التشغيل.",
invitesFederationsTitle: "الاتحادات",
invitesAcceptedInvites: "متحدة",
invitesUnfollow: "إلغاء المتابعة",
@@ -564,16 +681,12 @@ module.exports = {
invitesUnfollowedInvites: "غير متحدة",
invitesNoFederatedPubs: "لا توجد pubs متحدة.",
invitesNoUnfollowed: "لا توجد pubs غير متحدة.",
- invitesUnreachablePubs: "يتعذر الوصول",
- invitesNoUnreachablePubs: "لا توجد pubs يتعذر الوصول إليها.",
invitesPubsRefresh: "تحديث",
- invitesPubsClearUnreachable: "إزالة المتعذر الوصول إليها",
+ invitesPubsClearUnreachable: "تنظيف",
invitesPubsExport: "تصدير",
invitesPubsImport: "استيراد",
invitesPubsImportTitle: "استيراد pubs",
invitesPubsImportPlaceholder: "ألصق عنوان multiserver أو رمز دعوة لكل سطر، أو حمّل ملف .txt…",
- currentlyUnreachable: "خطأ!",
- errorDetails: "تفاصيل الخطأ",
genericError: "حدث خطأ.",
panicMode: "وضع الطوارئ!",
encryptData: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير البلوكتشين الخاص بك",
@@ -600,7 +713,6 @@ module.exports = {
votesOptionNoLabel:"لا",
votesOptionAbstentionLabel:"امتناع",
votesQuestionLabel:"السؤال",
- votesCreatedByLabel:"أنشأه",
voteStatusOpen:"مفتوح",
voteStatusClosed:"مغلق",
commentDescription: ({ parentUrl }) => [
@@ -617,22 +729,22 @@ module.exports = {
searchSubmit: "لنبحث...",
votesLabel: "التصويتات",
pdfFallbackLabel: "مستند PDF",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "المتاجر",
+ voteLabel: "الأصوات",
submit: "إرسال",
editProfile: "تعديل الصورة الرمزية",
oasisIdLabel: "OasisID",
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- /multiverse — أدر حساباتك الأخرى في الكون المتعدد، بما في ذلك إرسال واستقبال المحتوى.\n\nأُرسلت هذه الرسالة بشكل خاص منك إلى نفسك، لذا لم يلزم أي اتصال لاستلامها.",
+ welcomePmBody: "مرحبًا بك في أوازيس — شبكة اجتماعية حرة، نِدّ لِنِد، اتحادية ومشفّرة، ذات بنية موزّعة بالدعوة فقط.\n\nبعض الأماكن المثيرة للاهتمام للبدء:\n\n- [/avatar](/profile) — عدّل صورتك الرمزية واسمك ووصفك والوحدات التي تظهر في جانبك العام.\n- /settings — اضبط نسختك المحلية: اللغة والسمة والوحدات والخصوصية والمزامنة.\n- /invites — أضف pub للاتحاد مع بقية الشبكة.\n- /peers — اطّلع على من هو متصل، أعد مسح شبكتك المحلية، صدّر أو استورد قوائم الأقران.\n- /inhabitants — اكتشف الصور الرمزية للسكان الآخرين وزرها.\n- /tribes — أنشئ مجموعات خاصة بتشفير من طرف إلى طرف أو انضم إليها.\n- /search — ابحث في محتوى الشبكة حسب النوع.\n\nبعض الأماكن المثيرة للاهتمام للاتصال:\n\n- /multiverse — أدر حساباتك الأخرى في الكون المتعدد، بما في ذلك إرسال واستقبال المحتوى.\n\nأُرسلت هذه الرسالة بشكل خاص منك إلى نفسك، لذا لم يلزم أي اتصال لاستلامها.",
profileSensorsSectionTitle: "المستشعرات",
profileVisibilityActivity: "مستوى النشاط",
profileDeviceLockedHint: "هذا المستشعر مفعّل دائمًا: يتيح للآخرين معرفة الجهاز الذي تتصل منه ولا يمكن تعطيله.",
profileVisibilityKarma: "نقاط KARMA",
- profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "محفظة ECOIN",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "الدخل الأساسي",
+ profileVisibilityWallet: "محفظة ECOin",
+ profileVisibilityEcoTax: "ضريبة ECO",
+ profileVisibilityLarpSign: "ختم L.A.R.P.",
profileVisibilityGpg: "مفتاح GPG",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "المتاجر",
@@ -645,6 +757,10 @@ module.exports = {
profileClearnetImagesLabel: "الصور",
profileClearnetDocumentsLabel: "المستندات",
profileClearnetTorrentsLabel: "التورنت",
+ profileClearnetPodcastsLabel: "البودكاست",
+ profileClearnetMarketLabel: "السوق",
+ profileClearnetFeedLabel: "التدفق",
+ profileClearnetWikiLabel: "ويكي",
editProfileDescription:
"",
profileName: "الاسم",
@@ -670,7 +786,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "تأكيدات",
walletConfirm: "تأكيد",
- walletDescription: "إدارة أصولك الرقمية، بما في ذلك إرسال واستقبال ECOin، وعرض رصيدك، والوصول إلى سجل معاملاتك.",
+ walletDescription: "أدر محفظة ECOin الخاصة بك.",
walletDate: "التاريخ",
walletFee: "الرسوم (كلما ارتفعت الرسوم، زادت سرعة معالجة معاملتك)",
walletFeeLine: ({ fee }) => `الرسوم: ECO ${fee}`,
@@ -678,6 +794,86 @@ module.exports = {
walletReceive: "استقبال",
walletReset: "إعادة تعيين",
walletSend: "إرسال",
+ walletPayingTransfer: "دفع التحويل",
+ walletCreateTransferLabel: "إنشاء عقد ذكي (تحويل)",
+ walletTransferNotifiedNote: "تم إخطار الطرف الآخر بهذه الدفعة",
+ walletTransferCreatedNote: "تم إنشاء تحويل (إيصال) لهذه الدفعة",
+ walletTransferNoPayeeNote: "لم ينشر أي ساكن هذا العنوان، فلم يُنشأ تحويل",
+ walletTransferReceiptConcept: "دفعة من المحفظة",
+ walletPaymentPmText: "أرسل لك دفعة",
+ walletPayeeLabel: "المستلم",
+ walletConceptLabel: "البيان",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "لقد استلمت دخلك الأساسي.",
+ bankingBotPaymentTitle: "لقد استلمت دفعة.",
+ bankingBotUbiPaidText: "تم دفع دخلك الأساسي الشامل",
+ bankUbiPubThisNode: "هذه العقدة تدفع الدخل الأساسي",
+ bankUbiPubConnected: "PUB الدخل الأساسي",
+ bankUbiPubNone: "لا يوجد PUB يعلن عن الدخل الأساسي في شبكتك بعد",
+ bankUbiAddressPublished: "تم نشر عنوان ECOin",
+ bankUbiAddressMissing: "انشر عنوان ECOin الخاص بك لتلقي الدخل الأساسي",
+ bankUbiClaimedThisMonth: "تمت المطالبة هذا الشهر",
+ bankUbiPubBalance: "محفظة PUB المتاحة للدخل الأساسي",
+ bankNoPubAddress: "لم ينشر PUB الدخل الأساسي عنوان ECOin بعد.",
+ bankUbiTab: "الدخل الأساسي",
+ bankDonateEco: "تبرّع!",
+ donateTooltip: "تبرّع بـ ECOin",
+ bankNoUserAddress: "هذا الساكن لا يشارك عنوان ECOin.",
+ bankUbiPubDefault: "افتراضي",
+ bankUbiPool: "الرصيد",
+ bankUbiLastSeen: "آخر ظهور",
+ bankUbiLastPayout: "آخر إجراء",
+ bankUbiPaidOut: "تم توزيعه",
+ bankRangeToday: "اليوم",
+ bankRangeWeek: "أسبوع",
+ bankRangeMonth: "شهر",
+ bankRangeYear: "سنة",
+ bankRangeFiveYears: "5 سنوات",
+ bankRangeAll: "الكل",
+ bankChartValueTitle: "تطور قيمة ECOin",
+ bankChartValueHours: "المعادل الزمني (ساعة)",
+ bankChartWealthTitle: "إعادة توزيع ثروة ECOin",
+ bankChartDistributed: "الدخل الأساسي الموزّع (ECO)",
+ bankChartRebalanceTitle: "إعادة توزيع الثروة بين الـ PUBs",
+ bankChartRebalanced: "ECO المنقولة بين الـ PUBs",
+ bankChartTaxes: "الضرائب المحتجزة (ECO)",
+ bankChartNoDataRange: "لا توجد بيانات في هذا النطاق.",
+ bankChartNoDataYet: "لا توجد بيانات بعد",
+ bankChartPerHour: "في الساعة",
+ bankChartPerDay: "في اليوم",
+ bankChartPerMonth: "في الشهر",
+ bankTotalUbiDistributed: "إجمالي الدخل الأساسي المعاد توزيعه (الشبكة)",
+ bankTotalTaxesWithheld: "إجمالي الضرائب المحتجزة (الشبكة)",
+ bankInflationIssuance: "معدل الإصدار (سنوي، من مكافأة الكتلة)",
+ bankRulesEligibilityTitle: "من يمكنه تلقي الدخل الأساسي",
+ bankRulesEligibility1: "عنوان ECOin منشور في ملفك (الملف → المستشعرات → محفظة ECOin).",
+ bankRulesEligibility2: "تغذية عمرها أكثر من 30 يوماً ولها نشاط في الشبكة: كارما فوق الصفر.",
+ bankRulesEligibility3: "مطالبة واحدة في الشهر (الحقبة)، من Banking بزر المطالبة بالدخل الأساسي. يمكن رفض الشهر الحالي بزر رفض الدخل الأساسي.",
+ bankRulesEligibility4: "الحد الأدنى 1 ECO يُدفع دائماً؛ الضرائب تقلّل فقط الجزء الذي يتجاوزه ولا تُحصَّل أبداً بشكل منفصل.",
+ bankRulesEligibility5: "يدفع الـ PUB في دورته التالية وينشر تحويل دخل أساسي يمكنك تأكيده.",
+ bankRulesEligibility6: "إذا غاب عنوانك أو كانت التغذية حديثة جداً أو رفضت الشهر أو لم يكن لدى الـ PUB أموال، تُتخطى المطالبة وتُسجَّل على الـ PUB.",
+ copyLinkTitle: "نسخ الرابط",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "رفض الدخل الأساسي",
+ bankUbiRefusedThisMonth: "لقد رفضت دخل هذا الشهر الأساسي.",
+ bankingBotUbiAvailableTitle: "يمكنك المطالبة بدخلك الأساسي.",
+ bankingBotUbiAvailableText: "دخلك الأساسي لهذا الشهر متاح",
+ bankingBotConfirmTitle: "لديك عقد ذكي بانتظار التأكيد",
+ bankingBotConfirmText: "عقود ذكية بانتظار تأكيدك",
+ bankChartZoomHint: "انقر للتكبير",
+ bankChartPoolTitle: "رصيد الدخل الأساسي (عبر الزمن)",
+ bankChartNetworkUbiTitle: "إجمالي الدخل الأساسي المعاد توزيعه (الشبكة)",
+ bankChartSupplyTitle: "المعروض المتداول من ECOin (عبر الزمن)",
+ bankChartInflationTitle: "تضخم ECOin (عبر الزمن)",
+ bankChartInflationSeries: "المعدل السنوي (%)",
+ bankChartPool: "إجمالي الرصيد (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (عبر الزمن)",
+ bankChartFundsTitle: "أموالك ECOin (عبر الزمن)",
+ bankChartKarma: "كارما",
+ bankWalletReady: "ECOin متصل",
+ bankWalletNotConfigured: "ECOin غير متصل",
+ transfersPayWithWallet: "ادفع!",
walletStatus: "الحالة",
walletDisconnected: [
"محفظة ECOin ",
@@ -687,8 +883,11 @@ module.exports = {
" أو حالة الاتصال.",
],
walletSentToLine: ({ destination, amount }) => `تم إرسال ECO ${amount} إلى ${destination}`,
+ walletNotConfigured: "محفظة ECOin الخاصة بك غير مُهيأة بعد.",
walletSettingsDescription: "دمج Oasis مع محفظة ECOin الخاصة بك.",
- walletSettingsDocLink: "دليل تثبيت ECOin",
+ walletSettingsMobileDescription: "اربط Oasis بتطبيق ECOin Wallet على هذا الجهاز.",
+ walletDownloadEcoin: "نزّل ECOin!",
+ walletRpcUrl: "عنوان RPC",
walletStatusMessages: {
invalid_amount: "مبلغ غير صالح",
invalid_dest: "عنوان وجهة غير صالح",
@@ -704,6 +903,7 @@ module.exports = {
walletUser: "اسم المستخدم",
walletPass: "كلمة المرور",
walletConfiguration: "تعيين المحفظة",
+ walletDisconnectButton: "فصل المحفظة",
cipher: "التشفير",
cipherTitle: "التشفير",
cipherDescription: "تشفير وفك تشفير نصك بشكل متماثل (باستخدام كلمة مرور مشتركة).",
@@ -737,17 +937,16 @@ module.exports = {
bookmarkFilterRecent: "الأخيرة",
bookmarkCreateButton: "إنشاء علامة مرجعية",
bookmarkUpdateButton: "تحديث",
- bookmarkDeleteButton: "حذف",
bookmarkAddFavoriteButton: "إضافة للمفضلة",
bookmarkRemoveFavoriteButton: "إزالة من المفضلة",
bookmarkUrlLabel: "الرابط",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "الوصف",
bookmarkDescriptionPlaceholder: "اختياري",
bookmarkTagsLabel: "الوسوم",
bookmarkTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
bookmarkLastVisitLabel: "آخر زيارة",
- bookmarkSearchPlaceholder: "ابحث عن رابط، وسوم، فئة، مؤلف...",
+ bookmarkSearchPlaceholder: "ابحث في العلامات المرجعية...",
bookmarkSortRecent: "الأحدث",
bookmarkSortOldest: "الأقدم",
bookmarkSortTop: "الأكثر تصويتًا",
@@ -786,7 +985,7 @@ module.exports = {
videoDescriptionPlaceholder: "اختياري",
videoNoFile: "لم يتم تقديم ملف فيديو",
noVideos: "لا توجد فيديوهات متاحة.",
- videoSearchPlaceholder: "ابحث عن عنوان، وسوم، مؤلف...",
+ videoSearchPlaceholder: "ابحث في الفيديوهات...",
videoSortRecent: "الأحدث",
videoSortOldest: "الأقدم",
videoSortTop: "الأكثر تصويتًا",
@@ -809,7 +1008,6 @@ module.exports = {
documentFilterFavorites: "المفضلة",
documentCreateButton: "رفع مستند",
documentUpdateButton: "تحديث",
- documentDeleteButton: "حذف",
documentAddFavoriteButton: "إضافة للمفضلة",
documentRemoveFavoriteButton: "إزالة من المفضلة",
documentMessageAuthorButton: "رسالة خاصة",
@@ -822,7 +1020,7 @@ module.exports = {
documentDescriptionPlaceholder: "اختياري",
documentNoFile: "لا يوجد ملف.",
noDocuments: "لا توجد مستندات متاحة.",
- documentSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف، مؤلف...",
+ documentSearchPlaceholder: "ابحث في المستندات...",
documentSortRecent: "الأحدث",
documentSortOldest: "الأقدم",
documentSortTop: "الأكثر تصويتًا",
@@ -843,19 +1041,19 @@ module.exports = {
audioFilterTop: "الأفضل",
audioCreateButton: "رفع ملف صوتي",
audioUpdateButton: "تحديث",
- audioDeleteButton: "حذف",
audioAddFavoriteButton: "إضافة للمفضلة",
audioRemoveFavoriteButton: "إزالة من المفضلة",
audioFileLabel: "اختر ملفًا صوتيًا (.mp3, .wav, .ogg)",
audioTagsLabel: "الوسوم",
audioTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ tagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
audioTitleLabel: "العنوان",
audioTitlePlaceholder: "اختياري",
audioDescriptionLabel: "الوصف",
audioDescriptionPlaceholder: "اختياري",
audioNoFile: "لم يتم تقديم ملف صوتي",
noAudios: "لا توجد ملفات صوتية متاحة.",
- audioSearchPlaceholder: "ابحث عن عنوان، وسوم، مؤلف...",
+ audioSearchPlaceholder: "ابحث في الملفات الصوتية...",
audioSortRecent: "الأحدث",
audioSortOldest: "الأقدم",
audioSortTop: "الأكثر تصويتًا",
@@ -879,13 +1077,12 @@ module.exports = {
favoritesFilterChats: "الدردشات",
favoritesFilterCalendars: "التقويمات",
favoritesFilterVideos: "الفيديوهات",
- favoritesRemoveButton: "إزالة من المفضلة",
favoritesNoItems: "لا توجد مفضلات بعد.",
yourContacts: "جهات اتصالك",
allInhabitants: "السكان",
allCVs: "السير الذاتية",
discoverPeople: "اكتشف السكان في شبكتك.",
- searchInhabitantsPlaceholder: "تصفية السكان حسب الاسم …",
+ searchInhabitantsPlaceholder: "ابحث في السكان...",
filterLocation: "تصفية السكان حسب الموقع …",
filterLanguage: "تصفية السكان حسب اللغة …",
filterSkills: "تصفية السكان حسب المهارات …",
@@ -909,7 +1106,6 @@ module.exports = {
topSectionTitle: "الأعلى",
blockedLabel: "مستخدم محظور",
inhabitantviewDetails: "عرض التفاصيل",
- cvVisitButton: "زيارة السيرة الذاتية",
keepReading: "متابعة القراءة...",
oasisId: "المعرّف",
noInhabitantsFound: "لم يتم العثور على سكان بعد.",
@@ -927,6 +1123,18 @@ module.exports = {
parliamentFilterLeaders: "القادة",
parliamentFilterRules: "القواعد",
parliamentGovernmentCard: "الحكومة الحالية",
+ parliamentSeatsGovernment: "الحكومة",
+ parliamentSeatsOpposition: "المعارضة",
+ parliamentSeatsAbstention: "امتناع",
+ parliamentSeatsQuorum: "نصاب الانتخاب",
+ parliamentSeatsPass: "عتبة الموافقة",
+ parliamentSeatsByElection: "حسب الانتخاب",
+ parliamentSeatsByHouses: "حسب بيت LARP",
+ parliamentSeatsSeats: "مقاعد",
+ parliamentSeatsSeat: "مقعد",
+ parliamentSeatsLeader: "القائد",
+ parliamentSeatsVotesFor: "أصوات لـ",
+ parliamentSeatsNoHouse: "بلا بيت",
parliamentActorInPowerInhabitant: 'الساكن الحاكم',
parliamentActorInPowerTribe: 'القبيلة الحاكمة',
parliamentHistoricalGovernmentsTitle: 'الحكومات',
@@ -994,6 +1202,7 @@ module.exports = {
parliamentTimeRemaining: "الوقت المتبقي",
parliamentElectionsStatusTitle: "الحكومة القادمة",
parliamentProposalDeadlineLabel: "الموعد النهائي",
+ parliamentViewReport: "عرض التقرير",
parliamentProposalTimeLeft: "الوقت المتبقي",
parliamentRulesTitle: "كيف يعمل البرلمان",
parliamentRulesIntro: "تُحسم الانتخابات كل شهرين؛ الترشيحات مستمرة وتُعاد عند اختيار حكومة.",
@@ -1008,6 +1217,7 @@ module.exports = {
parliamentRulesLaws: "عندما يصل اقتراح إلى حده الأدنى، يصبح قانونًا ويظهر في تبويب القوانين مع تاريخ سنّه.",
parliamentRulesHistorical: "في تبويب السجل التاريخي يمكنك رؤية كل دورة حكومية حدثت وبيانات عن إدارتها.",
parliamentRulesLeaders: "في تبويب القادة يمكنك رؤية ترتيب السكان/القبائل التي حكمت (أو ترشحت)، مرتبة حسب الكفاءة.",
+ parliamentRulesHemicycle: "يمنح نصف الدائرة مقعداً لكل ساكن: كتلة الحكومة (ناخبو الترشيح الفائز والقائد)، وكتلة معارضة لكل ترشيح آخر في الدورة، والامتناع. تُظهر العلامات المتقطعة نصاب الانتخاب (25٪ من التعداد) وعتبة موافقة الطريقة الحالية. «حسب بيت LARP» يلوّن المقاعد نفسها حسب البيت.",
parliamentProposalVoteStatusLabel: "حالة التصويت",
parliamentProposalOnTrackYes: "تم الوصول للحد الأدنى",
parliamentProposalOnTrackNo: "دون الحد الأدنى",
@@ -1021,6 +1231,7 @@ module.exports = {
courtsCaseFormTitle: "فتح قضية",
courtsCaseRespondent: "المتهم / المدعى عليه",
courtsCaseRespondentPh: "معرّف Oasis (@...) أو اسم القبيلة",
+ courtsCaseSubjectPlaceholder: "الموضوع أو وصف قصير",
courtsCaseMethod: "طريقة الحل",
courtsCaseSubmit: "رفع القضية",
courtsNominateJudge: "ترشيح قاضٍ",
@@ -1054,15 +1265,30 @@ module.exports = {
courtsMethodDICTATOR: "ديكتاتور",
courtsMethodPOPULAR: "شعبي",
courtsMethodKARMATOCRACY: "كارماتوقراطية",
+ courtsCaseType: "نوع القضية",
+ courtsPresetMinorConflict: "نزاع بسيط",
+ courtsPresetModerateConflict: "نزاع متوسط",
+ courtsPresetSevereConflict: "نزاع خطير",
+ courtsPresetHarassment: "تحرش أو إساءة",
+ courtsPresetContentModeration: "إشراف على المحتوى",
+ courtsPresetBanRestriction: "حظر أو تقييد",
+ courtsPresetGovernanceDispute: "نزاع حوكمة",
+ courtsStatusOPEN: "مفتوحة",
+ courtsStatusIN_PROGRESS: "قيد النظر",
+ courtsStatusDECIDED: "تم البت فيها",
+ courtsStatusCLOSED: "مغلقة",
+ courtsStatusSOLVED: "محلولة",
+ courtsStatusUNSOLVED: "غير محلولة",
+ courtsStatusDISCARDED: "مرفوضة",
courtsRulesTitle: "كيف تعمل المحاكم",
courtsRulesIntro: "المحاكم هي عملية يديرها المجتمع لحل النزاعات وتعزيز العدالة التصالحية. يُعطى الأولوية للحوار والأدلة الواضحة والعلاجات المتناسبة.",
courtsRulesLifecycle: "العملية: 1) فتح قضية 2) اختيار الطريقة 3) تقديم الأدلة 4) الاستماع والمداولة 5) الحكم والعلاج 6) الامتثال والإغلاق 7) الاستئناف (إن وُجد).",
- courtsRulesRoles: "المدعي: يفتح القضية. الدفاع: الشخص أو القبيلة المتهمة. الطريقة: الآلية التي يختارها المجتمع لتسهيل وتقييم الأدلة وإصدار الحكم. الشاهد: يقدم شهادة أو دليلاً. الوسطاء: أشخاص محايدون يدعوهم المدعي و/أو الدفاع، لديهم حق الوصول لجميع التفاصيل، يساعدون في تهدئة النزاع والمشاركة في صنع الاتفاقيات.",
+ courtsRulesRoles: "المدعي: يفتح القضية. الدفاع: الساكن أو القبيلة المتهمة. الطريقة: الآلية التي يختارها المجتمع لتسهيل وتقييم الأدلة وإصدار الحكم. الشاهد: يقدم شهادة أو دليلاً. الوسطاء: سكان محايدون يدعوهم المدعي و/أو الدفاع، لديهم حق الوصول لجميع التفاصيل، يساعدون في تهدئة النزاع والمشاركة في صنع الاتفاقيات.",
courtsRulesEvidence: "الوصف حتى 1000 حرف. أرفق صورًا وملفات صوتية وفيديوهات ومستندات PDF ذات صلة وقانونية. لا تشارك بيانات خاصة حساسة دون موافقة.",
courtsRulesDeliberation: "قد تكون الجلسات علنية أو خاصة. يضمن القضاة الاحترام ويطلبون التوضيحات وقد يتجاهلون المواد غير ذات الصلة أو غير القانونية.",
courtsRulesVerdict: "يُعطى الأولوية للتصالح: الاعتذارات، اتفاقيات الوساطة، إدارة المحتوى، القيود المؤقتة، أو تدابير متناسبة أخرى. يجب تسجيل الأسباب.",
courtsRulesAppeals: "الاستئناف: مسموح عند وجود أدلة جديدة أو خطأ إجرائي واضح. يجب تقديمه خلال 7 أيام ما لم يُذكر خلاف ذلك.",
- courtsRulesPrivacy: "احترم الخصوصية والأمان. يتم إزالة التشهير والكراهية والتهديدات. قد يعدل القضاة أو يختمون أجزاء من السجل لحماية الأشخاص المعرضين للخطر.",
+ courtsRulesPrivacy: "احترم الخصوصية والأمان. يتم إزالة التشهير والكراهية والتهديدات. قد يعدل القضاة أو يختمون أجزاء من السجل لحماية السكان المعرضين للخطر.",
courtsRulesMisconduct: "قد يؤدي التحرش أو التلاعب أو تلفيق الأدلة إلى حكم سلبي فوري.",
courtsRulesGlossary: "القضية: سجل نزاع. الدليل: مواد تدعم الادعاءات. الحكم: قرار مع علاج. الاستئناف: طلب مراجعة الحكم.",
courtsFilterActions: "الإجراءات",
@@ -1078,12 +1304,16 @@ module.exports = {
exploreTrending: "استكشف المحتوى الأكثر شعبية في شبكتك.",
votesButton: "التصويتات",
shopProductButton: "متجر",
+ podcastButton: "بودكاست",
+ podcastEpisodeButton: "حلقة",
+ campaignButton: "حملة",
+ logisticsRouteButton: "مسار",
trendingTotalOpinions: "إجمالي الآراء",
trendingNoContentMessage: "لا توجد اتجاهات بعد.",
trendingTotalCount: "العدد الإجمالي",
tasksTitle: "المهام",
tasksDescription: "اكتشف وأدِر المهام في شبكتك.",
- taskSearchPlaceholder: "ابحث عن المهام...",
+ taskSearchPlaceholder: "ابحث في المهام...",
taskTitleLabel: "العنوان",
taskDescriptionLabel: "الوصف",
taskStartTimeLabel: "وقت البدء",
@@ -1102,7 +1332,7 @@ module.exports = {
taskStatusOpen: "مفتوح",
taskStatusInProgress: "قيد التنفيذ",
taskStatusClosed: "مغلق",
- taskAssignedTo: "مُسنَد إلى",
+ taskAssignedTo: "مُسنَد",
taskAssignedChip: "مُسندة",
taskUnassignedChip: "غير مُسندة",
taskAssignees: "المُكلَّفون",
@@ -1112,6 +1342,7 @@ module.exports = {
taskUpdateButton: "تحديث",
taskDeleteButton: "حذف",
taskFilterAll: "الكل",
+ taskFilterRecent: "الأخيرة",
taskFilterMine: "خاصتي",
taskFilterOpen: "مفتوح",
taskFilterInProgress: "قيد التنفيذ",
@@ -1139,14 +1370,13 @@ module.exports = {
eventUpcomingDates: "التواريخ القادمة",
eventsTitle: "الأحداث",
eventsDescription: "اكتشف وأدِر الأحداث في شبكتك.",
- eventSearchPlaceholder: "ابحث عن الأحداث...",
+ eventSearchPlaceholder: "ابحث في الأحداث...",
eventPrice: "السعر",
eventStatus: "الحالة",
eventAllSectionTitle: "الأحداث",
eventMineSectionTitle: "أحداثك",
eventCreateSectionTitle: "إنشاء حدث",
eventUpdateSectionTitle: "تحديث الحدث",
- eventDeleteButton: "حذف",
eventCreateButton: "إنشاء حدث",
eventAddToCalendar: "إضافة إلى التقويم",
eventVisitCalendar: "عرض التقويم",
@@ -1188,6 +1418,7 @@ module.exports = {
eventDate: "التاريخ",
eventAttendButton: "حضور الحدث",
eventFilterAll: "الكل",
+ eventFilterRecent: "الأخيرة",
eventFilterMine: "خاصتي",
eventFilterToday: "اليوم",
eventFilterWeek: "هذا الأسبوع",
@@ -1214,7 +1445,7 @@ module.exports = {
tagsFilterTop: "الأفضل",
tagsFilterCloud: "السحابة",
tagsNoItems: "لا توجد وسوم متاحة.",
- tagsSearchPlaceholder: "ابحث عن الوسوم...",
+ tagsSearchPlaceholder: "ابحث في الوسوم...",
tagsTableHeaderTag: "الوسم/الرابط:",
tagsTableHeaderCount: "العداد:",
transfersTitle: "التحويلات",
@@ -1222,8 +1453,11 @@ module.exports = {
transfersFrom: "من",
transfersTo: "إلى",
transfersFilterAll: "الكل",
+ transfersFilterRecent: "الأخيرة",
transfersFilterMine: "خاصتي",
- transfersFilterUBI: "UBI",
+ transfersFilterMinePending: "قيد الانتظار",
+ transfersFilterMineConfirmed: "موقَّعة",
+ transfersFilterUBI: "الدخل الأساسي",
transfersFilterMarket: "السوق",
transfersFilterTop: "الأفضل",
transfersFilterPending: "معلّق",
@@ -1237,7 +1471,6 @@ module.exports = {
transfersCategoryEconomic: "اقتصادي",
transfersCategoryTime: "وقت",
transfersCategoryTrust: "ثقة",
- transfersCategoryApply: "تطبيق",
transfersUnitEco: "ECO",
transfersUnitHours: "س",
transfersUnitTrust: "ثقة",
@@ -1267,7 +1500,7 @@ module.exports = {
transfersDiscardedSectionTitle: "التحويلات الملغاة",
transfersCreateSectionTitle: "إنشاء عملية نقل",
transfersAllSectionTitle: "التحويلات",
- transfersSearchPlaceholder: "ابحث عن مفهوم، وسوم، مستخدمين...",
+ transfersSearchPlaceholder: "ابحث في التحويلات...",
transfersMinAmountLabel: "الحد الأدنى للمبلغ",
transfersMaxAmountLabel: "الحد الأقصى للمبلغ",
transfersSortRecent: "الأحدث",
@@ -1289,6 +1522,7 @@ module.exports = {
voteErrorTitle: "راجع النموذج",
voteErrorDeadlineMin: "يجب أن يكون الموعد النهائي بعد {days} أيام على الأقل من الآن.",
voteErrorGeneric: "تعذّر حفظ التصويت.",
+ voteLocked: "تلقّى هذا التصويت أصواتًا أو آراء بالفعل، أو يتبع البرلمان أو المحاكم: لم يعد بالإمكان تعديله أو حذفه.",
voteUpdateButton: "تحديث",
voteDeleteButton: "حذف",
voteOptionYes: "نعم",
@@ -1298,6 +1532,7 @@ module.exports = {
voteFollowMajority: "اتباع الأغلبية",
voteNotInterested: "غير مهتم",
voteFilterAll: "الكل",
+ voteFilterRecent: "الأخيرة",
voteFilterMine: "خاصتي",
voteFilterOpen: "مفتوح",
voteFilterClosed: "مغلق",
@@ -1313,7 +1548,6 @@ module.exports = {
voteTags: "الوسوم",
voteOpinions: "الآراء",
novotes: "لا توجد مقترحات تصويت متاحة.",
- voteBy: "بواسطة",
voteCreatedAt: "أُنشئ في",
voteNoQuestion: "لم يتم تقديم سؤال",
voteUnknownCreator: "مُنشئ غير معروف",
@@ -1323,6 +1557,7 @@ module.exports = {
voteCommentsForumButton: 'فتح النقاش',
voteCommentsSectionTitle: 'فتح النقاش',
voteNoCommentsYet: 'لا توجد تعليقات بعد. كن أول من يرد.',
+ commentsGoToLast: "اذهب إلى آخر تعليق",
voteNewCommentPlaceholder: 'اكتب تعليقك هنا…',
voteNewCommentButton: 'نشر التعليق',
voteNewCommentLabel: 'إضافة تعليق',
@@ -1333,6 +1568,8 @@ module.exports = {
cvNameLabel: "الاسم الكامل",
cvDescriptionLabel: "الملخص",
cvPhotoLabel: "الصورة",
+ cvPdfLabel: "السيرة الذاتية (PDF)",
+ cvVisitButton: "زيارة السيرة الذاتية",
cvPersonalExperiencesLabel: "الخبرات الشخصية",
cvPersonalSkillsLabel: "المهارات الشخصية (مفصولة بفواصل)",
cvOasisExperiencesLabel: "خبرات المساهمة في Oasis",
@@ -1364,7 +1601,7 @@ module.exports = {
blogMessage: "الرسالة",
blogImage: "رفع وسائط (الحد الأقصى: 50 ميغابايت)",
blogMedia: "المرفقات (حتى 8 صور ومقطع فيديو)",
- blogPublish: "معاينة",
+ blogPublish: "نشر",
pollsTitle: "الاستطلاعات",
dataTitle: "التطابقات",
dataDescription: "استكشف تطابقات شبكتك وشاهدها.",
@@ -1383,12 +1620,23 @@ module.exports = {
dataKindTasks: "المهام",
dataKindReports: "التقارير",
dataKindVotes: "التصويتات",
- dataSearchPlaceholder: "ابحث في البيانات المتقاطعة...",
+ dataSearchPlaceholder: "ابحث في التطابقات...",
dataCohesionTitle: "معامل التماسك (CC)",
dataCcShort: "CC",
dataCohesionHint: "متوسط التقارب بين كل ما نشرته الشبكة.",
dataAffinity: "التوافق",
dataCommonTerms: "كلمة مفتاحية",
+ dataReasonFollowing: "أنت تدعم هذا الساكن",
+ dataReasonTribe: "يشاركك قبيلة",
+ dataReasonPinned: "يطابق شيئًا ثبّتّه",
+ dataReasonCv: "يطابق مهارات سيرتك الذاتية",
+ dataReasonContent: "مرتبط بما تنشره",
+ dataReasonRelated: "مرتبط باهتماماتك",
+ dataReasonAlike: "نشره ساكن يشبهك",
+ dataReasonSupportsYou: "يدعمك",
+ dataReasonMutual: "دعم متبادل",
+ dataReasonRated: "حاصل على تقييم جيد من الشبكة",
+ dataReasonNear: "بالقرب منك",
dataStatPeople: "السير الذاتية",
dataStatConnected: "متصلون",
dataStatSkills: "المهارات",
@@ -1467,12 +1715,11 @@ module.exports = {
forumCreateButton: "إنشاء منتدى",
forumCreateSectionTitle: "إنشاء منتدى",
forumDescription: "تحدث بصراحة مع السكان الآخرين في شبكتك.",
- forumSearchPlaceholder: "ابحث في المنتدى...",
+ forumSearchPlaceholder: "ابحث في المنتديات...",
forumFilterAll: "الكل",
forumFilterMine: "خاصتي",
forumFilterRecent: "الأخيرة",
forumFilterTop: "الأفضل",
- forumDeleteButton: "حذف",
forumParticipants: "المشاركون",
forumMessages: "الرسائل",
forumMessageLabel: "الرسالة",
@@ -1499,7 +1746,6 @@ module.exports = {
imageFilterGallery: "المعرض",
imageCreateButton: "رفع صورة",
imageUpdateButton: "تحديث",
- imageDeleteButton: "حذف",
imageAddFavoriteButton: "إضافة للمفضلة",
imageRemoveFavoriteButton: "إزالة من المفضلة",
imageFileLabel: "اختر ملف صورة (.jpeg, .jpg, .png, .gif)",
@@ -1511,13 +1757,14 @@ module.exports = {
imageDescriptionPlaceholder: "اختياري",
imageNoFile: "لم يتم تقديم ملف صورة",
noImages: "لا توجد صور متاحة.",
- imageSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف، مؤلف...",
+ imageSearchPlaceholder: "ابحث في الصور...",
imageSortRecent: "الأحدث",
imageSortOldest: "الأقدم",
imageSortTop: "الأكثر تصويتًا",
imageSearchButton: "بحث",
imageUpdatedAt: "تم التحديث",
imageNoMatch: "لا توجد صور تطابق بحثك.",
+ feedSearchPlaceholder: "ابحث في التغذية...",
feedTitle: "التغذية",
createFeedTitle: "إنشاء تغذية",
createFeedButton: "أرسل التغذية!",
@@ -1532,7 +1779,7 @@ module.exports = {
alreadyRefeeded: "لقد أعدت نشر هذا بالفعل.",
activityTitle: "النشاط",
yourActivity: "نشاطك",
- globalActivity: "النشاط العام",
+ globalActivity: "النشاط",
activityList: "النشاط",
activityDesc: "شاهد آخر نشاط في شبكتك.",
allButton: "الكل",
@@ -1547,7 +1794,8 @@ module.exports = {
meme: "ميم",
typeRecent: "الأخيرة",
typeTop: "الأعلى",
- typePost: "مدونات",
+ typePost: "مدونة",
+ activityUpdateLabel: "تحديث",
typeTribe: "القبائل",
typeLarp: "L.A.R.P.",
typeInhabitants: "السكان",
@@ -1682,7 +1930,7 @@ module.exports = {
courtsNoCases: 'لا توجد قضايا.',
reportsTitle: "التقارير",
reportsDescription: "أدر تقارير شبكتك وتابعها.",
- reportsSearchPlaceholder: "ابحث عن البلاغات...",
+ reportsSearchPlaceholder: "ابحث في التقارير...",
reportsFilterAll: "الكل",
reportsFilterRecent: "حديثة",
reportsFilterTop: "الأعلى",
@@ -1730,7 +1978,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "التقارير قيد المراجعة",
reportsResolvedSectionTitle: "التقارير المحلولة",
reportsInvalidSectionTitle: "التقارير غير الصالحة",
- reportsTemplateSectionTitle: 'قالب التقرير',
reportsBugTemplateTitle: 'تفاصيل إعادة الإنتاج (الأخطاء)',
reportsFeatureTemplateTitle: 'التفاصيل (الميزات)',
reportsAbuseTemplateTitle: 'التفاصيل (الإساءة)',
@@ -1790,8 +2037,6 @@ module.exports = {
tribeGallerySectionTitle: "معرض القبائل",
tribeRecentSectionTitle: "القبائل الأخيرة",
tribeTopSectionTitle: "القبائل الشائعة",
- tribeviewTribeButton: "زيارة القبيلة",
- tribeviewSubTribeButton: "زيارة القبيلة الفرعية",
tribeRootLabel: "الجذر",
tribeDescription: "استكشف أو أنشئ قبائل في شبكتك.",
tribeMainTribeLabel: "القبيلة الرئيسية",
@@ -1800,7 +2045,7 @@ module.exports = {
tribeDeleteButton: "حذف",
tribeImageLabel: "رفع وسائط (الحد الأقصى: 50 ميغابايت)",
tribeTitleLabel: "العنوان",
- searchTribesPlaceholder: "تصفية القبائل حسب الاسم …",
+ searchTribesPlaceholder: "ابحث في القبائل...",
tribeTitlePlaceholder: "اسم القبيلة",
tribeDescriptionLabel: "الوصف",
tribeDescriptionPlaceholder: "صف هذه القبيلة",
@@ -1813,6 +2058,15 @@ module.exports = {
tribeIsAnonymousLabel: "الحالة",
tribeMembersCount: "الأعضاء",
tribeEnterInvite: "إدخال الرمز",
+ subscriptionTitle: "الاشتراكات",
+ subscriptionOn: "مشترك",
+ subscriptionOff: "غير مشترك",
+ subscriptionSubscribe: "اشترك",
+ subscriptionUnsubscribe: "إلغاء الاشتراك",
+ subscriptionSubscribers: "المشتركون",
+ pmListLabel: "إرسال إلى",
+ pmListNone: "— بدون قائمة —",
+ pmListNoSubscribers: "لا مشتركين",
tribeLeaveButton: "مغادرة",
tribePublic: "عامة",
tribePrivate: "خاصة",
@@ -1845,16 +2099,16 @@ module.exports = {
tribeSectionVideos: "الفيديوهات",
tribeSectionDocuments: "المستندات",
tribeSectionBookmarks: "العلامات المرجعية",
- tribeSectionMaps: "MAPS",
- tribeSectionPads: "PADS",
- tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionMaps: "الخرائط",
+ tribeSectionPads: "المستندات التعاونية",
+ tribeSectionChats: "المحادثات",
+ tribeSectionCalendars: "التقاويم",
+ tribePadCreate: "إنشاء مستند تعاوني",
+ tribeChatCreate: "إنشاء محادثة",
+ tribeCalendarCreate: "إنشاء تقويم",
+ tribePadsEmpty: "لا توجد مستندات تعاونية بعد.",
+ tribeChatsEmpty: "لا توجد محادثات بعد.",
+ tribeCalendarsEmpty: "لا توجد تقاويم بعد.",
tribeInhabitantsEmpty: "لا يوجد سكان في هذه القبيلة بعد.",
tribeEventCreate: "إنشاء حدث",
tribeEventsEmpty: "لا توجد أحداث بعد.",
@@ -1909,9 +2163,14 @@ module.exports = {
tribeMediaTypeDocument: "مستند",
tribeMediaTypeBookmark: "علامة مرجعية",
tribeContentDelete: "حذف",
+ tribeReachTribe: "القبيلة",
+ tribeReachNotice: "يعرضه OASIS لجميع السكان ويعرضه CLEARNET أيضًا على الويب المفتوح. فتحه يترك نسخة مقروءة خارج القبيلة: إعادته إلى القبيلة تخفيه، لكن لا يمكن مسح النسخ التي تمت مشاركتها.",
+ tribeReachPrivate: "محتوى القبيلة الخاصة لا يمكن أن يبقى إلا داخل القبيلة.",
+ tribeReachOpenedBy: "فتحه",
+ tribeReachChange: "مكان النشر",
tribeInviteCodeText: "رمز الدعوة: ",
oasisVersionLabel: "إصدار Oasis",
- tribeInviteCodeHint: "شارك هذا الرمز مع من تريد دعوته. يمكنه الانضمام من /invites → Tribes.",
+ tribeInviteCodeHint: "شارك هذا الرمز مع من تريد دعوته. يمكنه الانضمام من /invites.",
tribeStatusOpen: "مفتوح",
tribeStatusClosed: "مغلق",
tribeStatusInProgress: "قيد التنفيذ",
@@ -1951,7 +2210,7 @@ module.exports = {
tribeSearchMinChars: "أدخل حرفين على الأقل للبحث.",
agendaTitle: "الأجندة",
agendaDescription: "هنا يمكنك العثور على جميع العناصر المسندة إليك.",
- agendaSearchPlaceholder: "ابحث في جدول الأعمال...",
+ agendaSearchPlaceholder: "ابحث في الأجندة...",
agendaFilterAll: "الكل",
agendaFilterToday: "اليوم",
agendaFilterUpcoming: "القادمة",
@@ -1972,6 +2231,7 @@ module.exports = {
agendaNoItems: "لم يتم العثور على إسنادات.",
agendaDiscardButton: "تجاهل",
agendaRestoreButton: "استعادة",
+ agendaRemoveButton: "إزالة",
agendaMembersCount: "الأعضاء",
agendaLocationLabel: "الموقع",
agendaYes: "نعم",
@@ -2038,8 +2298,8 @@ module.exports = {
pmComposeTitle: "إرسال رسالة",
pmRecipients: "المستلمون",
pmRecipientsHint: "أدخل معرّفات Oasis مفصولة بفواصل",
- pmLimitsHint: "حتى 7 مستلمين لكل رسالة.",
- pmTextPlaceholder: "النص محدود بـ 7000 حرفًا.",
+ pmLimitsHint: "حتى 7 من السكان لكل رسالة.",
+ pmTextPlaceholder: "اكتب رسالتك.",
pmSubject: "الموضوع",
pmSubjectHint: "أدخل موضوع الرسالة",
pmText: "الرسالة",
@@ -2061,8 +2321,8 @@ module.exports = {
pmCrypterCharsLabel: "حرفًا",
pmInvalidRecipients: "معرّف Oasis غير صالح (يجب أن يكون بالشكل @…=.ed25519).",
pmEncryptionLabel: "التشفير",
- private: "خاص",
- privateDescription: "رسائلك المشفرة.",
+ private: "صندوق الوارد",
+ privateDescription: "أدر رسائلك الخاصة.",
privateInbox: "الوارد",
privateSent: "المُرسَل",
privateDelete: "حذف",
@@ -2118,24 +2378,24 @@ module.exports = {
visitContent: "زيارة المحتوى",
favoriteAdd: "تثبيت في المفضلة",
pmContentTooltip: "إرسال رسالة خاصة",
+ phoneCallTooltip: "إجراء مكالمة هاتفية",
favoriteRemove: "إزالة من المفضلة",
reportContent: "الإبلاغ عن المحتوى",
banking: 'المصرفية',
bankingTitle: 'المصرفية',
- bankingDescription: "اقتصاد ECOin: الرصيد، الدخل الأساسي، الضرائب وقيمة الصناعة.",
+ bankingDescription: "اقتصاد ECOin الجماعي.",
bankOverview: 'نظرة عامة',
bankEpochs: 'الحقب',
bankRules: 'القواعد',
pending: 'معلّق',
closed: 'مغلق',
- bankViewTx: 'عرض المعاملة',
bankClaimNow: 'طالب الآن',
- bankClaimUBI: 'طالب بـ UBI!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: 'طالب بـ UBI',
+ bankClaimAndPay: "المطالبة والدفع",
+ bankClaimedPending: "المطالبة قيد الانتظار...",
+ bankStatusClaimed: "تمت المطالبة",
+ bankStatusExpired: "منتهية الصلاحية",
+ bankPubOnly: "عملية خاصة بـ PUB فقط",
bankEpoch: 'الحقبة',
bankPool: 'المجمع (هذه الحقبة)',
bankWeightsSum: 'مجموع الأوزان',
@@ -2154,8 +2414,8 @@ module.exports = {
bankViewEpoch: 'عرض الحقبة',
bankYourIndustryBalance: "حصتك الصناعية",
bankYourUbiMonth: "دخلك الأساسي (هذا الشهر)",
- bankYourFundsMonth: "أموالك (هذا الشهر)",
- bankIndustryBalance: "الإنتاج الصناعي (تقديري)",
+ bankYourFundsMonth: "إجمالي الأموال",
+ bankIndustryBalance: "الإنتاج الصناعي",
bankUserBalance: 'رصيدك',
bankAddresses: 'العناوين',
bankNoAddresses: 'لم يتم العثور على عناوين.',
@@ -2163,6 +2423,10 @@ module.exports = {
bankAddress: 'العنوان',
bankAddAddressTitle: 'إضافة عنوان ECOIN',
bankAddAddressUser: 'معرّف Oasis',
+ bankAddAddressLabel: "تسمية (اختياري)",
+ bankAddAddressLabelPlaceholder: "محفظة بوب، متجر أليس…",
+ bankAddAddressUserOptional: "معرّف Oasis (اختياري)",
+ bankAddressUnnamed: "عنوان بدون اسم",
bankAddAddressAddress: 'عنوان ECOIN',
bankAddAddressSave: 'حفظ',
bankAddressAdded: 'تمت إضافة العنوان',
@@ -2180,11 +2444,11 @@ module.exports = {
bankAddressDeleteConfirm: 'حذف هذا العنوان؟',
search: 'ابحث!',
bankLocal: 'محلي',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "الشبكة",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "لا توجد أموال!",
bankUbiAvailableOk: "متوفر!",
- bankUbiAvailability: "الدخل الأساسي (الشبكة)",
+ bankUbiAvailability: "الدخل الأساسي",
bankAlreadyClaimedThisMonth: "تم المطالبة بالفعل هذا الشهر",
bankUbiThisMonth: "الدخل الأساسي (هذا الشهر)",
bankUbiLastClaimed: "الدخل الأساسي (آخر مطالبة)",
@@ -2214,6 +2478,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "مشفّر أثناء النقل",
shopAddFavorite: "إضافة مفضلة",
shopRemoveFavorite: "إزالة مفضلة",
shopOpen: "مفتوح",
@@ -2221,6 +2486,13 @@ module.exports = {
shopMakePrivate: "جعلها خاصة (E2E)",
shopMakePublic: "جعلها عامة",
shopProducts: "المنتجات",
+ shopFilterAll: "الكل",
+ shopFilterRecent: "الأحدث",
+ shopFilterMine: "خاصتي",
+ shopFilterTop: "الأفضل",
+ shopFilterProducts: "المنتجات",
+ shopFilterPrices: "الأسعار",
+ shopFilterFavorites: "المفضلة",
shopProductAdd: "إضافة منتج",
shopProductTitle: "منتج",
shopProductUpdate: "تحديث منتج",
@@ -2248,7 +2520,7 @@ module.exports = {
marketVisitItem: "زيارة العنصر",
shopStatus: "الحالة",
shopCreatedAt: "تاريخ الإنشاء",
- shopSearchPlaceholder: "البحث عن متاجر...",
+ shopSearchPlaceholder: "ابحث في متاجر...",
shopUrl: "الرابط",
shopLocation: "الموقع",
shopTags: "الوسوم",
@@ -2258,37 +2530,40 @@ module.exports = {
shopTitlePlaceholder: "اسم متجرك",
shopDescriptionPlaceholder: "وصف تفصيلي لمتجرك",
shopLocationPlaceholder: "المدينة، البلد",
- shopTagsPlaceholder: "وسم1، وسم2، وسم3",
+ shopTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
mapTitlePlaceholder: "عنوان الخريطة",
shopProductFeatured: "منتج مميز",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "إرسال إلى السوق",
typeShop: "متاجر",
typeShopProduct: "منتج متجر",
bankExchange: 'الصرف',
bankExchangeCurrentValue: 'قيمة ECOin (1 ساعة)',
- bankTotalSupply: 'إجمالي معروض ECOin',
- bankEcoinHours: "معادلة ECOin بالوقت",
+ bankTotalSupply: "إجمالي معروض ECOin",
+ bankPubsSupply: "معروض ECOin لرصيد PUBs",
+ bankHoldingSupply: "معروض ECOin خارج UBI",
+ bankEcoinHours: "معادلة ECOin بالوقت (1 ECO)",
bankHoursOfWork: 'ساعات',
bankUnitMs: "مللي ثانية",
bankUnitSeconds: "ثواني",
bankUnitMinutes: "دقائق",
bankUnitDays: "أيام",
bankExchangeNoData: 'لا توجد بيانات متاحة',
- bankInflation: 'تضخم ECOin (anual)',
- bankInflationMonthly: 'تضخم ECOin (mensual)',
+ bankInflation: "تضخم ECOin (سنوي)",
+ bankInflationMonthly: "تضخم ECOin (شهري)",
bankExchangeChartTitle: 'تطور قيمة ECOin عبر الزمن',
bankExchangeChartValue: 'القيمة (ECO/ساعة)',
bankExchangeChartSupply: 'العرض',
bankExchangeChartInflation: 'التضخم %',
bankExchangeChartEmpty: 'لا توجد عينات كافية بعد — ارجع لاحقًا',
- bankCurrentSupply: 'المعروض الحالي من ECOin',
+ bankCurrentSupply: "معروض ECOin الحالي",
bankingSyncStatus: 'حالة ECOin',
bankingSyncStatusSynced: 'متزامن',
- bankingSyncStatusOutdated: 'قديم',
+ bankingSyncStatusOutdated: "غير متزامن",
statsTitle: 'الإحصائيات',
statistics: "الإحصائيات",
statsDescription: "اكتشف إحصائيات عن شبكتك.",
ALLButton: "الكل",
+ RECENTButton: "الأخيرة",
MINEButton: "خاصتي",
TOMBSTONEButton: "شواهد القبور",
statsCreatedAt: "أُنشئ في",
@@ -2296,7 +2571,8 @@ module.exports = {
statsYourOpinions: "الآراء",
statsNetworkContent: "المحتوى",
statsNetworkOpinions: "الآراء",
- statsEcoWalletLabel: "محفظة ECOIN",
+ statsEcoWalletLabel: "محفظة ECOin",
+ walletAddressCopyHint: "انقر للتحديد ثم انسخ",
statsEcoWalletNotConfigured: "غير مُعدّة!",
statsBookmark: "العلامات المرجعية",
statsEvent: "الأحداث",
@@ -2318,6 +2594,8 @@ module.exports = {
statsTransfer: "التحويلات",
statsAiExchange: "الذكاء الاصطناعي",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "الأقران",
+ statsTotalLabel: "الإجمالي",
statsPost: "المنشورات",
statsSize: "الإجمالي (الحجم)",
statsBlockchainSize: "البلوكتشين (الحجم)",
@@ -2369,8 +2647,14 @@ module.exports = {
aiPrompt: "قدّم ردًا إعلاميًا ودقيقًا.",
aiConfiguration: "تعيين التوجيه",
aiPromptUsed: "التوجيه",
- aiClearHistory: "مسح سجل المحادثة",
- aiServerError: "لم يتمكن الذكاء الاصطناعي من الرد. يرجى المحاولة مرة أخرى.",
+ aiClearHistory: "مسح السجل",
+ aiServerError: "لا أستطيع الإجابة بشكل صحيح. حاول مرة أخرى.",
+ aiStatusLoading: "يقوم 42 بتحميل النموذج. اسأل مرة أخرى بعد لحظة.",
+ aiThinking: "يفكر",
+ aiWaiting: "في الانتظار",
+ aiStatusMissingModel: "نموذج الذكاء الاصطناعي غير مثبت: الملف src/AI/oasis-42-1-chat.Q4_K_M.gguf مفقود.",
+ aiExportFineTuning: "تصدير Fine-Tuning",
+ aiFactsTitle: "بيانات من شبكتك",
aiInputPlaceholder: "ما هو Oasis؟",
typeAiExchange: "الذكاء الاصطناعي",
aiApproveTrain: "إضافة للتدريب الجماعي",
@@ -2399,7 +2683,7 @@ module.exports = {
marketFilterDiscarded: "ملغى",
marketFilterRecent: "الأخيرة",
marketFilterMyBids: "العروض",
- marketCreateButton: "إنشاء عنصر",
+ marketCreateButton: "بِع شيئًا",
marketItemType: "النوع",
marketItemTitle: "العنوان",
marketItemAvailable: "الموعد النهائي",
@@ -2427,7 +2711,7 @@ module.exports = {
marketNoItems: "لا توجد عناصر متاحة بعد.",
marketYourBid: "عرضك",
marketCreateFormImageLabel: "رفع وسائط (الحد الأقصى: 50 ميغابايت)",
- marketSearchPlaceholder: "ابحث عن عنوان أو وسوم",
+ marketSearchPlaceholder: "ابحث في السوق...",
marketMinPriceLabel: "الحد الأدنى للسعر",
marketMaxPriceLabel: "الحد الأقصى للسعر",
marketSortRecent: "الأحدث",
@@ -2493,8 +2777,7 @@ module.exports = {
housingSetClosed: "اجعله غير متاح",
housingCreateButton: "إنشاء مكان",
housingUpdateButton: "تحديث",
- housingDeleteButton: "حذف",
- housingSearchPlaceholder: "ابحث عن أماكن...",
+ housingSearchPlaceholder: "ابحث في السكن...",
housingSearchButton: "بحث",
housingMinPrice: "أقل سعر",
housingMaxPrice: "أعلى سعر",
@@ -2572,12 +2855,11 @@ module.exports = {
jobsExchangeSkill: "المهارة المطلوبة في المقابل",
jobTimePartial: "دوام جزئي",
jobTimeComplete: "دوام كامل",
- jobsDeleteButton: "حذف",
jobsUpdateButton: "تحديث",
jobsFilterApplied: "مُتقدَّم",
jobsAppliedTitle: "طلباتي",
jobsAppliedBadge: "مُتقدَّم",
- jobsSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف...",
+ jobsSearchPlaceholder: "ابحث في الوظائف...",
jobsMinSalaryLabel: "الحد الأدنى للراتب",
jobsMaxSalaryLabel: "الحد الأقصى للراتب",
jobsSortRecent: "الأحدث",
@@ -2589,7 +2871,7 @@ module.exports = {
jobSetOpen: "تعيين كمفتوح",
jobsTagsLabel: "الوسوم",
noJobsMatch: "لا توجد وظائف تطابق بحثك.",
- industrySearchPlaceholder: "ابحث عن المصانع…",
+ industrySearchPlaceholder: "ابحث في الصناعة...",
industryAllSectors: "جميع القطاعات",
industryVisitButton: "زيارة الصناعة",
industryAdvanceTo: "تعيين إلى",
@@ -2663,7 +2945,6 @@ module.exports = {
industryBuildStatus_FAILED: "فاشل",
pmBotIndustry: "IndustryBot",
pmBotHousing: "HousingBot",
- pmBotJobs: "JobsBot",
jobsBotMatchTitle: "وظيفة تطابق سيرتك الذاتية",
jobsBotMatchIntro: "وظيفة تطابق سيرتك الذاتية.",
jobsBotMatchJob: "الوظيفة",
@@ -2690,7 +2971,7 @@ module.exports = {
industryRulesIntro: "تتيح Industry للسكان امتلاك وسائل الإنتاج جماعيًا: المصنع ورشة مملوكة للشبكة لا يملكها أحد بشكل خاص.",
industryRulesSteward: "المؤسس هو القيّم — راعٍ لا مالك: لا يمكنه بيع المصنع أو خصخصته أو حله بمفرده.",
industryRulesMembership: "تحدد سياسة العضوية كيفية الانضمام: مفتوح (فورًا)، بالتصويت (بقبول أصوات الأعضاء) أو بالدعوة فقط (يجب أن يدعوك عضو أولاً).",
- industryRulesQuorum: "النصاب هو الحد الأدنى من الأعضاء الذين يجب أن يصوّتوا لتُحتسب القرار، حتى لا يقرر شخص واحد في مصنع صغير.",
+ industryRulesQuorum: "النصاب هو الحد الأدنى من الأعضاء الذين يجب أن يصوّتوا لتُحتسب القرار، حتى لا يقرر ساكن واحد في مصنع صغير.",
industryRulesMajority: "الأغلبية هي نسبة الأصوات اللازمة (0.5 = نصف، 1 = إجماع)؛ يمر القرار عندما تبلغ أصوات نعم على الأقل max(النصاب، الأعضاء × الأغلبية).",
industryRulesDecisions: "يصوّت الأعضاء لقبول الجدد والموافقة على عمليات البناء وحل المصنع؛ لا يمكن للقيّم تجاوز هذه القرارات الجماعية.",
industryRulesBlueprints: "المخططات وصفات حرة (COPYLEFT) — المدخلات (مواد، ساعات عمل، مهارات) والمخرجات (سلعة مادية أو رقمية) — ويمكن لأي شخص نسخها.",
@@ -2716,6 +2997,7 @@ module.exports = {
modulesIndustryLabel: "الصناعة",
modulesIndustryDescription: "وحدة لإدارة وسائل الإنتاج بشكل جماعي.",
industryFilterAll: "الكل",
+ industryFilterRecent: "الأخيرة",
industryFilterMember: "عضو",
industryFilterBlueprints: "مخططات",
industryFilterBuilds: "إنتاجات",
@@ -2724,6 +3006,7 @@ module.exports = {
industryFilterPaused: "موقوفة",
industryFilterDissolved: "منحلة",
industryAllTitle: "الصناعة",
+ industryRecentTitle: "المصانع الأخيرة",
industryMemberTitle: "المصانع التي أنتمي إليها",
industryMineTitle: "مصانعي",
industryActiveTitle: "يعمل",
@@ -2771,7 +3054,7 @@ module.exports = {
industryPolicy_invite: "بالدعوة فقط",
projectsTitle: "المشاريع",
projectsDescription: "أنشئ ومُوّل وتابع مشاريع يقودها المجتمع في شبكتك.",
- projectSearchPlaceholder: "ابحث عن المشاريع...",
+ projectSearchPlaceholder: "ابحث في المشاريع...",
projectCreateProject: "إنشاء مشروع",
projectCreateButton: "إنشاء مشروع",
projectUpdateButton: "تحديث",
@@ -2866,15 +3149,13 @@ module.exports = {
modulesModuleName: "الاسم",
modulesModuleDescription: "الوصف",
modulesModuleStatus: "الحالة",
- modulesTotalModulesLabel: "الوحدات المُحمَّلة",
+ modulesTotalModulesLabel: "الإجمالي",
modulesEnabledModulesLabel: "مُفعَّلة",
modulesDisabledModulesLabel: "مُعطَّلة",
modulesInvitesLabel: "الدعوات",
modulesInvitesDescription: "وحدة لإدارة وتطبيق رموز الدعوة.",
modulesWalletLabel: "المحفظة",
modulesWalletDescription: "وحدة لإدارة أصولك الرقمية (ECOin).",
- modulesLegacyLabel: "القديم",
- modulesLegacyDescription: "وحدة لإدارة مفتاحك السري (المفتاح الخاص) بسرعة وأمان.",
modulesCipherLabel: "التشفير",
modulesCipherDescription: "وحدة لتشفير وفك تشفير نصك بشكل متماثل (باستخدام كلمة مرور مشتركة).",
modulesBookmarksLabel: "العلامات المرجعية",
@@ -2936,20 +3217,23 @@ module.exports = {
modulesProjectsLabel: "المشاريع",
modulesProjectsDescription: "وحدة لاستكشاف وتمويل جماعي وإدارة المشاريع.",
modulesBankingLabel: "المصرفية",
- modulesBankingDescription: "وحدة لتحديد القيمة الحقيقية لـ ECOIN وتوزيع الدخل الأساسي الشامل باستخدام الخزينة المشتركة.",
+ modulesBankingDescription: "وحدة لإدارة الخزينة المشتركة: قيمة ECOIN والضرائب والدخل الأساسي الشامل.",
modulesFavoritesLabel: "المفضلة",
modulesFavoritesDescription: "وحدة لإدارة المحتوى المفضل لديك.",
fileTooLargeTitle: "الملف كبير جدًا",
fileTooLargeMessage: "يتجاوز الملف الحجم الأقصى المسموح به (50 ميغابايت). يرجى اختيار ملف أصغر.",
goBack: "رجوع",
+ errorDismiss: "حسنًا",
errorPageTitle: "حدث خطأ",
+ errorNoAllocation: "لم يتم العثور على مخصصات لهذه المطالبة.",
+ errorInvalidClaim: "لا يمكن المطالبة بهذه المخصصات.",
visibilityLabel: "الرؤية",
+ clearnetPrivateConflict: "لا يمكن نشر محتوى خاص أو مخفي أو مغلق أو بدعوة فقط أو مدفوع على CLEARNET. اختر OASIS أو اجعله عامًا.",
visibilityPublic: "عام",
visibilityHidden: "مخفي",
visibilityMakePublic: "جعله عامًا",
visibilityMakeHidden: "إخفاؤه",
invitesInhabitantsTitle: "السكان",
- invitesInhabitantsFollow: "متابعة",
aiNavPlaceholder: "صف ما تحتاجه...",
aiNavDisabled: "تعطيل التنقل بالذكاء الاصطناعي.",
aiNavResultsTitle: "اقتراحات AINav",
@@ -2960,7 +3244,7 @@ module.exports = {
modulesAINavDescription: "وحدة لإجراء استعلامات بلغة طبيعية حول محتوى الشبكة.",
directConnectDescription: "اتصل مباشرة بقرين عن طريق إدخال عنوان IP والمنفذ والمفتاح العام. سيتم إضافة القرين كاتصال مُتابَع.",
peerHost: "IP",
- peerPort: "المنفذ (افتراضي: 8008)",
+ peerPort: "المنفذ",
peerPublicKey: "المفتاح العام (@...ed25519)",
connectAndFollow: "اتصال",
modulesPresetTitle: "الإعدادات الشائعة",
@@ -2969,11 +3253,11 @@ module.exports = {
workflowsSet: "تطبيق مسار العمل",
workflow_default: "الافتراضي",
workflow_jobs: "العمل",
- workflow_ruling: "الحُكم",
- workflow_politics: "السياسة",
workflow_social: "اجتماعي",
workflow_business: "الأعمال",
workflow_night: "ليل",
+ workflow_kids: "الأطفال",
+ workflow_activists: "الناشطون",
workflow_mobile: "الهاتف",
statsCarbonFootprintTitle: "البصمة الكربونية",
statsCarbonTombstone: "بصمة الحذف",
@@ -2985,7 +3269,7 @@ module.exports = {
noComments: "لا توجد تعليقات بعد",
mapsLabel: "خرائط",
mapTitle: "خرائط",
- mapDescription: "استكشف وأدر الخرائط غير المتصلة في شبكتك.",
+ mapDescription: "أدر الخرائط غير المتصلة وشاركها في شبكتك.",
mapMineSectionTitle: "خرائطك",
mapCreateSectionTitle: "إنشاء خريطة",
mapUpdateSectionTitle: "تحديث الخريطة",
@@ -3025,9 +3309,22 @@ module.exports = {
markerImageLabel: "صورة العلامة",
mapAddMarkerTitle: "إضافة علامة",
mapAddMarkerButton: "إضافة علامة",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "مسح العلامة",
mapApplyZoom: "تطبيق التكبير",
- mapSearchPlaceholder: "البحث في الوصف، الوسوم، المؤلف...",
+ mapPlaceSearchPlaceholder: "ابحث عن مكان أو بلد...",
+ mapNoPlaces: "لم يتم العثور على أماكن.",
+ mapClusterTitle: "علامات هنا، انقر للتكبير",
+ mapDeleteMarker: "حذف العلامة",
+ mapZoomIn: "تكبير",
+ mapZoomOut: "تصغير",
+ mapFitMarkers: "ملاءمة كل العلامات",
+ mapPanLabel: "تحريك الخريطة",
+ mapCenterHere: "توسيط هنا",
+ mapNear: "بالقرب من",
+ mapPickedSpot: "النقطة المختارة",
+ mapPickHint: "انقر على الخريطة لاختيار نقطة.",
+ mapClearPick: "مسح",
+ mapSearchPlaceholder: "ابحث في خرائط...",
mapSearchButton: "بحث",
mapUpdatedAt: "محدّث",
mapNoMatch: "لا توجد خرائط مطابقة لبحثك.",
@@ -3038,54 +3335,625 @@ module.exports = {
typeMapMarker: "علامة خريطة",
modulesMapLabel: "خرائط",
modulesMapDescription: "وحدة لإدارة ومشاركة الخرائط غير المتصلة.",
- padsTitle: "الوسادات",
- padTitle: "وسادة",
- modulesPadsLabel: "الوسادات",
+ emergenciesTitle: "الطوارئ",
+ modulesEmergenciesLabel: "الطوارئ",
+ modulesEmergenciesDescription: "وحدة لإطلاق حالات الطوارئ وتأكيدها ومتابعتها في الشبكة.",
+ emergenciesDescription: "وحدة لإطلاق حالات الطوارئ وتأكيدها ومتابعتها في الشبكة.",
+ emergencyCreate: "إنشاء حالة طوارئ",
+ emergencyUpdate: "تحديث",
+ emergencyDelete: "حذف",
+ emergencyTitleLabel: "العنوان",
+ emergencyTitlePlaceholder: "ماذا يحدث؟",
+ emergencyTextLabel: "التفاصيل",
+ emergencyTextPlaceholder: "أين، منذ متى، ماذا نفعل...",
+ emergencyCategoryLabel: "الفئة",
+ emergencyCategoryWeather: "الطقس",
+ emergencyCategoryInfrastructure: "البنية التحتية",
+ emergencyCategoryHealth: "الصحة",
+ emergencyCategorySecurity: "الأمن",
+ emergencyCategoryLost: "المفقودات",
+ emergencyCategoryNeighborhood: "الحي",
+ emergencyExpiresLabel: "ينتهي خلال",
+ emergencyExpires1d: "يوم واحد",
+ emergencyExpires3d: "3 أيام",
+ emergencyExpires7d: "أسبوع واحد",
+ emergencyExpires30d: "شهر واحد",
+ emergencyExpiresNone: "غير محدد",
+ emergencyExpiresKeep: "الاحتفاظ بالتاريخ الحالي",
+ emergencyTagsLabel: "الوسوم",
+ emergencyTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ emergencyFilterAll: "الكل",
+ emergencyFilterMine: "تنبيهاتي",
+ emergencyFilterRecent: "الأحدث",
+ emergencySeverityUnverified: "غير مؤكد",
+ emergencySeverityLow: "منخفضة",
+ emergencySeverityMedium: "متوسطة",
+ emergencySeverityHigh: "عالية",
+ emergencyStatusActive: "نشط",
+ emergencyStatusResolved: "تم الحل",
+ emergencyStatusExpired: "منتهٍ",
+ emergencyConfirmations: "التأكيدات",
+ emergencyConfirmButton: "تأكيد",
+ emergencyConfirmed: "لقد أكدت حالة الطوارئ هذه",
+ emergencyResolveButton: "حل",
+ emergencyReopenButton: "إعادة فتح",
+ emergencyGenerateReport: "إنشاء التقرير",
+ emergencyUpdateEdited: "مُعدَّل",
+ emergencyLastUpdate: "آخر تحديث",
+ emergencyUpdatesTitle: "آخر التحديثات:",
+ emergencyNoUpdates: "لا تحديثات بعد.",
+ emergencyAddUpdate: "نشر تحديث",
+ emergencyUpdatePlaceholder: "ما الذي تغيّر؟",
+ emergencyNoItems: "لم يتم العثور على حالات طوارئ.",
+ emergencyExpiresAt: "ينتهي",
+ emergencyBannerLabel: "حالة طوارئ نشطة",
+ emergencyCreateSectionTitle: "إنشاء حالة طوارئ",
+ emergencyUpdateSectionTitle: "تحديث حالة الطوارئ",
+ emergencySearchPlaceholder: "البحث في الطوارئ...",
+ typeEmergency: "الطوارئ",
+ typeEmergencyConfirm: "تأكيد حالة طوارئ",
+ typeEmergencyUpdate: "تحديث حالة طوارئ",
+ statsEmergency: "الطوارئ",
+ statsEmergencyConfirm: "تأكيدات الطوارئ",
+ statsEmergencyUpdate: "تحديثات الطوارئ",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "حالة طوارئ تتابعها لديها تحديث.",
+ emergencyBotResolvedTitle: "تم حل حالة طوارئ تتابعها.",
+ dataKindEmergencies: "الطوارئ",
+ mailingTitle: "القوائم البريدية",
+ modulesMailingLabel: "القوائم البريدية",
+ modulesMailingDescription: "اكتشف وأدر القوائم البريدية في شبكتك.",
+ modulesPhoneLabel: "الهاتف",
+ modulesPhoneDescription: "وحدة للاتصال بالسكان الآخرين عبر مكالمات فيديو مشفّرة من طرف إلى طرف.",
+ mailingDescription: "اكتشف وأدر القوائم البريدية في شبكتك.",
+ mailingCreate: "إنشاء قائمة بريدية",
+ mailingUpdate: "تحديث",
+ mailingArchive: "أرشفة",
+ mailingActivate: "تفعيل",
+ mailingCreateSectionTitle: "إنشاء قائمة بريدية",
+ mailingUpdateSectionTitle: "تحديث القائمة البريدية",
+ mailingTitleLabel: "العنوان",
+ mailingTitlePlaceholder: "اسم القائمة البريدية",
+ mailingDescriptionLabel: "الوصف",
+ mailingDescriptionPlaceholder: "ما موضوع هذه القائمة؟",
+ mailingTypeLabel: "نوع القائمة البريدية",
+ mailingTypeOpen: "مفتوحة",
+ mailingTypeClosed: "مغلقة",
+ mailingStatusLabel: "الحالة",
+ mailingStatusActive: "نشطة",
+ mailingStatusArchived: "مؤرشفة",
+ mailingMembersLabel: "دعوة السكان",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "المشتركون",
+ mailingTagsLabel: "الوسوم",
+ mailingTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ mailingFilterAll: "الكل",
+ mailingFilterMine: "قوائمي",
+ mailingFilterSubscribed: "مشترك بها",
+ mailingFilterRecent: "الأحدث",
+ mailingHistoryDate: "التاريخ",
+ mailingHistoryThreads: "المواضيع",
+ mailingHistoryInhabitants: "السكان",
+ mailingHistorySearchPlaceholder: "البحث في السجل...",
+ mailingNoMessages: "لا توجد رسائل بعد.",
+ mailingNoItems: "لم يتم العثور على قوائم بريدية.",
+ mailingSearchPlaceholder: "البحث في القوائم البريدية...",
+ mailingWriteButton: "كتابة رسالة",
+ mailingWriteTitle: "الكتابة إلى القائمة",
+ mailingReplyTitle: "الرد على القائمة",
+ mailingSend: "إرسال",
+ mailingTextPlaceholder: "تصل رسالتك إلى جميع المشاركين في القائمة.",
+ mailingParticipants: "المشاركون",
+ inboxFilterMailing: "القوائم البريدية",
+ mailingReplyPlaceholder: "الرد على القائمة...",
+ mailingReplyToList: "الرد على القائمة",
+ typeMailingList: "قائمة بريدية",
+ statsMailingList: "القوائم البريدية",
+ mailingListLabel: "قائمة بريدية",
+ logisticsTitle: "اللوجستيات",
+ modulesLogisticsLabel: "اللوجستيات",
+ modulesLogisticsDescription: "اكتشف وأدر الخطط اللوجستية في شبكتك.",
+ logisticsDescription: "اكتشف وأدر الخطط اللوجستية في شبكتك.",
+ logisticsCreate: "إنشاء مسار",
+ logisticsUpdate: "تحديث",
+ logisticsClose: "إغلاق",
+ logisticsReopen: "إعادة فتح",
+ logisticsCreateSectionTitle: "إنشاء مسار",
+ logisticsUpdateSectionTitle: "تحديث المسار",
+ logisticsTitleLabel: "العنوان",
+ logisticsTitlePlaceholder: "رحلة إلى السوق، شاحنة متاحة...",
+ logisticsKindLabel: "نوع اللوجستيات",
+ logisticsKindTrip: "رحلة",
+ logisticsKindShipment: "شحنة",
+ logisticsKindTrips: "الرحلات",
+ logisticsKindShipments: "الشحنات",
+ logisticsModeLabel: "الوضع",
+ logisticsModeOffer: "أعرض",
+ logisticsModeRequest: "أبحث",
+ logisticsModeOffers: "العروض",
+ logisticsModeRequests: "الطلبات",
+ logisticsDescriptionLabel: "الوصف",
+ logisticsDescriptionPlaceholder: "نقطة اللقاء، ما تحمله، الشروط...",
+ logisticsOriginLabel: "نقطة الانطلاق",
+ logisticsOriginPlaceholder: "من أين يبدأ",
+ logisticsDestinationLabel: "الوجهة",
+ logisticsDestinationPlaceholder: "أين ينتهي",
+ logisticsDateLabel: "التاريخ والوقت",
+ logisticsRecurrenceLabel: "التكرار",
+ logisticsFrequencyLabel: "التكرار",
+ logisticsRecurrenceNone: "مرة واحدة",
+ logisticsRecurrenceDaily: "يومي",
+ logisticsRecurrenceWeekly: "أسبوعي",
+ logisticsRecurrenceMonthly: "شهري",
+ logisticsSeatsLabel: "المقاعد",
+ logisticsSizeLabel: "الحجم",
+ logisticsSizePlaceholder: "مثلاً 2m x 1m",
+ logisticsWeightLabel: "الوزن",
+ logisticsWeightPlaceholder: "مثلاً 40kg",
+ logisticsPriceFree: "مجاني",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "وقت",
+ logisticsPriceLabel: "السعر",
+ logisticsHours: "س",
+ logisticsOrderRefLabel: "رابط الطلب",
+ logisticsOrderRefPlaceholder: "/shops/... أو /market/... للطلب المراد تسليمه",
+ logisticsOrderLink: "الطلب المرتبط",
+ logisticsTagsLabel: "الوسوم",
+ logisticsTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ logisticsFilterAll: "الكل",
+ logisticsFilterMine: "مساراتي",
+ logisticsFilterBooked: "المحجوزة",
+ logisticsFilterRecent: "الأحدث",
+ logisticsFilterHistory: "السجل",
+ logisticsFilterTop: "الأفضل",
+ logisticsStatusOpen: "مفتوح",
+ logisticsStatusUpcoming: "القادمة",
+ logisticsStatusPast: "السابقة",
+ logisticsStatusClosed: "المغلقة",
+ logisticsZoneLabel: "المنطقة",
+ logisticsSearchPlaceholder: "البحث في اللوجستيات...",
+ logisticsNoItems: "لم يتم العثور على مسارات.",
+ logisticsBookingPending: "قيد الانتظار",
+ logisticsBookingConfirmed: "مؤكد",
+ logisticsBookingRejected: "مرفوض",
+ logisticsBookingCancelled: "ملغى",
+ logisticsBookingDelivered: "تم التسليم",
+ logisticsConfirm: "تأكيد",
+ logisticsReject: "رفض",
+ logisticsDeliver: "تسليم",
+ logisticsReceiptLabel: "إيصال",
+ logisticsReceiptPlaceholder: "ملاحظة التسليم (اختياري)",
+ logisticsCancelBooking: "إلغاء الحجز",
+ logisticsBookTitle: "احجز هذا المسار",
+ logisticsNotesLabel: "ملاحظات",
+ logisticsNotesPlaceholder: "ما يجب أن يعرفه المسؤول",
+ logisticsBook: "حجز",
+ logisticsBookingsTitle: "الحجوزات",
+ logisticsMyBookingTitle: "حجزك",
+ logisticsRatingsTitle: "التقييمات",
+ logisticsNoRatings: "لا توجد تقييمات بعد.",
+ logisticsRatingsWhenClosed: "تُفتح التقييمات بعد إغلاق المسار.",
+ logisticsScoreLabel: "الدرجة",
+ logisticsRatingPlaceholder: "كيف سارت الأمور؟",
+ logisticsRate: "تقييم",
+ typeLogisticsRoute: "مسار",
+ typeLogisticsRating: "تقييم مسار",
+ statsLogisticsRoute: "المسارات",
+ statsLogisticsRating: "تقييمات المسارات",
+ logisticsRouteLabel: "مسار",
+ podcastsTitle: "البودكاست",
+ modulesPodcastsLabel: "البودكاست",
+ modulesPodcastsDescription: "وحدة لنشر قنوات البودكاست.",
+ podcastsDescription: "وحدة لنشر قنوات البودكاست.",
+ podcastCreate: "إنشاء بودكاست",
+ podcastUpdate: "تحديث",
+ podcastDelete: "حذف",
+ podcastCreateSectionTitle: "إنشاء بودكاست",
+ podcastUpdateSectionTitle: "تحديث البودكاست",
+ podcastTitleLabel: "العنوان",
+ podcastTitlePlaceholder: "اسم القناة",
+ podcastDescriptionLabel: "الوصف",
+ podcastDescriptionPlaceholder: "ما موضوع هذا البودكاست؟",
+ podcastCategoryLabel: "الفئة",
+ podcastCategoryNews: "أخبار",
+ podcastCategoryMusic: "موسيقى",
+ podcastCategoryTalk: "حوار",
+ podcastCategoryEducation: "تعليم",
+ podcastCategoryTech: "تقنية",
+ podcastCategoryCulture: "ثقافة",
+ podcastCategoryCommunity: "مجتمع",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "أخرى",
+ podcastTagsLabel: "الوسوم",
+ podcastCoverLabel: "الغلاف (صورة أو فيديو)",
+ podcastEpisodeAudioLabel: "ملف صوتي أو فيديو (الحد الأقصى: 75MB)",
+ podcastTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ podcastFilterAll: "الكل",
+ podcastFilterMine: "قنواتي",
+ podcastFilterRecent: "الأحدث",
+ podcastFilterTop: "الأفضل",
+ podcastFilterViewers: "المستمعون",
+ podcastSearchPlaceholder: "البحث في البودكاست...",
+ podcastNoItems: "لم يتم العثور على بودكاست.",
+ podcastEpisodesLabel: "الحلقات",
+ podcastPlaysLabel: "المشاهدات",
+ podcastLastEpisode: "آخر حلقة",
+ podcastEpisodesTitle: "الحلقات",
+ podcastNoEpisodes: "لا توجد حلقات بعد.",
+ podcastEpisodeAdd: "إضافة حلقة",
+ podcastEpisodeCreateTitle: "نشر حلقة",
+ podcastEpisodeUpdateTitle: "تحديث الحلقة",
+ podcastEpisodeTitleLabel: "عنوان الحلقة",
+ podcastEpisodeTitlePlaceholder: "عنوان الحلقة",
+ podcastEpisodeDescriptionLabel: "ملاحظات",
+ podcastEpisodeDescriptionPlaceholder: "ما يحدث في هذه الحلقة، روابط، شكر...",
+ podcastEpisodePublish: "نشر",
+ podcastPlayed: "تم الاستماع",
+ podcastMarkPlayed: "وضع علامة كمستمَع",
+ typePodcast: "بودكاست",
+ typePodcastEpisode: "حلقة",
+ typePodcastOpinion: "رأي في الحلقة",
+ typePodcastPlay: "تشغيل الحلقة",
+ statsPodcast: "البودكاست",
+ statsPodcastEpisode: "الحلقات",
+ statsPodcastPlay: "مرات تشغيل الحلقات",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "مدونة تتابعها فيها مقال جديد.",
+ podcastBotEpisodeTitle: "بودكاست تتابعه لديه حلقة جديدة.",
+ podcastLabel: "بودكاست",
+ podcastEpisodeLabel: "حلقة",
+ campaignsTitle: "الحملات",
+ modulesCampaignsLabel: "الحملات",
+ modulesCampaignsDescription: "اكتشف وأدر الحملات في شبكتك.",
+ campaignsDescription: "اكتشف وأدر الحملات في شبكتك.",
+ campaignCreate: "إنشاء حملة",
+ campaignUpdate: "تحديث",
+ campaignDelete: "حذف",
+ campaignClose: "إغلاق",
+ campaignReopen: "إعادة فتح",
+ campaignCreateSectionTitle: "إنشاء حملة",
+ campaignUpdateSectionTitle: "تحديث الحملة",
+ campaignTitleLabel: "العنوان",
+ campaignTitlePlaceholder: "ماذا تريد أن تحقق؟",
+ campaignTextLabel: "النص",
+ campaignTextPlaceholder: "اشرح القضية، من يقرر وماذا تطلب...",
+ campaignCategoryLabel: "الفئة",
+ campaignCategoryEnvironment: "البيئة",
+ campaignCategoryRights: "الحقوق",
+ campaignCategoryHealth: "الصحة",
+ campaignCategoryEducation: "التعليم",
+ campaignCategoryInfrastructure: "البنية التحتية",
+ campaignCategoryCulture: "الثقافة",
+ campaignCategoryEconomy: "الاقتصاد",
+ campaignCategoryOther: "أخرى",
+ campaignGoalLabel: "هدف التوقيعات",
+ campaignDeadlineLabel: "الموعد النهائي",
+ campaignTagsLabel: "الوسوم",
+ campaignTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ campaignFilterAll: "الكل",
+ campaignFilterMine: "حملاتي",
+ campaignFilterSigned: "الموقّعة",
+ campaignFilterRecent: "الأحدث",
+ campaignFilterTop: "الأفضل",
+ campaignStatusOpen: "مفتوحة",
+ campaignStatusAchieved: "محققة",
+ campaignStatusUnachieved: "غير محقَّقة",
+ campaignStatusClosed: "مغلقة",
+ campaignSearchPlaceholder: "البحث في الحملات...",
+ campaignNoItems: "لم يتم العثور على حملات.",
+ campaignSignaturesLabel: "التوقيعات",
+ campaignSignaturesTitle: "الداعمون",
+ campaignNoSignatures: "لا توجد توقيعات بعد.",
+ campaignSignTitle: "وقّع هذه الحملة",
+ campaignSignPlaceholder: "لماذا تدعمها؟ (اختياري)",
+ campaignSign: "توقيع",
+ campaignSigned: "لقد وقّعت بالفعل!",
+ campaignNotSigned: "ما زال توقيعك ناقصًا",
+ campaignElevate: "رفعها إلى البرلمان",
+ campaignElevated: "رُفعت إلى البرلمان",
+ campaignUpdatesTitle: "التحديثات",
+ campaignNoUpdates: "لا توجد تحديثات بعد.",
+ campaignUpdatePlaceholder: "ماذا حدث؟",
+ campaignAddUpdate: "نشر تحديث",
+ campaignQrAlt: "رمز QR لتوقيع هذه الحملة",
+ campaignQrCaption: "امسح للتوقيع",
+ typeCampaign: "حملة",
+ typeCampaignSignature: "توقيع",
+ typeCampaignUpdate: "تحديث حملة",
+ statsCampaign: "الحملات",
+ statsCampaignSignature: "توقيعات الحملات",
+ statsCampaignUpdate: "تحديثات الحملات",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "حملة تتابعها لديها تحديث.",
+ campaignBotAchievedTitle: "حملة تتابعها حققت هدفها.",
+ campaignBotRaisedTitle: "حملة وقّعت عليها رُفعت إلى البرلمان.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "تغيّر مسار حجزته.",
+ logisticsBotClosedTitle: "أُغلق مسار حجزته.",
+ logisticsBotBookedTitle: "حجز شخص ما مسارك.",
+ logisticsBotCancelledTitle: "أُلغي حجز على مسارك.",
+ logisticsBotConfirmedTitle: "تأكد حجزك: الطرد في الطريق.",
+ logisticsBotRejectedTitle: "رُفض حجزك.",
+ logisticsBotDeliveredTitle: "وصل طردك.",
+ campaignLabel: "حملة",
+ campaignGenerateReport: "إنشاء التقرير",
+ logisticsGenerateReport: "إنشاء التقرير",
+ mailingGenerateReport: "إنشاء التقرير",
+ campaignUpdateEdited: "مُعدَّل",
+ mailingMessagesLabel: "الرسائل",
+ logisticsBookingsLabel: "الحجوزات",
+ backupTitle: "النسخ الاحتياطي",
+ modulesBackupLabel: "النسخ الاحتياطي",
+ modulesBackupDescription: "وحدة لتصدير مفاتيحك واستيرادها وإنشاء نسخ احتياطية مشفّرة.",
+ backupDescription: "وحدة لتصدير مفاتيحك واستيرادها وإنشاء نسخ احتياطية مشفّرة.",
+ backupTypeRecovery: "الاستعادة",
+ backupTypeKeys: "تصدير المفاتيح",
+ backupTypeFull: "نسخة كاملة",
+ backupTypeRestore: "استعادة النسخة",
+ backupTypeInstant: "فورية",
+ backupInstantDescription: "ملف .zip عادي يضم سجلك وملفاتك كاملة، بلا مفتاحك السري وبلا كلمة سر. سريع، لكن ",
+ backupInstantRisk: "من يحصل على الملف يقرأ كل ما فيه.",
+ backupKitPageDescription: "لا يمكن فتح حزمة الاستعادة إلا من هذا الجهاز.",
+ backupKitId: "معرّف Oasis",
+ backupKitDate: "تاريخ الإنشاء",
+ backupKitQrAlt: "رمز QR لمفتاحك السري",
+ backupKitStep1: "اطبعه أو انسخه يدوياً واحتفظ به في مكان آمن ودون اتصال.",
+ backupKitStep2: "للاستعادة، ثبّت Oasis على جهاز جديد واستورد هذا السر من النسخ الاحتياطي › المفاتيح.",
+ backupKitStep3: "أتلف هذه الصفحة إذا تعرّضت للكشف.",
+ backupKitPdfButton: "إنشاء PDF",
+ backupScopeLabel: "النطاق",
+ backupScopeAll: "كل شيء",
+ backupScopeMine: "محتواي فقط",
+ backupSinceLabel: "منذ",
+ backupEstimateTitle: "التقدير",
+ backupFileInfo: "سيتم تنزيل نسختك المشفّرة إلى جهازك (الاسم: oasis-backup-التاريخ.oasisbk)",
+ backupExportButton: "تنزيل النسخة",
+ backupRestorePassword: "اكتب كلمة المرور المستخدمة عند إنشاء النسخة",
+ backupRestoreButton: "استعادة النسخة",
+ backupRestoredLine: "تمت استعادة النسخة.",
+ backupRestoredMessages: "الرسائل المضافة",
+ backupRestoredSkipped: "موجودة مسبقاً",
+ backupRestoredBlobs: "الملفات المضافة",
+ backupRestoredState: "الإعدادات المستعادة",
+ backupRestoredFailed: "فشلت",
+ backupRestoredForked: "متباينة",
+ backupRestoreRunning: "جارٍ استعادة النسخة. تتحدث هذه الصفحة تلقائيًا؛ يمكنك متابعة استخدام Oasis في هذه الأثناء.",
+ backupRestoreElapsed: "المدة المنقضية",
+ backupRestoreFailedLine: "تعذّر استعادة النسخة.",
+ backupRestoreForkMine: "نشر هذا الجهاز بالفعل رسائل بهويتك غير موجودة في النسخة، لذا تعذّر تطبيقها فوقها. استعد النسخة على تثبيت نظيف مباشرة بعد استيراد مفاتيحك وقبل القيام بأي شيء آخر.",
+ verificationTitle: "التحقق",
+ verificationDescription: "افحص سلسلة خلاصتك، واكتشف التفرعات، وراجع الملفات اليتيمة أو المفقودة.",
+ verificationRun: "تشغيل التحقق",
+ verificationTotalMessages: "رسالة في السجل",
+ verificationFeed: "خلاصتك",
+ verificationMessages: "رسالة",
+ verificationLastSequence: "آخر تسلسل",
+ verificationGaps: "الفجوات",
+ verificationBrokenLinks: "روابط مكسورة",
+ verificationBadHashes: "تجزئات خاطئة",
+ verificationBadSignatures: "توقيعات خاطئة",
+ verificationDuplicates: "تسلسلات مكررة",
+ verificationForks: "التفرعات",
+ verificationBlobs: "الملفات",
+ verificationBlobsPresent: "موجودة",
+ verificationBlobsReferenced: "مُشار إليها",
+ verificationBlobsOrphan: "يتيمة",
+ verificationBlobsMissing: "مفقودة",
+ verificationBlobsMissingOwn: "ملفاتك المفقودة من هذا الجهاز",
+ verificationBlobsMissingOthers: "ملفات سكان آخرين لم تُنزَّل بعد",
+ verificationBlobsUnavailable: "تعذّر سرد الملفات على هذا الجهاز.",
+ wikiTitle: "ويكي",
+ modulesWikiLabel: "ويكي",
+ modulesWikiDescription: "وحدة لاكتشاف وإدارة الويكي.",
+ wikiDescription: "وحدة لاكتشاف وإدارة الويكي.",
+ wikiCreate: "إنشاء ويكي",
+ wikiUpdate: "تحديث",
+ wikiDelete: "حذف",
+ wikiEdit: "تعديل",
+ wikiTitleLabel: "العنوان",
+ wikiTitlePlaceholder: "عنوان الويكي...",
+ wikiBodyLabel: "المحتوى",
+ wikiBodyPlaceholder: "اربط ويكي أخرى عبر [[عنوان الويكي]] أو [[عنوان الويكي|نص مخصص]].\n\nاذكر ساكنًا عبر @id.\n\nضع وسمًا مثل #oasis.\n\nألصق روابط مثل https://solarnethub.com\n\nالسطر الفارغ يبدأ فقرة جديدة؛ وتُحفظ فواصل الأسطر المفردة.\n\nأرفق أي وسائط مدعومة وسيتم دمجها هنا.",
+ formatBarLabel: "التنسيق",
+ wikiStatusLabel: "نوع الويكي",
+ wikiStatusOpen: "مفتوحة",
+ wikiStatusClosed: "مغلقة",
+ wikiTagsLabel: "الوسوم",
+ wikiTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ wikiSummaryLabel: "ملخص التغيير",
+ wikiSummaryPlaceholder: "ما الذي تغيّر؟",
+ wikiFilterAll: "الكل",
+ wikiFilterMine: "صفحاتي",
+ wikiFilterRecent: "الأحدث",
+ wikiFilterLinked: "المرتبطة",
+ wikiChanges: "آخر التغييرات",
+ wikiNoPages: "لم يتم العثور على ويكي.",
+ wikiNoChanges: "لا تغييرات بعد.",
+ wikiHistory: "السجل",
+ wikiVersion: "الإصدار",
+ wikiVersions: "إصدارات",
+ wikiRestore: "استعادة",
+ wikiDiff: "التغييرات",
+ wikiViewVersion: "عرض",
+ wikiLinkedPages: "الصفحات المرتبطة",
+ wikiNoLinkedPages: "هذه الصفحة غير مرتبطة بأي صفحة أخرى بعد.",
+ wikiMissingLink: "الصفحة غير موجودة بعد",
+ wikiDuplicateTitle: "توجد صفحة بهذا العنوان بالفعل. غيّر العنوان لإنشاء صفحة مختلفة.",
+ wikiCreateSectionTitle: "إنشاء ويكي",
+ wikiUpdateSectionTitle: "تحديث الويكي",
+ wikiSearchPlaceholder: "البحث في الويكي...",
+ wikiCurrentVersion: "الإصدار الحالي",
+ wikiViewingVersion: "أنت تعرض إصدارًا قديمًا",
+ wikiBackToPage: "العودة إلى الصفحة",
+ wikiLinkedChip: "مرتبطة",
+ wikiRestoredSummary: "إصدار مستعاد",
+ wikiExportPdf: "إنشاء الصفحة",
+ wikiPreview: "معاينة",
+ tribeSectionWiki: "ويكي",
+ tribeWikiCreate: "إنشاء ويكي",
+ tribeWikiEmpty: "لا ويكي بعد.",
+ typeWiki: "ويكي",
+ padsTitle: "المستندات التعاونية",
+ padTitle: "مستند تعاوني",
+ modulesPadsLabel: "المستندات التعاونية",
modulesPadsDescription: "وحدة لإدارة محررات النصوص التعاونية.",
- padCreate: "إنشاء وسادة",
+ padCreate: "إنشاء مستند تعاوني",
padUpdate: "تحديث",
padDelete: "حذف",
padTitleLabel: "العنوان",
- padTitlePlaceholder: "أدخل عنوان الوسادة...",
+ padTitlePlaceholder: "أدخل عنوان المستند التعاوني...",
padStatusLabel: "الحالة",
+ padTypeLabel: "نوع اللوح",
padStatusOpen: "مفتوح",
padStatusInviteOnly: "بدعوة فقط",
padStatusClosed: "مغلق",
padDeadlineLabel: "الموعد النهائي",
padTagsLabel: "الوسوم",
- padTagsPlaceholder: "وسم1، وسم2، ...",
+ padTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
padMembersLabel: "الأعضاء",
padCreated: "تاريخ الإنشاء",
- padStartEditing: "ابدأ التحرير!",
+ padStartEditing: "تحرير",
padEditorPlaceholder: "ابدأ الكتابة...",
padSubmitEntry: "إرسال",
padNoEntries: "لا توجد مدخلات بعد.",
- padAllSectionTitle: "جميع الوسادات",
- padMineSectionTitle: "وساداتي",
+ padAllSectionTitle: "جميع المستندات التعاونية",
+ padMineSectionTitle: "مستنداتي التعاونية",
padsDescription: "إدارة محرّرات النصوص التعاونية المشفّرة في شبكتك.",
- padRecentSectionTitle: "الوسادات الأخيرة",
- padOpenSectionTitle: "الوسادات المفتوحة",
- padClosedSectionTitle: "الوسادات المغلقة",
- padCreateSectionTitle: "إنشاء وسادة جديدة",
- padUpdateSectionTitle: "تحديث الوسادة",
- typePad: "وسادات",
+ roomsTitle: "الغرف",
+ roomsDescription: "اكتشف غرف مؤتمرات فيديو مشفّرة في شبكتك وانضم إليها.",
+ modulesRoomsLabel: "الغرف",
+ modulesRoomsDescription: "وحدة لاكتشاف غرف مؤتمرات الفيديو المشفّرة والانضمام إليها.",
+ roomFilterRecent: "الأخيرة",
+ roomFilterMine: "غرفي",
+ roomFilterAll: "الكل",
+ roomFilterLive: "مباشر",
+ roomFilterOpen: "مفتوحة",
+ roomFilterInvite: "بدعوة فقط",
+ roomFilterClosed: "مغلقة",
+ roomCreate: "إنشاء غرفة",
+ roomUpdate: "تحديث",
+ roomDelete: "حذف",
+ roomClose: "إغلاق",
+ roomCreateSectionTitle: "إنشاء غرفة",
+ roomUpdateSectionTitle: "تحديث الغرفة",
+ roomTitlePlaceholder: "عنوان الغرفة",
+ roomDescriptionLabel: "الوصف",
+ roomDescriptionPlaceholder: "عمّ ستتحدثون؟",
+ roomTypeLabel: "نوع الغرفة",
+ roomTagsLabel: "الوسوم",
+ roomStatusOpen: "مفتوحة",
+ roomStatusInviteOnly: "بدعوة فقط",
+ roomStatusClosed: "مغلقة",
+ roomParticipants: "المشاركون",
+ roomJoin: "انضمام",
+ roomLeave: "مغادرة",
+ roomFull: "الغرفة ممتلئة",
+ roomLiveChip: "مباشر",
+ roomMuted: "مكتوم",
+ roomRec: "تسجيل الصوت",
+ roomRecStop: "إيقاف التسجيل",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} دخل الغرفة",
+ roomEventLeft: "{name} غادر الغرفة",
+ roomEventRecStart: "{name} بدأ التسجيل",
+ roomEventRecStop: "{name} أوقف التسجيل",
+ roomEventMuted: "{name} كتم صوته",
+ roomEventUnmuted: "{name} ألغى كتم صوته",
+ roomEventHand: "{name} رفع يده",
+ roomRaiseHand: "ارفع يدك",
+ roomLowerHand: "أنزل يدك",
+ confirmActionTitle: "أكّد هذا الإجراء",
+ confirmActionButton: "تأكيد",
+ confirmJoinText: "أنت على وشك الانضمام باستخدام هذه الدعوة.",
+ confirmFollowText: "أنت على وشك دعم هذا الساكن.",
+ confirmSignText: "أنت على وشك توقيع هذه الحملة.",
+ confirmDownloadText: "أنت على وشك تنزيل هذا الملف إلى جهازك.",
+ roomRecordings: "التسجيلات",
+ roomClearNotices: "مسح",
+ roomLineSwitchboard: "مقسم",
+ roomLineDndError: "رقم هذه الغرفة لا يستقبل المكالمات.",
+ roomNumberHint: "اطلب هذا الرقم من الهاتف للانضمام إلى الغرفة.",
+ liveRefresh: "تحديث",
+ roomNobody: "لا أحد في الغرفة الآن.",
+ roomSomeone: "{n} في الغرفة الآن.",
+ roomYou: "أنت",
+ roomYouAreIn: "أنت في الداخل",
+ roomNobodyInside: "لا يوجد أحد في هذه الغرفة الآن.",
+ roomErrorFull: "الغرفة ممتلئة. يمكنك الانضمام عندما يغادر أحدهم.",
+ roomErrorUnreachable: "لا يمكن الوصول إلى الغرفة الآن. حاول لاحقًا.",
+ roomErrorBusy: "أنت بالفعل في مكالمة أو في غرفة أخرى.",
+ roomErrorClosed: "هذه الغرفة مغلقة.",
+ roomAccessDenied: "هذه الغرفة بدعوة فقط. تحتاج إلى دعوة للانضمام.",
+ roomsNoItems: "لم يُعثر على غرف.",
+ roomSearchPlaceholder: "ابحث في الغرف...",
+ roomInviteMode: "دعوة",
+ tribeSectionRooms: "الغرف",
+ tribeRoomCreate: "إنشاء غرفة",
+ tribeRoomsEmpty: "لا توجد غرف بعد.",
+ typeRoom: "غرف",
+ typeRoomMember: "مشارك في غرفة",
+ statsRoom: "الغرف",
+ statsRoomMember: "المشاركون في الغرف",
+ favoritesFilterRooms: "الغرف",
+ invitesRoomsTitle: "الغرف",
+ inviteCodeInvalid: "رمز الدعوة هذا غير صالح أو استُخدم من قبل.",
+ inviteAlreadyMember: "أنت منضم بالفعل. يمكنك فتحه من وحدته.",
+ actionFailed: "تعذّر تنفيذ ذلك. حاول مرة أخرى.",
+ publishTooShort: "منشورك قصير جدًا.",
+ walletSendFailed: "تعذّر إرسال الدفعة: {reason}",
+ pixeliaCoordsError: "هذه الإحداثيات خارج الشبكة.",
+ courtsErrTitle: "العنوان مطلوب.",
+ courtsErrRespondent: "حدّد ضد من تُرفع القضية.",
+ courtsErrRespondentId: "هذا ليس معرّف Oasis صالحًا.",
+ courtsErrMethod: "اختر طريقة حل القضية.",
+ courtsErrCaseNotFound: "تعذّر العثور على هذه القضية.",
+ courtsErrBrief: "اكتب ردّك.",
+ courtsErrStance: "اختر موقفك.",
+ courtsErrResult: "اكتب النتيجة.",
+ courtsErrTerms: "اكتب شروط الاتفاق.",
+ courtsErrMediator: "أضف وسيطًا واحدًا على الأقل.",
+ courtsErrSelfMediator: "لا يمكنك أن تكون وسيطًا في قضيتك.",
+ courtsErrJudge: "اختر قاضيًا.",
+ courtsErrSelfJudge: "لا يمكنك أن تكون قاضيًا في قضيتك.",
+ courtsErrVisibility: "اختر من يمكنه رؤية القضية.",
+ courtsErrNomination: "تعذّر العثور على هذا الترشيح.",
+ opinionAlreadyGiven: "لقد أبديت رأيك بالفعل.",
+ cipherPasswordShort: "يجب ألا تقل كلمة المرور عن 32 حرفًا.",
+ errorForbidden: "ليس لديك صلاحية الوصول إلى هذا.",
+ errorNotFound: "تعذّر العثور عليه.",
+ errorClosed: "هذا مغلق.",
+ errorInviteOnly: "هذا بدعوة فقط. تحتاج إلى دعوة.",
+ errorTooLong: "هذا النص طويل جدًا.",
+ errorRequired: "هناك معلومات مطلوبة ناقصة.",
+ errorInvalid: "بعض المعلومات غير صالحة.",
+ errorNotAuthor: "لا يمكن القيام بهذا إلا لصاحب المحتوى.",
+ panicRemoved: "تم حذف سلسلة الكتل الخاصة بك.",
+ padRecentSectionTitle: "المستندات التعاونية الأخيرة",
+ padOpenSectionTitle: "المستندات التعاونية المفتوحة",
+ padClosedSectionTitle: "المستندات التعاونية المغلقة",
+ padCreateSectionTitle: "إنشاء مستند تعاوني جديد",
+ padUpdateSectionTitle: "تحديث المستند التعاوني",
+ typePad: "مستندات تعاونية",
padNew: "جديد",
padAddFavorite: "إضافة إلى المفضلة",
padRemoveFavorite: "إزالة من المفضلة",
padClose: "إغلاق",
padBackToEditor: "العودة إلى المحرر",
- padSearchPlaceholder: "البحث عن الوسادات...",
+ padSearchPlaceholder: "ابحث في المستندات التعاونية...",
modulesChatsLabel: "المحادثات",
- modulesChatsDescription: "وحدة لاكتشاف وإدارة المحادثات المشفرة.",
+ modulesChatsDescription: "وحدة لاكتشاف وإدارة الدردشات.",
typeChat: "محادثات",
typeChatMessage: "رسالة محادثة",
chatsTitle: "المحادثات",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "محادثاتك",
+ chatRecentTitle: "المحادثات الأخيرة",
chatFavoritesTitle: "المفضلة",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "المحادثات المفتوحة",
+ chatClosedTitle: "المحادثات المغلقة",
chatDescription: "الوصف",
chatCategory: "الفئة",
chatStatus: "الحالة",
@@ -3100,34 +3968,172 @@ module.exports = {
chatMessagesLabel: "الرسائل",
chatThreadsLabel: "المواضيع",
chatCreatedAt: "تم الإنشاء",
- chatSearchPlaceholder: "بحث في المحادثات...",
+ chatSearchPlaceholder: "ابحث في المحادثات...",
chatStatusOpen: "مفتوح",
chatStatusInviteOnly: "بالدعوة فقط",
chatStatusClosed: "مغلق",
chatSendMessage: "إرسال",
chatJumpLatest: "آخر رسالة",
+ chatReply: "رد",
+ chatReplyCancel: "إلغاء الرد",
+ chatPin: "تثبيت",
+ chatUnpin: "إلغاء التثبيت",
+ chatPinned: "المثبتة",
chatPickChat: "اختر محادثة لفتحها",
chatNoneYet: "لا توجد محادثة متاحة بعد.",
activitySearchPlaceholder: "ابحث في النشاط...",
trendingSearchPlaceholder: "ابحث في الرائج...",
opinionsSearchPlaceholder: "ابحث في الآراء...",
votesSearchPlaceholder: "ابحث في التصويتات...",
- welcomeStepUxTitle: "اختر واجهتك",
- welcomeStepUxText: "قرر شكل Oasis. يمكنك تغييره لاحقاً من الإعدادات.",
- welcomeStepUxAction: "استخدم هذا العرض",
+ gamesSearchPlaceholder: "ابحث في الألعاب...",
+ schoolTitle: "المدرسة",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "تم تعديل صفحة ويكي تتابعها.",
+ wikiBotRestoredTitle: "تمت استعادة إصدار سابق من صفحة ويكي تتابعها.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "انضم طالب جديد إلى دورتك.",
+ schoolBotInvitedTitle: "تمت دعوتك إلى دورة.",
+ schoolBotAdmittedTitle: "تم قبولك في دورة.",
+ schoolBotCertificateTitle: "لقد حصلت على شهادة.",
+ schoolBotPassedTitle: "نجح طالب في دورتك.",
+ schoolBotLessonTitle: "تم نشر درس جديد.",
+ invitesSchoolTitle: "المدرسة",
+ schoolEnrollLabel: "الانضمام إلى الدورة",
+ schoolExamRetryLater: "يمكنك المحاولة مجددًا بعد 24 ساعة.",
+ schoolApproved: "ناجح",
+ schoolExamPassMark: "درجة النجاح (0-10)",
+ schoolExamPassed: "ناجح",
+ schoolExamPending: "قيد الانتظار",
+ schoolExamFailed: "راسب",
+ schoolExamAddQuestion: "إضافة سؤال",
+ schoolExamCreateQuestion: "إنشاء سؤال",
+ schoolExamOption: "خيار",
+ schoolExamCorrect: "الخيار الصحيح",
+ schoolExamPoints: "النقاط",
+ schoolMaterialTextPlaceholder: "ملاحظات لهذا الدرس...",
+ schoolMaterials: "المواد",
+ schoolAddMaterial: "إضافة مادة",
+ schoolNoMaterials: "لا توجد مواد بعد.",
+ bankYourSchoolBalance: "أرباحك من المدرسة",
+ schoolProgress: "التقدّم",
+ schoolProgressMark: "وضع علامة مكتمل",
+ schoolProgressDone: "مكتمل",
+ schoolExams: "الاختبارات",
+ schoolExamCreate: "إنشاء اختبار",
+ schoolExamTitlePlaceholder: "عنوان الاختبار",
+ schoolExamHelp: "سؤال واحد في كل سطر: سؤال؟ ; خيار ; الخيار الصحيح* ; خيار",
+ schoolExamQuestionsPlaceholder: "ما هو SSB؟ ; قاعدة بيانات ; بروتوكول P2P* ; متصفح",
+ schoolExamSubmit: "إرسال الإجابات",
+ schoolExamScore: "نتيجتك",
+ schoolNoScoresYet: "لا توجد نتائج بعد.",
+ schoolLessonUnit: "الوحدة / المرحلة",
+ schoolLessonUnitPlaceholder: "مثال: المرحلة 1",
+ schoolLessonOrder: "الترتيب",
+ profileClearnetSchoolLabel: "المدرسة",
+ schoolStartDate: "تاريخ البدء",
+ schoolSessionDate: "تاريخ الجلسة",
+ schoolCourseChat: "دردشة الدورة",
+ agendaFilterSchool: "المدرسة",
+ agendaFilterCampaigns: "الحملات",
+ agendaFilterLogistics: "اللوجستيات",
+ schoolCourseType: "نوع الدورة",
+ schoolTypeOpen: "مفتوح",
+ schoolTypePaid: "مدفوع",
+ schoolTypeInvite: "بالدعوة فقط",
+ schoolLessonLocked: "الدرس مشفّر — اطلب مفتاح الدورة من المعلم.",
+ schoolGrantAccess: "إرسال مفتاح الدورة",
+ schoolKeySent: "تم إرسال المفتاح",
+ schoolOngoing: "جارٍ",
+ schoolFilterApplied: "مسجّل",
+ schoolFilterOpen: "مفتوحة",
+ schoolFilterFavorites: "المفضلة",
+ schoolPendingPayment: "الدفع معلّق",
+ schoolPendingStudents: "تسجيلات معلّقة",
+ schoolViewBill: "عرض الفاتورة",
+ schoolPaymentNote: "التسجيل يُنشئ فاتورة ECO (تحويل). يتأكد تسجيلك بعد توقيع التحويل.",
+ schoolCloseCourse: "إغلاق الدورة",
+ schoolReopenCourse: "إعادة فتح الدورة",
+ schoolDescription: "علّم وتعلّم الدورات في شبكتك.",
+ schoolFilterAll: "الكل",
+ schoolFilterMine: "دوراتي",
+ schoolFilterTop: "الأفضل",
+ schoolFilterRecent: "الأحدث",
+ schoolCreateButton: "إنشاء دورة",
+ schoolCreateSectionTitle: "إنشاء دورة",
+ schoolUpdateSectionTitle: "تحديث الدورة",
+ schoolCourseTitlePlaceholder: "اسم دورتك",
+ schoolCourseDescriptionPlaceholder: "ماذا ستعلّم في هذه الدورة؟",
+ schoolCourseImage: "صورة الدورة (الحجم الأقصى: 75MB)",
+ schoolTags: "الوسوم",
+ schoolTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ schoolPrice: "السعر (ECO)",
+ schoolVisibility: "الظهور",
+ schoolVisibilityPublic: "عام",
+ schoolVisibilityInvite: "بدعوة",
+ schoolStatus: "الحالة",
+ schoolClosed: "مغلق",
+ schoolFree: "مجاني",
+ schoolCreate: "إنشاء الدورة",
+ schoolUpdate: "تحديث الدورة",
+ schoolSearchPlaceholder: "ابحث في المدرسة...",
+ schoolSortTitle: "العنوان",
+ schoolNoCourses: "لم يتم العثور على دورات.",
+ schoolStudents: "الطلاب",
+ schoolTeacher: "المعلم",
+ schoolCreatedAt: "تاريخ الإنشاء",
+ schoolLessons: "الدروس",
+ schoolNoLessons: "لا توجد دروس بعد.",
+ schoolEnrollToSee: "سجّل لرؤية دروس هذه الدورة.",
+ schoolEnrollButton: "التسجيل",
+ schoolUnenrollButton: "مغادرة الدورة",
+ schoolInviteRequired: "هذه الدورة بدعوة فقط.",
+ schoolTeacherPanel: "لوحة المعلم",
+ schoolStudentPanel: "لوحة الطالب",
+ schoolAddLesson: "إنشاء درس",
+ schoolLessonTitlePlaceholder: "عنوان الدرس",
+ schoolLessonTextPlaceholder: "صف المفاهيم التي يغطيها هذا الدرس...",
+ schoolInviteStudents: "دعوة الطلاب",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "دعوة",
+ schoolInvited: "المدعوون",
+ schoolIssueCertificate: "إنشاء شهادة",
+ schoolCertified: "معتمد",
+ schoolCertificateTextPlaceholder: "ملاحظة الشهادة (اختياري)",
+ schoolLessonOpen: "افتح الدرس",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "الشهادات",
+ schoolNoCertificates: "لم يتم إصدار شهادات بعد.",
+ schoolEditButton: "تعديل",
+ schoolDeleteButton: "حذف",
+ typeSchool: "المدرسة",
+ schoolCourseLabel: "دورة",
+ emergencyLabel: "طوارئ",
+ wikiPageLabel: "ويكي",
+ statsSchoolCourse: "الدورات",
+ statsSchoolLesson: "الدروس",
+ statsSchoolEnroll: "التسجيلات",
+ statsSchoolCertificate: "شهادات المدرسة",
+ modulesSchoolLabel: "المدرسة",
+ modulesSchoolDescription: "وحدة لتبادل المعرفة.",
+ welcomeStepUxAction: "حفظ العرض",
+ welcomeStepWorkflowTitle: "ما الاستخدام الذي تفكر فيه لـ OASIS؟",
+ welcomeStepWorkflowText: "في Oasis وحدات كثيرة. اختر الإعداد الذي يناسبك ولن يبقى مفعّلًا إلا المفيد منها. يمكنك تعديله متى شئت من «الوحدات».",
+ welcomeStepWorkflowAction: "حفظ الإعداد",
+ welcomeWorkflow_full: "الافتراضي",
chatRateLimitTitle: "رسائل كثيرة جدًا",
chatRateLimitMessage: "لقد بلغت حد الرسائل الذي تقبله هذه الغرفة في الساعة. حاول لاحقًا.",
chatMessagePlaceholder: "اكتب رسالتك...",
chatNoMessages: "لا توجد رسائل بعد.",
chatTitlePlaceholder: "عنوان المحادثة",
chatDescriptionPlaceholder: "وصف المحادثة",
- chatTagsPlaceholder: "وسم1، وسم2",
+ chatTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
chatImageLabel: "اختر ملف صورة (.jpeg, .jpg, .png, .gif)",
chatAuthor: "المؤلف",
chatAddFavorite: "إضافة للمفضلة",
chatRemoveFavorite: "إزالة من المفضلة",
chatPM: "رسالة",
chatStatusLabel: "الحالة",
+ chatTypeLabel: "نوع الدردشة",
chatCategoryLabel: "الفئة",
gamesTitle: "الألعاب",
gamesDescription: "اكتشف وألعب بعض الألعاب.",
@@ -3158,22 +4164,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "اقلب عملة معدنية وراهن على الوجه أو الظهر. كم أنت محظوظ?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "بلياردو من منظور علوي. انقر للتصويب واضغط باستمرار لشحن القوة. أدخل جميع الكرات بأقل عدد من الضربات.",
+ gamesArtilleryTitle: "المدفعية",
+ gamesArtilleryDesc: "صوّب مدفعك، وخذ الرياح في الحسبان، وأصب الهدف. 5 جولات، ويفوز صاحب أقل عدد من الطلقات.",
+ gamesLabyrinthTitle: "المتاهة",
+ gamesLabyrinthDesc: "اهرب من المتاهة قبل أن تنفد حركاتك. كل مستوى أكبر وأصعب.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "كُل كل النقاط وتجنّب الأشباح. تتحرك الأشباح في الوقت الحقيقي — استمر في الحركة!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "البندول الصوتي",
+ gamesAudioPendulumDesc: "محاكي فيزياء فوضوية مع توليف صوتي في الوقت الحقيقي. تتحول السرعات الزاوية إلى ترددات، والقمم إلى ضربات طبول. لا توجد محاكاتان تبدوان متشابهتين.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "امزج المرئيات مباشرة على منصتين: اختر نمطاً لكل منهما، واضبط السرعة واللون والتكبير، وانتقل بينهما وأطلق الومضات على الإيقاع. انقر لضبط الإيقاع أو دع الميكروفون يقود النبض.",
+ gamesTetrisDesc: "المكعبات الساقطة الكلاسيكية. أكمل الصفوف لتسجل النقاط. إلى متى يمكنك الصمود؟",
+ gamesMinesweeperTitle: "كاسحة الألغام",
+ gamesMinesweeperDesc: "صيد الألغام الكلاسيكي. نظّف اللوحة لترتقي مستوى — شبكات أكبر وألغام أكثر ونقاط أعلى.",
+ gamesFilterScoring: "النقاط",
+ gamesHallOfFame: "قاعة المشاهير",
+ gamesHallPlayer: "اللاعب",
+ gamesHallScore: "النتيجة",
+ gamesNoScores: "لا توجد نتائج بعد.",
calendarsTitle: "التقاويم",
calendarTitle: "التقويم",
modulesCalendarsLabel: "التقاويم",
@@ -3181,15 +4191,15 @@ module.exports = {
typeCalendar: "تقويمات",
calendarCreate: "إنشاء تقويم",
calendarUpdate: "تحديث",
- calendarDelete: "حذف",
calendarTitleLabel: "العنوان",
calendarTitlePlaceholder: "عنوان التقويم...",
calendarStatusLabel: "الحالة",
+ calendarTypeLabel: "نوع التقويم",
calendarStatusOpen: "مفتوح",
calendarStatusClosed: "مغلق",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "الموعد النهائي",
calendarTagsLabel: "الوسوم",
- calendarTagsPlaceholder: "وسم1، وسم2...",
+ calendarTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
calendarParticipantsLabel: "المشاركون",
calendarCreated: "تم الإنشاء",
calendarJoin: "انضمام",
@@ -3200,11 +4210,11 @@ module.exports = {
calendarNotePlaceholder: "إضافة ملاحظة...",
calendarFirstDateLabel: "التاريخ",
calendarFirstNoteLabel: "ملاحظات",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "الفاصل الزمني",
calendarIntervalNone: "بدون تكرار",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "أسبوعيًا",
+ calendarIntervalMonthly: "شهريًا",
+ calendarIntervalYearly: "سنويًا",
calendarFormDescription: "الوصف",
calendarNoDates: "لا توجد تواريخ.",
calendarNoNotes: "لا توجد ملاحظات.",
@@ -3212,6 +4222,8 @@ module.exports = {
calendarsDescription: "اكتشف وأدر التقويمات في شبكتك.",
calendarMonthPrev: "← السابق",
calendarMonthNext: "التالي →",
+ calendarMonthNames: "يناير,فبراير,مارس,أبريل,مايو,يونيو,يوليو,أغسطس,سبتمبر,أكتوبر,نوفمبر,ديسمبر",
+ calendarDayInitials: "ن,ث,ر,خ,ج,س,ح",
calendarAllSectionTitle: "التقاويم",
calendarRecentSectionTitle: "التقويمات الأحدث",
calendarFavoritesSectionTitle: "المفضلة",
@@ -3221,20 +4233,160 @@ module.exports = {
calendarCreateSectionTitle: "إنشاء تقويم جديد",
calendarUpdateSectionTitle: "تحديث التقويم",
calendarAddFavorite: "إضافة إلى المفضلة",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "حذف",
calendarRemoveFavorite: "إزالة من المفضلة",
- calendarSearchPlaceholder: "البحث عن تقاويم...",
+ calendarSearchPlaceholder: "ابحث في التقويم...",
calendarAddEntry: "إضافة إدخال",
statsCalendar: "التقاويم",
statsCalendarDate: "تواريخ التقويم",
statsCalendarNote: "ملاحظات التقويم",
chatAccessDenied: "ليس لديك حق الوصول إلى هذه المحادثة. اطلب دعوة للوصول إلى المحتوى.",
- padAccessDenied: "ليس لديك حق الوصول إلى هذا الوسادة. اطلب دعوة للوصول إلى المحتوى.",
+ padAccessDenied: "ليس لديك حق الوصول إلى هذا المستند التعاوني. اطلب دعوة للوصول إلى المحتوى.",
contentAccessDenied: "ليس لديك حق الوصول إلى هذا المحتوى.",
blockAccessRestricted: "الوصول مقيد",
tribeContentAccessDenied: "تم رفض الوصول",
tribeContentAccessDeniedMsg: "هذا المحتوى ينتمي إلى قبيلة. يجب أن تكون عضواً للوصول إليه.",
tribeViewTribes: "عرض القبائل",
+ tribeFilesEmpty: "لا توجد تورنتات بعد.",
+ filesLabel: "التورنت",
+ profileClearnetFilesLabel: "التورنت",
+ filesTitle: "التورنت",
+ filesDescription: "استكشف وأدِر التورنت في شبكتك.",
+ fileAllSectionTitle: "التورنت",
+ fileMineSectionTitle: "تورنتاتك",
+ fileRecentSectionTitle: "تورنتات حديثة",
+ fileTopSectionTitle: "أفضل التورنتات",
+ fileFavoritesSectionTitle: "المفضلة",
+ fileFilterAll: "الكل",
+ fileFilterMine: "خاصتي",
+ fileFilterRecent: "الحديثة",
+ fileFilterTop: "الأفضل",
+ fileFilterFavorites: "المفضلة",
+ fileCreateSectionTitle: "رفع تورنت",
+ fileUpdateSectionTitle: "تحديث التورنت",
+ fileCreateButton: "رفع تورنت",
+ fileUpdateButton: "تحديث",
+ fileAddFavoriteButton: "إضافة إلى المفضلة",
+ fileRemoveFavoriteButton: "إزالة من المفضلة",
+ fileFileLabel: "اختاري ملفًا (الحد الأقصى: 50 ميغابايت)",
+ calendarFilterRecent: "الأخيرة",
+ calendarFilterAll: "الكل",
+ calendarFilterMine: "خاصتي",
+ calendarFilterFavorites: "المفضلة",
+ calendarFilterOpen: "مفتوح",
+ calendarFilterClosed: "مغلق",
+ padFilterRecent: "الأخيرة",
+ padFilterAll: "الكل",
+ padFilterMine: "خاصتي",
+ padFilterOpen: "مفتوح",
+ padFilterClosed: "مغلق",
+ chatFilterRecent: "الأخيرة",
+ chatFilterAll: "الكل",
+ chatFilterMine: "خاصتي",
+ chatFilterFavorites: "المفضلة",
+ chatFilterOpen: "مفتوح",
+ chatFilterClosed: "مغلق",
+ licenseLabel: "الترخيص",
+ phoneTitle: "الهاتف",
+ phoneDescription: "أدر مكالمات الفيديو المشفّرة من طرف إلى طرف.",
+ phoneUnavailable: "المكالمات غير متاحة على هذا الجهاز.",
+ phoneCallButton: "اتصال",
+ profileVisibilityPhone: "رقم الهاتف",
+ phoneNumberUnknown: "لا أحد في شبكتك لديه الرقم {number}.",
+ phoneNumberChoose: "تحقق ممن تريد الاتصال به على الرقم {number}:",
+ phoneAnswer: "رد",
+ phoneSpeaker: "مكبر الصوت",
+ phoneEarpiece: "سماعة الأذن",
+ phoneReject: "رفض",
+ phoneHangup: "إنهاء المكالمة",
+ phoneMute: "كتم الصوت",
+ phoneUnmute: "إلغاء الكتم",
+ phoneCameraOn: "الكاميرا: تشغيل",
+ phoneCameraOff: "الكاميرا: إيقاف",
+ settingsPhoneVideo: "الفيديو",
+ settingsPhoneVideoOn: "مسموح في المكالمات والغرف",
+ settingsPhoneVideoOff: "صوت فقط",
+ phoneSilence: "عدم السماع",
+ phoneUnsilence: "السماع مجدداً",
+ phoneCalling: "جارٍ الاتصال بـ",
+ phoneIsCalling: "يتصل بك",
+ notifyNewPmFrom: "رسالة خاصة جديدة من",
+ notifyNewPamFrom: "رسالة PaM جديدة من",
+ notifyUpdateLabel: "تحديث",
+ updateInstalledLabel: "الإصدار المثبت",
+ updateAvailableLabel: "الإصدار المتاح",
+ updateChangesLabel: "التغييرات",
+ updateFilesLabel: "الملفات",
+ updateOriginLabel: "المصدر",
+ phoneRecording: "جارٍ تسجيل PaM لـ",
+ phoneLeaveMessage: "لم يرد أحد: اترك رسالتك بعد الصفارة.",
+ phoneLeaveMessageBusy: "في مكالمة أخرى: اترك رسالتك بعد الإشارة.",
+ phoneLeaveMessageUnreachable: "تعذّر الوصول: اترك رسالتك بعد الإشارة.",
+ phoneConnecting: "جارٍ الاتصال بـ",
+ phoneSendPam: "إرسال PaM",
+ phoneCancel: "إلغاء",
+ phoneSearchPlaceholder: "ابحث في الهاتف...",
+ phonePamTitle: "تسجيلات صوتية",
+ phoneNew: "جديد",
+ phoneDelete: "حذف",
+ phoneNoPams: "ليست لديك تسجيلات صوتية.",
+ phoneHistoryTitle: "السجل",
+ phoneLatestTitle: "آخر المكالمات",
+ phoneCreateButton: "مكالمة جديدة",
+ phoneLimitsHint: "حتى 7 من السكان لكل مكالمة؛ أكثر من ساكن واحد يجعلها مكالمة مشتركة.",
+ phoneErrorPub: "لا يمكن الاتصال بخادم pub.",
+ phoneJointCall: "مكالمة مشتركة",
+ phoneWith: "مع",
+ phoneResult: "النتيجة",
+ phoneWhen: "متى",
+ phoneDuration: "المدة",
+ phoneOutgoing: "صادرة",
+ phoneIncoming: "واردة",
+ phoneNoHistory: "لا توجد سجلات بعد.",
+ phoneOutcomeEnded: "تم الرد",
+ phoneOutcomeMissed: "فائتة",
+ phoneOutcomeRejected: "مرفوضة",
+ phoneOutcomeNoanswer: "لا رد",
+ phoneOutcomeCancelled: "ملغاة",
+ phoneOutcomePam: "تم إرسال PaM",
+ phoneOutcomeFailed: "فشلت",
+ phoneDialAdd: "إضافة",
+ phoneDialBack: "حذف",
+ phoneDialClear: "مسح",
+ phoneDialPlaceholder: "رقم أو معرّف Oasis",
+ phoneDialInhabitants: "السكان",
+ phoneDialRemove: "إزالة",
+ phoneOwnNumber: "هذا رقمك أنت.",
+ phoneSettingsDesc: "اختر من يمكنه الاتصال بك.",
+ phoneDnd: "عدم الإزعاج",
+ phoneOpen: "مفتوح",
+ phoneRecipientRefuses: "الساكن الذي تحاول الاتصال به لا يقبل المكالمات.",
+ phoneRefusedNotice: "هؤلاء السكان لا يقبلون المكالمات ولم يتم الاتصال بهم:",
+ fileEmptyError: "الملف فارغ. اختاري ملفًا آخر.",
+ fileTitleLabel: "العنوان",
+ fileTitlePlaceholder: "العنوان",
+ fileDescriptionLabel: "الوصف",
+ fileDescriptionPlaceholder: "الوصف",
+ fileTagsLabel: "الوسوم",
+ fileTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
+ fileSizeLabel: "الحجم",
+ fileDownloadButton: "تحميل",
+ fileDetailsButton: "التفاصيل",
+ fileNoFile: "لا يوجد ملف تورنت",
+ fileSearchPlaceholder: "ابحث في التورنت...",
+ fileSearchButton: "بحث",
+ fileSortRecent: "الأحدث",
+ fileSortOldest: "الأقدم",
+ fileSortTop: "الأكثر تصويتاً",
+ fileNoMatch: "لا توجد تورنتات مطابقة.",
+ fileUpdatedAt: "تم التحديث",
+ typeFile: "التورنت",
+ modulesFilesLabel: "الملفات",
+ modulesFilesDescription: "وحدة لاكتشاف وإدارة الملفات.",
+ tribeSectionFiles: "التورنت",
+ fileDescription: "الوصف",
+ fileDownload: "تنزيل",
+ fileTypeLabel: "النوع",
torrentsTitle: "التورنت",
torrentsDescription: "استكشف وأدِر التورنت في شبكتك.",
torrentAllSectionTitle: "التورنت",
@@ -3262,10 +4414,33 @@ module.exports = {
torrentTagsLabel: "الوسوم",
torrentTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل",
torrentSizeLabel: "الحجم",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "إنشاء تورنت",
+ torrentFromContentMissing: "الملف غير متاح بعد على هذه العقدة. حاولي لاحقًا.",
+ torrentDownloads: "التنزيلات",
+ torrentFetchOasis: "تنزيل داخل Oasis",
+ torrentSaveFile: "حفظ الملف",
+ torrentSeeds: "بذور",
+ seedsLabel: "البذور",
+ seedAction: "دعم",
+ torrentSourceFile: "الملف",
+ torrentStateQueued: "في الانتظار",
+ torrentStateProbing: "البحث عن بذور",
+ torrentStateDownloading: "جارٍ التنزيل",
+ torrentStateDone: "اكتمل",
+ torrentStateFailed: "فشل",
+ torrentStateNoSource: "لا توجد بذور متصلة بعد، في الانتظار",
+ torrentStateCancelled: "أُلغي",
+ torrentNoDownloads: "لا توجد تنزيلات بعد.",
+ torrentOriginalSection: "الأصل",
+ torrentCancel: "إلغاء",
+ torrentDownloadButton: "تحميل",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "التفاصيل",
torrentNoFile: "لا يوجد ملف تورنت",
noTorrents: "لم يتم العثور على تورنتات.",
- torrentSearchPlaceholder: "بحث بالعنوان، الوسوم، المؤلف...",
+ noFiles: "لم يتم العثور على تورنتات.",
+ torrentSearchPlaceholder: "ابحث في التورنت...",
torrentSearchButton: "بحث",
torrentSortRecent: "الأحدث",
torrentSortOldest: "الأقدم",
@@ -3273,10 +4448,12 @@ module.exports = {
torrentNoMatch: "لا توجد تورنتات مطابقة.",
torrentUpdatedAt: "تم التحديث",
statsTorrent: "التورنت",
+ statsFile: "الملفات",
typeTorrent: "التورنت",
modulesTorrentsLabel: "التورنت",
modulesTorrentsDescription: "وحدة لاكتشاف وإدارة التورنت.",
favoritesFilterTorrents: "التورنت",
+ favoritesFilterFiles: "الملفات",
favoritesFilterMarket: "السوق",
favoritesFilterEvents: "الفعاليات",
favoritesFilterForum: "المنتدى",
@@ -3290,15 +4467,17 @@ module.exports = {
favoritesFilterShopProducts: "منتجات المتجر",
tribeSectionTorrents: "التورنت",
tribeCreateTorrent: "رفع تورنت",
+ tribeCreateFile: "رفع ملف",
settingsWishTitle: "الرغبة",
- settingsWishDesc: "قم بتكوين رغبة الأفاتار الخاص بك.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "يحدد كيفية وصولك إلى كل المحتوى وتجربتك في شبكة Oasis.",
+ settingsWishWhole: "الكون المتعدد",
+ settingsWishMutuals: "الدعم المتبادل فقط",
+ settingsWishOnlyLan: "الشبكة المحلية فقط",
+ settingsWishLocal: "محلي",
settingsPmVisibilityTitle: "الرسائل الخاصة",
settingsPmVisibilityDesc: "قم بتكوين مستوى التعرض للرسائل الخاصة في الشبكة.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "الكون المتعدد",
+ settingsPmVisibilityMutuals: "الدعم المتبادل فقط",
pmMutualNotice: "الإرسال حاجز UX. الاستقبال فلتر انتباه.",
inhabitantsPendingFollowsTitle: "طلبات الدعم المعلقة",
inhabitantsPendingAccept: "قبول",
@@ -3342,7 +4521,7 @@ module.exports = {
tribeGovNoRevocations: "لا يوجد أي إلغاء بعد",
tribeGovNoHistorical: "لا يوجد أي سجل بعد",
logsTitle: "السجل",
- logsDescription: "سجل تجربتك في الشبكة.",
+ logsDescription: "احتفظ بمذكرات خاصة لتجاربك.",
logsViewTitle: "السجل",
logsColumnType: "النوع",
logsView: "عرض",
@@ -3351,7 +4530,7 @@ module.exports = {
logsCreateTitle: "إنشاء إدخال",
logsWriteButton: "اكتب",
logsTextPlaceholder: "صف تجاربك...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "مساعد الذكاء الاصطناعي",
logsModeManual: "يدوي",
logsModeAI: "ذكاء",
logsColumnLog: "السجل",
@@ -3370,23 +4549,24 @@ module.exports = {
logsExportOne: "تصدير السجل",
logsViewDetails: "عرض التفاصيل",
logsGenerateButton: "توليد نص",
- logsSearchText: "ابحث في السجلات...",
+ logsSearchText: "ابحث في السجل...",
logsSearchAnyType: "أي نوع",
logsSearchButton: "بحث",
logsEmpty: "لا توجد إدخالات بعد.",
+ logsNothingNew: "لا توجد إجراءات جديدة لتسجيلها.",
modulesLogsLabel: "السجل",
- modulesLogsDescription: "وحدة لتسجيل تجاربك (عبر مساعد ذكاء اصطناعي).",
+ modulesLogsDescription: "وحدة للاحتفاظ بمذكرات خاصة لتجاربك.",
statsLogsTitle: "السجل",
typeLog: "سجل",
larpTitle: "L.A.R.P.",
larpDescription: "طبقة لعب أدوار حية للتجربة التعاونية.",
larpNoHousesMatch: "لا توجد بيوت تطابق بحثك.",
- larpSearchPlaceholder: "ابحث في البيوت...",
+ larpSearchPlaceholder: "ابحث في L.A.R.P....",
larpAllHouses: "البيوت:",
larpFilterRuling: "يحكم",
larpFilterHouses: "البيوت",
- larpFilterRules: "FAQ",
+ larpFilterRules: "الأسئلة الشائعة",
larpRulesTitle: "أسئلة شائعة عن L.A.R.P.",
larpRulesEntryText: "يبدأ كل ساكن في ACADEMIA افتراضياً. من ACADEMIA، اختر بيتاً من لوحة «الانضمام إلى بيت»: ستفتح اختبار الدخول الخاص به. أجب عن الأسئلة العشرة وأرسلها. إذا تجاوزت الحد (7/10) فستُقبل آلياً في ذلك البيت؛ وإلا تُرفض وتبقى في ACADEMIA. في كل الأحوال يسجّل النظام OasisID الخاص بك ودورة المحاولة، ويمنع محاولة جديدة حتى انتهاء فترة الانتظار وهي 30 دورة.",
larpRulesGovernanceText: "خلال دورته، يحمل البيت الحاكم شارة «يحكم» وهو الوحيد الذي يُعرض حائطه علنياً ضمن تبويب «يحكم».",
@@ -3397,118 +4577,117 @@ module.exports = {
larpPostPlaceholder: "ماذا يريد هذا البيت أن يقول؟",
larpPostSubmit: "انشر",
larpCycleLabel: "الدورة:",
- audioBackToBcs: "Back to BCS",
+ audioBackToBcs: "العودة إلى BCS",
audioFilterBcs: "BCS",
- audioTranscodeButton: "TRANSCODE",
- audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.",
- audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.",
- audioTranscodeDetailTitle: "Transcode",
- audioTranscodeStegoEmpty: "(none)",
- audioTranscodeStegoMessage: "TEXT",
- audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.",
- audioTranscodeStegoOasisId: "By",
- audioTranscodeStegoTimestamp: "Generated at",
+ audioTranscodeButton: "تحويل الترميز",
+ audioTranscodeCompositionEmpty: "لا يتضمن هذا الملف الصوتي تأليفًا محفوظًا لسلسلة الكتل.",
+ audioTranscodeDetailDescription: "فك ترميز الحمولة المضمنة وخريطة التأليف الأصلية لسلسلة الكتل.",
+ audioTranscodeDetailTitle: "تحويل الترميز",
+ audioTranscodeStegoEmpty: "(لا شيء)",
+ audioTranscodeStegoMessage: "النص",
+ audioTranscodeStegoNotFound: "تعذّر فك ترميز أي حمولة مخفية من هذا الملف الصوتي.",
+ audioTranscodeStegoTimestamp: "تاريخ الإنشاء",
audioTranscodeStegoUnknown: "—",
- bankExchangeEcoTaxAnnual: "ECOin Taxes (annual)",
- bankExchangeEcoTaxMonthly: "ECOin Taxes (monthly)",
- bankOverviewYourTaxes: "Your taxes",
- bankRulesAlpha: "Alpha (max share of pub balance per epoch)",
+ bankExchangeEcoTaxAnnual: "ضرائب ECOin (سنويًا)",
+ bankExchangeEcoTaxMonthly: "ضرائب ECOin (شهريًا)",
+ bankOverviewYourTaxes: "إجمالي الضرائب",
+ bankRulesAlpha: "Alpha (الحصة القصوى من رصيد الـ pub لكل حقبة)",
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.",
- bankRulesArchTaxRate: "Rate",
- bankRulesArchTaxTitle: "ARCH Tax",
- bankRulesCapPerEpoch: "Cap per epoch (absolute)",
- bankRulesCapUser: "Cap per user per epoch",
- bankRulesCarbonFactor: "Carbon factor",
+ bankRulesArchTaxNote: "تعكس ضريبة ARCH التكلفة طويلة الأمد لتوسيع أرشيف الشبكة وصيانته: كلما كانت بياناتك أقدم في الشبكة، زادت حصتك من تكلفة الصيانة.",
+ bankRulesArchTaxRate: "المعدل",
+ bankRulesArchTaxTitle: "ضريبة ARCH",
+ bankRulesCapPerEpoch: "الحد الأقصى لكل حقبة (مطلق)",
+ bankRulesCapUser: "الحد الأقصى لكل مستخدم في كل حقبة",
+ bankRulesCarbonFactor: "معامل الكربون",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
- bankRulesChipTitle: "ECO Tax chip color band",
+ bankRulesChipNote: "تُلوَّن شارة كل عنصر بالنسبة إلى أكبر رسالة رُصدت في الشبكة، وتُلطَّف بعدد السكان النشطين — فالشبكة الأكبر توزّع الحمل وتدفع مزيدًا من العناصر إلى النطاق الأخضر.",
+ bankRulesChipTitle: "نطاق لون شارة ضريبة ECO",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
- bankRulesEcoTaxRate: "Rate",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesEpochKind: "Epoch granularity",
- bankRulesFloor: "Floor per user (gross)",
- bankRulesGraceDays: "Claim grace period",
+ bankRulesEcoTaxNote: "تُخصم ضريبة ECO من الدخل الأساسي الإجمالي عند حساب تخصيص الحقبة. ولا يُعاد توزيع وحدات ECO المخصومة في هذه الحقبة — بل تبقى في رصيد الـ pub وتغذّي صندوق الحقبة التالية عبر حدود reserveMin / alpha.",
+ bankRulesEcoTaxRate: "المعدل",
+ bankRulesEcoTaxTitle: "ضريبة ECO",
+ bankRulesEpochKind: "دقة الحقبة",
+ bankRulesFloor: "الحد الأدنى لكل مستخدم (إجمالي)",
+ bankRulesGraceDays: "فترة السماح للمطالبة",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
- bankRulesKarmaTitle: "Karma (user engagement score)",
+ bankRulesKarmaNote: "تُشتق الكارما من أفعالك (المنشورات، والأصوات، والمشاركة في البرلمان/المحاكم، وغير ذلك) مع معامل تناقص بمرور الوقت، مطروحًا منها غرامات الكربون التي تولّدها تغذيتك.",
+ bankRulesKarmaTitle: "الكارما (درجة تفاعل المستخدم)",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
- bankRulesPoolTitle: "Monthly pool",
- bankRulesReserveMin: "Reserve minimum (kept in pub balance)",
+ bankRulesPoolTitle: "الصندوق الشهري",
+ bankRulesReserveMin: "الحد الأدنى للاحتياطي (يبقى في رصيد الـ pub)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
- bankRulesShareTitle: "Per-user share",
+ bankRulesShareTitle: "حصة كل مستخدم",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankRulesWMax: "Maximum weight (w_max)",
- bankRulesWMin: "Minimum weight (w_min)",
- bankTaxes: "Taxes",
- bankTaxesAnnualEcoin: "ECO Tax (annual)",
- bankTaxesArchTaxAnnual: "ARCH Tax (annual)",
- bankTaxesArchTaxFirstBlock: "Your first block age",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxLifetime: "ARCH Tax (lifetime)",
- bankTaxesArchTaxMonthly: "ARCH Tax (monthly)",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, and their ongoing contribution may be required by networking consensus.",
- bankTaxesArchTaxRate: "Rate",
- bankTaxesArchTaxTitle: "ARCH Tax",
- bankTaxesArchTaxUserAmount: "Your ARCH tax (price to return)",
- bankTaxesEcoTaxLifetime: "ECO Tax (lifetime)",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesLookupAuthor: "Author",
- bankTaxesLookupButton: "Inspect",
- bankTaxesLookupCarbon: "Carbon footprint",
- bankTaxesLookupEcoin: "ECO Tax",
- bankTaxesLookupNotFound: "No block found in your local feed with that ID.",
- bankTaxesLookupPlaceholder: "Block ID (e.g. %abc...=.sha256)",
- bankTaxesLookupSize: "Size",
- bankTaxesLookupTitle: "Inspect a block",
- bankTaxesLookupType: "Type",
- bankTaxesMonthlyEcoin: "ECO Tax (monthly)",
- bankTaxesRate: "Rate",
- bankTaxesSpan: "Sampling span",
- bankTaxesTotalAnnual: "Total (annual)",
- bankTaxesTotalBlocks: "Total blocks",
- bankTaxesTotalBytes: "Total bytes",
- bankTaxesTotalCarbon: "Total carbon",
- bankTaxesTotalEcoin: "Total ECO tax (lifetime)",
- bankTaxesTotalLifetime: "Total (lifetime)",
- bankTaxesTotalMonthly: "Total (monthly)",
- bankTaxesTypesApply: "Set my taxes",
- bankTaxesTypesLabel: "Select which taxes you want to pay",
- bankTaxesUserAmount: "Your ECO tax (price to return)",
- 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.",
- 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.",
- blockchainBackToBlockexplorer: "Back to blockexplorer",
- blockchainBlockNotAvailable: "This block is not available in your local feed. It may belong to a peer you are not yet replicating from.",
- ecoTaxLabel: "ECO Tax",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- melodyAllEmpty: "No BCS compositions from other inhabitants yet.",
- melodyByLabel: "By",
- melodyNoteUnavailable: "block not in your local feed",
- melodyUploadBcsButton: "Publish",
- melodyUploadBcsNameNote: "The audio will be published with the auto-generated name",
- melodyUploadBcsTitle: "Publish",
- melodyUploadStegoLabel: "Hidden message (steganography)",
- melodyUploadStegoMaxLabel: "max 280 characters",
- melodyUploadStegoPlaceholder: "Optional.",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
- statsPad: "Pads",
- statsPadEntry: "Pad entries",
- statsTombstoneEmpty: "No tombstones in the network yet.",
- typeGameScore: "GAME SCORES",
+ bankRulesWMax: "الوزن الأقصى (w_max)",
+ bankRulesWMin: "الوزن الأدنى (w_min)",
+ bankTaxes: "الضرائب",
+ bankTaxesAnnualEcoin: "ضريبة ECO (سنويًا)",
+ bankTaxesArchTaxAnnual: "ضريبة ARCH (سنويًا)",
+ bankTaxesArchTaxFirstBlock: "عمر أول كتلة لك",
+ bankTaxesArchTaxFootprintNote: "تعكس ضريبة ARCH تكلفة توسيع أرشيف الشبكة وصيانته. وتُحسب من الفارق الزمني بين أول كتلة نشرتها وأحدث كتلة في الشبكة — فكلما طال بقاء تاريخك في الأرشيف، زادت حصتك من تكلفة الصيانة.",
+ bankTaxesArchTaxLifetime: "ضريبة ARCH (مدى الحياة)",
+ bankTaxesArchTaxMonthly: "ضريبة ARCH (شهريًا)",
+ bankTaxesArchTaxNoteBold: "خفض ضريبة ARCH مباشرةً",
+ bankTaxesArchTaxNoteIntro: "تُخصم ضريبة ARCH الخاصة بك من الفائض الذي تولّده الشبكة فوق دخلك الأساسي؛ وتُحدَّد القيمة الأساسية للدخل الأساسي كحد أدنى ثابت. ولا تُخصم الضريبة أبدًا من المبلغ الثابت الذي يستحقه كل ساكن بوصفه دخلًا أساسيًا. تُغذّي الأموال المخصومة خوارزمية إعادة توزيع الثروة وتُعاد إلى سكان آخرين عبر مطالباتهم بالدخل الأساسي. ومن المرجح أن يكون لدى السكان الأحدث، ولدى المتفرغين لمهام الأرشفة والنسخ والصيانة، مهمة مخصصة للحفاظ على سلامة أرشيف الشبكة نيابةً عنك. أو قد يكرّسون أنفسهم لـ",
+ bankTaxesArchTaxNoteOutro: " عبر اتفاقيات التقليم، وإزالة تكرار البيانات الزائدة، وبنية صيانة مشتركة، وقد يطلب إجماع الشبكة مساهمتهم المستمرة.",
+ bankTaxesArchTaxRate: "المعدل",
+ bankTaxesArchTaxTitle: "ضريبة ARCH",
+ bankTaxesArchTaxUserAmount: "ضريبة ARCH الخاصة بك (المبلغ الواجب إرجاعه)",
+ bankTaxesEcoTaxLifetime: "ضريبة ECO (مدى الحياة)",
+ bankTaxesEcoTaxTitle: "ضريبة ECO",
+ bankTaxesLookupAuthor: "المؤلف",
+ bankTaxesLookupButton: "فحص",
+ bankTaxesLookupCarbon: "البصمة الكربونية",
+ bankTaxesLookupEcoin: "ضريبة ECO",
+ bankTaxesLookupNotFound: "لم يُعثر في تغذيتك المحلية على كتلة بهذا المعرّف.",
+ bankTaxesLookupPlaceholder: "معرّف الكتلة (مثل %abc...=.sha256)",
+ bankTaxesLookupSize: "الحجم",
+ bankTaxesLookupTitle: "فحص كتلة",
+ bankTaxesLookupType: "النوع",
+ bankTaxesMonthlyEcoin: "ضريبة ECO (شهريًا)",
+ bankTaxesRate: "المعدل",
+ bankTaxesSpan: "فترة أخذ العينات",
+ bankTaxesTotalAnnual: "الإجمالي (سنويًا)",
+ bankTaxesTotalBlocks: "إجمالي الكتل",
+ bankTaxesTotalBytes: "إجمالي البايتات",
+ bankTaxesTotalCarbon: "إجمالي الكربون",
+ bankTaxesTotalEcoin: "إجمالي ضريبة ECO (مدى الحياة)",
+ bankTaxesTotalLifetime: "الإجمالي (مدى الحياة)",
+ bankTaxesTotalMonthly: "الإجمالي (شهريًا)",
+ bankTaxesTypesApply: "تعيين ضرائبي",
+ bankTaxesTypesLabel: "اختر الضرائب التي تريد دفعها",
+ bankTaxesUserAmount: "ضريبة ECO الخاصة بك (المبلغ الواجب إرجاعه)",
+ bankTaxesUserNoteChips: "تتغير شارة ضريبة ECO المعروضة بجانب كل عنصر لونها (أخضر / أصفر / أحمر) بحسب حجم العنصر مقارنةً بأكبر كتلة شوهدت في الشبكة، مع تلطيفها بعدد السكان النشطين — فالشبكة الشمسية الأكبر توزّع الحمل وتدفع مزيدًا من العناصر إلى النطاق الأخضر.",
+ bankTaxesUserNoteOtherParams: "تُشتق ضريبة ECO حاليًا من البصمة الكربونية لكل كتلة، لكنها قد تتضمن مع الوقت معايير أخرى — الطاقة المستهلكة في النسخ، والتخزين المكرر بين العقد، وعرض نطاق الملفات، والتكلفة الحسابية لفك التشفير، وبصمة تعدين المعاملات المرتبطة، أو أي حمل آخر قابل للقياس تتفق الشبكة على تقييمه.",
+ blockchainBackToBlockexplorer: "العودة إلى مستكشف الكتل",
+ blockchainBlockNotAvailable: "هذه الكتلة غير متوفرة في تغذيتك المحلية. قد تنتمي إلى عقدة لا تنسخ منها بعد.",
+ ecoTaxLabel: "ضريبة ECO",
+ gamesHallDate: "التاريخ",
+ gamesNewRecord: "رقم قياسي جديد!",
+ indexingRefreshNote: "تُحدَّث هذه الصفحة كل 10 ثوانٍ.",
+ indexingMessage: "يقوم Oasis بمزامنة شبكة العقد الموزعة. يرجى الانتظار.",
+ indexingTitle: "جارٍ المزامنة",
+ melodyAllEmpty: "لا توجد بعد مؤلفات BCS من سكان آخرين.",
+ melodyNoteUnavailable: "الكتلة ليست في تغذيتك المحلية",
+ melodyUploadBcsButton: "نشر",
+ melodyUploadBcsNameNote: "سيُنشر الملف الصوتي بالاسم المُنشأ تلقائيًا",
+ melodyUploadBcsTitle: "نشر",
+ melodyUploadStegoLabel: "رسالة مخفية (إخفاء المعلومات)",
+ melodyUploadStegoMaxLabel: "280 حرفًا كحد أقصى",
+ melodyUploadStegoPlaceholder: "اختياري.",
+ padsNoItems: "لم يتم العثور على مستندات تعاونية.",
+ padVersionHistory: "سجل الإصدارات",
+ padAttributionView: "حسب المؤلفة",
+ padVersionView: "عرض",
+ statsChat: "المحادثات",
+ statsChatMessage: "رسائل المحادثة",
+ statsGameScore: "الألعاب",
+ statsWiki: "صفحات الويكي",
+ statsPad: "المستندات التعاونية",
+ statsPadEntry: "مدخلات المستندات التعاونية",
+ statsTombstoneEmpty: "لا توجد عناصر محذوفة (tombstones) في الشبكة بعد.",
+ typeGameScore: "نتائج الألعاب",
bankTaxesLookupNote: "أدخل معرف كتلة للبحث عنه في خلاصتك المحلية.",
bankTaxesUserNoteChipsClick: "انقر على أي شريحة لفحص كتلتها في blockexplorer.",
mapUrlPlaceholder: "/maps/MAP_ID",
@@ -3523,6 +4702,14 @@ module.exports = {
settingsReplicationTitle: "النسخ",
settingsReplicationDesc: "اضبط عدد القفزات التي يتبعها نظيرك انطلاقًا من خلاصتك عند نسخ المحتوى.",
settingsReplicationHopsLabel: "قفزات",
+ settingsBlobCacheTitle: "ذاكرة الوسائط المؤقتة",
+ settingsBlobCacheDesc: "يُحفظ محتوى السكان الآخرين على هذا الجهاز. اختر المساحة التي يمكنه شغلها.",
+ settingsBlobCacheUsage: "الاستخدام الحالي",
+ settingsBlobCacheFiles: "ملفات",
+ settingsBlobCacheLimit: "الحد",
+ settingsBlobCacheUnlimited: "بلا حد",
+ settingsBlobCacheCleanNow: "تنظيف الآن",
+ settingsBlobCacheCleaned: "تمت إزالة {n} ملفات وتحرير {size}.",
aiApproveTagsLabel: "وسوم (مفصولة بفواصل)",
aiApproveTagsPlaceholder: "مثلاً oasis، حوكمة، بيئة",
aiApproveRatingLabel: "التقييم",
@@ -3550,8 +4737,6 @@ module.exports = {
larpInviteBannerHint: "شارك هذا الرمز مع شخص في ACADEMIA. ينتهي خلال 30 دورة أو بعد استخدام واحد.",
larpTestRankingTitle: "النقاط لكل بيت",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "رمز دعوة بيت",
- invitesHouseJoinButton: "الانضمام إلى البيت",
larpLastAttemptTitle: "آخر محاولاتك",
larpLastAttemptHouse: "البيت",
larpLastAttemptWhen: "متى",
@@ -3569,7 +4754,7 @@ module.exports = {
larpBadgeYou: "أنت",
larpBadgeRuling: "يحكم",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "وحدة طبقة لعب الأدوار الحية في Oasis (البيوت التسعة).",
+ modulesLarpDescription: "وحدة لطبقة لعب الأدوار الحيّ.",
larpProfileQ1: "عند مواجهة مشكلة معقدة، ما الذي تفعله أولاً؟",
larpProfileQ1O1: "التحدث مع الآخرين للوصول إلى توافق",
larpProfileQ1O2: "بناء نموذج أولي لاختباره",
@@ -3643,7 +4828,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "اختر وضع التنقل UX الذي تريده لواجهتك.",
uxModeMenus: "الكتل",
- uxModeAINav: "AI",
+ uxModeChats: "المحادثات",
+ uxModeFeed: "التدوين المصغر",
+ feedTrendingTitle: "الوسوم الرائجة",
+ feedActiveTitle: "السكان النشطون",
+ cnBrandSub: "حر · P2P · اتحادي",
+ cnSyncedPeers: "العقد المتزامنة",
+ cnLicense: "الرخصة",
+ cnNotAccessible: "المحتوى غير متاح في هذه اللحظة.",
+ cnUntitled: "بلا عنوان",
+ cnSearchPlaceholder: "بحث…",
+ cnHubTitle: "مركز Clearnet",
+ cnHubDescription: "محتوى عام يشاركه سكان شبكة Oasis هذه.",
+ cnHubEmpty: "لم تتم مشاركة أي محتوى عام على Clearnet بعد.",
+ cnPublicContent: "المحتوى",
+ cnTribesContent: "القبائل",
+ cnNetworkContent: "الشبكة",
+ cnCategoryEmpty: "لا يوجد محتوى في هذه الفئة.",
+ cnInhabitantEmpty: "لم ينشر هذا الساكن أي محتوى على Clearnet بعد.",
+ cnPrevPage: "← السابق",
+ cnNextPage: "التالي →",
+ cnPageOf: "صفحة {page} من {pages}",
+ cnMoreInfo: "مزيد من المعلومات ←",
+ cnOpenCourse: "دورة مفتوحة",
+ cnAuction: "مزاد",
+ cnExchange: "تبادل",
+ cnRssDescription: "نشرها سكان هذا المركز",
+ cnKindAudio: "صوت",
+ cnKindBlog: "مدونة",
+ cnKindBookmark: "إشارة مرجعية",
+ cnKindDocument: "مستند",
+ cnKindEvent: "حدث",
+ cnKindFeed: "تغذية",
+ cnKindImage: "صورة",
+ cnKindJob: "وظيفة",
+ cnKindMarket: "سوق",
+ cnKindPodcast: "بودكاست",
+ cnKindProject: "مشروع",
+ cnKindCourse: "دورة",
+ cnKindShop: "متجر",
+ cnKindTorrent: "تورنت",
+ cnKindFile: "ملف",
+ cnKindVideo: "فيديو",
+ cnKindWiki: "ويكي",
+ cnKindRoom: "غرفة",
+ cnKindMap: "خريطة",
+ uxModeAINav: "الذكاء الاصطناعي",
}
};
diff --git a/src/client/assets/translations/oasis_ca.js b/src/client/assets/translations/oasis_ca.js
new file mode 100644
index 0000000..0129a4e
--- /dev/null
+++ b/src/client/assets/translations/oasis_ca.js
@@ -0,0 +1,4880 @@
+const { a, em, strong } = require('../../../server/node_modules/hyperaxe');
+module.exports = {
+ ca: {
+ shopOrderStatusPaid: "Pagament rebut",
+ shopOrderStatusReceived: "Rebut",
+ shopOrderMarkPaid: "Marcar pagament rebut",
+ shopOrderConfirmReceived: "Confirmar rebut",
+ shopMyOrdersTitle: "Les meves comandes",
+ shopPurchasesButton: "Compres",
+ shopMyOrdersDescription: "Les teves comandes de compra.",
+ shopMyOrdersEmpty: "Encara no tens compres.",
+ shopOrderPmSeller: "PM Venedor",
+ shopOrderSeller: "Venedor",
+ shopOrderInvoice: "Factura",
+ shopOrderInvoiceConcept: "Factura",
+ shopOrderStatusPending: "Pendent",
+ shopOrderStatusAccepted: "Acceptat",
+ shopOrderStatusRejected: "Rebutjat",
+ shopOrderStatusShipped: "Enviat",
+ shopOrderAccept: "Acceptar",
+ shopOrderReject: "Rebutjar",
+ shopOrderMarkShipped: "Marcar enviat",
+ shopOrderPmBuyer: "PM Comprador",
+ shopOrderContractConcept: "Comanda de botiga",
+ shopOrdersPending: "Comandes pendents",
+ all: "Tots",
+ mine: "Meus",
+ recent: "Recents",
+ anonymous: "Anònim",
+ unnamed: "Anònim",
+ authorLabel: "Autoria",
+ delete: "Eliminar",
+ save: "Desar",
+ vote: "Votar",
+ url: "URL",
+ price: "Preu",
+ priority: "Prioritat",
+ severity: "Gravetat",
+ organizer: "Organitzador",
+ edited: "editat",
+ isPublic: "Públic",
+ searchIsPublicLabel: "Públic",
+ privacyPrivate: "PRIVAT",
+ privacyPublic: "PÚBLIC",
+ notFound: "No trobat",
+ no_results: "Sense dades",
+ searchButton: "Cercar",
+ mapZoomLabel: "Zoom",
+ modulesTitle: "Mòduls",
+ viewJson: "Veure JSON",
+ matchScore: "Puntuació de coincidència",
+ preferencesLabel: "Preferències",
+ inhabitantProfileTitle: "Habitant",
+ contentWarningLabel: "Avís de contingut",
+ invalidPost: "Contingut no vàlid",
+ invalidPostHint: "Aquest missatge té el text buit o no vàlid.",
+ spreadChron: "Rèpliques",
+ spreaded: "Replicat",
+ spreadContentUnavailable: "Contingut encara no disponible (replicació pendent)",
+ filteredByTag: "Filtrat per etiqueta",
+ filteredByTagTitle: "Filtrat per etiqueta",
+ feedPublishedSuccess: "Publicació creada correctament!",
+ feedMastodonFailed: "S'ha publicat a Oasis, però no s'ha pogut enviar a Mastodon.",
+ tribeFeedSent: "Missatge enviat correctament!",
+ tribeContentEncrypted: "Contingut xifrat",
+ tribeTorrentsEmpty: "Encara no hi ha torrents.",
+ torrentDescription: "Descripció",
+ torrentDownload: "Baixar",
+ chatInviteMode: "Convidar",
+ padInviteMode: "Convidar",
+ noInviteMode: "Sense mode d'invitació",
+ noDeadline: "Sense data límit",
+ noStatus: "Sense estat",
+ noSeverity: "Sense gravetat",
+ calendarDeleteDate: "Eliminar data",
+ calendarIntervalUntil: "Fins a",
+ bookmarkLastVisit: "Darrera visita",
+ profileClearnetBookmarksLabel: "Marcadors",
+ invitesPort: "Port",
+ peerHostValidation: "IPv4 vàlida (p. ex. 192.168.1.100) o nom d'amfitrió (p. ex. pub.solarnethub.com)",
+ peerPortValidation: "Port 1-65535",
+ peerKeyValidation: "Clau pública SSB ed25519 (@<44 caràcters base64>=.ed25519)",
+ inboxJobUnsubscribedTitle: "Baixa de la teva oferta de feina",
+ inboxProjectFollowedTitle: "Nou seguidor del teu projecte",
+ inboxProjectUnfollowedTitle: "Ha deixat de seguir el teu projecte",
+ pmHasFollowedYourProject: "ha seguit el teu projecte",
+ pmHasUnfollowedYourProject: "ha deixat de seguir el teu projecte",
+ pmHasUnsubscribedFromYourJobOffer: "s'ha donat de baixa de la teva oferta de feina",
+ marketDeleteButton: "Eliminar",
+ marketNoBids: "Encara no s'han fet licitacions.",
+ marketAuctionBidAmount: "Import de la licitació",
+ marketAuctionBidTime: "Hora de la licitació",
+ marketAuctionUser: "Licitador",
+ parliamentActorInPower: "TRIBU GOVERNANT",
+ parliamentWinningCandidature: "Candidatura guanyadora",
+ projectBounty: "Recompensa",
+ projectFollowing: "SEGUINT",
+ projectBackerAuthor: "Mecenes",
+ projectBackerDate: "Data",
+ projectConfirmTransferButton: "Confirmar transferència",
+ projectPendingTransfersTitle: "Transferències pendents",
+ transfersUpdateSectionTitle: "Actualitzar transferència",
+ taskUnassignedFrom: "Desassignat de",
+ taskDescriptionPlaceholder: "Descripció de la tasca",
+ exportPasswordLabel: "Contrasenya d'exportació",
+ importPasswordPlaceholder: "Introdueix la contrasenya",
+ searchCasesPlaceholder: "Cercar a Tribunals...",
+ shopBuyDeliveryAddressPlaceholder: "Adreça de lliurament",
+ shopBuyNotesPlaceholder: "Notes",
+ bankTaxesUserNoteBold: "reduir directament l'impost ECO",
+ bankTaxesUserNoteIntro: "El teu impost ECO es dedueix de l'excedent que la xarxa genera per sobre de la teva RBU; el valor base de la RBU es fixa com a mínim inamovible. L'impost mai no es dedueix de la quantitat fixa que correspon a cada habitant com a RBU. Els fons deduïts alimenten l'algorisme de redistribució de la riquesa i es canalitzen de tornada cap a altres habitants mitjançant les seves reclamacions de RBU. Aquests altres habitants que reben més RBU per als seus projectes probablement tindran alguna tasca dedicada a ajudar-te a reduir el teu impost ECO. O poden dedicar-se a ",
+ bankTaxesUserNoteOutro: ", i el consens de la xarxa pot requerir-ne la contribució contínua.",
+ courtsViewDetails: "Veure",
+ courtsViewDetailsShort: "Detalls",
+ courtsThDetails: "Detalls",
+ courtsDetailsAnswersTitle: "Respostes",
+ courtsDetailsEvidenceTitle: "Proves",
+ courtsDetailsSettlementsTitle: "Acords",
+ courtsDetailsVerdictTitle: "Veredicte",
+ courtsDetailsNotPublic: "No públic",
+ courtsEvidenceSideAccuser: "Proves de l'acusador",
+ courtsEvidenceSideRespondent: "Proves de la defensa",
+ courtsEvidenceSideUnknown: "Desconegut",
+ courtsJudgeNotAssigned: "-",
+ courtsSupportCase: "Donar suport al cas",
+ courtsSettlementAcceptBtn: "Acceptar l'acord",
+ courtsSupportCount: "Suports",
+ reportsSetStatus: "Canviar l'estat",
+ reportsStatusClosed: "TANCAT",
+ statsAvgPerInhabitant: "Mitjana per habitant",
+ statsCarbonMaxAnnual: "Estimació màx. anual",
+ statsCarbonNetwork: "Total de la xarxa",
+ statsCarbonOfEstMax: "de la capacitat màx. estimada",
+ statsCarbonYearProgress: "de l'any transcorregut",
+ statsNetworkTitle: "Xarxa",
+ statsStorageTitle: "Emmagatzematge",
+ statsEcoTaxTitle: "Taxa ECO",
+ statsAccountTitle: "Compte",
+ statsAveragesTitle: "Mitjanes",
+ statsCarbonOfNetwork: "del total de la xarxa",
+ statsCarbonUser: "La teva petjada",
+ statsContentCountColumn: "Quantitat",
+ statsContentTypeColumn: "Tipus",
+ statsMsgsPerDay: "Missatges/dia (històric)",
+ statsMyShare: "La teva part de la xarxa",
+ statsNetworkSpan: "Antiguitat de la xarxa",
+ statsTombstoneRatioLabel: "Proporció d'esborrats",
+ statsTopTagsTitle: "Etiquetes principals",
+ statsTopTypesTitle: "Tipus de contingut principals",
+ statsTotalMsgs: "Missatges totals",
+ extended: "Multivers",
+ extendedDescription: [
+ "Quan dones suport a algú, pots baixar les publicacions dels habitants a qui dona suport, i aquestes publicacions apareixeran aquí, ordenades per la més recent.",
+ ],
+ popular: "Destacades",
+ popularDescription: [
+ "Publicacions d'habitants de la teva xarxa, ",
+ strong("ordenades per suports"),
+ ". Selecciona el període de temps per obtenir una llista.",
+ ],
+ week: "Setmana",
+ month: "Mes",
+ year: "Any",
+ latest: "Darrers",
+ latestDescription: [
+ strong("Publicacions"),
+ " teves i d'habitants a qui dones suport, ordenades per les més recents.",
+ ],
+ topics: "Temes",
+ topicsDescription: [
+ strong("Temes"),
+ " teus i d'habitants a qui dones suport, ordenats pels més recents.",
+ ],
+ summaries: "Resums",
+ summariesDescription: [
+ strong("Temes i alguns comentaris"),
+ " teus i d'habitants a qui dones suport, ordenats pels més recents.",
+ ],
+ threads: "Fils",
+ threadsDescription: [
+ strong("Publicacions que tenen comentaris"),
+ " d'habitants a qui dones suport i del teu multivers, ordenades per les més recents.",
+ ],
+ profile: "Avatar",
+ inhabitants: "Habitants",
+ peersReplicatedFeeds: "Replicats",
+ peersTorColumn: "TOR",
+ peersTorYes: "Accessible per Tor",
+ peersTorNo: "No accessible per Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Versió",
+ graphos: "Graphos",
+ graphosDescription: "Mapa interactiu de la xarxa al teu voltant.",
+ graphosFederation: "Federació",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Inabastables",
+ graphosFedLinks: "Enllaços mutus",
+ graphosFedIsolated: "Aïllats",
+ graphosFedNoData: "Sense dades",
+ graphosFedMutual: "Mutu",
+ graphosFedOneWay: "En un sentit",
+ graphosFedTransport: "Xarxa",
+ graphosFedWith: "Federat amb",
+ graphosZoom: "Amplia",
+ graphosFedInhabitants: "Habitants",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "El teu node encara no coneix cap PUB.",
+ graphosViewingGraphOf: "Veient",
+ graphosBackToMine: "← La meva xarxa",
+ graphosShowing: "Mostrant",
+ graphosYou: "Tu",
+ graphosTotalNodes: "Nodes totals",
+ mentions: "Mencions",
+ mentionsDescription: [
+ strong("Tots els missatges que et @mencionen"),
+ ".",
+ ],
+ noMentions: "Encara no has rebut @mencions.",
+ mentionsSearchPlaceholder: "Cercar a Mencions...",
+ privateReminders: "RECORDATORIS",
+ inboxFilterPms: "PMs",
+ inboxFilterNotifications: "Notificacions",
+ inboxMarkRead: "Marcar com a llegit",
+ inboxMarkUnread: "Marcar com a no llegit",
+ inboxUnreadChip: "No llegit",
+ inboxMarkAllRead: "Marcar-ho tot com a llegit",
+ inboxDeleteShown: "Esborrar-ho tot",
+ inboxArchive: "Arxivar",
+ inboxUnarchive: "Desarxivar",
+ inboxFilterArchived: "Arxivats",
+ inboxEarlierMessages: "missatges anteriors",
+ inboxSortThread: "Per fil",
+ inboxSortRecent: "Més recents primer",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Notificacions de l'Inbox",
+ settingsInboxBotsDesc: "Tria quins bots et poden avisar a l'Inbox. Els bots desmarcats s'amaguen i els seus avisos no es compten.",
+ inboxFiltersLabel: "Filtres:",
+ inboxToggleToMutuals: "Canviar a mutus",
+ inboxToggleToWhole: "Canviar a tots",
+ privateDate: "Data",
+ peers: "Nodes",
+ searchDescription: "Descripció",
+ searchFromLabel: "Des de",
+ searchToLabel: "Fins a",
+ searchQueryLabel: "Cerca",
+ searchPerPageLabel: "Resultats",
+ settings: "Configuració",
+ settingsDescription: "Configura l'entorn de la teva xarxa.",
+ continueReading: "Continuar llegint",
+ moreComments: "més comentaris",
+ readThread: "llegir la resta del fil",
+ pixeliaTitle: "Pixelia",
+ pixeliaDescription: "Dibuixa píxels en una graella i colabor-ART amb habitants de la teva xarxa.",
+ melodyTitle: "Melody",
+ melodyDescription: "Reprodueix la melodia de la teva blockchain — cada bloc es converteix en una nota.",
+ melodyEmpty: "Encara no hi ha notes — la teva blockchain encara no ha generat cap bloc.",
+ melodyTotalBlocks: "Notes",
+ melodyFilterAll: "TOTES",
+ melodyRegenerate: "Regenerar",
+ melodyDownload: "Baixar BCS",
+ profileContentSectionTitle: "Contingut de l'Avatar",
+ profileContentHelp: "Tria quins mòduls es mostraran al teu avatar.",
+ profileSensorsHelp: "Mètriques opcionals que es mostren al teu avatar.",
+ profileClearnetHelp: "Mòduls que es poden consultar des de fora d'Oasis.",
+ profileHubAll: "Tot",
+ footerLicenseLabel: "Llicència",
+ profileVisibilityFediverse: "Multivers",
+ contributorsTitle: "Contribucions",
+ colorLabel: "Tria un color",
+ paintButton: "Dibuixar!",
+ totalPixels: "Total de píxels",
+ modules: "Mòduls",
+ modulesViewTitle: "Mòduls",
+ modulesViewDescription: "Defineix el teu entorn ideal activant i desactivant mòduls.",
+ inbox: "Bústia",
+ inboxSearchPlaceholder: "Cercar a la Bústia...",
+ multiverse: "Multivers",
+ fediverse: "Multivers",
+ fediverseDescription: "Gestiona els teus altres comptes del multivers, incloent-hi enviar i rebre contingut.",
+ fediverseStatus: "Estat",
+ fediverseDisconnected: "Multivers desconnectat. Comprova %LINK% o l'estat de la connexió.",
+ fediverseSettingsTitle: "Multivers",
+ fediverseInstanceLabel: "Adreça",
+ fediverseTokenLabel: "Testimoni d'accés",
+ fediverseConnect: "Connectar",
+ fediverseConnectedAs: "Connectat com a",
+ nextcloudServerLabel: "Servidor",
+ nextcloudUserLabel: "Usuari",
+ nextcloudFolderLabel: "Carpeta",
+ nextcloudUploadButton: "Pujar",
+ nextcloudFileLabel: "Tria un fitxer",
+ fileExternalLink: "Enllaç extern",
+ nextcloudErrConnect: "No s'ha pogut arribar a Nextcloud amb aquestes dades.",
+ nextcloudErrUpload: "La pujada a Nextcloud ha fallat.",
+ nextcloudErrShare: "Nextcloud no ha donat cap enllaç públic per al fitxer.",
+ fediverseDisconnect: "Desconnectar",
+ fediverseEmptyLink: "la teva configuració",
+ fediverseComposePlaceholder: "Què estàs pensant?",
+ fediverseReplyPlaceholder: "Escriu la teva resposta…",
+ fediverseAttach: "Adjuntar multimèdia",
+ fediversePublish: "Publicar",
+ fediverseReply: "Respondre",
+ fediverseBoosted: "ha impulsat",
+ fediverseNoPosts: "La teva cronologia és buida.",
+ fediverseTimeline: "Cronologies",
+ fediverseFollowers: "Seguidors",
+ fediverseFollowing: "Seguint",
+ fediversePosts: "Publicacions",
+ fediverseJoined: "S'hi va unir",
+ fediverseRefresh: "Actualitzar",
+ fediverseWrite: "Escriure",
+ fediversePreview: "Previsualització",
+ fediverseManage: "Gestionar",
+ fediverseError: "No s'ha pogut contactar amb Mastodon.",
+ fediverseErrInstance: "URL d'instància no vàlid.",
+ fediverseErrAuth: "Testimoni no vàlid o caducat.",
+ fediverseErrConnect: "No s'ha pogut connectar amb la instància.",
+ fediverseErrToken: "Cal un testimoni.",
+ fediverseErrPublic: "No disponible en mode públic.",
+ fediverseErrFetch: "No s'ha pogut carregar la cronologia.",
+ fediverseErrPost: "No s'ha pogut publicar.",
+ fediverseErrMedia: "No s'ha pogut pujar el fitxer.",
+ fediverseErrEmpty: "Escriu alguna cosa o adjunta un fitxer.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Número de telèfon",
+ telegramSendCode: "Enviar codi",
+ telegramCodeHelp: "Introdueix el codi que Telegram t'acaba d'enviar (app o SMS).",
+ telegramCodeLabel: "Codi",
+ telegramPasswordHelp: "Aquest compte té verificació en dos passos. Introdueix la teva contrasenya.",
+ telegramPasswordLabel: "Contrasenya",
+ telegramVerify: "Verificar",
+ telegramCancel: "Cancel·lar",
+ telegramChats: "Xats",
+ telegramUnread: "Sense llegir",
+ telegramOpen: "Obrir",
+ telegramSend: "Enviar",
+ telegramYou: "Tu",
+ telegramNoChats: "Encara no hi ha xats.",
+ telegramNoMessages: "Encara no hi ha missatges.",
+ telegramComposePlaceholder: "Escriu un missatge…",
+ telegramChannel: "Canal",
+ telegramGroup: "Grup",
+ telegramPrivate: "Privat",
+ telegramErrConnect: "No s'ha pogut contactar amb Telegram.",
+ telegramErrTimeout: "Telegram ha trigat massa a respondre.",
+ telegramErrAuth: "Sessió de Telegram no vàlida o caducada. Torna-la a connectar.",
+ telegramErrFetch: "No s'han pogut carregar els xats.",
+ telegramErrSend: "No s'ha pogut enviar el missatge.",
+ telegramErrMissing: "Calen l'API ID, l'API hash i el número de telèfon.",
+ telegramErrCode: "Codi incorrecte. Torna-ho a provar.",
+ telegramErrCodeExpired: "El codi ha caducat. Torna a començar.",
+ telegramErrPassword: "Contrasenya incorrecta.",
+ telegramErrPhone: "Número de telèfon no vàlid.",
+ telegramErrApi: "API ID o API hash no vàlids.",
+ telegramErrFlood: "Massa intents. Espera una estona i torna-ho a provar.",
+ telegramErrNoLogin: "No hi ha cap inici de sessió en curs. Torna a començar.",
+ peertubeUsernameLabel: "Usuària",
+ peertubePasswordLabel: "Contrasenya",
+ peertubeSubscriptions: "Subscripcions",
+ peertubeMyVideos: "Els meus vídeos",
+ peertubeVideos: "Vídeos",
+ peertubeFollowers: "Seguidores",
+ peertubeViews: "visualitzacions",
+ peertubeLikes: "m'agrada",
+ peertubeQuota: "Quota",
+ peertubeUpload: "Pujar vídeo",
+ peertubeUploadHelp: "Tria un fitxer de vídeo. Es puja al teu canal i PeerTube el processa després.",
+ peertubeTitleLabel: "Títol",
+ peertubeDescriptionLabel: "Descripció",
+ peertubePrivacyLabel: "Privacitat",
+ peertubePrivacyPublic: "Públic",
+ peertubePrivacyUnlisted: "No llistat",
+ peertubePrivacyPrivate: "Privat",
+ peertubeNoVideos: "Encara no hi ha vídeos.",
+ peertubeComments: "Comentaris",
+ peertubeComment: "Comentar",
+ peertubeCommentPlaceholder: "Escriu un comentari…",
+ peertubeNoComments: "Encara no hi ha comentaris.",
+ peertubeOpen: "Obrir a PeerTube",
+ peertubeWatch: "Veure",
+ peertubeChannel: "Canal",
+ peertubeNoStream: "Aquest vídeo encara no es pot reproduir aquí. Obre'l a PeerTube.",
+ peertubeUploaded: "Vídeo pujat. PeerTube l'està processant.",
+ peertubeErrConnect: "No s'ha pogut contactar amb PeerTube.",
+ peertubeErrAuth: "Usuària o contrasenya incorrectes, o la sessió ha caducat. Connecta-la de nou.",
+ peertubeErrInstance: "URL d'instància no vàlida.",
+ peertubeErrMissing: "Calen instància, usuària i contrasenya.",
+ peertubeErrFetch: "No s'han pogut carregar els vídeos.",
+ peertubeErrUpload: "No s'ha pogut pujar el vídeo.",
+ peertubeErrTitle: "Cal un títol.",
+ peertubeErrComment: "No s'ha pogut publicar el comentari.",
+ peertubeErrNoFile: "Tria un fitxer de vídeo.",
+ bookmarksLabel: "Marcadors",
+ videosLabel: "Vídeos",
+ torrentsLabel: "Torrents",
+ docsLabel: "Documents",
+ audiosLabel: "Àudios",
+ tagsLabel: "Etiquetes",
+ imagesLabel: "Imatges",
+ inhabitantsLabel: "Habitants",
+ trendingLabel: "Tendències",
+ eventsLabel: "Esdeveniments",
+ apply: "Aplicar",
+ menuPersonal: "Personal",
+ menuGovernance: "Governança",
+ menuOffice: "Oficina",
+ menuNetwork: "Comunitat",
+ menuCreative: "Creatiu",
+ menuEconomy: "Economia",
+ menuMedia: "Biblioteca",
+ menuTools: "Eines",
+ comment: "Comentar",
+ subtopic: "Subtema",
+ json: "JSON",
+ unfollow: "Deixar de donar suport",
+ follow: "Donar suport",
+ block: "Bloquejar",
+ unblock: "Desbloquejar",
+ relationshipNotFollowing: "No et dona suport",
+ relationshipTheyFollow: "Et dona suport",
+ relationshipMutuals: "Suport mutu",
+ relationshipFollowing: "Li dones suport",
+ relationshipYou: "Tu",
+ relationshipBlocking: "L'estàs bloquejant",
+ relationshipBlockedBy: "Et bloqueja",
+ relationshipMutualBlock: "Bloqueig mutu",
+ relationshipNone: "No li dones suport",
+ relationshipBlockingPost: "Post bloquejat",
+ viewLikes: "Veure rèpliques",
+ viewSupporters: "Veure suports",
+ spreadedDescription: "Llista de continguts replicats per habitant.",
+ preview: "Previsualitzar",
+ publish: "Publicar",
+ contentWarningPlaceholder: "Afegeix un títol al teu post (opcional)",
+ publishWarningPlaceholder: "Escriu el cos de la teva entrada.",
+ publishTooLong: "La teva publicació és massa llarga. Escurça-la, si us plau.",
+ keepTextRetry: "Envia de nou",
+ dateInPastError: "La data no pot ser anterior a avui",
+ publishCustomDescription: [
+ "RECORDA: A causa de la tecnologia blockchain, un cop has publicat alguna cosa, no es pot editar ni esborrar. Pensa-t'ho bé!",
+ ],
+ commentWarning: [
+ "RECORDA: A causa de la tecnologia blockchain, un cop has publicat alguna cosa, no es pot editar ni esborrar. Pensa-t'ho bé!",
+ ],
+ commentLabel: ({ publicOrPrivate, markdownUrl }) => [
+ ],
+ publishLabel: ({ markdownUrl, linkTarget }) => [
+ "RECORDA: A causa de la tecnologia blockchain, un cop has publicat alguna cosa, no es pot editar ni esborrar. Pensa-t'ho bé!",
+ ],
+ replyLabel: ({ markdownUrl }) => [
+ "RECORDA: A causa de la tecnologia blockchain, un cop has publicat alguna cosa, no es pot editar ni esborrar. Pensa-t'ho bé!",
+ ],
+ publishCustomInfo: ({ href }) => [
+ "Si tens experiència, també pots ",
+ a({ href }, "escriure un post avançat"),
+ ".",
+ ],
+ publishBasicInfo: ({ href }) => [
+ "Si no tens experiència, hauries d'",
+ a({ href }, "escriure un post normal"),
+ ".",
+ ],
+ publishCustom: "Escriure un post avançat",
+ messagePreview: "Previsualització",
+ mentionsMatching: "Mencions",
+ mentionsName: "Nom",
+ mentionsRelationship: "Relació",
+ updateBannerText: "Hi ha una nova versió d'Oasis disponible.",
+ updateBannerAction: "Actualitzar ara!",
+ info: "Info",
+ settingsIntro: ({ version }) => [
+ `[SNH] ꖒ OASIS [ v.${version} ]`,
+ ],
+ timeAgo: "fa",
+ sendTime: "escrit ",
+ theme: "Tema",
+ backupKeysExportButton: "Exportar",
+ backupKeysImportButton: "Importar",
+ ssbLogStream: "Blockchain",
+ ssbLogStreamDescription: "Configura el límit de missatges per als fluxos de la blockchain.",
+ logWindowChip: "Darrers {n} streams de la blockchain",
+ saveSettings: "Desar la configuració",
+ exportDescription: "Estableix una contrasenya (mínim 32 caràcters de llargada) per xifrar el teu secret",
+ exportDataTitle: "Còpia instantània",
+ exportDataDescription: "Baixar la teva blockchain (clau privada exclosa!)",
+ exportDataButton: "Baixar la blockchain",
+ importDescription: "Importa el teu secret xifrat (clau privada) per activar el teu avatar",
+ passwordImport: "Escriu la teva contrasenya per desxifrar les dades que es desaran al teu sistema (nom: secret)",
+ exportPasswordPlaceholder: "Utilitza minúscules, majúscules, números i símbols",
+ fileInfo: "El teu secret xifrat es baixarà al teu dispositiu (nom: oasis.enc)",
+ developer: "Desenvolupament",
+ devTitle: "Desenvolupament",
+ welcomeBannerText: "El teu avatar encara no està configurat.",
+ aiSuggestionBanner: "Suggeriment:",
+ aiSuggestionsEnable: "Suggeriments de la IA",
+ welcomeBannerAction: "Començar",
+ welcomeTitle: "Benvinguda",
+ welcomeStepIdentity: "Identitat",
+ welcomeStepType: "Tipus",
+ welcomeStepUse: "Ús",
+ welcomeStepLook: "Aparença",
+ welcomeStepCommunity: "Comunitat",
+ welcomeStepIntro: "Benvinguda",
+ welcomeHintIdentity: "El teu nom i la teva imatge.",
+ welcomeHintType: "Com s'obre Oasis per a tu.",
+ welcomeHintUse: "Quins mòduls queden actius.",
+ welcomeHintLook: "El tema que vesteix Oasis.",
+ welcomeHintCommunity: "Entra en un PUB per conèixer altres habitants.",
+ welcomeHintIntro: "Envia una primera salutació a la comunitat.",
+ welcomeStepThemeAction: "Fes servir aquest tema",
+ welcomeJoinPubs: "Entra als PUBs",
+ welcomeNoFederation: "Sense federar-se",
+ welcomeStepGreetingAction: "Enviar feed",
+ welcomeDescription: "Unes quantes coses que convé fer abans de començar.",
+ welcomeSkip: "Ara no",
+ welcomeStepProfileAction: "Desar el perfil",
+ welcomeBootstrapRunning: "Carregant la instantània del pub. En acabar s'uneix al pub automàticament; mentrestant pots continuar fent servir Oasis.",
+ welcomeCompleteTitle: "Tot a punt.",
+ welcomeCompleteText: "El teu node està preparat. A partir d'aquí la xarxa creix amb els habitants a qui dones suport.",
+ welcomeFindPeople: "Cercar habitants",
+ devFilterFiles: "FITXERS",
+ devFilterSearch: "CERCAR",
+ devFilterModules: "MÒDULS",
+ devFilterTranslations: "TRADUCCIONS",
+ devFilterStyles: "ESTILS",
+ devFilterTests: "TESTS",
+ devVersion: "Versió",
+ devNodeVersion: "Node",
+ devStatsTests: "Tests",
+ devParentFolder: "Carpeta superior",
+ devOpenFolder: "obrir",
+ devDescription: "Explora el codi que s'està executant en aquest node.",
+ devRoot: "arrel",
+ devSearchPlaceholder: "Text a cercar al codi",
+ devAnyExtension: "Qualsevol fitxer",
+ devStatsFiles: "Fitxers",
+ devStatsLines: "Línies",
+ devStatsModules: "Mòduls",
+ devStatsLanguages: "Idiomes",
+ devNotViewable: "no visualitzable",
+ devEmptyFolder: "Aquesta carpeta és buida.",
+ devSize: "Mida",
+ devShowing: "Mostrant",
+ devLine: "línia",
+ devReportBug: "Informar d'un error",
+ devCreateTask: "Crear tasca",
+ devRaw: "RAW",
+ devReportContext: "Trobat llegint el codi d'Oasis",
+ devTaskPrefix: "Revisar",
+ devPrevPage: "Línies anteriors",
+ devNextPage: "Línies següents",
+ devMatches: "coincidències",
+ devFilesScanned: "fitxers revisats",
+ devNoResults: "Encara no hi ha coincidències.",
+ devColModule: "Mòdul",
+ devColState: "Estat",
+ devColModel: "Model",
+ devColView: "Vista",
+ devColRoutes: "Rutes",
+ devColTests: "Tests",
+ devOn: "actiu",
+ devOff: "inactiu",
+ modulesDevLabel: "Desenvolupament",
+ modulesDevDescription: "Mòdul per gestionar el codi d'Oasis.",
+ themeIntro:
+ "Tria un tema.",
+ setTheme: "Establir el tema",
+ language: "Idioma",
+ languageDescription:
+ "Si vols utilitzar un altre idioma, selecciona'l aquí.",
+ setLanguage: "Establir l'idioma",
+ peerConnectionsIntro: "Gestiona totes les teves connexions amb altres nodes.",
+ peersConnectFailed: "No s'ha pogut connectar: {reason}.",
+ peerStateLabel: "Estat",
+ peerAddressLabel: "Adreça",
+ peerLastChangeLabel: "Darrer canvi",
+ peerStateConnected: "Connectat",
+ peerStateConnecting: "Connectant",
+ peerStateStaged: "Disponible",
+ peerErrSilent: "Sense activitat",
+ peerErrTimeout: "No respon",
+ peerErrRefused: "Rebutja la connexió",
+ peerErrNotFound: "Adreça desconeguda",
+ peerErrUnreachable: "Xarxa inaccessible",
+ peerErrKeys: "Fent servir claus diferents",
+ peerErrIdentity: "No accepta la teva connexió",
+ peerErrTor: "Només TOR",
+ peerErrDropped: "Connexió tallada",
+ peerErrPaused: "Xarxa en pausa",
+ peerErrOther: "Error de connexió",
+ peerOutdated: "Desactualitzat",
+ peerVersionUnannounced: "No anuncia la seva versió: un Oasis antic",
+ peersTorMissing: "Aquest PUB només permet connexions des de TOR.",
+ peerConnectionsTitle: "Connexions",
+ online: "Connectat",
+ offline: "Desconnectat",
+ discovered: "Descoberts",
+ unknown: "Desconeguts",
+ lanBroadcastActive: "Activa (multicast UDP a la LAN)",
+ peerSourceRpc: "RPC",
+ peerSourceGossip: "Gossip",
+ peerSourceEbt: "EBT",
+ peerSourceRecent: "Recent",
+ peerSourceLan: "LAN",
+ pub: "PUB",
+ supported: "Amb suport",
+ recommended: "Recomanat",
+ blocked: "Bloquejat",
+ noConnections: "No hi ha nodes connectats.",
+ noDiscovered: "No has descobert cap node.",
+ noUnknownPeers: "No hi ha nodes desconeguts al graf d'amistats.",
+ peersTechnicalEmpty: "Encara no hi ha nodes registrats.",
+ peerConnect: "Connectar",
+ peerDisconnect: "Desconnectar",
+ peerRefresh: "Refrescar",
+ peerPruneIdle: "Treure els inactius",
+ peersPause: "Pausa",
+ peersResume: "Reprèn",
+ peersPausedNote: "En pausa: Oasis no es connecta amb ningú i ningú s'hi pot connectar.",
+ peersPauseHint: "Atura totes les connexions: Oasis no es connecta a altres nodes ni els accepta fins que reprenguis.",
+ peerExport: "Exportar",
+ peerImport: "Importar",
+ peerImportTitle: "Importar una llista de nodes",
+ peerImportPlaceholder: "Enganxa una adreça multiserver per línia, o puja un fitxer .txt…",
+ connectionActionIntro:
+ "",
+ indexes: "Índexs",
+ indexesRebuilt: "Índexs reconstruïts",
+ indexesRebuildFailed: "No s'han pogut reconstruir els índexs",
+ indexesFiles: "Fitxers d'índex",
+ indexesDescription:
+ "Reconstruir els índexs és segur i pot arreglar alguns errors de la teva blockchain.",
+ homePageTitle: "Pàgina d'inici",
+ homePageDescription: "Selecciona quin mòdul vols com a pàgina d'inici.",
+ saveHomePage: "Establir la pàgina d'inici",
+ invites: "Invitacions",
+ invitesDescription: "Gestiona i aplica codis d'invitació a la teva xarxa.",
+ invitesPubsHint: "Enganxa un codi d'invitació d'un pub per federar-t'hi i començar a replicar els seus habitants.",
+ invitesFederationsHint: "Pubs amb què estàs federat: actualitza'ls, treu els inabastables o exporta la llista.",
+ invitesTribesTitle: "Tribus",
+ invitesChatsTitle: "Xats",
+ invitesPadsTitle: "Pads",
+ invitesCalendarsTitle: "Calendaris",
+ invitesEventsTitle: "Esdeveniments",
+ invitesForumsTitle: "Fòrums",
+ invitesMapsTitle: "Mapes",
+ invitesShopsTitle: "Botigues",
+ invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "PUBs Suggerits",
+ invitesFilterOthers: "Altres",
+ invitesJoinTitle: "Invitacions",
+ invitesJoinHint: "Enganxa qualsevol codi d'invitació, sigui del que sigui, o l'Oasis ID d'un habitant.",
+ invitesJoinPlaceholder: "Codi d'invitació o Oasis ID",
+ invitesJoinButton: "Entra",
+ invitesUsedTitle: "Últimes invitacions",
+ invitesUsedEmpty: "Encara no has utilitzat cap invitació.",
+ invitesUsedType: "Tipus",
+ invitesUsedName: "Nom",
+ invitesUsedDate: "Data",
+ invitesPubInviteCodePlaceholder: "Introdueix el codi d'invitació del PUB",
+ invitesAcceptInvite: "Entrar al PUB",
+ invitesPubUses: "Invitacions usades",
+ invitesPubExhausted: "Aquest PUB no té invitacions disponibles.",
+ invitesAlreadyFederated: "Ja estàs federat amb aquest pub.",
+ invitesJoinPubMode: "Aquest Oasis funciona com a PUB, en mode només lectura. Per unir-lo a un altre PUB, fes servir al terminal: ./oasis.sh join
",
+ invitesJoinLocalOnly: "Les invitacions només s'accepten des de l'equip on funciona Oasis, o amb l'enllaç d'administració que mostra en arrencar.",
+ invitesFederationsTitle: "Federacions",
+ invitesAcceptedInvites: "Federades",
+ invitesNoFederatedPubs: "No hi ha pubs federats.",
+ invitesPubsRefresh: "Refrescar",
+ invitesPubsClearUnreachable: "Netejar",
+ invitesPubsExport: "Exportar",
+ invitesPubsImport: "Importar",
+ invitesPubsImportTitle: "Importar pubs",
+ invitesPubsImportPlaceholder: "Enganxa una adreça multiserver o un codi d'invitació per línia, o puja un fitxer .txt…",
+ genericError: "S'ha produït un error.",
+ panicMode: "Mode pànic!",
+ encryptData: "Estableix una contrasenya (mínim 32 caràcters de llargada) per xifrar la teva blockchain",
+ decryptData: "Introdueix la contrasenya per desxifrar la teva blockchain",
+ removeDataDescription: "COMPTE: Aquest procés no es pot desfer.",
+ removePanicButton: "ESBORRAR TOTES LES TEVES DADES!",
+ searchTitle: "Cercar",
+ searchDescriptionLabel: "Cerca contingut a la teva xarxa.",
+ searchPlaceholder:"Cercar contingut...",
+ searchLocationLabel:"Localització",
+ searchPriceLabel:"Preu",
+ searchCategoryLabel:"Categoria",
+ searchPriorityLabel:"Prioritat",
+ searchStatusLabel:"Estat",
+ statusLabel:"Estat",
+ noResultsFound:"No s'han trobat resultats.",
+ votesOption:"Opinions votades",
+ voteYesLabel:"Sí",
+ voteNoLabel:"No",
+ allTypesLabel: "SENSE LÍMITS",
+ YESLabel:"SÍ",
+ NOLabel:"NO",
+ votesOptionYesLabel:"Sí",
+ votesOptionNoLabel:"No",
+ votesOptionAbstentionLabel:"Abstenció",
+ votesQuestionLabel:"Pregunta",
+ voteStatusOpen:"OBERT",
+ voteStatusClosed:"TANCAT",
+ commentDescription: ({ parentUrl }) => [
+ " ha comentat en ",
+ a({ href: parentUrl }, " fil"),
+ ],
+ commentTitle: ({ authorName }) => [`Ha comentat al post de @${authorName}`],
+ subtopicDescription: ({ parentUrl }) => [
+ " ha creat un subtema des de ",
+ a({ href: parentUrl }, " un post"),
+ ],
+ subtopicTitle: ({ authorName }) => [`Ha creat un subtema al post de @${authorName}`],
+ oasisDescription: "OASIS Xarxa de Projectes",
+ searchSubmit: "Cercar...",
+ votesLabel: "GOVERN",
+ pdfFallbackLabel: "Document PDF",
+ shopLabel: "BOTIGUES",
+ voteLabel: "VOTS",
+ submit: "Aplicar",
+ editProfile: "Editar l'Avatar",
+ oasisIdLabel: "OasisID",
+ spreadContent: "Replicar",
+ welcomePmSubject: "Hello World!",
+ welcomePmBody: "Et donem la benvinguda a Oasis — una xarxa social lliure, peer-to-peer, federada i xifrada, amb una arquitectura distribuïda i només per invitació.\n\nAlguns llocs interessants per començar:\n\n- [/avatar](/profile) — Edita el teu avatar, el nom, la descripció i quins mòduls es mostren al teu avatar públic.\n- /settings — Ajusta la teva instància local: idioma, tema, mòduls, privadesa i sincronització.\n- /invites — Afegeix un pub per federar-te amb la resta de la xarxa.\n- /peers — Mira qui està connectat, torna a escanejar la teva LAN, exporta o importa llistes de nodes.\n- /inhabitants — Descobreix i visita els avatars d'altres habitants.\n- /tribes — Crea grups privats amb xifratge d'extrem a extrem o uneix-t'hi.\n- /search — Cerca el contingut de la xarxa per tipus.\n\nAlguns llocs interessants per connectar:\n\n- /multiverse — Gestiona els teus altres comptes del multivers, incloent-hi enviar i rebre contingut.\n\nAquest missatge s'ha enviat de manera privada de tu cap a tu, per això no ha calgut connexió per rebre'l.",
+ profileSensorsSectionTitle: "Sensors",
+ profileVisibilityActivity: "Nivell d'activitat",
+ profileDeviceLockedHint: "Aquest sensor està sempre actiu: permet que altres vegin des de quin dispositiu et connectes i no es pot desactivar.",
+ profileVisibilityKarma: "Puntuació KARMA",
+ profileVisibilityUbi: "RBU",
+ profileVisibilityWallet: "Moneder ECOin",
+ profileVisibilityEcoTax: "Taxa ECO",
+ profileVisibilityLarpSign: "Segell L.A.R.P.",
+ profileVisibilityGpg: "Clau GPG",
+ clearnetSectionTitle: "Clearnet",
+ profileClearnetShopsLabel: "Botigues",
+ profileClearnetJobsLabel: "Feina",
+ profileClearnetEventsLabel: "Esdeveniments",
+ profileClearnetProjectsLabel: "Projectes",
+ profileClearnetPostsLabel: "Blogs",
+ profileClearnetAudiosLabel: "Àudios",
+ profileClearnetVideosLabel: "Vídeos",
+ profileClearnetImagesLabel: "Imatges",
+ profileClearnetDocumentsLabel: "Documents",
+ profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Mercat",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
+ editProfileDescription:
+ "",
+ profileName: "Nom",
+ profileImage: "Imatge de l'Avatar",
+ profileGpgKey: "Clau pública GPG (.asc)",
+ profileGpgChip: "GPG",
+ profileGpgDownload: "Baixar",
+ profileGpgRemove: "Eliminar",
+ profileDescription: "Descripció",
+ hashtagDescription:
+ "Posts d'habitants de la teva xarxa que fan referència a aquest #hashtag, ordenats pel més recent.",
+ rebuildName: "Reconstruir la blockchain",
+ wallet: "Moneder",
+ walletAddress: "Adreça",
+ walletAmount: "Quantitat",
+ walletAddressLine: ({ address }) => `Adreça: ${address}`,
+ walletAmountLine: ({ amount }) => `Quantitat: ${amount} ECO`,
+ walletBack: "Tornar",
+ walletBalanceTitle: "Saldo",
+ walletWalletSendTitle: "Enviar",
+ walletReceiveTitle: "Rebre",
+ walletHistoryTitle: "Historial",
+ walletBalanceLine: ({ balance }) => `${balance} ECO`,
+ walletCnfrs: "Conf.",
+ walletConfirm: "Confirmar",
+ walletDescription: "Gestiona el teu moneder ECOin.",
+ walletDate: "Data",
+ walletFee: "Comissió (com més alta sigui la comissió, més ràpid es processarà la teva transacció)",
+ walletFeeLine: ({ fee }) => `Comissió: ECO ${fee}`,
+ walletHistory: "Historial",
+ walletReceive: "Rebre",
+ walletReset: "Restablir",
+ walletSend: "Enviar",
+ walletPayingTransfer: "Pagant el transfer",
+ walletCreateTransferLabel: "Generar contracte (transfer)",
+ walletTransferNotifiedNote: "S'ha avisat del pagament a l'altra part",
+ walletTransferCreatedNote: "S'ha creat un transfer (rebut) d'aquest pagament",
+ walletTransferNoPayeeNote: "Cap habitant no ha publicat aquesta adreça, així que no s'ha creat cap transfer",
+ walletTransferReceiptConcept: "Pagament des del moneder",
+ walletPaymentPmText: "t'ha enviat un pagament",
+ walletPayeeLabel: "Destinatari",
+ walletConceptLabel: "Concepte",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Has rebut la teva RBU.",
+ bankingBotPaymentTitle: "Has rebut un pagament.",
+ bankingBotUbiPaidText: "La teva Renda Bàsica Universal s'ha pagat",
+ bankUbiPubThisNode: "Aquest node paga la RBU",
+ bankUbiPubConnected: "PUB de la RBU",
+ bankUbiPubNone: "De moment no hi ha PUBs que anunciïn una RBU.",
+ bankUbiAddressPublished: "Adreça ECOin publicada",
+ bankUbiAddressMissing: "Publica la teva adreça ECOin per rebre la RBU",
+ bankUbiClaimedThisMonth: "Reclamada aquest mes",
+ bankUbiPubBalance: "Moneder del PUB disponible per a la RBU",
+ bankNoPubAddress: "El PUB de la RBU encara no ha publicat cap adreça ECOin.",
+ bankUbiTab: "RBU",
+ bankDonateEco: "DONAR!",
+ donateTooltip: "Donar ECOin",
+ bankNoUserAddress: "Aquest habitant no comparteix cap adreça ECOin.",
+ bankUbiPubDefault: "Per defecte",
+ bankUbiPool: "Assignació",
+ bankUbiLastSeen: "Vist per última vegada",
+ bankUbiLastPayout: "Darrera acció",
+ bankUbiPaidOut: "Repartit",
+ bankRangeToday: "Avui",
+ bankRangeWeek: "Setmana",
+ bankRangeMonth: "Mes",
+ bankRangeYear: "Any",
+ bankRangeFiveYears: "5 anys",
+ bankRangeAll: "Tot",
+ bankChartValueTitle: "Evolució del valor d'ECOin",
+ bankChartValueHours: "Equivalència en temps (h)",
+ bankChartWealthTitle: "Redistribució de la riquesa ECOin",
+ bankChartDistributed: "RBU repartida (ECO)",
+ bankChartRebalanceTitle: "Redistribució de la riquesa entre PUBs",
+ bankChartRebalanced: "ECO moguts entre PUBs",
+ bankChartTaxes: "Impostos retinguts (ECO)",
+ bankChartNoDataRange: "No hi ha dades en aquest interval.",
+ bankChartNoDataYet: "Encara no hi ha dades",
+ bankChartPerHour: "per hora",
+ bankChartPerDay: "per dia",
+ bankChartPerMonth: "per mes",
+ bankTotalUbiDistributed: "RBU total redistribuïda (xarxa)",
+ bankTotalTaxesWithheld: "Impostos totals retinguts (xarxa)",
+ bankInflationIssuance: "Taxa d'emissió (anual, per recompensa de bloc)",
+ bankRulesEligibilityTitle: "Qui pot rebre la RBU",
+ bankRulesEligibility1: "Una adreça ECOin publicada al teu perfil (Perfil → Sensors → Moneder ECOin).",
+ bankRulesEligibility2: "Un feed de més de 30 dies i activitat a la xarxa: karma per sobre de zero.",
+ bankRulesEligibility3: "Una reclamació per mes (epoch), des de Banca amb el botó Reclamar RBU. Es pot rebutjar la del mes en curs amb Rebutjar RBU.",
+ bankRulesEligibility4: "El mínim d'1 ECO es paga sempre; els impostos només redueixen la part que el supera i mai no es cobren a part.",
+ bankRulesEligibility5: "El PUB paga en el seu següent cicle i publica un transfer RBU que pots confirmar.",
+ bankRulesEligibility6: "Si falta la teva adreça, el feed és massa jove, has rebutjat el mes o el PUB no té fons, la reclamació se salta i queda registrada al PUB.",
+ copyLinkTitle: "Copiar l'enllaç",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Rebutjar RBU",
+ bankUbiRefusedThisMonth: "Has rebutjat la RBU d'aquest mes.",
+ bankingBotUbiAvailableTitle: "Pots reclamar la teva RBU.",
+ bankingBotUbiAvailableText: "La teva RBU d'aquest mes està disponible",
+ bankingBotConfirmTitle: "Tens un contracte pendent de confirmació",
+ bankingBotConfirmText: "Contractes pendents de confirmació",
+ bankChartZoomHint: "Fes clic per ampliar",
+ bankChartPoolTitle: "Assignació de la RBU (en el temps)",
+ bankChartNetworkUbiTitle: "RBU total redistribuïda (xarxa)",
+ bankChartSupplyTitle: "Oferta circulant d'ECOin (en el temps)",
+ bankChartInflationTitle: "Inflació d'ECOin (en el temps)",
+ bankChartInflationSeries: "Taxa anualitzada (%)",
+ bankChartPool: "Assignació total (ECO)",
+ bankChartKarmaTitle: "Puntuació KARMA (en el temps)",
+ bankChartFundsTitle: "Els teus fons ECOin (en el temps)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin connectat",
+ bankWalletNotConfigured: "ECOin desconnectat",
+ transfersPayWithWallet: "PAGAR!",
+ walletStatus: "Estat",
+ walletDisconnected: [
+ "Tens el ",
+ strong("moneder d'ECOin desconnectat"),
+ ". Revisa ",
+ a({ href: '/settings#wallet' }, "la teva configuració"),
+ " o l'estat de la teva connexió.",
+ ],
+ walletSentToLine: ({ destination, amount }) => `Enviar ECO ${amount} a ${destination}`,
+ walletNotConfigured: "La teva cartera d'ECOin encara no està configurada.",
+ walletSettingsDescription: "Integrar Oasis amb el teu moneder d'ECOin.",
+ walletSettingsMobileDescription: "Vincula Oasis amb l'app ECOin Wallet d'aquest dispositiu.",
+ walletDownloadEcoin: "Baixar ECOin!",
+ walletRpcUrl: "URL del RPC",
+ walletStatusMessages: {
+ invalid_amount: "Quantitat no vàlida",
+ invalid_dest: "Adreça de destinació no vàlida",
+ invalid_fee: "Comissió no vàlida",
+ validation_errors: "Errors en la validació",
+ send_tx_success: "Transacció feta",
+ },
+ walletTitle: "Moneder",
+ walletTotalCostLine: ({ totalCost }) => `Cost total: ECO ${totalCost}`,
+ walletTransactionId: "ID de la transacció",
+ walletTxId: "ID Tx",
+ walletType: "Tipus",
+ walletUser: "Usuari",
+ walletPass: "Contrasenya",
+ walletConfiguration: "Configurar el moneder",
+ walletDisconnectButton: "Desconnectar el moneder",
+ cipher: "Xifrador",
+ cipherTitle: "Xifrador",
+ cipherDescription: "Xifra i desxifra el teu text de manera simètrica (amb una contrasenya compartida).",
+ randomPassword: "Contrasenya aleatòria",
+ cipherTextPlaceholder: "Introdueix el text que vols xifrar...",
+ cipherPasswordLabel: "Estableix una contrasenya (mínim 32 caràcters) per xifrar el teu text",
+ cipherPasswordDecryptLabel: "Estableix una contrasenya (mínim 32 caràcters) per desxifrar el teu text",
+ cipherPasswordPlaceholder: "Introdueix una contrasenya...",
+ cipherEncryptButton: "Xifrar",
+ cipherEncryptedMessageLabel: "Text xifrat",
+ cipherDecryptedMessageLabel: "Text desxifrat",
+ cipherEncryptedTextPlaceholder: "Introdueix el text xifrat...",
+ cipherDecryptButton: "Desxifrar",
+ password: "Contrasenya",
+ text: "Text",
+ encryptedText: "Text xifrat",
+ iv: "Vector d'inicialització (IV)",
+ bookmarkTitle: "Marcadors",
+ bookmarkDescription: "Descobreix i gestiona marcadors a la teva xarxa.",
+ bookmarkAllSectionTitle: "Marcadors",
+ bookmarkMineSectionTitle: "Els teus marcadors",
+ bookmarkRecentSectionTitle: "Marcadors recents",
+ bookmarkTopSectionTitle: "Marcadors top",
+ bookmarkFavoritesSectionTitle: "Preferits",
+ bookmarkCreateSectionTitle: "Crear un marcador",
+ bookmarkUpdateSectionTitle: "Actualitzar el marcador",
+ bookmarkFilterAll: "TOTS",
+ bookmarkFilterMine: "MEUS",
+ bookmarkFilterTop: "TOP",
+ bookmarkFilterFavorites: "PREFERITS",
+ bookmarkFilterRecent: "RECENTS",
+ bookmarkCreateButton: "Crear un marcador",
+ bookmarkUpdateButton: "Actualitzar",
+ bookmarkAddFavoriteButton: "Afegir a preferits",
+ bookmarkRemoveFavoriteButton: "Treure de preferits",
+ bookmarkUrlLabel: "Enllaç",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
+ bookmarkDescriptionLabel: "Descripció",
+ bookmarkDescriptionPlaceholder: "Opcional",
+ bookmarkTagsLabel: "Etiquetes",
+ bookmarkTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ bookmarkLastVisitLabel: "Darrera visita",
+ bookmarkSearchPlaceholder: "Cercar a Marcadors...",
+ bookmarkSortRecent: "Més recents",
+ bookmarkSortOldest: "Més antics",
+ bookmarkSortTop: "Més votats",
+ bookmarkSearchButton: "Cercar",
+ bookmarkUpdatedAt: "Actualitzat",
+ bookmarkNoMatch: "No hi ha marcadors que coincideixin amb la teva cerca.",
+ noBookmarks: "No hi ha marcadors disponibles.",
+ noUrl: "Sense enllaç",
+ noCategory: "Sense categoria",
+ noLastVisit: "Sense darrera visita",
+ videoTitle: "Vídeos",
+ videoDescription: "Explora i gestiona contingut de vídeo a la teva xarxa.",
+ videoMineSectionTitle: "Els teus vídeos",
+ videoCreateSectionTitle: "Pujar un vídeo",
+ videoUpdateSectionTitle: "Actualitzar el vídeo",
+ videoAllSectionTitle: "Vídeos",
+ videoRecentSectionTitle: "Vídeos recents",
+ videoTopSectionTitle: "Vídeos més votats",
+ videoFavoritesSectionTitle: "Preferits",
+ videoFilterAll: "TOTS",
+ videoFilterMine: "MEUS",
+ videoFilterRecent: "RECENTS",
+ videoFilterTop: "TOP",
+ videoFilterFavorites: "PREFERITS",
+ videoCreateButton: "Pujar un vídeo",
+ videoUpdateButton: "Actualitzar",
+ videoDeleteButton: "Eliminar",
+ videoAddFavoriteButton: "Afegir a preferits",
+ videoRemoveFavoriteButton: "Treure de preferits",
+ videoFileLabel: "Selecciona un fitxer de vídeo (.mp4, .webm, .ogv, .mov)",
+ videoTagsLabel: "Etiquetes",
+ videoTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ videoTitleLabel: "Títol",
+ videoTitlePlaceholder: "Opcional",
+ videoDescriptionLabel: "Descripció",
+ videoDescriptionPlaceholder: "Opcional",
+ videoNoFile: "No s'ha proporcionat cap fitxer de vídeo",
+ noVideos: "No hi ha vídeos disponibles.",
+ videoSearchPlaceholder: "Cercar a Vídeos...",
+ videoSortRecent: "Més recents",
+ videoSortOldest: "Més antics",
+ videoSortTop: "Més votats",
+ videoSearchButton: "Cercar",
+ videoUpdatedAt: "Actualitzat",
+ videoNoMatch: "Cap vídeo no coincideix amb la teva cerca.",
+ documentTitle: "Documents",
+ documentDescription: "Descobreix i gestiona documents a la teva xarxa.",
+ documentAllSectionTitle: "Documents",
+ documentMineSectionTitle: "Els teus documents",
+ documentRecentSectionTitle: "Documents recents",
+ documentTopSectionTitle: "Documents top",
+ documentFavoritesSectionTitle: "Preferits",
+ documentCreateSectionTitle: "Pujar un document",
+ documentUpdateSectionTitle: "Editar el document",
+ documentFilterAll: "TOT",
+ documentFilterMine: "MEUS",
+ documentFilterRecent: "RECENTS",
+ documentFilterTop: "TOP",
+ documentFilterFavorites: "PREFERITS",
+ documentCreateButton: "Pujar un document",
+ documentUpdateButton: "Actualitzar",
+ documentAddFavoriteButton: "Afegir a preferits",
+ documentRemoveFavoriteButton: "Treure de preferits",
+ documentMessageAuthorButton: "MP",
+ documentFileLabel: "Pujar un document (.pdf)",
+ documentTagsLabel: "Etiquetes",
+ documentTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ documentTitleLabel: "Títol",
+ documentTitlePlaceholder: "Opcional",
+ documentDescriptionLabel: "Descripció",
+ documentDescriptionPlaceholder: "Opcional",
+ documentNoFile: "Sense fitxer.",
+ noDocuments: "No hi ha documents disponibles.",
+ documentSearchPlaceholder: "Cercar a Documents...",
+ documentSortRecent: "Més recents",
+ documentSortOldest: "Més antics",
+ documentSortTop: "Més votats",
+ documentSearchButton: "Cercar",
+ documentNoMatch: "No hi ha documents que coincideixin amb la teva cerca.",
+ documentUpdatedAt: "Actualitzat",
+ audioTitle: "Àudios",
+ audioDescription: "Explora i gestiona contingut d'àudio a la teva xarxa.",
+ audioMineSectionTitle: "Els teus àudios",
+ audioCreateSectionTitle: "Pujar un àudio",
+ audioUpdateSectionTitle: "Actualitzar l'àudio",
+ audioAllSectionTitle: "Àudios",
+ audioRecentSectionTitle: "Àudios recents",
+ audioTopSectionTitle: "Àudios més votats",
+ audioFilterAll: "TOTS",
+ audioFilterMine: "MEUS",
+ audioFilterRecent: "RECENTS",
+ audioFilterTop: "TOP",
+ audioCreateButton: "Pujar un àudio",
+ audioUpdateButton: "Actualitzar",
+ audioAddFavoriteButton: "Afegir a preferits",
+ audioRemoveFavoriteButton: "Treure de preferits",
+ audioFileLabel: "Selecciona un fitxer d'àudio (.mp3, .wav, .ogg)",
+ audioTagsLabel: "Etiquetes",
+ audioTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ tagsPlaceholder: "Introdueix etiquetes separades per comes",
+ audioTitleLabel: "Títol",
+ audioTitlePlaceholder: "Opcional",
+ audioDescriptionLabel: "Descripció",
+ audioDescriptionPlaceholder: "Opcional",
+ audioNoFile: "No s'ha proporcionat cap fitxer d'àudio",
+ noAudios: "No hi ha àudios disponibles.",
+ audioSearchPlaceholder: "Cercar a Àudios...",
+ audioSortRecent: "Més recents",
+ audioSortOldest: "Més antics",
+ audioSortTop: "Més votats",
+ audioSearchButton: "Cercar",
+ audioMessageAuthorButton: "MP",
+ audioUpdatedAt: "Actualitzat",
+ audioNoMatch: "Cap àudio no coincideix amb la teva cerca.",
+ audioFavoritesSectionTitle: "Preferits",
+ audioFilterFavorites: "PREFERITS",
+ favoritesTitle: "Preferits",
+ favoritesDescription: "Tots els teus elements marcats com a preferits en un sol lloc.",
+ favoritesSearchPlaceholder: "Cercar a Preferits...",
+ favoritesFilterAll: "TOTS",
+ favoritesFilterRecent: "RECENTS",
+ favoritesFilterAudios: "ÀUDIOS",
+ favoritesFilterBookmarks: "MARCADORS",
+ favoritesFilterDocuments: "DOCUMENTS",
+ favoritesFilterImages: "IMATGES",
+ favoritesFilterMaps: "MAPES",
+ favoritesFilterPads: "PADS",
+ favoritesFilterChats: "XATS",
+ favoritesFilterCalendars: "CALENDARIS",
+ favoritesFilterVideos: "VÍDEOS",
+ favoritesNoItems: "Encara no hi ha preferits.",
+ yourContacts: "Els teus contactes",
+ allInhabitants: "Habitants",
+ allCVs: "CV",
+ discoverPeople: "Descobreix habitants a la teva xarxa.",
+ searchInhabitantsPlaceholder: "Cercar a Habitants...",
+ filterLocation: "FILTRAR habitants PER UBICACIÓ …",
+ filterLanguage: "FILTRAR habitants PER IDIOMA …",
+ filterSkills: "FILTRAR habitants PER HABILITATS …",
+ cvSkillsCount: "Habilitats",
+ applyFilters: "Aplicar els filtres",
+ locationLabel: "Ubicació",
+ languagesLabel: "Idiomes",
+ skillsLabel: "Habilitats",
+ commonSkills: "Habilitats comunes",
+ mutualFollowers: "Seguidors mutus",
+ suggestedFollowsYou: "Et segueix",
+ latestInteractions: "Darreres interaccions",
+ suggestedSectionTitle: "Suggerits",
+ topkarmaSectionTitle: "Millor karma",
+ topecoSectionTitle: "Millor Eco",
+ topactivitySectionTitle: "Més activitat",
+ "TOP INACTIVITYButton": "MÉS INACTIUS",
+ topinactivitySectionTitle: "Habitants menys actius",
+ blockedSectionTitle: "Bloquejats",
+ gallerySectionTitle: "GALERIA",
+ topSectionTitle: "TOP",
+ blockedLabel: "Usuari bloquejat",
+ inhabitantviewDetails: "Veure els detalls",
+ keepReading: "Continuar llegint...",
+ oasisId: "ID",
+ noInhabitantsFound: "Encara no s'han trobat habitants.",
+ inhabitantActivityLevel: "Nivell d'activitat",
+ lifespanLabel: "Vigència",
+ deviceLabel: "Dispositiu",
+ parliamentTitle: "Parlament",
+ parliamentDescription: "Explora formes de govern i polítiques de gestió col·lectiva.",
+ parliamentFilterGovernment: "GOVERN",
+ parliamentFilterCandidatures: "CANDIDATURES",
+ parliamentFilterProposals: "PROPOSTES",
+ parliamentFilterLaws: "LLEIS",
+ parliamentFilterRevocations: "REVOCACIONS",
+ parliamentFilterHistorical: "HISTÒRIC",
+ parliamentFilterLeaders: "LÍDERS",
+ parliamentFilterRules: "REGLES",
+ parliamentGovernmentCard: "Govern actual",
+ parliamentSeatsGovernment: "Govern",
+ parliamentSeatsOpposition: "Oposició",
+ parliamentSeatsAbstention: "Abstenció",
+ parliamentSeatsQuorum: "Quòrum d'elecció",
+ parliamentSeatsPass: "Llindar d'aprovació",
+ parliamentSeatsByElection: "Per elecció",
+ parliamentSeatsByHouses: "Per casa del LARP",
+ parliamentSeatsSeats: "escons",
+ parliamentSeatsSeat: "escó",
+ parliamentSeatsLeader: "Líder",
+ parliamentSeatsVotesFor: "vots a",
+ parliamentSeatsNoHouse: "Sense casa",
+ parliamentActorInPowerInhabitant: "HABITANT AL PODER",
+ parliamentActorInPowerTribe: "TRIBU AL PODER",
+ parliamentHistoricalGovernmentsTitle: "GOVERNS",
+ parliamentHistoricalElectionsTitle: "CICLES ELECTORALS",
+ parliamentHistoricalLawsTitle: "HISTÒRIC",
+ parliamentHistoricalLeadersTitle: "LÍDERS",
+ parliamentThCycles: "CICLES",
+ parliamentThTimesInPower: "MANDATS",
+ parliamentThTotalCandidatures: "CANDIDATURES",
+ parliamentThProposed: "LLEIS PROPOSADES",
+ parliamentThApproved: "LLEIS APROVADES",
+ parliamentThDeclined: "LLEIS REBUTJADES",
+ parliamentThDiscarded: "LLEIS DESCARTADES",
+ parliamentMembers: "MEMBRES",
+ parliamentLegSince: "INICI DEL CICLE",
+ parliamentLegEnd: "FI DEL CICLE",
+ parliamentPoliciesProposal: "PROPOSTES DE LLEI",
+ parliamentPoliciesApproved: "LLEIS APROVADES",
+ parliamentPoliciesDeclined: "LLEIS REBUTJADES",
+ parliamentPoliciesDiscarded: "LLEIS DESCARTADES",
+ parliamentEfficiency: "% EFICIÈNCIA",
+ parliamentRevocationFormTitle: "Revocar una llei",
+ parliamentRevocationLaw: "Llei",
+ parliamentRevocationReasons: "Motius",
+ parliamentRevocationPublish: "Publicar la revocació",
+ parliamentCurrentRevocationsTitle: "Revocacions actuals",
+ parliamentFutureRevocationsTitle: "Revocacions futures",
+ parliamentPoliciesRevocated: "LLEIS REVOCADES",
+ parliamentPoliciesTitle: "HISTÒRIC",
+ parliamentLawsTitle: "LLEIS APROVADES",
+ parliamentRulesRevocations: "Qualsevol llei aprovada es pot revocar amb el mètode de govern vigent.",
+ parliamentNoStableGov: "Encara no hi ha cap govern elegit.",
+ parliamentNoGovernments: "Encara no hi ha governs a l'històric.",
+ parliamentCandidatureFormTitle: "Proposar una candidatura",
+ parliamentCandidatureIdPh: "Oasis ID (@...) o nom de la tribu",
+ parliamentCandidatureMethod: "Mètode",
+ parliamentCandidatureProposeBtn: "Publicar la candidatura",
+ parliamentVoteBtn: "Votar",
+ parliamentProposalFormTitle: "Proposar una llei",
+ parliamentProposalDescription: "Descripció (≤1000)",
+ parliamentProposalPublish: "Publicar la proposta",
+ parliamentNoProposals: "Encara no hi ha propostes de llei.",
+ parliamentNoLaws: "Encara no hi ha lleis aprovades.",
+ parliamentMethodDEMOCRACY: "Democràcia",
+ parliamentMethodMAJORITY: "Majoria (80%)",
+ parliamentMethodMINORITY: "Minoria (20%)",
+ parliamentMethodDICTATORSHIP: "Dictadura",
+ parliamentMethodKARMATOCRACY: "Karmatocràcia",
+ parliamentThId: "ID",
+ parliamentThProposalDate: "Data de la proposta",
+ parliamentThMethod: "Mètode",
+ parliamentThKarma: "Karma",
+ parliamentThSupports: "Suports",
+ parliamentThVote: "Votar",
+ parliamentCurrentProposalsTitle: "Propostes actuals",
+ parliamentVotesSlashTotal: "Vots/Total",
+ parliamentVotesNeeded: "Vots necessaris",
+ parliamentFutureLawsTitle: "Futures lleis",
+ parliamentVoteAction: "Votar",
+ parliamentThLeader: "AVATAR",
+ parliamentPopulation: "Població",
+ parliamentThPresented: "CANDIDATURES",
+ parliamentNoLeaders: "Encara no hi ha líders.",
+ parliamentCandidaturesListTitle: "Llista de candidatures",
+ parliamentTimeRemaining: "Temps restant",
+ parliamentElectionsStatusTitle: "Pròxim govern",
+ parliamentProposalDeadlineLabel: "Data límit",
+ parliamentViewReport: "Veure l'informe",
+ parliamentProposalTimeLeft: "Temps restant",
+ parliamentRulesTitle: "Com funciona el Parlament",
+ parliamentRulesIntro: "Les eleccions es resolen cada 2 mesos; les candidatures són contínues i es reinicien quan s'elegeix un govern.",
+ parliamentRulesCandidates: "Qualsevol habitant es pot proposar a si mateix, a un altre habitant o a qualsevol tribu. Cada habitant pot proposar fins a 3 candidatures per cicle; es rebutgen els duplicats dins el mateix cicle.",
+ parliamentRulesElection: "Guanya la candidatura amb més vots en el moment de la resolució.",
+ parliamentRulesTies: "Desempat: més karma de l'habitant; si persisteix, perfil més antic; si persisteix, proposta més primerenca; després, ordre lexicogràfic per ID.",
+ parliamentRulesTerm: "La pestanya Govern mostra el govern actual i les seves estadístiques.",
+ parliamentRulesMethods: "Formes: Anarquia (majoria simple), Democràcia (50%+1), Majoria (80%), Minoria (20%), Karmatocràcia (propostes amb més karma), Dictadura (aprovació instantània).",
+ parliamentRulesAnarchy: "L'Anarquia és el mode per defecte: si en resoldre no s'elegeix cap candidatura, es proclama l'Anarquia. En Anarquia, qualsevol habitant pot proposar lleis.",
+ parliamentRulesProposals: "Si ets l'habitant governant o membre de la tribu governant, pots publicar propostes de llei. Els mètodes no dictatorials creen una votació pública.",
+ parliamentRulesLimit: "Cada habitant pot publicar com a màxim 3 propostes de llei per cicle.",
+ parliamentRulesLaws: "Quan una proposta arriba al seu llindar, es converteix en Llei i apareix a la pestanya Lleis amb la seva data d'entrada en vigor.",
+ parliamentRulesHistorical: "A Històric es pot veure cada cicle de govern que hi ha hagut i dades sobre la seva gestió.",
+ parliamentRulesLeaders: "A Líders es pot veure un rànquing d'habitants/tribus que han governat (o s'han presentat), ordenats per eficàcia.",
+ parliamentRulesHemicycle: "L'hemicicle dona un escó per habitant: el bloc de govern (votants de la candidatura guanyadora i el líder), un bloc d'oposició per cada altra candidatura del cicle, i l'abstenció. Les marques discontínues assenyalen el quòrum d'elecció (25 % del cens) i el llindar d'aprovació del mètode vigent. \"Per casa del LARP\" acoloreix els mateixos escons per casa.",
+ parliamentProposalVoteStatusLabel: "Estat de la votació",
+ parliamentProposalOnTrackYes: "Llindar assolit",
+ parliamentProposalOnTrackNo: "Per sota del llindar",
+ courtsTitle: "Tribunals",
+ courtsDescription: "Explora formes de resolució de conflictes i de gestió col·lectiva de la justícia.",
+ courtsFilterCases: "CASOS",
+ courtsFilterMyCases: "MEUS",
+ courtsFilterJudges: "JUTGES",
+ courtsFilterHistory: "HISTORIAL",
+ courtsFilterRules: "REGLES",
+ courtsCaseFormTitle: "Obrir un cas",
+ courtsCaseRespondent: "Acusat / Part demandada",
+ courtsCaseRespondentPh: "ID d'Oasis (@...) o nom de la tribu",
+ courtsCaseSubjectPlaceholder: "Assumpte o descripció breu",
+ courtsCaseMethod: "Mètode de resolució",
+ courtsCaseSubmit: "Presentar el cas",
+ courtsNominateJudge: "Nominar un jutge",
+ courtsJudgeId: "Jutge",
+ courtsJudgeIdPh: "ID d'Oasis (@...) o nom de l'habitant",
+ courtsNominateBtn: "Nominar",
+ courtsAddEvidence: "Afegir proves",
+ courtsEvidenceText: "Text",
+ courtsEvidenceLink: "Enllaç",
+ courtsEvidenceLinkPh: "https://…",
+ courtsEvidenceSubmit: "Adjuntar",
+ courtsAnswerText: "Resum de la resposta",
+ courtsAnswerSubmit: "Enviar la resposta",
+ courtsVerdictTitle: "Emetre veredicte",
+ courtsVerdictOrdersPh: "Accions, terminis, passos restauratius...",
+ courtsIssueVerdict: "Emetre veredicte",
+ courtsMediationPropose: "Proposar un acord",
+ courtsSettlementProposeBtn: "Proposar",
+ courtsNominationsTitle: "Nominacions a la judicatura",
+ courtsThJudge: "Jutge",
+ courtsThDate: "Data",
+ courtsThVote: "Votar",
+ courtsNoNominations: "Encara no hi ha nominacions.",
+ courtsRespondentInvalid: "Ha de ser un ID SSB vàlid (@...ed25519)",
+ courtsCaseMediatorsRespondentTitle: "Afegir mediadors de la defensa",
+ courtsCaseMediatorsRespondent: "Mediadors (defensa)",
+ courtsMediatorsAccuserLabel: "Mediadors (acusació)",
+ courtsMediatorsRespondentLabel: "Mediadors (defensa)",
+ courtsMediatorsSubmit: "Desar els mediadors",
+ courtsNoMyCases: "Encara no tens conflictes.",
+ courtsNoHistory: "Encara no hi ha judicis registrats.",
+ courtsMethodDICTATOR: "Dictador",
+ courtsMethodPOPULAR: "Popular",
+ courtsMethodKARMATOCRACY: "Karmatocràcia",
+ courtsCaseType: "Tipus de cas",
+ courtsPresetMinorConflict: "Conflicte lleu",
+ courtsPresetModerateConflict: "Conflicte moderat",
+ courtsPresetSevereConflict: "Conflicte greu",
+ courtsPresetHarassment: "Assetjament o abús",
+ courtsPresetContentModeration: "Moderació de contingut",
+ courtsPresetBanRestriction: "Expulsió o restricció",
+ courtsPresetGovernanceDispute: "Disputa de governança",
+ courtsStatusOPEN: "Obert",
+ courtsStatusIN_PROGRESS: "En curs",
+ courtsStatusDECIDED: "Decidit",
+ courtsStatusCLOSED: "Tancat",
+ courtsStatusSOLVED: "Resolt",
+ courtsStatusUNSOLVED: "Sense resoldre",
+ courtsStatusDISCARDED: "Descartat",
+ courtsRulesTitle: "Com funcionen els Tribunals",
+ courtsRulesIntro: "Els Tribunals són un procés gestionat per la comunitat per resoldre conflictes i promoure la justícia restaurativa. Es prioritzen el diàleg, les proves clares i els remeis proporcionals.",
+ courtsRulesLifecycle: "Procés: 1) Obrir el cas 2) Seleccionar el mètode 3) Presentar proves 4) Audiència i deliberació 5) Veredicte i remei 6) Compliment i tancament 7) Apel·lació (si escau).",
+ courtsRulesRoles: "Acusació: obre el cas. Defensa: habitant o tribu acusada. Mètode: mecanisme triat per la comunitat per facilitar, avaluar les proves i emetre veredicte. Testimoni: aporta testimoniatge o proves. Mediadors: habitants neutrals convidats per l'acusació i/o la defensa, amb accés a tots els detalls, que ajuden a desescalar el conflicte i a cocrear acords.",
+ courtsRulesEvidence: "Descripció de fins a 1000 caràcters. Adjunta imatges, àudio, vídeo i documents PDF rellevants i legals. No comparteixis dades privades sensibles sense consentiment.",
+ courtsRulesDeliberation: "Les audiències poden ser públiques o privades. Els jutges garanteixen el respecte, demanen aclariments i poden descartar material irrellevant o il·legal.",
+ courtsRulesVerdict: "Es prioritza la restauració: disculpes, acords de mediació, moderació de contingut, restriccions temporals o altres mesures proporcionals. El raonament ha de quedar registrat.",
+ courtsRulesAppeals: "Apel·lació: permesa quan hi ha proves noves o un error processal clar. S'ha de presentar en un termini de 7 dies llevat que s'indiqui el contrari.",
+ courtsRulesPrivacy: "Respecta la privadesa i la seguretat. El doxing, l'odi o les amenaces s'eliminen. Els jutges poden editar o segellar parts de l'expedient per protegir habitants en risc.",
+ courtsRulesMisconduct: "L'assetjament, la manipulació o les proves fabricades poden comportar una resolució negativa immediata.",
+ courtsRulesGlossary: "Cas: registre d'un conflicte. Proves: materials que avalen les afirmacions. Veredicte: decisió amb remei. Apel·lació: sol·licitud per revisar el veredicte.",
+ courtsFilterActions: "ACCIONS",
+ courtsThRole: "Rol",
+ courtsRoleAccuser: "Acusació",
+ courtsRoleDefence: "Defensa",
+ courtsRoleMediator: "Mediador",
+ courtsRoleJudge: "Jutge",
+ courtsRoleDictator: "Dictador",
+ courtsAssignJudgeTitle: "Triar un jutge",
+ courtsAssignJudgeBtn: "Triar un jutge",
+ trendingTitle: "Tendències",
+ exploreTrending: "Explora el contingut més popular de la teva xarxa.",
+ votesButton: "GOVERN",
+ shopProductButton: "BOTIGA",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISODI",
+ campaignButton: "CAMPANYA",
+ logisticsRouteButton: "RUTA",
+ trendingTotalOpinions: "Total d'opinions",
+ trendingNoContentMessage: "Encara no hi ha tendències.",
+ trendingTotalCount: "Total de comptadors",
+ tasksTitle: "Tasques",
+ tasksDescription: "Descobreix i gestiona tasques a la teva xarxa.",
+ taskSearchPlaceholder: "Cercar a Tasques...",
+ taskTitleLabel: "Títol",
+ taskDescriptionLabel: "Descripció",
+ taskStartTimeLabel: "Data d'inici",
+ taskEndTimeLabel: "Data de fi",
+ taskPriorityLabel: "Prioritat",
+ taskPriorityUrgent: "Urgent",
+ taskPriorityHigh: "Alta",
+ taskPriorityMedium: "Mitjana",
+ taskPriorityLow: "Baixa",
+ taskLocationLabel: "Ubicació",
+ taskTagsLabel: "Etiquetes",
+ taskVisibilityLabel: "Visibilitat",
+ taskPublic: "públic",
+ taskPrivate: "privat",
+ taskStatus: "Estat",
+ taskStatusOpen: "Oberta",
+ taskStatusInProgress: "En curs",
+ taskStatusClosed: "Tancada",
+ taskAssignedTo: "Assignada",
+ taskAssignedChip: "Assignada",
+ taskUnassignedChip: "Sense assignar",
+ taskAssignees: "Assignats",
+ taskAssignButton: "Assignar-me-la",
+ taskUnassignButton: "Desassignar",
+ taskCreateButton: "Crear una tasca",
+ taskUpdateButton: "Actualitzar",
+ taskDeleteButton: "Eliminar",
+ taskFilterAll: "TOTES",
+ taskFilterRecent: "RECENTS",
+ taskFilterMine: "MEVES",
+ taskFilterOpen: "OBERTES",
+ taskFilterInProgress: "EN CURS",
+ taskFilterClosed: "TANCADES",
+ taskFilterAssigned: "ASSIGNADES",
+ taskFilterUrgent: "URGENTS",
+ taskFilterHigh: "ALTES",
+ taskFilterMedium: "MITJANES",
+ taskFilterLow: "BAIXES",
+ taskAllSectionTitle: "Tasques",
+ taskMineSectionTitle: "Les teves tasques",
+ taskCreateSectionTitle: "Crear una tasca",
+ taskUpdateSectionTitle: "Actualitzar",
+ taskOpenTitle: "Tasques obertes",
+ taskInProgressTitle: "Tasques en curs",
+ taskClosedTitle: "Tasques tancades",
+ taskAssignedTitle: "Tasques assignades",
+ notasks: "No hi ha tasques disponibles.",
+ noLocation: "No s'ha especificat cap ubicació",
+ taskSetStatus: "Establir l'estat",
+ eventDateLabel: "Data",
+ eventRecurrenceLabel: "Recurrència",
+ eventRecurrenceUntil: "Repetir fins a",
+ eventRecurrenceHint: "Deixa buida la data de repetició per a un esdeveniment únic.",
+ eventUpcomingDates: "Pròximes dates",
+ eventsTitle: "Esdeveniments",
+ eventsDescription: "Descobreix i gestiona esdeveniments a la teva xarxa.",
+ eventSearchPlaceholder: "Cercar a Esdeveniments...",
+ eventPrice: "Preu",
+ eventStatus: "Estat",
+ eventAllSectionTitle: "Esdeveniments",
+ eventMineSectionTitle: "Els teus esdeveniments",
+ eventCreateSectionTitle: "Crear un esdeveniment",
+ eventUpdateSectionTitle: "Actualitzar l'esdeveniment",
+ eventCreateButton: "Crear un esdeveniment",
+ eventAddToCalendar: "Afegir al calendari",
+ eventVisitCalendar: "Visitar el calendari",
+ viewTask: "Veure la tasca",
+ viewEvent: "Veure l'esdeveniment",
+ viewPad: "Veure el pad",
+ viewMap: "Veure el mapa",
+ viewCalendar: "Veure el calendari",
+ viewReport: "Veure l'informe",
+ viewTransfer: "Veure la transferència",
+ viewItem: "Veure l'article",
+ viewShop: "Veure la botiga",
+ viewProject: "Veure el projecte",
+ viewJob: "Veure la feina",
+ viewPlace: "Veure el lloc",
+ generatePdf: "Generar PDF",
+ sharePm: "Compartir per PM",
+ galleryImages: "Imatges (mida màx.: 75MB cadascuna)",
+ galleryPhotos: "Imatges",
+ galleryAddPhoto: "Afegir una imatge",
+ galleryRemovePhoto: "Treure",
+ galleryVideo: "Vídeo (mida màx.: 75MB)",
+ galleryAddVideo: "Afegir un vídeo",
+ galleryRemoveVideo: "Treure el vídeo",
+ viewVotation: "Veure la votació",
+ voteCastTitle: "Emetre el vot",
+ voteResults: "Resultats",
+ eventTitleLabel: "Títol",
+ eventDescriptionLabel: "Descripció",
+ eventDescriptionPlaceholder: "Introdueix la descripció de l'esdeveniment...",
+ eventUpdateButton: "Actualitzar",
+ eventTagsLabel: "Etiquetes",
+ eventPriceLabel: "Preu",
+ eventUrlLabel: "URL",
+ eventAttendees: "Assistents",
+ eventLocation: "Ubicació",
+ eventLocationLabel: "Ubicació",
+ noevents: "No hi ha esdeveniments disponibles.",
+ eventDate: "Data",
+ eventAttendButton: "Assistir a l'esdeveniment",
+ eventFilterAll: "TOTS",
+ eventFilterRecent: "RECENTS",
+ eventFilterMine: "MEUS",
+ eventFilterToday: "AVUI",
+ eventFilterWeek: "AQUESTA SETMANA",
+ eventFilterMonth: "AQUEST MES",
+ eventFilterYear: "AQUEST ANY",
+ eventFilterArchived: "ARXIVATS",
+ eventPrivacyLabel: "Visibilitat",
+ eventPublic: "Públic",
+ eventPrivate: "Privat",
+ eventAttended: "Hi assisteixo",
+ eventUnattended: "No hi assisteixo",
+ eventStatusOpen: "Obert",
+ eventStatusClosed: "Tancat",
+ tagsTitle: "Etiquetes",
+ tagsDescription: "Descobreix i explora patrons de taxonomia a la teva xarxa.",
+ tagsAllSectionTitle: "Etiquetes",
+ tagsTopSectionTitle: "Etiquetes principals",
+ tagsCloudSectionTitle: "Núvol d'etiquetes",
+ tagsFilterAll: "TOTES",
+ tagsFilterMine: "MEVES",
+ tagsFilterRecent: "RECENTS",
+ tagsMineSectionTitle: "Les meves etiquetes",
+ tagsRecentSectionTitle: "Etiquetes recents",
+ tagsFilterTop: "TOP",
+ tagsFilterCloud: "NÚVOL",
+ tagsNoItems: "No hi ha etiquetes disponibles.",
+ tagsSearchPlaceholder: "Cercar a Etiquetes...",
+ tagsTableHeaderTag: "ETIQUETA/ENLLAÇ:",
+ tagsTableHeaderCount: "COMPTADOR:",
+ transfersTitle: "Transferències",
+ transfersDescription: "Descobreix i gestiona transferències a la teva xarxa.",
+ transfersFrom: "De",
+ transfersTo: "A",
+ transfersFilterAll: "TOTES",
+ transfersFilterRecent: "RECENTS",
+ transfersFilterMine: "MEVES",
+ transfersFilterMinePending: "PENDENTS",
+ transfersFilterMineConfirmed: "SIGNADES",
+ transfersFilterUBI: "RBU",
+ transfersFilterMarket: "MERCAT",
+ transfersFilterTop: "TOP",
+ transfersFilterPending: "PENDENTS",
+ transfersFilterUnconfirmed: "NO CONFIRMADES",
+ transfersFilterClosed: "TANCADES",
+ transfersFilterDiscarded: "DESCARTADES",
+ transfersFilterEconomic: "ECONÒMICA",
+ transfersFilterTime: "TEMPS",
+ transfersFilterTrust: "CONFIANÇA",
+ transfersCategory: "Categoria",
+ transfersCategoryEconomic: "Econòmica",
+ transfersCategoryTime: "Temps",
+ transfersCategoryTrust: "Confiança",
+ transfersUnitEco: "ECO",
+ transfersUnitHours: "h",
+ transfersUnitTrust: "confiança",
+ transfersEconomicSectionTitle: "Transferències econòmiques",
+ transfersTimeSectionTitle: "Transferències de temps",
+ transfersTrustSectionTitle: "Transferències de confiança",
+ transfersCreateButton: "Crear una transferència",
+ transfersUpdateButton: "Actualitzar",
+ transfersDeleteButton: "Eliminar",
+ transfersToUser: "ID d'Oasis",
+ transfersToUserValidation: "ID d'Oasis vàlid, p. ex. @…=.ed25519",
+ transfersConcept: "Concepte",
+ transfersAmount: "Quantitat",
+ transfersDeadline: "Termini",
+ transfersTags: "Etiquetes",
+ transfersStatus: "Estat",
+ transfersConfirmations: "CONFIRMACIONS",
+ transfersExportContract: "Generar la factura",
+ transfersConfirmButton: "Confirmar la transferència",
+ transfersNoItems: "No s'han trobat transferències.",
+ transfersMineSectionTitle: "Les teves transferències",
+ transfersUBISectionTitle: "Transferències RBU",
+ transfersTopSectionTitle: "Transferències principals",
+ transfersPendingSectionTitle: "Transferències pendents",
+ transfersUnconfirmedSectionTitle: "Transferències no confirmades",
+ transfersClosedSectionTitle: "Transferències tancades",
+ transfersDiscardedSectionTitle: "Transferències descartades",
+ transfersCreateSectionTitle: "Crear una transferència",
+ transfersAllSectionTitle: "Transferències",
+ transfersSearchPlaceholder: "Cercar a Transferències...",
+ transfersMinAmountLabel: "Import mín.",
+ transfersMaxAmountLabel: "Import màx.",
+ transfersSortRecent: "Més recents",
+ transfersSortAmount: "Import més alt",
+ transfersSortDeadline: "Termini més proper",
+ transfersSearchButton: "Cercar",
+ transfersExpiredBadge: "CADUCADA",
+ transfersUpdatedAt: "Actualitzat",
+ transfersNoMatch: "No hi ha transferències que coincideixin amb la teva cerca.",
+ votationsTitle: "Votacions",
+ votationsDescription: "Descobreix i gestiona votacions a la teva xarxa.",
+ voteMineSectionTitle: "Les teves votacions",
+ voteCreateSectionTitle: "Crear una votació",
+ voteUpdateSectionTitle: "Actualitzar",
+ voteOpenTitle: "Votacions obertes",
+ voteClosedTitle: "Votacions tancades",
+ voteAllSectionTitle: "Govern",
+ voteCreateButton: "Crear una votació",
+ voteErrorTitle: "Revisa el formulari",
+ voteErrorDeadlineMin: "La data límit ha de ser d'almenys {days} dies a partir d'ara.",
+ voteErrorGeneric: "No s'ha pogut desar la votació.",
+ voteLocked: "Aquesta votació ja ha rebut vots o opinions, o pertany al Parlament o als Tribunals: ja no es pot editar ni esborrar.",
+ voteUpdateButton: "Actualitzar",
+ voteDeleteButton: "Eliminar",
+ voteOptionYes: "SÍ",
+ voteOptionNo: "NO",
+ voteOptionAbstention: "ABSTENCIÓ",
+ voteConfused: "CONFÓS",
+ voteFollowMajority: "SEGUIR LA MAJORIA",
+ voteNotInterested: "SENSE INTERÈS",
+ voteFilterAll: "TOTES",
+ voteFilterRecent: "RECENTS",
+ voteFilterMine: "MEVES",
+ voteFilterOpen: "OBERTES",
+ voteFilterClosed: "TANCADES",
+ voteQuestionLabel: "Pregunta",
+ voteDeadlineLabel: "Termini",
+ voteOptionsLabel: "El teu vot",
+ voteBreakdown: "Desglossament",
+ voteFinalResult: "RESULTAT",
+ voteNoQuorum: "SENSE QUÒRUM",
+ voteTagsLabel: "Etiquetes",
+ voteDeadline: "Termini",
+ voteStatus: "Estat",
+ voteTags: "Etiquetes",
+ voteOpinions: "Opinions",
+ novotes: "No hi ha propostes de votació disponibles.",
+ voteCreatedAt: "Creat el",
+ voteNoQuestion: "No s'ha proporcionat cap pregunta",
+ voteUnknownCreator: "Creador desconegut",
+ voteUnknownDate: "Data desconeguda",
+ voteDetailSectionTitle: "Detalls de la votació",
+ voteCommentsLabel: "Comentaris",
+ voteCommentsForumButton: "Obrir la conversa",
+ voteCommentsSectionTitle: "Conversa oberta",
+ voteNoCommentsYet: "Encara no hi ha comentaris. Sigues la primera persona a opinar.",
+ commentsGoToLast: "Anar al darrer comentari",
+ voteNewCommentPlaceholder: "Escriu aquí el teu comentari…",
+ voteNewCommentButton: "Publicar el comentari",
+ voteNewCommentLabel: "Afegeix un comentari",
+ cvTitle: "CV",
+ cvEditSectionTitle: "Editar el CV",
+ cvCreateSectionTitle: "Crear un CV",
+ cvDescription: "Gestiona i comparteix les teves habilitats professionals i la teva informació.",
+ cvNameLabel: "Nom complet",
+ cvDescriptionLabel: "Resum",
+ cvPhotoLabel: "Foto",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Visitar el CV",
+ cvPersonalExperiencesLabel: "Experiències personals",
+ cvPersonalSkillsLabel: "Habilitats personals (separades per comes)",
+ cvOasisExperiencesLabel: "Experiències de contribució a Oasis",
+ cvOasisSkillsLabel: "Habilitats de contribució a Oasis (separades per comes)",
+ cvEducationExperiencesLabel: "Experiències educatives",
+ cvEducationalSkillsLabel: "Habilitats educatives (separades per comes)",
+ cvProfessionalExperiencesLabel: "Experiències professionals",
+ cvProfessionalSkillsLabel: "Habilitats professionals (separades per comes)",
+ cvLanguagesLabel: "Idiomes",
+ cvLocationLabel: "Ubicació",
+ cvStatusLabel: "Estat",
+ cvPreferencesLabel: "Preferències",
+ cvPersonal: "Personal",
+ cvOasis: "Contribuïdor d'Oasis (opcional)",
+ cvOasisContributorView: "Contribució",
+ cvEducational: "Educatiu (opcional)",
+ cvEducationalView: "Educatiu",
+ cvProfessional: "Professional (opcional)",
+ cvProfessionalView: "Professional",
+ cvAvailability: "Disponibilitat (opcional)",
+ cvUpdateButton: "Actualitzar",
+ cvCreateButton: "Crear un CV",
+ cvCreatedAt: "Creat el",
+ cvUpdatedAt: "Actualitzat el",
+ cvEditButton: "Actualitzar",
+ cvDeleteButton: "Eliminar",
+ cvNoCV: "No s'ha trobat cap CV.",
+ blogSubject: "Assumpte",
+ blogMessage: "Missatge",
+ blogImage: "Pujar contingut multimèdia (màx.: 75MB)",
+ blogMedia: "Adjunts (fins a 8 imatges i un vídeo)",
+ blogPublish: "Publicar",
+ pollsTitle: "Enquestes",
+ dataTitle: "Coincidències",
+ dataDescription: "Explora i visualitza les coincidències de la teva xarxa.",
+ dataFilterAll: "TOT",
+ dataFilterMine: "MEUS",
+ dataFilterRecent: "RECENTS",
+ dataFilterTop: "TOP",
+ dataKindInhabitants: "HABITANTS",
+ dataKindJobs: "FEINES",
+ dataKindProjects: "PROJECTES",
+ dataKindEvents: "ESDEVENIMENTS",
+ dataKindTribes: "TRIBUS",
+ dataKindMarket: "MERCAT",
+ dataKindHousing: "HABITATGE",
+ dataKindIndustry: "INDÚSTRIA",
+ dataKindTasks: "TASQUES",
+ dataKindReports: "INFORMES",
+ dataKindVotes: "VOTACIONS",
+ dataSearchPlaceholder: "Cercar a Coincidències...",
+ dataCohesionTitle: "Coeficient de cohesió (CC)",
+ dataCcShort: "CC",
+ dataCohesionHint: "Afinitat mitjana entre tot el que ha publicat la xarxa.",
+ dataAffinity: "Afinitat",
+ dataCommonTerms: "Paraula clau",
+ dataReasonFollowing: "Dones suport a aquest habitant",
+ dataReasonTribe: "Comparteix tribu amb tu",
+ dataReasonPinned: "Coincideix amb alguna cosa que has fixat",
+ dataReasonCv: "Coincideix amb les habilitats del teu CV",
+ dataReasonContent: "Relacionat amb el que publiques",
+ dataReasonRelated: "Relacionat amb els teus interessos",
+ dataReasonAlike: "Publicat per un habitant afí a tu",
+ dataReasonSupportsYou: "Et dona suport",
+ dataReasonMutual: "Suport mutu",
+ dataReasonRated: "Ben valorat per la xarxa",
+ dataReasonNear: "A prop teu",
+ dataStatPeople: "CV",
+ dataStatConnected: "Connectats",
+ dataStatSkills: "Habilitats",
+ dataBestMatch: "Millor coincidència",
+ dataStatIsolated: "Aïllats",
+ dataStatEntities: "Entitats comparades",
+ dataStatTerms: "Termes diferents",
+ dataStatPairs: "Parells connectats",
+ dataMatchesTitle: "Coincidències",
+ dataMatchesHint: "Suggeriments personalitzats de l'algorisme.",
+ dataTermsTitle: "Paraules clau",
+ dataTermsHint: "Els termes que apareixen en més continguts.",
+ dataConnections: "Coincidències enllaçades",
+ dataTopicTitle: "Tot el relacionat amb",
+ dataTopicHint: "El que l'algorisme relaciona amb aquest tema",
+ dataNoMatches: "No hi ha dades creuades per mostrar.",
+ dataNoProfile: "Publica contingut o escriu el teu CV perquè l'algorisme aprengui què t'interessa.",
+ pollsDescription: "Mòdul per preguntar a la xarxa i comptar les respostes.",
+ pollFilterAll: "TOTES",
+ pollFilterMine: "MEVES",
+ pollFilterRecent: "RECENTS",
+ pollFilterTop: "TOP",
+ pollFilterVoted: "VOTADES",
+ pollFilterOpen: "OBERTES",
+ pollFilterClosed: "TANCADES",
+ pollCreateButton: "Crear una enquesta",
+ pollCreateTitle: "Crear una enquesta",
+ pollEditTitle: "Editar l'enquesta",
+ pollQuestion: "Pregunta",
+ pollQuestionPlaceholder: "Què vols preguntar?",
+ pollOptions: "Opcions (una per línia)",
+ pollOutcome: "Resultat",
+ pollNoVotesYet: "Encara sense vots",
+ pollTie: "Empat",
+ pollOptionsPlaceholder: "Plaça\nParc\nBar",
+ pollAnonymous: "Anònima",
+ pollAnonymousLabel: "Enquesta anònima",
+ pollMultiple: "Resposta múltiple",
+ pollMultipleLabel: "Permetre diverses respostes",
+ pollDeadline: "Data límit",
+ pollTags: "Etiquetes",
+ pollPublishButton: "Publicar l'enquesta",
+ pollUpdateButton: "Actualitzar",
+ pollCloseButton: "Tancar",
+ pollDeleteButton: "Eliminar",
+ pollVoteButton: "Votar",
+ pollChangeVote: "Canviar el vot",
+ pollVoters: "Votants",
+ pollComments: "Comentaris",
+ pollStatusLabel: "Estat",
+ pollStatusOpen: "OBERTA",
+ pollStatusClosed: "TANCADA",
+ pollSearchPlaceholder: "Cercar a Enquestes...",
+ pollsNoItems: "No s'han trobat enquestes.",
+ viewPoll: "Veure l'enquesta",
+ pollChatCreate: "Crear una enquesta",
+ pollInChat: "Enquesta",
+ blogTitle: "Blogs",
+ blogDescription: "Mòdul per descobrir i gestionar blogs.",
+ blogFilterAll: "TOTS",
+ blogFilterMine: "MEUS",
+ blogFilterRecent: "RECENTS",
+ blogFilterFavorites: "PREFERITS",
+ blogFilterTop: "TOP",
+ blogCreateButton: "Crear un blog",
+ blogSearchPlaceholder: "Cercar a Blogs...",
+ blogComments: "Comentaris",
+ blogAllowComments: "Permetre comentaris",
+ blogCommentsClosed: "L'autor ha tancat els comentaris d'aquest blog.",
+ blogNoItems: "No s'han trobat blogs.",
+ viewBlog: "Veure el blog",
+ forumTitle: "Fòrums",
+ forumCategoryLabel: "Categoria",
+ forumTitleLabel: "Títol",
+ forumTitlePlaceholder: "Títol del fòrum...",
+ forumCreateButton: "Crear un fòrum",
+ forumCreateSectionTitle: "Crear un fòrum",
+ forumDescription: "Parla obertament amb habitants de la teva xarxa.",
+ forumSearchPlaceholder: "Cercar a Fòrums...",
+ forumFilterAll: "TOTS",
+ forumFilterMine: "MEUS",
+ forumFilterRecent: "RECENTS",
+ forumFilterTop: "TOP",
+ forumParticipants: "participants",
+ forumMessages: "missatges",
+ forumMessageLabel: "Missatge",
+ forumMessagePlaceholder: "Escriu el teu missatge...",
+ forumSendButton: "Enviar",
+ noForums: "Encara no hi ha fòrums disponibles.",
+ forumVisitButton: "Visitar el fòrum",
+ forumTopicLabel: "Tema",
+ imageTitle: "Imatges",
+ imageDescription: "Explora i gestiona contingut d'imatges a la teva xarxa.",
+ imageMineSectionTitle: "Les teves imatges",
+ imageCreateSectionTitle: "Pujar una imatge",
+ imageUpdateSectionTitle: "Actualitzar la imatge",
+ imageAllSectionTitle: "Imatges",
+ imageRecentSectionTitle: "Imatges recents",
+ imageTopSectionTitle: "Imatges top",
+ imageFavoritesSectionTitle: "Preferits",
+ imageGallerySectionTitle: "Galeria",
+ imageFilterAll: "TOTES",
+ imageFilterMine: "MEVES",
+ imageFilterRecent: "RECENTS",
+ imageFilterTop: "TOP",
+ imageFilterFavorites: "PREFERITS",
+ imageFilterGallery: "GALERIA",
+ imageCreateButton: "Pujar una imatge",
+ imageUpdateButton: "Actualitzar",
+ imageAddFavoriteButton: "Afegir a preferits",
+ imageRemoveFavoriteButton: "Treure de preferits",
+ imageFileLabel: "Selecciona un fitxer d'imatge (.jpeg, .jpg, .png, .gif)",
+ imageTagsLabel: "Etiquetes",
+ imageTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ imageTitleLabel: "Títol",
+ imageTitlePlaceholder: "Opcional",
+ imageDescriptionLabel: "Descripció",
+ imageDescriptionPlaceholder: "Opcional",
+ imageNoFile: "No s'ha proporcionat cap fitxer d'imatge",
+ noImages: "No hi ha imatges disponibles.",
+ imageSearchPlaceholder: "Cercar a Imatges...",
+ imageSortRecent: "Més recents",
+ imageSortOldest: "Més antigues",
+ imageSortTop: "Més votades",
+ imageSearchButton: "Cercar",
+ imageUpdatedAt: "Actualitzat",
+ imageNoMatch: "Cap imatge no coincideix amb la teva cerca.",
+ feedSearchPlaceholder: "Cercar a Feed...",
+ feedTitle: "Feed",
+ feedDetailTitle: "Feed",
+ feedOpenDiscussion: "Obrir el debat",
+ feedPostComment: "Publicar el comentari",
+ noComments: "Encara no hi ha comentaris",
+ createFeedTitle: "Crear un feed",
+ createFeedButton: "Enviar el feed!",
+ feedPlaceholder: "Què està passant? (màxim 280 caràcters)",
+ TODAYButton: "AVUI",
+ totalOpinions: "Total d'opinions",
+ moreVoted: "Més votat",
+ noFeedsFound: "No s'han trobat feeds.",
+ createdAtLabel: "Creat el",
+ FeedshareYourOpinions: "Descobreix i comparteix textos breus a la teva xarxa.",
+ refeedButton: "Reenviar",
+ alreadyRefeeded: "Ja has realimentat això.",
+ activityTitle: "Activitat",
+ yourActivity: "La teva activitat",
+ globalActivity: "Activitat",
+ activityList: "Activitat",
+ activityDesc: "Consulta l'activitat més recent de la teva xarxa.",
+ allButton: "TOT",
+ mineButton: "MEVES",
+ noActions: "No hi ha activitat disponible.",
+ from: "De",
+ to: "A",
+ amount: "Quantitat",
+ concept: "Concepte",
+ description: "Descripció",
+ meme: "Mem",
+ typeRecent: "RECENTS",
+ typeTop: "TOP",
+ typePost: "BLOG",
+ activityUpdateLabel: "ACTUALITZACIÓ",
+ typeTribe: "TRIBUS",
+ typeLarp: "L.A.R.P.",
+ typeInhabitants: "HABITANTS",
+ typeAbout: "HABITANTS",
+ typeCurriculum: "CV",
+ typeImage: "IMATGES",
+ typeBookmark: "MARCADORS",
+ typeDocument: "DOCUMENTS",
+ typeVotes: "VOTACIONS",
+ typeAudio: "ÀUDIOS",
+ typeMarket: "MERCAT",
+ typeJob: "FEINES",
+ typeProject: "PROJECTES",
+ typeVideo: "VÍDEOS",
+ typeVote: "DIFUSIÓ",
+ typeEvent: "ESDEVENIMENTS",
+ typeTransfer: "TRANSFERÈNCIES",
+ typeTask: "TASQUES",
+ typePixelia: "PIXELIA",
+ typeForum: "FÒRUMS",
+ typeReport: "INFORMES",
+ typeFeed: "FEEDS",
+ typeContact: "CONTACTE",
+ typePub: "PUB",
+ typeTombstone: "ELIMINAT",
+ typeBanking: "BANCA",
+ typeBankWallet: "BANCA/MONEDER",
+ typeBankClaim: "BANCA/RBU",
+ typeKarmaScore: "KARMA",
+ typeParliament: "PARLAMENT",
+ typeSpread: "RÈPLIQUES",
+ typeParliamentCandidature: "Parlament · Candidatura",
+ typeParliamentTerm: "Parlament · Mandat",
+ typeParliamentProposal:"Parlament · Proposta",
+ typeParliamentRevocation:"Parlament · Revocació",
+ typeParliamentLaw: "Parlament · Nova llei",
+ typeCourts: "TRIBUNALS",
+ typeCourtsCase: "Tribunals · Cas",
+ typeCourtsEvidence: "Tribunals · Prova",
+ typeCourtsAnswer: "Tribunals · Resposta",
+ typeCourtsVerdict: "Tribunals · Veredicte",
+ typeCourtsSettlement: "Tribunals · Acord",
+ typeCourtsSettlementProposal: "Tribunals · Proposta d'acord",
+ typeCourtsSettlementAccepted: "Tribunals · Acord acceptat",
+ typeCourtsNomination: "Tribunals · Nominació",
+ typeCourtsNominationVote: "Tribunals · Votació de nominació",
+ question: "Pregunta",
+ deadline: "Data límit",
+ status: "Estat",
+ votes: "Vots",
+ totalVotes: "Vots totals",
+ voteTotalVotes: "Vots totals",
+ name: "Nom",
+ skills: "Habilitats",
+ tags: "Etiquetes",
+ title: "Títol",
+ date: "Data",
+ category: "Categoria",
+ attendees: "Assistents",
+ location: "Ubicació",
+ contentWarning: "Assumpte",
+ bankWalletConnected: "Moneder ECOin",
+ bankUbiReceived: "RBU rebuda",
+ bankTx: "Tx",
+ bankEpochShort: "Època",
+ viewDetails: "Veure els detalls",
+ link: "Enllaç",
+ activityProjectFollow: "%OASIS% ara està %ACTION% aquest projecte %PROJECT%",
+ activityProjectUnfollow: "%OASIS% ara està %ACTION% aquest projecte %PROJECT%",
+ following: "SEGUINT",
+ unfollowing: "DEIXANT DE SEGUIR",
+ pledged: "APORTAT",
+ parliamentCandidatureId: "Candidatura",
+ parliamentGovMethod: "Mètode",
+ parliamentVotesReceived: "Vots rebuts",
+ parliamentMethodANARCHY: "Anarquia",
+ parliamentMethodVOTE: "Votació comunitària",
+ parliamentMethodRANKED: "Vot preferencial",
+ parliamentMethodPLURALITY: "Pluralitat",
+ parliamentMethodCOUNCIL: "Consell",
+ parliamentMethodJURY: "Jurat",
+ parliamentAnarchy: "ANARQUIA",
+ parliamentElectionsStart: "Inici de les eleccions",
+ parliamentElectionsEnd: "Fi de les eleccions",
+ parliamentCurrentLeader: "Candidatura guanyadora",
+ parliamentProposalTitle: "Títol",
+ parliamentOpenVote: "Votació oberta",
+ parliamentStatus: "Estat",
+ parliamentLawQuestion: "Pregunta",
+ parliamentLawMethod: "Mètode",
+ parliamentLawProposer: "Proponent",
+ parliamentLawEnacted: "Promulgada",
+ parliamentLawVotes: "Vots",
+ createdAt: "Creat el",
+ courtsCaseTitle: "Cas",
+ courtsMethod: "Mètode",
+ courtsMethodJUDGE: "Jutge",
+ courtsMethodJUDGES: "Tribunal de jutges",
+ courtsMethodSINGLE_JUDGE: "Jutge únic",
+ courtsMethodJURY: "Jurat",
+ courtsMethodCOUNCIL: "Consell",
+ courtsMethodCOMMUNITY: "Comunitat",
+ courtsMethodARBITRATION: "Arbitratge",
+ courtsMethodVOTE: "Votació comunitària",
+ courtsAccuser: "Acusació",
+ courtsRespondent: "Defensa",
+ courtsThStatus: "Estat",
+ courtsThAnswerBy: "Respondre abans de",
+ courtsThEvidenceBy: "Proves fins a",
+ courtsThDecisionBy: "Decisió abans de",
+ courtsVotesNeeded: "Vots necessaris",
+ courtsVotesSlashTotal: "SÍ/TOTAL",
+ courtsOpenVote: "Votació oberta",
+ courtsAnswerTitle: "Resposta",
+ courtsVerdictResult: "Resultat",
+ courtsVerdictOrders: "Ordres",
+ courtsSettlementText: "Acord",
+ courtsSettlementAccepted: "Acceptat",
+ courtsJudge: "Jutge",
+ courtsThSupports: "Suports",
+ courtsFilterOpenCase: "Obrir un cas",
+ courtsCaseMediatorsPh: "IDs d'Oasis dels mediadors, separats per comes",
+ courtsMediatorsLabel: "Mediadors",
+ courtsThCase: "Cas",
+ courtsThCreatedAt: "Data d'inici",
+ courtsPublicPrefLabel: "Visibilitat després de la resolució",
+ courtsPublicPrefYes: "Accepto que aquest cas sigui totalment públic",
+ courtsPublicPrefNo: "Prefereixo mantenir privats els detalls",
+ courtsPublicPrefSubmit: "Desar la preferència de visibilitat",
+ courtsMethodMEDIATION: "Mediació",
+ courtsNoCases: "No hi ha casos.",
+ reportsTitle: "Informes",
+ reportsDescription: "Gestiona i segueix els informes de la teva xarxa.",
+ reportsSearchPlaceholder: "Cercar a Informes...",
+ reportsFilterAll: "TOTS",
+ reportsFilterRecent: "RECENTS",
+ reportsFilterTop: "TOP",
+ reportsFilterMine: "MEUS",
+ reportsFilterFeatures: "FUNCIONS",
+ reportsFilterBugs: "ERRORS",
+ reportsFilterAbuse: "ABUSOS",
+ reportsFilterContent: "CONTINGUT",
+ reportsFilterConfirmed: "CONFIRMATS",
+ reportsFilterResolved: "RESOLTS",
+ reportsFilterOpen: "OBERTS",
+ reportsFilterUnderReview: "EN REVISIÓ",
+ reportsFilterInvalid: "NO VÀLIDS",
+ reportsCreateButton: "Crear un informe",
+ reportsTitleLabel: "Títol",
+ reportsCategory: "Categoria",
+ reportsCategoryFeatures: "Funcions",
+ reportsCategoryBugs: "Errors",
+ reportsCategoryAbuse: "Abús",
+ reportsCategoryContent: "Contingut",
+ reportsUpdateButton: "Actualitzar",
+ reportsDeleteButton: "Eliminar",
+ reportsMineSectionTitle: "Els teus informes",
+ reportsFeaturesSectionTitle: "Sol·licituds de funcions",
+ reportsBugsSectionTitle: "Errors",
+ reportsAbuseSectionTitle: "Informes d'abús",
+ reportsContentSectionTitle: "Problemes de contingut",
+ reportsAllSectionTitle: "Informes",
+ reportsNoItems: "No hi ha informes disponibles.",
+ reportsSeverity: "Gravetat",
+ reportsSeverityLow: "Baixa",
+ reportsSeverityMedium: "Mitjana",
+ reportsSeverityHigh: "Alta",
+ reportsSeverityCritical: "Crítica",
+ reportsStatus: "Estat",
+ reportsStatusOpen: "Obert",
+ reportsStatusUnderReview: "En revisió",
+ reportsStatusResolved: "Resolt",
+ reportsStatusInvalid: "No vàlid",
+ reportsConfirmButton: "CONFIRMAR L'INFORME!",
+ reportsConfirmations: "Confirmacions",
+ reportsConfirmedSectionTitle: "Informes confirmats",
+ reportsCreateTaskButton: "Crear una tasca",
+ reportsOpenSectionTitle: "Informes oberts",
+ reportsUnderReviewSectionTitle: "Informes en revisió",
+ reportsResolvedSectionTitle: "Informes resolts",
+ reportsInvalidSectionTitle: "Informes no vàlids",
+ reportsBugTemplateTitle: "Dades per reproduir (errors)",
+ reportsFeatureTemplateTitle: "Detalls (funcions)",
+ reportsAbuseTemplateTitle: "Detalls (abús)",
+ reportsContentTemplateTitle: "Detalls (problemes de contingut)",
+ reportsStepsToReproduceLabel: "Passos per reproduir-ho",
+ reportsStepsToReproducePlaceholder: "1) ...\n2) ...\n3) ...",
+ reportsExpectedBehaviorLabel: "Resultat esperat",
+ reportsExpectedBehaviorPlaceholder: "Què hauria de passar?",
+ reportsActualBehaviorLabel: "Resultat real",
+ reportsActualBehaviorPlaceholder: "Què passa realment?",
+ reportsEnvironmentLabel: "Entorn",
+ reportsEnvironmentPlaceholder: "Versió, dispositiu, SO, navegador, configuració, registres, etc.",
+ reportsReproduceRateLabel: "Freqüència",
+ reportsReproduceRateAlways: "Sempre",
+ reportsReproduceRateOften: "Sovint",
+ reportsReproduceRateSometimes: "De vegades",
+ reportsReproduceRateRarely: "Rarament",
+ reportsReproduceRateUnable: "No es pot reproduir",
+ reportsReproduceRateUnknown: "No especificat",
+ reportsProblemStatementLabel: "Problema / necessitat",
+ reportsProblemStatementPlaceholder: "Quin problema resol aquesta funció?",
+ reportsUserStoryLabel: "Història d'habitant",
+ reportsUserStoryPlaceholder: "Com a , vull , per .",
+ reportsAcceptanceCriteriaLabel: "Criteris d'acceptació",
+ reportsAcceptanceCriteriaPlaceholder: "- Donat...\n- Quan...\n- Aleshores...",
+ reportsWhatHappenedLabel: "Què ha passat?",
+ reportsWhatHappenedPlaceholder: "Descriu l'incident amb context i dates aproximades.",
+ reportsReportedUserLabel: "Habitant / entitat denunciada",
+ reportsReportedUserPlaceholder: "@habitant, feed, ID, enllaç, etc.",
+ reportsEvidenceLinksLabel: "Proves / enllaços",
+ reportsEvidenceLinksPlaceholder: "Enganxa enllaços, IDs de missatges, captures (si escau), etc.",
+ reportsContentLocationLabel: "On és el contingut",
+ reportsContentLocationPlaceholder: "Enllaç, ID, canal, fil, autor, etc.",
+ reportsWhyInappropriatePlaceholder: "Explica el motiu i l'impacte.",
+ reportsRequestedActionLabel: "Acció sol·licitada",
+ reportsRequestedActionPlaceholder: "Eliminar, amagar, marcar, advertir, etc.",
+ tribesTitle: "Tribus",
+ tribeFilterAll: "TOTES",
+ tribeFilterRecent: "RECENTS",
+ tribeFilterMine: "MEVES",
+ tribeFilterMembership: "PERTINENÇA",
+ tribeFilterSubtribes: "SUBTRIBUS",
+ tribeFilterTop: "TOP",
+ tribeFilterGallery: "GALERIA",
+ tribeFeedFilterTOP: "TOP",
+ tribeFeedFilterMINE: "MEUS",
+ tribeFeedFilterALL: "TOTS",
+ tribeFeedFilterRECENT: "RECENTS",
+ courtsStanceDENY: "Negar",
+ courtsStanceADMIT: "Admetre",
+ courtsStancePARTIAL: "Admetre en part",
+ tribeAllSectionTitle: "Tribus",
+ tribeMineSectionTitle: "Les teves tribus",
+ tribeCreateSectionTitle: "Crear una tribu",
+ tribeUpdateSectionTitle: "Actualitzar la tribu",
+ tribeGallerySectionTitle: "Galeria de tribus",
+ tribeRecentSectionTitle: "Tribus recents",
+ tribeTopSectionTitle: "Tribus populars",
+ tribeRootLabel: "ARREL",
+ tribeDescription: "Explora o crea tribus a la teva xarxa.",
+ tribeMainTribeLabel: "TRIBU PRINCIPAL",
+ tribeCreateButton: "Crear una tribu",
+ tribeUpdateButton: "Actualitzar",
+ tribeDeleteButton: "Eliminar",
+ tribeImageLabel: "Pujar contingut multimèdia (màx.: 75MB)",
+ tribeTitleLabel: "Títol",
+ searchTribesPlaceholder: "Cercar a Tribus...",
+ tribeTitlePlaceholder: "Nom de la tribu",
+ tribeDescriptionLabel: "Descripció",
+ tribeDescriptionPlaceholder: "Descriu aquesta tribu",
+ tribeLocationLabel: "Ubicació",
+ tribeLocationPlaceholder: "On és ubicada aquesta tribu?",
+ tribeTagsLabel: "Etiquetes",
+ tribeTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ tribeInviteMode: "Mode d'invitació",
+ tribeModeLabel: "MODE",
+ tribeIsAnonymousLabel: "ESTAT",
+ tribeMembersCount: "Membres",
+ tribeEnterInvite: "INTRODUIR LA INVITACIÓ",
+ subscriptionTitle: "Subscripcions",
+ subscriptionOn: "Subscrit",
+ subscriptionOff: "No subscrit",
+ subscriptionSubscribe: "Subscriure-s'hi",
+ subscriptionUnsubscribe: "Cancel·lar la subscripció",
+ subscriptionSubscribers: "Subscriptors",
+ pmListLabel: "Enviar a",
+ pmListNone: "— Sense llista —",
+ pmListNoSubscribers: "Sense subscriptors",
+ tribeLeaveButton: "SORTIR",
+ tribePublic: "PÚBLICA",
+ tribePrivate: "PRIVADA",
+ tribeGenerateInvite: "INVITACIÓ ÚNICA",
+ tribeOpenInvitation: "INVITACIÓ OBERTA",
+ tribeJoinOpen: "UNIR-SE A LA TRIBU",
+ tribeRemoveInvitation: "ELIMINAR LA INVITACIÓ",
+ tribeCreatedAt: "Creat el",
+ tribeAuthor: "Per",
+ tribeStrict: "Estricte",
+ tribeOpen: "Oberta",
+ tribeFeedRefeeds: "Redifusions",
+ tribeFeedRefeed: "Redifondre",
+ tribeFeedMessagePlaceholder: "Escriu un feed…",
+ tribeFeedSend: "Enviar",
+ tribeFeedEmpty: "Encara no hi ha missatges de feed disponibles.",
+ noTribes: "Encara no s'han trobat tribus.",
+ tribeNotFound: "No s'ha trobat la tribu!",
+ createTribeTitle: "Crear una tribu",
+ updateTribeTitle: "Actualitzar la tribu",
+ tribeSectionInhabitants: "Habitants",
+ tribeSectionVotations: "VOTACIONS",
+ tribeSectionEvents: "ESDEVENIMENTS",
+ tribeSectionTasks: "TASQUES",
+ tribeSectionFeed: "FEED",
+ tribeSectionForum: "FÒRUM",
+ tribeSectionMedia: "Multimèdia",
+ tribeSectionImages: "IMATGES",
+ tribeSectionAudios: "ÀUDIOS",
+ tribeSectionVideos: "VÍDEOS",
+ tribeSectionDocuments: "DOCUMENTS",
+ tribeSectionBookmarks: "MARCADORS",
+ tribeSectionMaps: "MAPES",
+ tribeSectionPads: "PADS",
+ tribeSectionChats: "XATS",
+ tribeSectionCalendars: "CALENDARIS",
+ tribePadCreate: "Crear un pad",
+ tribeChatCreate: "Crear un xat",
+ tribeCalendarCreate: "Crear un calendari",
+ tribePadsEmpty: "Encara no hi ha pads.",
+ tribeChatsEmpty: "Encara no hi ha xats.",
+ tribeCalendarsEmpty: "Encara no hi ha calendaris.",
+ tribeInhabitantsEmpty: "Encara no hi ha habitants en aquesta tribu.",
+ tribeEventCreate: "Crear un esdeveniment",
+ tribeEventsEmpty: "Encara no hi ha esdeveniments.",
+ tribeEventTitle: "Títol",
+ tribeEventDescription: "Descripció",
+ tribeEventDate: "Data",
+ tribeEventLocation: "Ubicació",
+ tribeEventAttend: "ASSISTIR-HI",
+ tribeEventUnattend: "NO ASSISTIR-HI",
+ tribeEventAttendees: "Assistents",
+ tribeTaskCreate: "Crear una tasca",
+ tribeTasksEmpty: "Encara no hi ha tasques.",
+ tribeTaskTitle: "Títol",
+ tribeTaskDescription: "Descripció",
+ tribeTaskPriority: "Prioritat",
+ tribeTaskDeadline: "Data límit",
+ tribeTaskAssignees: "Assignats",
+ tribeTaskStatusInProgress: "EN CURS",
+ tribeTaskStatusClosed: "TANCAR",
+ tribeTaskAssign: "ASSIGNAR",
+ tribeTaskUnassign: "DESASSIGNAR",
+ tribeVotationCreate: "Crear una votació",
+ tribeVotationsEmpty: "Encara no hi ha votacions.",
+ tribeVotationTitle: "Títol",
+ tribeVotationDescription: "Descripció",
+ tribeVotationOptions: "Opcions",
+ tribeVotationDeadline: "Data límit",
+ tribeVotationVote: "VOTAR",
+ tribeVotationResults: "Vots",
+ tribeVotationClose: "TANCAR LA VOTACIÓ",
+ tribeVotationOptionPlaceholder: "Opció",
+ tribeForumCreate: "Crear un fòrum",
+ tribeForumEmpty: "Encara no hi ha fils.",
+ tribeForumTitle: "Títol",
+ tribeForumText: "Missatge",
+ tribeForumCategory: "Categoria",
+ tribeForumReply: "Respondre",
+ tribeForumReplies: "Respostes",
+ tribeMediaUpload: "Pujar multimèdia",
+ readDocument: "Llegir el document",
+ tribeCreateImage: "Crear una imatge",
+ tribeCreateAudio: "Crear un àudio",
+ tribeCreateVideo: "Crear un vídeo",
+ tribeCreateDocument: "Crear un document",
+ tribeCreateBookmark: "Crear un marcador",
+ tribeMediaEmpty: "Encara no hi ha multimèdia.",
+ tribeMediaTitle: "Títol",
+ tribeMediaDescription: "Descripció",
+ tribeMediaTypeImage: "Imatge",
+ tribeMediaTypeVideo: "Vídeo",
+ tribeMediaTypeAudio: "Àudio",
+ tribeMediaTypeDocument: "Document",
+ tribeMediaTypeBookmark: "Marcador",
+ tribeContentDelete: "ELIMINAR",
+ tribeReachTribe: "TRIBU",
+ tribeReachNotice: "OASIS ho mostra a tots els habitants i CLEARNET també a la web oberta. Obrir-ho deixa una còpia llegible fora de la tribu: tornar a TRIBU ho amaga, però les còpies ja compartides no es poden esborrar.",
+ tribeReachPrivate: "El contingut d'una tribu privada només es pot quedar dins de la tribu.",
+ tribeReachOpenedBy: "Obert per",
+ tribeReachChange: "On es publica",
+ tribeInviteCodeText: "Codi d'invitació: ",
+ oasisVersionLabel: "Versió d'Oasis",
+ tribeInviteCodeHint: "Comparteix aquest codi amb qui vulguis convidar. S'hi pot unir des de /invites.",
+ tribeStatusOpen: "OBERT",
+ tribeStatusClosed: "TANCAT",
+ tribeStatusInProgress: "EN CURS",
+ tribePriorityLow: "BAIXA",
+ tribePriorityMedium: "MITJANA",
+ tribePriorityHigh: "ALTA",
+ tribePriorityCritical: "CRÍTICA",
+ tribeTaskFilterAll: "TOTES",
+ tribeMediaFilterAll: "TOTS",
+ tribeForumCatGeneral: "GENERAL",
+ tribeForumCatProposal: "PROPOSTA",
+ tribeForumCatQuestion: "PREGUNTA",
+ tribeForumCatAnnouncement: "ANUNCI",
+ tribeStatusLabel: "Estat",
+ tribeSubTribes: "SUBTRIBUS",
+ tribeSubTribesCreate: "Crear una subtribu",
+ tribeSubTribesStrictDenied: "El mode estricte de la tribu no et permet crear noves subtribus. Posa't en contacte amb l'administrador.",
+ tribeActivityRefeed: "REFEED",
+ tribeSectionActivity: "ACTIVITAT",
+ tribeSectionTrending: "TENDÈNCIES",
+ tribeSectionTags: "ETIQUETES",
+ tribeSectionSearch: "CERCAR",
+ tribeActivityEmpty: "Encara no hi ha activitat.",
+ tribeActivityCreated: "ha creat",
+ tribeActivityPosted: "ha publicat",
+ tribeActivityReplied: "ha respost",
+ tribeTrendingEmpty: "Encara no hi ha contingut en tendència.",
+ tribeTrendingPeriodDay: "Avui",
+ tribeTrendingPeriodWeek: "Aquesta setmana",
+ tribeTrendingPeriodAll: "Tot",
+ tribeTrendingEngagement: "interacció",
+ tribeTopCategory: "Més votat",
+ tribeTagsEmpty: "No s'han trobat etiquetes.",
+ tribeSearchPlaceholder: "Cercar contingut de la tribu...",
+ tribeSearchEmpty: "Sense resultats.",
+ tribeSearchResults: "Resultats",
+ tribeSearchMinChars: "Introdueix almenys 2 caràcters per cercar.",
+ agendaTitle: "Agenda",
+ agendaDescription: "Aquí pots trobar tots els teus elements assignats.",
+ agendaSearchPlaceholder: "Cercar a l'Agenda...",
+ agendaFilterAll: "TOTS",
+ agendaFilterToday: "AVUI",
+ agendaFilterUpcoming: "PROPERS",
+ agendaFilterOverdue: "VENÇUTS",
+ agendaFilterOpen: "OBERTS",
+ agendaFilterClosed: "TANCATS",
+ agendaFilterTasks: "TASQUES",
+ agendaFilterMarket: "MERCAT",
+ agendaFilterTribes: "TRIBUS",
+ agendaFilterEvents: "ESDEVENIMENTS",
+ agendaFilterReports: "INFORMES",
+ agendaFilterTransfers: "TRANSFERÈNCIES",
+ agendaFilterJobs: "FEINES",
+ agendaFilterIndustry: "INDÚSTRIA",
+ agendaFilterHousing: "HABITATGE",
+ agendaFilterProjects: "PROJECTES",
+ agendaFilterCalendars: "CALENDARIS",
+ agendaNoItems: "No s'han trobat assignacions.",
+ agendaDiscardButton: "Descartar",
+ agendaRestoreButton: "Restaurar",
+ agendaRemoveButton: "Treure",
+ agendaMembersCount: "Membres",
+ agendaLocationLabel: "Ubicació",
+ agendaYes: "SÍ",
+ agendaNo: "NO",
+ agendaInviteModeLabel: "Mode d'invitació",
+ agendaAnonymousLabel: "Mode anònim",
+ agendaMembersLabel: "Membres",
+ agendareportCategory: "Categoria",
+ agendareportSeverity: "Gravetat",
+ agendareportStatus: "Estat",
+ agendaTransferConcept: "Concepte",
+ agendaTransferAmount: "Quantitat",
+ agendaTransferDeadline: "Termini",
+ opinionsTitle: "Opinions",
+ shareYourOpinions: "Descobreix i vota opinions a la teva xarxa.",
+ author: "Per",
+ voteNow: "Vota ara",
+ alreadyVoted: "Ja has opinat.",
+ noOpinionsFound: "No s'han trobat opinions.",
+ TOPButton: "TOP",
+ opinionsTotalCount: "Total d'opinions",
+ voteInteresting: "Interessant",
+ voteNecessary: "Necessari",
+ voteUseful: "Útil",
+ voteInformative: "Informatiu",
+ voteWellResearched: "Ben documentat",
+ voteNeedsSources: "Necessita fonts",
+ voteWrong: "Incorrecte",
+ voteLowQuality: "Baixa qualitat",
+ voteLove: "Amor",
+ voteClear: "Clar",
+ voteMisleading: "Enganyós",
+ voteOffTopic: "Fora de tema",
+ voteDuplicate: "Duplicat",
+ voteClickbait: "Esquer de clics",
+ votePropaganda: "Propaganda",
+ voteFunny: "Divertit",
+ voteInspiring: "Inspirador",
+ voteUplifting: "Encoratjador",
+ voteUnnecessary: "Innecessari",
+ voteRejected: "Rebutjat",
+ voteConfusing: "Confús",
+ voteTroll: "Troll",
+ voteNsfw: "NSFW",
+ voteViolent: "Violent",
+ voteToxic: "Tòxic",
+ voteHarassment: "Assetjament",
+ voteHate: "Odi",
+ voteScam: "Estafa",
+ voteTriggering: "Provocador",
+ voteInsightful: "Perspicaç",
+ voteAccurate: "Precís",
+ voteActionable: "Aplicable",
+ voteCreative: "Creatiu",
+ voteSpam: "Spam",
+ voteAdultOnly: "Només adults",
+ privateMessage: "MP",
+ pmSendTitle: "Missatges privats",
+ pmSend: "Enviar!",
+ pmCancel: "Cancel·lar",
+ pmReset: "Restablir",
+ pmSharedKeyHint: "Comparteix aquesta clau amb el destinatari per un altre canal. Cal per desxifrar.",
+ pmDescription: "Fes servir aquest formulari per enviar un missatge/fitxer xifrat a altres habitants.",
+ pmComposeTitle: "Enviar un missatge",
+ pmRecipients: "Destinataris",
+ pmRecipientsHint: "Introdueix els IDs d'Oasis separats per comes",
+ pmLimitsHint: "Fins a 7 habitants per missatge.",
+ pmTextPlaceholder: "Escriu el teu missatge.",
+ pmSubject: "Assumpte",
+ pmSubjectHint: "Introdueix l'assumpte del missatge",
+ pmText: "Missatge",
+ pmCrypterChip: "2xE2E",
+ pmCrypterDecryptButton: "Desxifrar",
+ fileShareTitle: "Compartir un fitxer",
+ fileShareRecipientPlaceholder: "@...=.ed25519",
+ fileShareFileLabel: "Fitxer",
+ fileShareDownload: "Baixar",
+ fileShareMutualError: "Només pots compartir fitxers amb habitants amb qui us doneu suport mútuament.",
+ fileShareNoFile: "No s'ha seleccionat cap fitxer.",
+ fileShareTooLarge: "El fitxer supera la mida permesa.",
+ fileShareFailed: "No s'ha pogut preparar el fitxer.",
+ fileShareSendError: "No s'ha pogut enviar el fitxer.",
+ fileShareUnavailable: "Aquest fitxer no està disponible ara mateix. Torna-ho a provar més tard.",
+ pmCrypterBadKey: "La clau compartida és incorrecta!",
+ pmCrypterTooLong: "El missatge és massa llarg per xifrar-lo amb el Crypter. Escurça'l i torna-ho a provar.",
+ pmCrypterCipherLabel: "Missatge rexifrat",
+ pmCrypterCharsLabel: "caràcters",
+ pmInvalidRecipients: "Oasis ID no vàlid (hauria de ser com @…=.ed25519).",
+ pmEncryptionLabel: "Xifratge",
+ private: "Bústia",
+ privateDescription: "Gestiona els teus missatges privats.",
+ privateInbox: "BÚSTIA",
+ privateSent: "ENVIATS",
+ privateDelete: "Esborrar",
+ pmCreateButton: "Escriure un MP",
+ noPrivateMessages: "No hi ha missatges privats.",
+ pmReply: "Respondre",
+ pmReplies: "respostes",
+ inReplyTo: "EN RESPOSTA A",
+ forumInThread: "AL FIL",
+ pmPreview: "Previsualitzar",
+ pmPreviewTitle: "Previsualització",
+ performed: "→",
+ pmFromLabel: "De:",
+ pmToLabel: "Per a:",
+ pmNoSubject: "(sense assumpte)",
+ pmSubjectLabel: "Assumpte:",
+ pmBotJobs: "JobsBot",
+ pmBotProjects: "ProjectsBot",
+ pmBotMarket: "MarketBot",
+ pmBotShops: "ShopsBot",
+ pmBotPolitical: "PoliticalBot",
+ politicalBotLarpTitle: "La casa governant del L.A.R.P ha canviat.",
+ politicalBotParliamentTitle: "Ha començat un nou cicle de govern al Parlament.",
+ politicalBotTribeTitle: "Ha començat un nou cicle de govern en una de les teves tribus.",
+ politicalBotLarpIntro: "Ara governa {house} durant aquest cicle: {cycle}",
+ politicalBotParliamentIntro: "El govern actual és {gov}",
+ politicalBotParliamentIntroLeader: "El govern actual és {gov}, exercit per {leader}",
+ politicalBotTribeIntro: "El govern actual a la tribu {tribe} és {gov}",
+ politicalBotTribeIntroLeader: "El govern actual a la tribu {tribe} és {gov}, exercit per {leader}",
+ politicalBotLeaderLabel: "Líder",
+ inboxJobSubscribedTitle: "Nova subscripció a la teva oferta de feina",
+ pmInhabitantWithId: "Habitant amb ID OASIS:",
+ pmHasSubscribedToYourJobOffer: "s'ha subscrit a la teva oferta de feina",
+ inboxMarketItemSoldTitle: "Article venut",
+ inboxShopSoldTitle: "Producte venut",
+ pmYourItem: "El teu article",
+ pmHasBeenSoldTo: "s'ha venut a",
+ pmFor: "per",
+ inboxProjectPledgedTitle: "Nova aportació al teu projecte",
+ pmHasPledged: "ha aportat",
+ pmToYourProject: "al teu projecte",
+ blockchain: "Explorador",
+ blockchainDescription: "Explora i visualitza els blocs de la cadena.",
+ blockchainNoBlocks: "No s'han trobat blocs a la cadena.",
+ blockchainStatsTitle: "Estadístiques",
+ blockchainStatsTypeBreakdown: "Desglossament per tipus",
+ blockchainStatsTopAuthors: "Autors principals",
+ blockchainStatsCount: "Blocs",
+ blockchainBlockID: "ID del bloc",
+ blockchainBlockAuthor: "Autoria",
+ blockchainBlockCarbon: "Petjada de carboni",
+ blockchainBlockType: "Tipus",
+ blockchainBlockTimestamp: "Marca de temps",
+ blockchainLatestDatagram: "Darrer datagrama",
+ blockchainDatagram: "Datagrama",
+ blockchainDetails: "Veure els detalls del bloc",
+ blockchainViewBlockexplorer: "Veure a Blockexplorer",
+ blockchainBack: "Tornar a Blockexplorer",
+ banking: "Banca",
+ bankingTitle: "Banca",
+ bankingDescription: "L'economia col·lectiva d'ECOin.",
+ bankOverview: "Resum",
+ bankEpochs: "Èpoques",
+ bankRules: "Regles",
+ pending: "Pendents",
+ closed: "Tancades",
+ bankClaimNow: "Reclamar",
+ bankClaimUBI: "Reclamar RBU",
+ bankClaimAndPay: "Reclamar i pagar",
+ bankClaimedPending: "Reclamació pendent...",
+ bankStatusClaimed: "Reclamat",
+ bankStatusExpired: "Caducat",
+ bankPubOnly: "Operació només per a PUBs",
+ bankEpoch: "Època",
+ bankPool: "Fons (aquesta època)",
+ bankWeightsSum: "Suma de pesos",
+ bankNoAllocations: "No s'han trobat assignacions.",
+ bankNoEpochs: "No s'han trobat èpoques.",
+ bankEpochAllocations: "Assignacions de l'època",
+ bankAllocId: "ID d'assignació",
+ bankAllocDate: "Data",
+ bankAllocConcept: "Concepte",
+ bankAllocFrom: "De",
+ bankAllocTo: "Per a",
+ bankAllocAmount: "Quantitat",
+ bankAllocStatus: "Estat",
+ bankEpochId: "ID d'època",
+ bankRuleHash: "Hash de la instantània de regles",
+ bankViewEpoch: "Veure l'època",
+ bankYourIndustryBalance: "La teva part de la indústria",
+ bankYourUbiMonth: "La teva RBU (aquest mes)",
+ bankYourFundsMonth: "Fons totals",
+ bankIndustryBalance: "Producció industrial",
+ bankUserBalance: "El teu saldo",
+ bankAddresses: "Adreces",
+ bankNoAddresses: "No s'han trobat adreces.",
+ bankUser: "ID d'Oasis",
+ bankAddress: "Adreça",
+ bankAddAddressTitle: "Afegir una adreça d'ECOin",
+ bankAddAddressUser: "ID d'Oasis",
+ bankAddAddressLabel: "Etiqueta (opcional)",
+ bankAddAddressLabelPlaceholder: "Moneder de Bob, botiga d'Alice…",
+ bankAddAddressUserOptional: "Oasis ID (opcional)",
+ bankAddressUnnamed: "Adreça sense nom",
+ bankAddAddressAddress: "Adreça d'ECOin",
+ bankAddAddressSave: "Desar",
+ bankAddressAdded: "Adreça afegida",
+ bankAddressUpdated: "Adreça actualitzada",
+ bankAddressExists: "L'adreça ja existeix",
+ bankAddressInvalid: "Adreça no vàlida",
+ bankAddressDeleted: "Adreça eliminada",
+ bankAddressNotFound: "No s'ha trobat l'adreça",
+ bankAddressForbidden: "Només pots configurar la teva pròpia adreça de cobrament",
+ bankAddressTotal: "Total d'adreces",
+ bankAddressSearch: "Cercar @habitant o adreça",
+ bankAddressActions: "Accions",
+ bankAddressDelete: "Eliminar",
+ bankAddressSource: "Font",
+ bankAddressDeleteConfirm: "Vols eliminar aquesta adreça?",
+ search: "Cercar!",
+ bankLocal: "Local",
+ bankFromOasis: "Xarxa",
+ pubIdLabel: "PUB ID",
+ bankUbiAvailableNo: "SENSE FONS!",
+ bankUbiAvailableOk: "DISPONIBLE!",
+ bankUbiAvailability: "RBU",
+ bankAlreadyClaimedThisMonth: "Ja reclamada aquest mes",
+ bankUbiThisMonth: "RBU (aquest mes)",
+ bankUbiLastClaimed: "RBU (darrera reclamada)",
+ bankUbiNeverClaimed: "Mai reclamada",
+ bankUbiTotalClaimed: "RBU (total reclamat)",
+ bankUbiPub: "PUB",
+ bankUbiInhabitant: "HABITANT",
+ bankUbiClaimedAmount: "RECLAMAT (ECO)",
+ typeBankUbiResult: "BANCA - RBU",
+ bankNoPubConfigured: "No hi ha cap PUB configurat. Estableix l'ID del teu PUB a Configuració.",
+ shopsTitle: "Botigues",
+ shopDescription: "Descobreix i gestiona botigues a la xarxa.",
+ shopTitle: "Botiga",
+ shopUpload: "Crear una botiga",
+ shopAllSectionTitle: "Botigues",
+ shopMineSectionTitle: "Les meves botigues",
+ shopRecentSectionTitle: "Botigues recents",
+ shopTopSectionTitle: "Botigues destacades",
+ shopProductsSectionTitle: "Productes destacats",
+ shopPricesSectionTitle: "Productes per preu",
+ shopFavoritesSectionTitle: "Preferides",
+ shopCreateSectionTitle: "Crear una botiga",
+ shopUpdateSectionTitle: "Actualitzar la botiga",
+ shopCreate: "Crear",
+ shopUpdate: "Actualitzar",
+ shopDelete: "Eliminar",
+ shopReachClearnet: "Clearnet",
+ shopReachOasis: "Oasis",
+ encryptedChipLabel: "E2E",
+ transportChipLabel: "Xifrat en trànsit",
+ shopAddFavorite: "Afegir a preferides",
+ shopRemoveFavorite: "Treure de preferides",
+ shopOpen: "OBERTA",
+ shopClosed: "TANCADA",
+ shopMakePrivate: "FER-LA PRIVADA (E2E)",
+ shopMakePublic: "FER-LA PÚBLICA",
+ shopProducts: "Productes",
+ shopFilterAll: "TOTES",
+ shopFilterRecent: "RECENTS",
+ shopFilterMine: "MEVES",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUCTES",
+ shopFilterPrices: "PREUS",
+ shopFilterFavorites: "PREFERITS",
+ shopProductAdd: "Afegir un producte",
+ shopProductTitle: "Producte",
+ shopProductUpdate: "Actualitzar el producte",
+ shopProductPrice: "Preu (ECO)",
+ shopProductStock: "Estoc",
+ shopProductUntitled: "Producte sense títol",
+ shopUntitled: "Botiga sense títol",
+ shopNoItems: "No s'han trobat botigues.",
+ shopNoProducts: "Encara no hi ha productes.",
+ shopOutOfStock: "Exhaurit",
+ shopBuy: "Comprar",
+ shopBuyEncryptedNote: "Les teves dades de lliurament s'envien xifrades; només el propietari de la botiga les pot veure.",
+ shopBuyDeliveryAddress: "Adreça de lliurament",
+ shopBuyContact: "Contacte",
+ shopBuyContactPlaceholder: "correu, telèfon, etc.",
+ shopBuyNotes: "Notes",
+ shopBuyDeliveryRequired: "L'adreça de lliurament és obligatòria.",
+ shopOrdersTitle: "Comandes",
+ shopOrdersDescription: "Comandes rebudes per aquesta botiga.",
+ shopOrdersEmpty: "Encara no hi ha comandes.",
+ shopOrderProduct: "Producte",
+ shopOrderPrice: "Preu",
+ shopOrderBuyer: "Comprador",
+ shopBackToShop: "Tornar a la botiga",
+ marketVisitItem: "VEURE L'ARTICLE",
+ shopStatus: "ESTAT",
+ shopCreatedAt: "CREADA",
+ shopSearchPlaceholder: "Cercar a Botigues...",
+ shopUrl: "URL",
+ shopLocation: "Ubicació",
+ shopTags: "Etiquetes",
+ shopVisibility: "Visibilitat",
+ shopShortDescription: "Descripció curta",
+ shopShortDescriptionPlaceholder: "Descripció breu per a les targetes (màx. 160 caràcters)",
+ shopTitlePlaceholder: "Nom de la teva botiga",
+ shopDescriptionPlaceholder: "Descripció detallada de la teva botiga",
+ shopLocationPlaceholder: "Ciutat, País",
+ shopTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ mapTitlePlaceholder: "Títol del mapa",
+ shopProductFeatured: "Producte destacat",
+ shopSendToMarket: "Enviar al mercat",
+ typeShop: "BOTIGUES",
+ typeShopProduct: "PRODUCTE DE BOTIGA",
+ bankExchange: "Intercanvi",
+ bankExchangeCurrentValue: "Valor d'ECOin (1h)",
+ bankTotalSupply: "Oferta total d'ECOin",
+ bankPubsSupply: "Oferta d'ECOin del fons dels PUBs",
+ bankHoldingSupply: "Oferta d'ECOin fora de la RBU",
+ bankHoursOfWork: "hores",
+ bankUnitMs: "ms",
+ bankUnitSeconds: "segons",
+ bankUnitMinutes: "minuts",
+ bankUnitDays: "dies",
+ bankExchangeNoData: "No hi ha dades disponibles",
+ bankInflation: "Inflació d'ECOin (anual)",
+ bankInflationMonthly: "Inflació d'ECOin (mensual)",
+ bankExchangeChartTitle: "Evolució del valor d'ECOin al llarg del temps",
+ bankExchangeChartValue: "Valor (ECO/h)",
+ bankExchangeChartSupply: "Oferta",
+ bankExchangeChartInflation: "Inflació %",
+ bankExchangeChartEmpty: "Encara no hi ha prou mostres — torna més tard",
+ bankCurrentSupply: "Oferta actual d'ECOin",
+ bankingSyncStatus: "Estat d'ECOin",
+ bankingSyncStatusSynced: "Sincronitzat",
+ bankingSyncStatusOutdated: "Sense sincronitzar",
+ statsTitle: "Estadístiques",
+ statistics: "Estadístiques",
+ statsDescription: "Descobreix estadístiques sobre la teva xarxa.",
+ ALLButton: "TOT",
+ RECENTButton: "RECENTS",
+ MINEButton: "MEVES",
+ TOMBSTONEButton: "ELIMINATS",
+ statsCreatedAt: "Creat el",
+ statsYourContent: "Contingut",
+ statsYourOpinions: "Opinions",
+ statsNetworkContent: "Contingut",
+ statsNetworkOpinions: "Opinions",
+ statsEcoWalletLabel: "Moneder ECOin",
+ walletAddressCopyHint: "Prem per seleccionar i copiar",
+ statsEcoWalletNotConfigured: "No configurat!",
+ statsBookmark: "Marcadors",
+ statsEvent: "Esdeveniments",
+ statsTask: "Tasques",
+ statsVotes: "Vots",
+ statsMarket: "Mercat",
+ statsForum: "Fòrums",
+ statsJob: "Feines",
+ statsReport: "Informes",
+ statsFeed: "Feed",
+ statsTribe: "Tribus",
+ statsImage: "Imatges",
+ statsAudio: "Àudios",
+ statsVideo: "Vídeos",
+ statsDocument: "Documents",
+ statsMap: "Mapes",
+ statsShop: "Botigues",
+ statsShopProduct: "Productes de botiga",
+ statsTransfer: "Transferències",
+ statsAiExchange: "IA",
+ statsPUBs: "PUBs",
+ statsSyncedPeers: "Nodes",
+ statsTotalLabel: "Total",
+ statsPost: "Publicacions",
+ statsSize: "Total (mida)",
+ statsBlockchainSize: "Blockchain (mida)",
+ statsBlobsSize: "Blobs (mida)",
+ statsActivity7d: "Activitat (darrers 7 dies)",
+ statsActivity7dTotal: "Total 7 dies",
+ statsActivity30dTotal: "Total 30 dies",
+ day: "Dia",
+ messages: "Missatges",
+ statsProject: "Projectes",
+ statsProjectsTitle: "Projectes",
+ statsProjectsTotal: "Total de projectes",
+ statsProjectsActive: "Actius",
+ statsProjectsCompleted: "Completats",
+ statsProjectsPaused: "En pausa",
+ statsProjectsCancelled: "Cancel·lats",
+ statsProjectsGoalTotal: "Objectiu total",
+ statsProjectsPledgedTotal: "Aportació total",
+ statsMarketTitle: "Mercat",
+ statsMarketTotal: "Articles totals",
+ statsMarketForSale: "En venda",
+ statsMarketReserved: "Reservats",
+ statsMarketClosed: "Tancats",
+ statsMarketSold: "Venuts",
+ statsUsersTitle: "Habitants",
+ user: "Habitant",
+ statsTombstoneRatio: "Ràtio d'eliminats (%)",
+ bankingUserEngagementScore: "Puntuació de KARMA",
+ statsParliamentCandidature: "Candidatures del parlament",
+ statsParliamentTerm: "Mandats del parlament",
+ statsParliamentProposal: "Propostes del parlament",
+ statsParliamentRevocation: "Revocacions del parlament",
+ statsParliamentLaw: "Lleis del parlament",
+ statsCourtsCase: "Casos judicials",
+ statsCourtsEvidence: "Proves judicials",
+ statsCourtsAnswer: "Respostes judicials",
+ statsCourtsVerdict: "Veredictes judicials",
+ statsCourtsSettlement: "Acords judicials",
+ statsCourtsSettlementProposal: "Propostes d'acord",
+ statsCourtsSettlementAccepted: "Acords acceptats",
+ statsCourtsNomination: "Nominacions de jutges",
+ statsCourtsNominationVote: "Vots de nominació",
+ ai: "IA",
+ aiTitle: "IA",
+ aiDescription: "Una Intel·ligència Artificial Col·lectiva (IAC) anomenada '42' que aprèn de la teva xarxa.",
+ aiUserQuestion: "Pregunta",
+ aiResponseTitle: "Resposta",
+ aiSubmitButton: "Enviar!",
+ aiSettingsDescription: "Configura el teu prompt (màx. 128 caràcters) per al model d'IA.",
+ aiPrompt: "Proporciona una resposta informativa i precisa.",
+ aiConfiguration: "Configurar el prompt",
+ aiPromptUsed: "Indicació",
+ aiClearHistory: "Esborrar l'historial",
+ aiServerError: "No puc respondre bé. Torna-ho a provar.",
+ aiStatusLoading: "42 està carregant el model. Torna a preguntar d'aquí a un moment.",
+ aiThinking: "Pensant",
+ aiWaiting: "Esperant",
+ aiStatusMissingModel: "El model d'IA no està instal·lat: falta src/AI/oasis-42-1-chat.Q4_K_M.gguf.",
+ aiExportFineTuning: "Exportar Fine-Tuning",
+ aiFactsTitle: "Dades de la teva xarxa",
+ aiInputPlaceholder: "Què és Oasis?",
+ typeAiExchange: "IA",
+ aiApproveTrain: "Afegir a l'entrenament col·lectiu",
+ aiRejectTrain: "No entrenar",
+ aiTrainApproved: "Aprovat per a l'entrenament",
+ aiTrainRejected: "Rebutjat per a l'entrenament",
+ aiSnippetsUsed: "Fragments utilitzats",
+ aiSnippetsLearned: "Fragments apresos",
+ statsAITraining: "Entrenament d'IA",
+ aiCustomAnswerPlaceholder: "Escriu la teva resposta personalitzada…",
+ marketMineSectionTitle: "Els teus articles",
+ marketCreateSectionTitle: "Crear un article",
+ marketUpdateSectionTitle: "Actualitzar",
+ marketAllSectionTitle: "Mercat",
+ marketTitle: "Mercat",
+ marketDescription: "Un mercat per intercanviar béns o serveis a la teva xarxa.",
+ marketFilterAll: "TOTS",
+ marketFilterMine: "MEUS",
+ marketFilterAuctions: "SUBHASTES",
+ marketFilterItems: "INTERCANVI",
+ marketFilterNew: "NOU",
+ marketFilterUsed: "USAT",
+ marketFilterBroken: "TRENCAT",
+ marketFilterForSale: "EN VENDA",
+ marketFilterSold: "VENUT",
+ marketFilterDiscarded: "DESCARTAT",
+ marketFilterRecent: "RECENTS",
+ marketFilterMyBids: "LICITACIONS",
+ marketCreateButton: "Vendre alguna cosa",
+ marketItemType: "Tipus",
+ marketItemTitle: "Títol",
+ marketItemAvailable: "Data límit",
+ marketItemDescription: "Descripció",
+ marketItemDescriptionPlaceholder: "Descriu l'article que vens",
+ marketItemStatus: "Estat",
+ marketShopLabel: "Botiga",
+ marketItemCondition: "Condició",
+ marketItemPrice: "Preu",
+ marketItemTags: "Etiquetes",
+ marketItemTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ marketItemDeadline: "Data límit",
+ marketItemIncludesShipping: "Inclou l'enviament?",
+ marketItemHighestBid: "Licitació més alta",
+ marketItemStock: "Existències",
+ marketOutOfStock: "Sense estoc",
+ marketActionsUpdate: "Actualitzar",
+ marketUpdateButton: "Actualitzar",
+ marketActionsDelete: "Eliminar",
+ marketActionsChangeStatus: "CANVIAR L'ESTAT",
+ marketActionsBuy: "COMPRAR!",
+ marketAuctionBids: "Licitacions actuals",
+ marketPlaceBidButton: "Licitar",
+ marketItemSeller: "Venedor",
+ marketNoItems: "Encara no hi ha articles disponibles.",
+ marketYourBid: "La teva licitació",
+ marketCreateFormImageLabel: "Pujar contingut multimèdia (màx.: 75MB)",
+ marketSearchPlaceholder: "Cercar al Mercat...",
+ marketMinPriceLabel: "Preu mínim",
+ marketMaxPriceLabel: "Preu màxim",
+ marketSortRecent: "Més recents",
+ marketSortPrice: "Preu",
+ marketSortDeadline: "Data límit",
+ marketSearchButton: "Cercar",
+ marketAuctionEndsIn: "Acaba",
+ marketAuctionEnded: "Ha acabat",
+ marketNoItemsMatch: "No hi ha articles que coincideixin amb la teva cerca.",
+ housingTitle: "Habitatge",
+ housingDescriptionText: "Descobreix i gestiona llocs a la teva xarxa.",
+ modulesHousingLabel: "Habitatge",
+ modulesHousingDescription: "Mòdul per descobrir i gestionar llocs.",
+ typeHousing: "HABITATGE",
+ housingFilterAll: "TOT",
+ housingFilterMine: "MEUS",
+ housingFilterRequested: "SOL·LICITATS",
+ housingFilterSale: "VENDA",
+ housingFilterRent: "LLOGUER",
+ housingFilterCouchsurfing: "COUCHSURFING",
+ housingFilterOpen: "DISPONIBLES",
+ housingFilterClosed: "NO DISPONIBLES",
+ housingFilterRecent: "RECENTS",
+ housingFilterTop: "TOP",
+ housingType: "Oferta",
+ housingTypeSALE: "En venda",
+ housingTypeRENT: "En lloguer",
+ housingTypeCOUCHSURFING: "Couchsurfing",
+ housingProperty: "Immoble",
+ housingPropertyAPARTMENT: "Pis",
+ housingPropertyHOUSE: "Casa",
+ housingPropertyROOM: "Habitació",
+ housingPropertyLAND: "Terreny",
+ housingPropertyOTHER: "Altres",
+ housingTitleLabel: "Títol",
+ housingTitlePlaceholder: "Nom del lloc",
+ housingDescription: "Descripció",
+ housingDescriptionPlaceholder: "Descriu el lloc, el barri, què inclou: banys, jardí, llits…",
+ housingRules: "Normes",
+ housingRulesPlaceholder: "Mascotes, fumar, hores de silenci, estada mínima…",
+ housingPlace: "Lloc",
+ housingPlacePlaceholder: "País, ciutat, adreça",
+ housingPrice: "Preu",
+ housingPriceLabel: "Preu (ECO)",
+ housingSizeLabel: "Superfície (m²)",
+ housingFree: "GRATIS",
+ housingPerMonth: "/mes",
+ housingRooms: "Habitacions",
+ housingSize: "Superfície",
+ housingCapacity: "Hostes",
+ housingAvailableFrom: "Disponible des de",
+ housingAvailableTo: "Disponible fins a",
+ housingTags: "Etiquetes",
+ spreadEditWarning: "Aquest contingut perdrà les seves rèpliques si l'edites",
+ housingRequests: "Sol·licituds",
+ housingRequestButton: "Sol·licitar",
+ housingCancelButton: "Cancel·lar la sol·licitud",
+ housingRequestedBadge: "SOL·LICITAT",
+ housingStatus: "Estat",
+ housingStatusOPEN: "DISPONIBLE",
+ housingStatusCLOSED: "NO DISPONIBLE",
+ housingSetOpen: "Marcar com a disponible",
+ housingSetClosed: "Marcar com a no disponible",
+ housingCreateButton: "Crear un lloc",
+ housingUpdateButton: "Actualitzar",
+ housingSearchPlaceholder: "Cercar a Habitatge...",
+ housingSearchButton: "Cercar",
+ housingMinPrice: "Preu mín.",
+ housingMaxPrice: "Preu màx.",
+ housingSortRecent: "Més recents",
+ housingSortPrice: "Preu més baix",
+ housingSortRequests: "Més sol·licitats",
+ housingSortRating: "Més ben valorats",
+ housingNoItems: "No s'han trobat llocs.",
+ jobsTitle: "Feina",
+ jobsCandidatesTitle: "Candidats suggerits",
+ jobsCandidatesDescription: "Habitants amb competències que encaixen amb aquesta feina. Envia'ls un missatge privat per convidar-los.",
+ jobsCandidatesPmBody: "Hola, crec que el teu perfil encaixa amb la meva oferta de feina",
+ jobsDescription: "Descobreix i gestiona ofertes de feina a la teva xarxa.",
+ jobsFilterRecent: "RECENTS",
+ jobsFilterMine: "MEVES",
+ jobsFilterAll: "TOTES",
+ jobsFilterRemote: "REMOTES",
+ jobsFilterOpen: "OBERTES",
+ jobsFilterClosed: "TANCADES",
+ jobsCV: "CV",
+ jobsCreateJob: "Publicar una feina",
+ jobsRecentTitle: "Feines recents",
+ jobsMineTitle: "Les teves feines",
+ jobsAllTitle: "Ofertes de feina",
+ jobsRemoteTitle: "Feines remotes",
+ jobsOpenTitle: "Feines obertes",
+ jobsClosedTitle: "Feines tancades",
+ jobsCVTitle: "CV",
+ jobsFilterPresencial: "PRESENCIAL",
+ jobsFilterFreelancer: "FREELANCE",
+ jobsFilterEmployee: "ASSALARIAT",
+ jobsPresencialTitle: "Feines presencials",
+ jobsFreelancerTitle: "Feines freelance",
+ jobsEmployeeTitle: "Feines assalariades",
+ jobTitle: "Títol",
+ jobLocation: "Ubicació",
+ jobSalary: "Salari (ECO/1h)",
+ jobVacants: "Vacants",
+ jobDescription: "Descripció",
+ jobRequirements: "Requisits",
+ jobLanguages: "Idiomes",
+ jobStatus: "Estat",
+ jobStatusOPEN: "OBERTA",
+ jobStatusCLOSED: "TANCADA",
+ jobSetClosed: "Marcar com a TANCADA",
+ jobSubscribeButton: "Uneix-te a aquesta oferta!",
+ jobUnsubscribeButton: "Surt d'aquesta oferta!",
+ jobTitlePlaceholder: "Introdueix el títol de la feina",
+ jobDescriptionPlaceholder: "Descriu el lloc de treball",
+ jobRequirementsPlaceholder: "Introdueix els requisits",
+ jobLanguagesPlaceholder: "Anglès, francès, castellà, català...",
+ jobTasksPlaceholder: "Llista de tasques",
+ jobLocationPresencial: "Presencial",
+ jobLocationRemote: "Remot",
+ jobVacantsPlaceholder: "Nombre de vacants",
+ jobImage: "Pujar contingut multimèdia (màx.: 75MB)",
+ jobTasks: "Tasques",
+ jobType: "Tipus de feina",
+ jobTime: "Temps de feina",
+ jobSubscribers: "Subscriptors",
+ noSubscribers: "Sense subscriptors",
+ jobsFilterTop: "TOP",
+ jobsTopTitle: "Feines més ben pagades",
+ createJobButton: "Publicar una feina",
+ noJobsFound: "No s'han trobat ofertes de feina.",
+ jobAuthor: "Per",
+ jobTypeFreelance: "Autònom",
+ jobTypeSalary: "Assalariat",
+ jobTypeExchange: "Intercanvi d'hores",
+ jobTypeEXCHANGE: "INTERCANVI D'HORES",
+ jobsFilterExchange: "INTERCANVI",
+ jobsExchangeTitle: "Feines per intercanvi d'hores",
+ jobsHoursOffered: "Hores oferides",
+ jobsHoursRequested: "Hores demanades a canvi",
+ jobsExchangeSkill: "Habilitat demanada a canvi",
+ jobTimePartial: "Parcial",
+ jobTimeComplete: "Completa",
+ jobsUpdateButton: "ACTUALITZAR",
+ jobsFilterApplied: "CANDIDATURA",
+ jobsAppliedTitle: "Les meves candidatures",
+ jobsAppliedBadge: "Inscrit",
+ jobsSearchPlaceholder: "Cercar a Feina...",
+ jobsMinSalaryLabel: "Salari mín.",
+ jobsMaxSalaryLabel: "Salari màx.",
+ jobsSortRecent: "Més recents",
+ jobsSortSalary: "Salari més alt",
+ jobsSortSubscribers: "Més candidats",
+ jobsSearchButton: "Cercar",
+ jobsApplicants: "Candidats",
+ jobsUpdatedAt: "Actualitzat",
+ jobSetOpen: "Marcar com a oberta",
+ jobsTagsLabel: "Etiquetes",
+ noJobsMatch: "No hi ha ofertes que coincideixin amb la teva cerca.",
+ industrySearchPlaceholder: "Cercar a Indústria...",
+ industryAllSectors: "Tots els sectors",
+ industryVisitButton: "Visitar Indústria",
+ industryAdvanceTo: "Canviar a",
+ industryAmount: "Quantitat",
+ industryApproveBuild: "Aprovar",
+ industryBlueprint: "Plànol",
+ industryBlueprints: "Plànols",
+ industryBuild: "Producció",
+ industryBuildNotes: "Notes",
+ industryBuildStart: "Data d'inici",
+ industryVoteUpdateButton: "Votar l'actualització",
+ industryVoteDeleteButton: "Votar l'esborrament",
+ industryRevokeVote: "Revocar",
+ industryTimeLeft: "Temps restant",
+ industryBuildEnd: "Data de fi",
+ industryBuilds: "Produccions",
+ industryBuildTitle: "Títol",
+ industryContribute: "Contribuir",
+ industryContributeButton: "Contribuir",
+ industryContributions: "Contribucions",
+ industryCreateBlueprintButton: "Crear un plànol",
+ industryDistribute: "Distribuir",
+ industryDistributeButton: "Distribuir per quotes",
+ industryDistribution: "Distribució",
+ industryEcoAmount: "Quantitat (ECO)",
+ industryEditBlueprint: "Editar el plànol",
+ industryFacility: "Fàbrica",
+ industryKindLabel: "Tipus",
+ industryKind_labor: "Mà d'obra",
+ industryKind_material: "Material",
+ industryKind_eco: "Fons",
+ industryLaborHours: "Mà d'obra (hores)",
+ industryHours: "Hores",
+ industryMaterialItem: "Material",
+ industryMaterials: "Materials",
+ industryEstMaterials: "Total de materials",
+ industryEstLabor: "Total de mà d'obra",
+ industryEstTotal: "Preu estimat",
+ industryBuildingPrice: "Preu de construcció",
+ industryFinalPrice: "Preu final",
+ industryBlueprintDescPlaceholder: "Especificacions, dimensions, pes, documentació…",
+ industryMaterialValue: "Valor (ECO)",
+ industryMember: "Membre",
+ industryNewBlueprint: "Nou plànol",
+ industryNewBuild: "Proposar una producció",
+ industryEditBuild: "Editar la producció",
+ industryNeedBlueprint: "Crea primer un plànol: cada producció en fabrica un.",
+ industryNoBlueprints: "Encara no hi ha plànols.",
+ industryNoBuilds: "Encara no hi ha produccions.",
+ industryNote: "Nota",
+ industryOutput: "Sortida",
+ industryOutputKind: "Tipus de producte",
+ industryOutputValue: "Valor de sortida (ECO, p. ex. de la venda)",
+ industryPostJob: "Crear una feina",
+ industryPot: "Pot",
+ industryProposeBuildButton: "Proposar la producció",
+ industryProposer: "Proponent",
+ industryAuthor: "Autor",
+ industrySellOnMarket: "Enviar al mercat",
+ industrySendToProjects: "Crear un projecte",
+ industrySkills: "Habilitats",
+ industryTreasury: "Tresoreria",
+ industryKind_physical: "Físic",
+ industryKind_digital: "Digital",
+ industryBuildStatus_PROPOSED: "PROPOSADA",
+ industryBuildStatus_REJECTED: "REBUTJADA",
+ industryBuildStatus_APPROVED: "APROVADA",
+ industryBuildStatus_STOCKING: "PROVEINT-SE",
+ industryBuildStatus_IN_PRODUCTION: "EN PRODUCCIÓ",
+ industryBuildStatus_COMPLETED: "COMPLETADA",
+ industryBuildStatus_FAILED: "FALLIDA",
+ pmBotIndustry: "IndustryBot",
+ pmBotHousing: "HousingBot",
+ jobsBotMatchTitle: "Una feina encaixa amb el teu currículum",
+ jobsBotMatchIntro: "Una feina encaixa amb el teu currículum.",
+ jobsBotMatchJob: "Feina",
+ jobsBotMatchHint: "Reps això perquè el teu currículum està gestionat per IA. Ho pots desactivar al teu CV.",
+ cvAiManaged: "Gestionat per IA",
+ switchOn: "ACTIVAT",
+ switchOff: "DESACTIVAT",
+ cvAiManagedHint: "Si està actiu, JobsBot t'avisa per missatge privat quan una feina encaixa amb el teu currículum.",
+ cvMatchThreshold: "Avisa'm a partir d'aquest nivell de coincidència",
+ housingBotRequestedTitle: "Algú ha sol·licitat un dels teus llocs.",
+ housingBotCancelledTitle: "S'ha cancel·lat una sol·licitud sobre un dels teus llocs.",
+ housingBotYouRequestedTitle: "Has sol·licitat un lloc.",
+ housingBotYouCancelledTitle: "Has cancel·lat una sol·licitud.",
+ housingBotUnavailableTitle: "Un lloc que vas sol·licitar ja no està disponible.",
+ housingBotUnavailableSentTitle: "Has avisat qui va sol·licitar aquest lloc.",
+ industryBotAdmittedTitle: "T'han admès en una fàbrica.",
+ industryBotApplicationTitle: "Nova sol·licitud d'ingrés a la teva fàbrica.",
+ industryBotInvitedTitle: "T'han convidat a una fàbrica.",
+ industryBotDissolvedTitle: "Una fàbrica de la qual formes part s'ha dissolt.",
+ industryBotBuildApprovedTitle: "S'ha aprovat una producció.",
+ industryBotDistributedTitle: "S'ha distribuït la sortida d'una producció.",
+ industryFilterRules: "REGLES",
+ industryRulesTitle: "Regles",
+ industryRulesIntro: "Indústria permet als habitants posseir col·lectivament els mitjans de producció: una Fàbrica és un taller de la xarxa que ningú no posseeix de manera privada.",
+ industryRulesSteward: "El fundador és el majordom — un custodi, no un amo: no pot vendre, privatitzar ni dissoldre la Fàbrica tot sol.",
+ industryRulesMembership: "La política de pertinença defineix com s'hi uneixen els habitants: Oberta (hi entres a l'instant), Per vot (t'admet el vot dels membres) o Només per invitació (un membre t'ha de convidar abans).",
+ industryRulesQuorum: "El quòrum és el nombre mínim de membres que han de votar perquè una decisió compti, perquè una Fàbrica petita no la decideixi un sol habitant.",
+ industryRulesMajority: "La majoria és la fracció de vots necessària per aprovar (0,5 = meitat, 1 = unanimitat); una decisió s'aprova quan els SÍ arriben almenys a max(quòrum, membres × majoria).",
+ industryRulesDecisions: "Els membres voten per admetre'n de nous, aprovar produccions i dissoldre la Fàbrica; el majordom no es pot saltar aquestes decisions col·lectives.",
+ industryRulesBlueprints: "Els plànols són receptes lliures (COPYLEFT) — les entrades (materials, hores de feina, habilitats) i la sortida (un bé físic o digital) — i qualsevol en pot fer un fork.",
+ industryRulesBuilds: "Una producció és una ordre de fabricació: PROPOSADA → APROVADA (per vot) → PROVEINT-SE → EN PRODUCCIÓ → COMPLETADA, i només accepta contribucions un cop aprovada.",
+ industryRulesContributions: "Els membres aporten feina (hores), materials (valor declarat en ECO) o ECO a una producció; cada aportació guanya karma.",
+ industryRulesLaborRate: "La tarifa de feina és el valor en ECO d'una hora de feina en aquesta Fàbrica; converteix hores en karma per comparar esforç i capital de manera justa: karma = hores × tarifa + valor material + ECO.",
+ industryRulesShares: "La teva quota en una producció és el teu karma ÷ karma total, i determina quina part del valor de sortida reps.",
+ industryRulesDistribution: "Quan una producció es completa, el majordom reparteix el pot (els fons de la producció més el valor de venda) entre qui hi va contribuir, en proporció a la seva participació.",
+ industryRulesTreasury: "El majordom custodia les aportacions en ECO com a tresoreria de la producció fins al repartiment; tots els moviments queden registrats a la xarxa i les disputes poden anar als Tribunals.",
+ industryJobs: "Feines",
+ industryReportButton: "Informar",
+ industryCreateTask: "Crear una tasca",
+ industryOpenDispute: "Obrir una disputa",
+ industryMaterialsPlaceholder: "placa-solar:2:120\nbateria:1:80\nkit:1:15",
+ industryCreateInvite: "Generar una invitació",
+ industryPauseVotes: "Vots d'estat",
+ industryTitle: "Indústria",
+ industryDescription: "Mòdul per gestionar col·lectivament els mitjans de producció.",
+ typeIndustryBuild: "PRODUCCIÓ",
+ typeIndustryBlueprint: "PLÀNOL",
+ typeIndustryAllocation: "DISTRIBUCIÓ",
+ typeIndustry: "INDÚSTRIA",
+ modulesIndustryLabel: "Indústria",
+ modulesIndustryDescription: "Mòdul per gestionar col·lectivament els mitjans de producció.",
+ industryFilterAll: "TOTES",
+ industryFilterRecent: "RECENTS",
+ industryFilterMember: "MEMBRE",
+ industryFilterBlueprints: "PLÀNOLS",
+ industryFilterBuilds: "PRODUCCIONS",
+ industryFilterMine: "MEVES",
+ industryFilterActive: "EN MARXA",
+ industryFilterPaused: "EN PAUSA",
+ industryFilterDissolved: "DISSOLTES",
+ industryAllTitle: "Indústria",
+ industryRecentTitle: "Fàbriques recents",
+ industryMemberTitle: "Fàbriques on soc",
+ industryMineTitle: "Les meves fàbriques",
+ industryActiveTitle: "En marxa",
+ industryPausedTitle: "Fàbriques en pausa",
+ industryDissolvedTitle: "Fàbriques dissoltes",
+ industryNoFacilitiesFound: "No s'han trobat fàbriques.",
+ industryCreateFacility: "Crear una fàbrica",
+ industryMembers: "Membres",
+ industryMemberBadge: "MEMBRE",
+ industryName: "Nom",
+ industryNamePlaceholder: "Nom de la fàbrica",
+ industryDescriptionLabel: "Descripció",
+ industryDescriptionPlaceholder: "Què produeix aquesta fàbrica?",
+ industrySector: "Sector",
+ industryMembershipPolicy: "Política de pertinença",
+ industryQuorum: "Quòrum",
+ industryMajority: "Majoria",
+ industryLaborRate: "Tarifa de feina",
+ industryCreateButton: "Crear la fàbrica",
+ industryUpdateButton: "Actualitzar",
+ industrySteward: "Majordom",
+ industryStatusActive: "EN MARXA",
+ industryStatusPaused: "EN PAUSA",
+ industryStatusDissolved: "DISSOLTA",
+ industryStatusLabel: "Estat",
+ industryJoinButton: "Unir-s'hi",
+ industryApplyButton: "Sol·licitar l'ingrés",
+ industryLeaveButton: "Sortir",
+ industryInviteButton: "Convidar",
+ industryInvitePlaceholder: "@...=.ed25519",
+ industryInviteNeeded: "Necessites una invitació per unir-t'hi.",
+ industryPauseButton: "Votar la pausa",
+ industryResumeButton: "Votar la represa",
+ industryDeleteButton: "Eliminar",
+ industryPendingApplicants: "Sol·licituds pendents",
+ industryVotesYes: "sí",
+ industryVotesNo: "no",
+ industryAlreadyVoted: "votat",
+ industryAdmit: "Admetre",
+ industryReject: "Rebutjar",
+ industryDissolveTitle: "Dissoldre la fàbrica",
+ industryDissolveVote: "Votar la dissolució",
+ industryPolicy_open: "Oberta",
+ industryPolicy_vote: "Per vot",
+ industryPolicy_invite: "Només per invitació",
+ projectsTitle: "Projectes",
+ projectsDescription: "Crea, finança i segueix projectes impulsats per la comunitat a la teva xarxa.",
+ projectSearchPlaceholder: "Cercar a Projectes...",
+ projectCreateProject: "Crear un projecte",
+ projectCreateButton: "Crear un projecte",
+ projectUpdateButton: "ACTUALITZAR",
+ projectDeleteButton: "ELIMINAR",
+ projectNoProjectsFound: "No s'han trobat projectes.",
+ projectFilterAll: "TOTS",
+ projectFilterMine: "ELS MEUS PROJECTES",
+ projectFilterActive: "ACTIUS",
+ projectFilterPaused: "EN PAUSA",
+ projectFilterCompleted: "COMPLETATS",
+ projectFilterFollowing: "SEGUITS",
+ projectFilterRecent: "RECENTS",
+ projectFilterTop: "TOP",
+ projectAllTitle: "Projectes",
+ projectMineTitle: "Els teus projectes",
+ projectActiveTitle: "Projectes actius",
+ projectPausedTitle: "Projectes en pausa",
+ projectCompletedTitle: "Projectes completats",
+ projectFollowingTitle: "Projectes seguits",
+ projectRecentTitle: "Projectes recents",
+ projectTopTitle: "Més ben finançats",
+ projectTitlePlaceholder: "Nom del projecte",
+ projectImage: "Pujar contingut multimèdia (màx.: 75MB)",
+ projectDescription: "Descripció",
+ projectDescriptionPlaceholder: "Explica la història i els objectius…",
+ projectGoal: "Objectiu (ECO)",
+ projectGoalPlaceholder: "50000",
+ projectDeadline: "Data límit",
+ projectProgress: "Progrés inicial (%)",
+ projectStatus: "Estat",
+ projectFunding: "Finançament",
+ projectPledged: "Compromès",
+ projectSetStatus: "Establir l'estat",
+ projectSetProgress: "Actualitzar el progrés",
+ projectFollowButton: "SEGUIR",
+ projectUnfollowButton: "DEIXAR DE SEGUIR",
+ projectStatusACTIVE: "ACTIU",
+ projectStatusPAUSED: "EN PAUSA",
+ projectStatusCOMPLETED: "COMPLETAT",
+ projectStatusCANCELLED: "CANCEL·LAT",
+ projectPledgeTitle: "Dona suport a aquest projecte",
+ projectPledgePlaceholder: "Quantitat en ECO",
+ projectBounties: "Recompenses",
+ projectNoBounties: "No s'han trobat recompenses.",
+ projectTitle: "Títol",
+ projectMilestoneSelect: "Seleccionar una fita",
+ projectBountyCreateButton: "Crear una recompensa",
+ projectBountyStatus: "Estat de la recompensa",
+ projectBountyOpen: "oberta",
+ projectBountyClaimed: "reclamada",
+ projectBountyDone: "completada",
+ projectBountyClaimedBy: "reclamada per",
+ projectBountyClaimButton: "reclamar",
+ projectBountyCompleteButton: "Marcar com a completada",
+ projectMilestones: "Fites",
+ projectAddMilestoneTitle: "Nova fita",
+ projectMilestoneTitle: "Títol de la fita",
+ projectMilestoneTargetPercent: "Percentatge (%)",
+ projectMilestoneDueDate: "Data",
+ projectMilestoneStatus: "Estat de la fita",
+ projectMilestoneOpen: "oberta",
+ projectMilestoneDone: "completada",
+ projectMilestoneDue: "venç",
+ projectMilestoneMarkDone: "Marcar com a feta",
+ projectMilestoneTitlePlaceholder: "Introdueix el títol de la fita",
+ projectMilestoneDescriptionPlaceholder: "Introdueix la descripció d'aquesta fita",
+ projectMilestoneDescription: "Descripció de la fita",
+ projectBudgetAssigned: "Assignat a recompenses",
+ projectBudgetOver: "⚠ Pressupost excedit: l'assignat supera l'objectiu",
+ projectFollowers: "Seguidors",
+ projectFollowersTitle: "Seguidors",
+ projectFollowersNone: "Encara no hi ha seguidors.",
+ projectMore: "més",
+ projectYouFollowHint: "Segueixes aquest projecte",
+ projectBackers: "Mecenes",
+ projectBackersTitle: "Mecenes",
+ projectBackersTotal: "Total de mecenes",
+ projectBackersTotalPledged: "Total aportat",
+ projectBackersYourPledge: "La teva aportació",
+ projectBackersNone: "Encara no hi ha aportacions.",
+ projectFilterBackers: "MECENES",
+ projectFilterApplied: "APORTANT",
+ projectAppliedTitle: "APORTANT",
+ projectBackersLeaderboardTitle: "Mecenes destacats",
+ projectNoBackersFound: "No hi ha mecenes.",
+ projectBackerAmount: "Total aportat",
+ projectBackerPledges: "Aportacions",
+ projectBackerProjects: "Projectes",
+ projectSelectMilestoneOrBounty: "Seleccionar una fita o una recompensa",
+ projectPledgeButton: "Aportar",
+ footerLicense: "GPLv3",
+ modulesModuleName: "Nom",
+ modulesModuleDescription: "Descripció",
+ modulesModuleStatus: "Estat",
+ modulesTotalModulesLabel: "Total",
+ modulesEnabledModulesLabel: "Habilitats",
+ modulesDisabledModulesLabel: "Deshabilitats",
+ modulesInvitesLabel: "Invitacions",
+ modulesInvitesDescription: "Mòdul per gestionar i aplicar codis d'invitació.",
+ modulesWalletLabel: "Moneder",
+ modulesWalletDescription: "Mòdul per gestionar els teus actius digitals (ECOin).",
+ modulesCipherLabel: "Xifratge",
+ modulesCipherDescription: "Mòdul per xifrar i desxifrar el teu text de manera simètrica (amb una contrasenya compartida).",
+ modulesBookmarksLabel: "Marcadors",
+ modulesBookmarksDescription: "Mòdul per descobrir i gestionar marcadors.",
+ modulesVideosLabel: "Vídeos",
+ modulesVideosDescription: "Mòdul per descobrir i gestionar vídeos.",
+ modulesDocsLabel: "Documents",
+ modulesDocsDescription: "Mòdul per descobrir i gestionar documents.",
+ modulesAudiosLabel: "Àudios",
+ modulesAudiosDescription: "Mòdul per descobrir i gestionar àudios.",
+ modulesTagsLabel: "Etiquetes",
+ modulesTagsDescription: "Mòdul per descobrir i explorar patrons de taxonomia (etiquetes).",
+ modulesImagesLabel: "Imatges",
+ modulesImagesDescription: "Mòdul per descobrir i gestionar imatges.",
+ modulesTrendingLabel: "Tendències",
+ modulesTrendingDescription: "Mòdul per explorar el contingut més popular.",
+ modulesEventsLabel: "Esdeveniments",
+ modulesEventsDescription: "Mòdul per descobrir i gestionar esdeveniments.",
+ modulesTasksLabel: "Tasques",
+ modulesTasksDescription: "Mòdul per descobrir i gestionar tasques.",
+ modulesMarketLabel: "Mercat",
+ modulesMarketDescription: "Mòdul per intercanviar béns o serveis.",
+ modulesShopsLabel: "Botigues",
+ modulesShopsDescription: "Mòdul per gestionar i descobrir botigues.",
+ modulesTribesLabel: "Tribus",
+ modulesTribesDescription: "Mòdul per explorar o crear tribus (grups).",
+ modulesVotationsLabel: "Votacions",
+ modulesVotationsDescription: "Mòdul per descobrir i gestionar votacions.",
+ modulesParliamentLabel: "Parlament",
+ modulesParliamentDescription: "Mòdul per elegir governs i votar lleis.",
+ modulesCourtsLabel: "Tribunals",
+ modulesCourtsDescription: "Mòdul per resoldre conflictes i emetre veredictes.",
+ modulesReportsLabel: "Informes",
+ modulesReportsDescription: "Mòdul per gestionar i fer el seguiment d'informes sobre problemes, errors, abusos i avisos de contingut.",
+ modulesOpinionsLabel: "Opinions",
+ modulesOpinionsDescription: "Mòdul per descobrir i votar opinions.",
+ modulesTransfersLabel: "Transferències",
+ modulesTransfersDescription: "Mòdul per descobrir i gestionar contractes intel·ligents (transferències).",
+ modulesFediverseLabel: "Multivers",
+ modulesBlogsLabel: "Blogs",
+ modulesBlogsDescription: "Mòdul per descobrir i gestionar blogs.",
+ modulesPollsLabel: "Enquestes",
+ modulesPollsDescription: "Mòdul per preguntar a la xarxa i comptar les respostes.",
+ modulesFediverseDescription: "Gestiona els teus altres comptes del multivers, incloent-hi enviar i rebre contingut.",
+ modulesFeedLabel: "Feed",
+ modulesFeedDescription: "Mòdul per descobrir i compartir textos breus (feeds).",
+ modulesPixeliaLabel: "Pixelia",
+ modulesPixeliaDescription: "Mòdul per dibuixar en una graella col·laborativa.",
+ modulesMelodyLabel: "Melody",
+ modulesMelodyDescription: "Mòdul per generar i compartir el \"so\" de la teva blockchain.",
+ modulesAgendaLabel: "Agenda",
+ modulesAgendaDescription: "Mòdul per gestionar tots els teus elements assignats.",
+ modulesAILabel: "IA",
+ modulesAIDescription: "Mòdul per parlar amb un LLM anomenat '42'.",
+ modulesForumLabel: "Fòrums",
+ modulesForumDescription: "Mòdul per descobrir i gestionar fòrums.",
+ modulesJobsLabel: "Feina",
+ modulesJobsDescription: "Mòdul per descobrir i gestionar ofertes de feina.",
+ modulesProjectsLabel: "Projectes",
+ modulesProjectsDescription: "Mòdul per explorar, finançar i gestionar projectes.",
+ modulesBankingLabel: "Banca",
+ modulesBankingDescription: "Mòdul per gestionar el tresor comú: valor d'ECOin, impostos i RBU.",
+ modulesFavoritesLabel: "Preferits",
+ modulesFavoritesDescription: "Mòdul per gestionar el teu contingut preferit.",
+ fileTooLargeTitle: "Fitxer massa gran",
+ fileTooLargeMessage: "El fitxer supera la mida màxima permesa (75 MB). Si us plau, selecciona un fitxer més petit.",
+ goBack: "Tornar",
+ errorDismiss: "D'acord",
+ errorPageTitle: "S'ha produït un error",
+ errorNoAllocation: "No s'ha trobat cap assignació per a aquesta reclamació.",
+ errorInvalidClaim: "Aquesta assignació no es pot reclamar.",
+ visibilityLabel: "Visibilitat",
+ clearnetPrivateConflict: "Un contingut privat, ocult, tancat, només per invitació o de pagament no es pot publicar a la CLEARNET. Tria OASIS o fes-lo públic.",
+ visibilityPublic: "Pública",
+ visibilityHidden: "Oculta",
+ visibilityMakePublic: "Fer-la pública",
+ visibilityMakeHidden: "Fer-la oculta",
+ invitesInhabitantsTitle: "Habitants",
+ aiNavPlaceholder: "Descriu què necessites...",
+ aiNavDisabled: "La navegació amb IA està desactivada.",
+ aiNavResultsTitle: "Suggeriments d'AINav",
+ aiNavQueryLabel: "Consulta",
+ aiNavResultMatch: "Coincidència",
+ aiNavResultsEmpty: "No hi ha rutes coincidents. Prova amb /search.",
+ modulesAINavLabel: "AINav",
+ modulesAINavDescription: "Mòdul per fer peticions en llenguatge natural sobre el contingut de la xarxa.",
+ directConnectDescription: "Connecta't directament a un node introduint-ne l'adreça IP, el port i la clau pública. El node s'afegirà com a connexió seguida.",
+ peerHost: "IP",
+ peerPort: "Port",
+ peerPublicKey: "Clau pública (@...ed25519)",
+ connectAndFollow: "Connectar",
+ modulesPresetTitle: "Configuracions comunes",
+ workflowsTitle: "Fluxos de treball",
+ workflowsDescription: "Un flux de treball fixa el tema i quins mòduls estan actius.",
+ workflowsSet: "Aplicar el flux de treball",
+ workflow_default: "Per defecte",
+ workflow_jobs: "Feina",
+ workflow_social: "Social",
+ workflow_business: "Negocis",
+ workflow_night: "Nit",
+ workflow_kids: "Infants",
+ workflow_activists: "Activisme",
+ workflow_mobile: "Mòbil",
+ statsCarbonFootprintTitle: "Petjada de carboni",
+ statsCarbonTombstone: "Petjada dels esborrats (tombstoning)",
+ uploadMedia: "Pujar contingut multimèdia (màx.: 75MB)",
+ invitesUnfollow: "Deixar de seguir",
+ invitesFollow: "Seguir",
+ invitesUnfollowedInvites: "No federades",
+ invitesNoUnfollowed: "No hi ha pubs no federats.",
+ reportsWhyInappropriateLabel: "Per què és inadequat?",
+ blockchainContentDeleted: "Aquest contingut s'ha eliminat",
+ visitContent: "Visitar el contingut",
+ favoriteAdd: "Fixar a preferits",
+ pmContentTooltip: "Enviar un missatge privat",
+ phoneCallTooltip: "Fer una trucada",
+ favoriteRemove: "Treure de preferits",
+ reportContent: "Denunciar el contingut",
+ bankEcoinHours: "Equivalència d'ECOin en temps (1 ECO)",
+ mapsLabel: "Mapes",
+ mapTitle: "Mapes",
+ mapDescription: "Gestiona i comparteix mapes fora de línia a la teva xarxa.",
+ mapMineSectionTitle: "Els teus mapes",
+ mapCreateSectionTitle: "Crear un mapa",
+ mapUpdateSectionTitle: "Actualitzar el mapa",
+ mapAllSectionTitle: "Mapes",
+ mapRecentSectionTitle: "Mapes recents",
+ mapFavoritesSectionTitle: "Preferits",
+ mapFilterAll: "TOTS",
+ mapFilterMine: "MEUS",
+ mapFilterRecent: "RECENTS",
+ mapFilterFavorites: "PREFERITS",
+ mapUploadButton: "Crear un mapa",
+ mapCreateButton: "Crear un mapa",
+ mapUpdateButton: "Actualitzar",
+ mapDeleteButton: "Eliminar",
+ mapAddFavoriteButton: "Afegir a preferits",
+ mapRemoveFavoriteButton: "Treure de preferits",
+ mapLatLabel: "Latitud",
+ mapLatPlaceholder: "p. ex. 41.3874",
+ mapLngLabel: "Longitud",
+ mapLngPlaceholder: "p. ex. 2.1686",
+ mapDescriptionLabel: "Descripció",
+ mapDescriptionPlaceholder: "Descriu el mapa o la ubicació...",
+ mapTypeLabel: "Tipus de mapa",
+ mapInviteMode: "Invitació",
+ mapTypeSingle: "ÚNIC",
+ mapTypeOpen: "OBERT",
+ mapTypeClosed: "TANCAT",
+ mapTagsLabel: "Etiquetes",
+ mapTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ mapUrlLabel: "URL del mapa",
+ mapMarkersTitle: "Marcadors",
+ mapMarkerDefault: "Marcador",
+ mapMarkerLatLabel: "Latitud del marcador",
+ mapMarkerLngLabel: "Longitud del marcador",
+ mapMarkerLabelField: "Etiqueta del marcador",
+ mapMarkerLabelPlaceholder: "Descriu aquest marcador...",
+ markerImageLabel: "Imatge del marcador",
+ mapAddMarkerTitle: "Afegir un marcador",
+ mapAddMarkerButton: "Afegir un marcador",
+ mapCleanMarkerButton: "Netejar el marcador",
+ mapApplyZoom: "Aplicar el zoom",
+ mapPlaceSearchPlaceholder: "Cerca un lloc o país...",
+ mapNoPlaces: "No s'han trobat llocs.",
+ mapClusterTitle: "marcadors aquí, fes clic per apropar",
+ mapDeleteMarker: "Elimina el marcador",
+ mapZoomIn: "Apropa",
+ mapZoomOut: "Allunya",
+ mapFitMarkers: "Ajusta a tots els marcadors",
+ mapPanLabel: "Mou el mapa",
+ mapCenterHere: "Centra aquí",
+ mapNear: "prop de",
+ mapPickedSpot: "Punt triat",
+ mapPickHint: "Fes clic al mapa per triar un punt.",
+ mapClearPick: "Neteja",
+ mapSearchPlaceholder: "Cercar a Mapes...",
+ mapSearchButton: "Cercar",
+ mapUpdatedAt: "Actualitzat",
+ mapNoMatch: "Cap mapa no coincideix amb la teva cerca.",
+ noMaps: "No hi ha mapes disponibles.",
+ mapLocationTitle: "Ubicació",
+ mapVisitLabel: "Visitar el mapa",
+ typeMap: "MAPES",
+ typeMapMarker: "MARCADOR DE MAPA",
+ modulesMapLabel: "Mapes",
+ modulesMapDescription: "Mòdul per gestionar i compartir mapes fora de línia.",
+ emergenciesTitle: "Emergències",
+ modulesEmergenciesLabel: "Emergències",
+ modulesEmergenciesDescription: "Mòdul per llançar, confirmar i seguir emergències a la xarxa.",
+ emergenciesDescription: "Mòdul per llançar, confirmar i seguir emergències a la xarxa.",
+ emergencyCreate: "Crear una emergència",
+ emergencyUpdate: "Actualitzar",
+ emergencyDelete: "Esborrar",
+ emergencyTitleLabel: "Títol",
+ emergencyTitlePlaceholder: "Què està passant?",
+ emergencyTextLabel: "Detalls",
+ emergencyTextPlaceholder: "On, des de quan, què cal fer...",
+ emergencyCategoryLabel: "Categoria",
+ emergencyCategoryWeather: "METEOROLOGIA",
+ emergencyCategoryInfrastructure: "INFRAESTRUCTURA",
+ emergencyCategoryHealth: "SALUT",
+ emergencyCategorySecurity: "SEGURETAT",
+ emergencyCategoryLost: "PERDUTS",
+ emergencyCategoryNeighborhood: "VEÏNAT",
+ emergencyExpiresLabel: "Caduca d'aquí a",
+ emergencyExpires1d: "1 dia",
+ emergencyExpires3d: "3 dies",
+ emergencyExpires7d: "1 setmana",
+ emergencyExpires30d: "1 mes",
+ emergencyExpiresNone: "Indefinit",
+ emergencyExpiresKeep: "Mantenir la data actual",
+ emergencyTagsLabel: "Etiquetes",
+ emergencyTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ emergencyFilterAll: "TOTES",
+ emergencyFilterMine: "MEVES",
+ emergencyFilterRecent: "RECENTS",
+ emergencySeverityUnverified: "SENSE VERIFICAR",
+ emergencySeverityLow: "BAIXA",
+ emergencySeverityMedium: "MITJANA",
+ emergencySeverityHigh: "ALTA",
+ emergencyStatusActive: "ACTIVA",
+ emergencyStatusResolved: "RESOLTA",
+ emergencyStatusExpired: "CADUCADA",
+ emergencyConfirmations: "Confirmacions",
+ emergencyConfirmButton: "Confirmar",
+ emergencyConfirmed: "Has confirmat aquesta emergència",
+ emergencyResolveButton: "Resoldre",
+ emergencyReopenButton: "Reobrir",
+ emergencyGenerateReport: "Generar un informe",
+ emergencyUpdateEdited: "Editada",
+ emergencyLastUpdate: "DARRERA ACTUALITZACIÓ",
+ emergencyUpdatesTitle: "Darreres actualitzacions:",
+ emergencyNoUpdates: "Encara no hi ha actualitzacions.",
+ emergencyAddUpdate: "Publicar una actualització",
+ emergencyUpdatePlaceholder: "Què ha canviat?",
+ emergencyNoItems: "No s'han trobat emergències.",
+ emergencyExpiresAt: "Caduca",
+ emergencyBannerLabel: "Emergència activa",
+ emergencyCreateSectionTitle: "Crear una emergència",
+ emergencyUpdateSectionTitle: "Actualitzar l'emergència",
+ emergencySearchPlaceholder: "Cercar a emergències...",
+ typeEmergency: "EMERGÈNCIES",
+ typeEmergencyConfirm: "CONFIRMACIÓ D'EMERGÈNCIA",
+ typeEmergencyUpdate: "ACTUALITZACIÓ D'EMERGÈNCIA",
+ statsEmergency: "Emergències",
+ statsEmergencyConfirm: "Confirmacions d'emergències",
+ statsEmergencyUpdate: "Actualitzacions d'emergències",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Una emergència que segueixes té una actualització.",
+ emergencyBotResolvedTitle: "Una emergència que segueixes s'ha resolt.",
+ dataKindEmergencies: "EMERGÈNCIES",
+ mailingTitle: "Llistes de correu",
+ modulesMailingLabel: "Llistes de correu",
+ modulesMailingDescription: "Descobreix i gestiona llistes de correu a la teva xarxa.",
+ modulesPhoneLabel: "Telèfon",
+ modulesPhoneDescription: "Mòdul per trucar a altres habitants amb videotrucades xifrades d'extrem a extrem.",
+ mailingDescription: "Descobreix i gestiona llistes de correu a la teva xarxa.",
+ mailingCreate: "Crear una llista de correu",
+ mailingUpdate: "Actualitzar",
+ mailingArchive: "Arxivar",
+ mailingActivate: "Activar",
+ mailingCreateSectionTitle: "Crear una llista de correu",
+ mailingUpdateSectionTitle: "Actualitzar la llista de correu",
+ mailingTitleLabel: "Títol",
+ mailingTitlePlaceholder: "Nom de la llista de correu",
+ mailingDescriptionLabel: "Descripció",
+ mailingDescriptionPlaceholder: "De què tracta aquesta llista?",
+ mailingTypeLabel: "Tipus de llista de correu",
+ mailingTypeOpen: "OBERTA",
+ mailingTypeClosed: "TANCADA",
+ mailingStatusLabel: "Estat",
+ mailingStatusActive: "ACTIVA",
+ mailingStatusArchived: "ARXIVADA",
+ mailingMembersLabel: "Convidar habitants",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Subscriptors",
+ mailingTagsLabel: "Etiquetes",
+ mailingTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ mailingFilterAll: "TOTES",
+ mailingFilterMine: "MEVES",
+ mailingFilterSubscribed: "SUBSCRITES",
+ mailingFilterRecent: "RECENTS",
+ mailingHistoryDate: "DATA",
+ mailingHistoryThreads: "FILS",
+ mailingHistoryInhabitants: "HABITANTS",
+ mailingHistorySearchPlaceholder: "Cercar a l'historial...",
+ mailingNoMessages: "Encara no hi ha missatges.",
+ mailingNoItems: "No s'han trobat llistes de correu.",
+ mailingSearchPlaceholder: "Cercar a llistes de correu...",
+ mailingWriteButton: "Escriure un missatge",
+ mailingWriteTitle: "Escriure a la llista",
+ mailingReplyTitle: "Respondre a la llista",
+ mailingSend: "Enviar",
+ mailingTextPlaceholder: "El teu missatge arriba a tots els participants de la llista.",
+ mailingParticipants: "Participants",
+ inboxFilterMailing: "Llistes de correu",
+ mailingReplyPlaceholder: "Respondre a la llista...",
+ mailingReplyToList: "Respondre a la llista",
+ typeMailingList: "LLISTA DE CORREU",
+ statsMailingList: "Llistes de correu",
+ mailingListLabel: "LLISTA DE CORREU",
+ logisticsTitle: "Logística",
+ modulesLogisticsLabel: "Logística",
+ modulesLogisticsDescription: "Descobreix i gestiona plans logístics a la teva xarxa.",
+ logisticsDescription: "Descobreix i gestiona plans logístics a la teva xarxa.",
+ logisticsCreate: "Crear una ruta",
+ logisticsUpdate: "Actualitzar",
+ logisticsClose: "Tancar",
+ logisticsReopen: "Reobrir",
+ logisticsCreateSectionTitle: "Crear una ruta",
+ logisticsUpdateSectionTitle: "Actualitzar la ruta",
+ logisticsTitleLabel: "Títol",
+ logisticsTitlePlaceholder: "Viatge al mercat, furgoneta disponible...",
+ logisticsKindLabel: "Tipus de logística",
+ logisticsKindTrip: "VIATGE",
+ logisticsKindShipment: "ENVIAMENT",
+ logisticsKindTrips: "VIATGES",
+ logisticsKindShipments: "ENVIAMENTS",
+ logisticsModeLabel: "Mode",
+ logisticsModeOffer: "OFEREIXO",
+ logisticsModeRequest: "BUSCO",
+ logisticsModeOffers: "OFERTES",
+ logisticsModeRequests: "PETICIONS",
+ logisticsDescriptionLabel: "Descripció",
+ logisticsDescriptionPlaceholder: "Punt de trobada, què portes, condicions...",
+ logisticsOriginLabel: "Origen",
+ logisticsOriginPlaceholder: "On comença",
+ logisticsDestinationLabel: "Destinació",
+ logisticsDestinationPlaceholder: "On acaba",
+ logisticsDateLabel: "Data i hora",
+ logisticsRecurrenceLabel: "Recurrència",
+ logisticsFrequencyLabel: "Freqüència",
+ logisticsRecurrenceNone: "ÚNIC",
+ logisticsRecurrenceDaily: "DIARI",
+ logisticsRecurrenceWeekly: "SETMANAL",
+ logisticsRecurrenceMonthly: "MENSUAL",
+ logisticsSeatsLabel: "Places",
+ logisticsSizeLabel: "Mida",
+ logisticsSizePlaceholder: "p. ex. 2m x 1m",
+ logisticsWeightLabel: "Pes",
+ logisticsWeightPlaceholder: "p. ex. 40kg",
+ logisticsPriceFree: "GRATIS",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TEMPS",
+ logisticsPriceLabel: "Preu",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Enllaç a la comanda",
+ logisticsOrderRefPlaceholder: "/shops/... o /market/... de la comanda que cal lliurar",
+ logisticsOrderLink: "Comanda enllaçada",
+ logisticsTagsLabel: "Etiquetes",
+ logisticsTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ logisticsFilterAll: "TOTES",
+ logisticsFilterMine: "MEVES",
+ logisticsFilterBooked: "RESERVADES",
+ logisticsFilterRecent: "RECENTS",
+ logisticsFilterHistory: "HISTORIAL",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "OBERTA",
+ logisticsStatusUpcoming: "PROPERES",
+ logisticsStatusPast: "PASSADES",
+ logisticsStatusClosed: "TANCADES",
+ logisticsZoneLabel: "Zona",
+ logisticsSearchPlaceholder: "Cercar a logística...",
+ logisticsNoItems: "No s'han trobat rutes.",
+ logisticsBookingPending: "PENDENT",
+ logisticsBookingConfirmed: "CONFIRMADA",
+ logisticsBookingRejected: "REBUTJADA",
+ logisticsBookingCancelled: "CANCEL·LADA",
+ logisticsBookingDelivered: "LLIURADA",
+ logisticsConfirm: "Confirmar",
+ logisticsReject: "Rebutjar",
+ logisticsDeliver: "Lliurar",
+ logisticsReceiptLabel: "Rebut",
+ logisticsReceiptPlaceholder: "Nota de lliurament (opcional)",
+ logisticsCancelBooking: "Cancel·lar la reserva",
+ logisticsBookTitle: "Reservar aquesta ruta",
+ logisticsNotesLabel: "Notes",
+ logisticsNotesPlaceholder: "El que hagi de saber la persona responsable",
+ logisticsBook: "Reservar",
+ logisticsBookingsTitle: "Reserves",
+ logisticsMyBookingTitle: "La teva reserva",
+ logisticsRatingsTitle: "Valoracions",
+ logisticsNoRatings: "Encara no hi ha valoracions.",
+ logisticsRatingsWhenClosed: "Les valoracions s'obren en tancar la ruta.",
+ logisticsScoreLabel: "Puntuació",
+ logisticsRatingPlaceholder: "Com ha anat?",
+ logisticsRate: "Valorar",
+ typeLogisticsRoute: "RUTA",
+ typeLogisticsRating: "VALORACIÓ DE RUTA",
+ statsLogisticsRoute: "Rutes",
+ statsLogisticsRating: "Valoracions de rutes",
+ logisticsRouteLabel: "RUTA",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Mòdul per publicar canals de podcast.",
+ podcastsDescription: "Mòdul per publicar canals de podcast.",
+ podcastCreate: "Crear un podcast",
+ podcastUpdate: "Actualitzar",
+ podcastDelete: "Esborrar",
+ podcastCreateSectionTitle: "Crear un podcast",
+ podcastUpdateSectionTitle: "Actualitzar el podcast",
+ podcastTitleLabel: "Títol",
+ podcastTitlePlaceholder: "Nom del canal",
+ podcastDescriptionLabel: "Descripció",
+ podcastDescriptionPlaceholder: "De què tracta aquest podcast?",
+ podcastCategoryLabel: "Categoria",
+ podcastCategoryNews: "NOTÍCIES",
+ podcastCategoryMusic: "MÚSICA",
+ podcastCategoryTalk: "XERRADA",
+ podcastCategoryEducation: "EDUCACIÓ",
+ podcastCategoryTech: "TECNOLOGIA",
+ podcastCategoryCulture: "CULTURA",
+ podcastCategoryCommunity: "COMUNITAT",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "ALTRES",
+ podcastTagsLabel: "Etiquetes",
+ podcastCoverLabel: "Portada (imatge o vídeo)",
+ podcastEpisodeAudioLabel: "Fitxer d'àudio o vídeo (màx.: 75MB)",
+ podcastTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ podcastFilterAll: "TOTS",
+ podcastFilterMine: "MEUS",
+ podcastFilterRecent: "RECENTS",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "OIENTS",
+ podcastSearchPlaceholder: "Cercar a podcasts...",
+ podcastNoItems: "No s'han trobat podcasts.",
+ podcastEpisodesLabel: "Episodis",
+ podcastPlaysLabel: "Reproduccions",
+ podcastLastEpisode: "Darrer episodi",
+ podcastEpisodesTitle: "Episodis",
+ podcastNoEpisodes: "Encara no hi ha episodis.",
+ podcastEpisodeAdd: "Afegir un episodi",
+ podcastEpisodeCreateTitle: "Publicar un episodi",
+ podcastEpisodeUpdateTitle: "Actualitzar l'episodi",
+ podcastEpisodeTitleLabel: "Títol de l'episodi",
+ podcastEpisodeTitlePlaceholder: "Títol de l'episodi",
+ podcastEpisodeDescriptionLabel: "Notes",
+ podcastEpisodeDescriptionPlaceholder: "Què passa en aquest episodi, enllaços, crèdits...",
+ podcastEpisodePublish: "Publicar",
+ podcastPlayed: "Reproduït",
+ podcastMarkPlayed: "Marcar com a reproduït",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISODI",
+ typePodcastOpinion: "OPINIÓ D'EPISODI",
+ typePodcastPlay: "REPRODUCCIÓ",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Episodis",
+ statsPodcastPlay: "Reproduccions",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Un blog que segueixes té una entrada nova.",
+ podcastBotEpisodeTitle: "Un podcast que segueixes té un episodi nou.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISODI",
+ campaignsTitle: "Campanyes",
+ modulesCampaignsLabel: "Campanyes",
+ modulesCampaignsDescription: "Descobreix i gestiona campanyes a la teva xarxa.",
+ campaignsDescription: "Descobreix i gestiona campanyes a la teva xarxa.",
+ campaignCreate: "Crear una campanya",
+ campaignUpdate: "Actualitzar",
+ campaignDelete: "Esborrar",
+ campaignClose: "Tancar",
+ campaignReopen: "Reobrir",
+ campaignCreateSectionTitle: "Crear una campanya",
+ campaignUpdateSectionTitle: "Actualitzar la campanya",
+ campaignTitleLabel: "Títol",
+ campaignTitlePlaceholder: "Què vols aconseguir?",
+ campaignTextLabel: "Text",
+ campaignTextPlaceholder: "Explica la causa, qui decideix i què demanes...",
+ campaignCategoryLabel: "Categoria",
+ campaignCategoryEnvironment: "MEDI AMBIENT",
+ campaignCategoryRights: "DRETS",
+ campaignCategoryHealth: "SALUT",
+ campaignCategoryEducation: "EDUCACIÓ",
+ campaignCategoryInfrastructure: "INFRAESTRUCTURA",
+ campaignCategoryCulture: "CULTURA",
+ campaignCategoryEconomy: "ECONOMIA",
+ campaignCategoryOther: "ALTRES",
+ campaignGoalLabel: "Objectiu de signatures",
+ campaignDeadlineLabel: "Termini",
+ campaignTagsLabel: "Etiquetes",
+ campaignTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ campaignFilterAll: "TOTES",
+ campaignFilterMine: "MEVES",
+ campaignFilterSigned: "SIGNADES",
+ campaignFilterRecent: "RECENTS",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "OBERTA",
+ campaignStatusAchieved: "ACONSEGUIDA",
+ campaignStatusUnachieved: "NO ACONSEGUIDA",
+ campaignStatusClosed: "TANCADA",
+ campaignSearchPlaceholder: "Cercar a campanyes...",
+ campaignNoItems: "No s'han trobat campanyes.",
+ campaignSignaturesLabel: "Signatures",
+ campaignSignaturesTitle: "Suports",
+ campaignNoSignatures: "Encara no hi ha signatures.",
+ campaignSignTitle: "Signar aquesta campanya",
+ campaignSignPlaceholder: "Per què hi dones suport? (opcional)",
+ campaignSign: "Signar",
+ campaignSigned: "Ja l'has signada!",
+ campaignNotSigned: "Encara hi falta la teva signatura",
+ campaignElevate: "Elevar al Parlament",
+ campaignElevated: "Elevada al Parlament",
+ campaignUpdatesTitle: "Actualitzacions",
+ campaignNoUpdates: "Encara no hi ha actualitzacions.",
+ campaignUpdatePlaceholder: "Què ha passat?",
+ campaignAddUpdate: "Publicar una actualització",
+ campaignQrAlt: "QR per signar aquesta campanya",
+ campaignQrCaption: "Escaneja per signar",
+ typeCampaign: "CAMPANYA",
+ typeCampaignSignature: "SIGNATURA",
+ typeCampaignUpdate: "ACTUALITZACIÓ DE CAMPANYA",
+ statsCampaign: "Campanyes",
+ statsCampaignSignature: "Signatures de campanyes",
+ statsCampaignUpdate: "Actualitzacions de campanyes",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Una campanya que segueixes té una actualització.",
+ campaignBotAchievedTitle: "Una campanya que segueixes ha assolit el seu objectiu.",
+ campaignBotRaisedTitle: "Una campanya que has signat s'ha elevat al Parlament.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Una ruta que vas reservar ha canviat.",
+ logisticsBotClosedTitle: "Una ruta que vas reservar s'ha tancat.",
+ logisticsBotBookedTitle: "Algú ha reservat la teva ruta.",
+ logisticsBotCancelledTitle: "S'ha cancel·lat una reserva de la teva ruta.",
+ logisticsBotConfirmedTitle: "La teva reserva s'ha confirmat: el paquet és en camí.",
+ logisticsBotRejectedTitle: "La teva reserva s'ha rebutjat.",
+ logisticsBotDeliveredTitle: "El teu paquet ha arribat.",
+ campaignLabel: "CAMPANYA",
+ campaignGenerateReport: "Generar un informe",
+ logisticsGenerateReport: "Generar un informe",
+ mailingGenerateReport: "Generar un informe",
+ campaignUpdateEdited: "Editada",
+ mailingMessagesLabel: "Missatges",
+ logisticsBookingsLabel: "Reserves",
+ backupTitle: "Còpia de seguretat",
+ modulesBackupLabel: "Còpia de seguretat",
+ modulesBackupDescription: "Mòdul per exportar i importar les teves claus i fer còpies de seguretat xifrades.",
+ backupDescription: "Mòdul per exportar i importar les teves claus i fer còpies de seguretat xifrades.",
+ backupTypeRecovery: "RECUPERACIÓ",
+ backupTypeKeys: "EXPORTAR CLAUS",
+ backupTypeFull: "CÒPIA COMPLETA",
+ backupTypeRestore: "RESTAURAR UNA CÒPIA",
+ backupTypeInstant: "INSTANTÀNIA",
+ backupInstantDescription: "Un .zip pla amb tot el teu registre i els teus fitxers, sense la teva clau secreta i sense contrasenya. Ràpida, però ",
+ backupInstantRisk: "qui tingui el fitxer ho pot llegir tot.",
+ backupKitPageDescription: "El kit de recuperació només es pot obrir des d'aquest dispositiu.",
+ backupKitId: "ID d'Oasis",
+ backupKitDate: "Generat",
+ backupKitQrAlt: "Codi QR de la teva clau secreta",
+ backupKitStep1: "Imprimeix-lo o copia'l a mà i desa'l en un lloc segur i sense connexió.",
+ backupKitStep2: "Per recuperar-lo, instal·la Oasis en un dispositiu nou i importa aquest secret des de Còpia de seguretat › Claus.",
+ backupKitStep3: "Destrueix aquesta pàgina si mai queda exposada.",
+ backupKitPdfButton: "Generar PDF",
+ backupScopeLabel: "Abast",
+ backupScopeAll: "TOT",
+ backupScopeMine: "NOMÉS EL MEU CONTINGUT",
+ backupSinceLabel: "Des de",
+ backupEstimateTitle: "Estimació",
+ backupFileInfo: "La teva còpia xifrada es baixarà al teu dispositiu (nom: oasis-backup-DATA.oasisbk)",
+ backupExportButton: "Baixar la còpia",
+ backupRestorePassword: "Escriu la contrasenya que vas fer servir en fer la còpia",
+ backupRestoreButton: "Restaurar la còpia",
+ backupRestoredLine: "Còpia restaurada.",
+ backupRestoredMessages: "Missatges afegits",
+ backupRestoredSkipped: "Ja existents",
+ backupRestoredBlobs: "Fitxers afegits",
+ backupRestoredState: "Configuració restaurada",
+ backupRestoredFailed: "Fallits",
+ backupRestoredForked: "Divergents",
+ backupRestoreRunning: "S'està restaurant la còpia. Aquesta pàgina s'actualitza sola; mentrestant pots continuar fent servir Oasis.",
+ backupRestoreElapsed: "Transcorregut",
+ backupRestoreFailedLine: "No s'ha pogut restaurar la còpia.",
+ backupRestoreForkMine: "Aquest dispositiu ja ha publicat missatges amb la teva identitat que no són a la còpia, així que no s'hi ha pogut aplicar a sobre. Restaura-la en una instal·lació neta just després d'importar les teves claus, abans de fer res més.",
+ verificationTitle: "Verificació",
+ verificationDescription: "Comprova la cadena del teu feed, detecta bifurcacions i revisa fitxers orfes o absents.",
+ verificationRun: "Executar la verificació",
+ verificationTotalMessages: "missatges al registre",
+ verificationFeed: "El teu feed",
+ verificationMessages: "missatges",
+ verificationLastSequence: "darrera seqüència",
+ verificationGaps: "Buits",
+ verificationBrokenLinks: "Enllaços trencats",
+ verificationBadHashes: "Hashes incorrectes",
+ verificationBadSignatures: "Signatures incorrectes",
+ verificationDuplicates: "Seqüències duplicades",
+ verificationForks: "Bifurcacions",
+ verificationBlobs: "Fitxers",
+ verificationBlobsPresent: "presents",
+ verificationBlobsReferenced: "referenciats",
+ verificationBlobsOrphan: "orfes",
+ verificationBlobsMissing: "absents",
+ verificationBlobsMissingOwn: "Fitxers teus que falten en aquest dispositiu",
+ verificationBlobsMissingOthers: "Fitxers d'altres habitants encara sense baixar",
+ verificationBlobsUnavailable: "No s'han pogut llistar els fitxers d'aquest dispositiu.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Mòdul per descobrir i gestionar wikis.",
+ wikiDescription: "Mòdul per descobrir i gestionar wikis.",
+ wikiCreate: "Crear una wiki",
+ wikiUpdate: "Actualitzar",
+ wikiDelete: "Esborrar",
+ wikiEdit: "Editar",
+ wikiTitleLabel: "Títol",
+ wikiTitlePlaceholder: "Títol de la wiki...",
+ wikiBodyLabel: "Contingut",
+ wikiBodyPlaceholder: "Enllaça altres wikis amb [[Títol de la wiki]] o [[Títol de la wiki|un text propi]].\n\nMenciona un habitant amb @id.\n\nEtiqueta amb #oasis.\n\nEnganxa enllaços com https://solarnethub.com\n\nUna línia en blanc obre un paràgraf nou; els salts de línia simples es conserven.\n\nAdjunta qualsevol mitjà compatible i s'incrustarà aquí.",
+ formatBarLabel: "Format",
+ wikiStatusLabel: "Tipus de wiki",
+ wikiStatusOpen: "OBERTA",
+ wikiStatusClosed: "TANCADA",
+ wikiTagsLabel: "Etiquetes",
+ wikiTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ wikiSummaryLabel: "Resum del canvi",
+ wikiSummaryPlaceholder: "Què ha canviat?",
+ wikiFilterAll: "TOTES",
+ wikiFilterMine: "MEVES",
+ wikiFilterRecent: "RECENTS",
+ wikiFilterLinked: "ENLLAÇADES",
+ wikiChanges: "Canvis recents",
+ wikiNoPages: "No s'han trobat wikis.",
+ wikiNoChanges: "Encara no hi ha canvis.",
+ wikiHistory: "Historial",
+ wikiVersion: "Versió",
+ wikiVersions: "versions",
+ wikiRestore: "Restaurar",
+ wikiDiff: "Canvis",
+ wikiViewVersion: "Veure",
+ wikiLinkedPages: "Pàgines enllaçades",
+ wikiNoLinkedPages: "Aquesta pàgina encara no enllaça cap altra.",
+ wikiMissingLink: "La pàgina encara no existeix",
+ wikiDuplicateTitle: "Ja existeix una pàgina amb aquest títol. Canvia el títol per crear una pàgina diferent.",
+ wikiCreateSectionTitle: "Crear una wiki",
+ wikiUpdateSectionTitle: "Actualitzar la wiki",
+ wikiSearchPlaceholder: "Cercar a la Wiki...",
+ wikiCurrentVersion: "Versió actual",
+ wikiViewingVersion: "Estàs veient una versió antiga",
+ wikiBackToPage: "Tornar a la pàgina",
+ wikiLinkedChip: "Enllaçada",
+ wikiRestoredSummary: "Versió restaurada",
+ wikiExportPdf: "Generar la pàgina",
+ wikiPreview: "Previsualització",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Crear una wiki",
+ tribeWikiEmpty: "Encara no hi ha wikis.",
+ typeWiki: "WIKI",
+ padsTitle: "Pads",
+ padTitle: "Pad",
+ modulesPadsLabel: "Pads",
+ modulesPadsDescription: "Mòdul per gestionar editors de text col·laboratius.",
+ padCreate: "Crear un pad",
+ padUpdate: "Actualitzar",
+ padDelete: "Eliminar",
+ padTitleLabel: "Títol",
+ padTitlePlaceholder: "Escriu el títol del pad...",
+ padStatusLabel: "Estat",
+ padTypeLabel: "Tipus de pad",
+ padStatusOpen: "OBERT",
+ padStatusInviteOnly: "NOMÉS CONVIDATS",
+ padStatusClosed: "TANCAT",
+ padDeadlineLabel: "Data límit",
+ padTagsLabel: "Etiquetes",
+ padTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ padMembersLabel: "Membres",
+ padCreated: "Creat",
+ padStartEditing: "Editar",
+ padEditorPlaceholder: "Comença a escriure...",
+ padSubmitEntry: "Enviar",
+ padNoEntries: "Encara no hi ha entrades.",
+ padAllSectionTitle: "Tots els pads",
+ padMineSectionTitle: "Els meus pads",
+ padsDescription: "Gestiona editors de text xifrats i col·laboratius a la teva xarxa.",
+ roomsTitle: "Sales",
+ roomsDescription: "Descobreix i uneix-te a sales de videoconferència xifrades a la teva xarxa.",
+ modulesRoomsLabel: "Sales",
+ modulesRoomsDescription: "Mòdul per descobrir i unir-se a sales de videoconferència xifrades.",
+ roomFilterRecent: "RECENTS",
+ roomFilterMine: "MEVES",
+ roomFilterAll: "TOTES",
+ roomFilterLive: "EN DIRECTE",
+ roomFilterOpen: "OBERTES",
+ roomFilterInvite: "NOMÉS CONVIDATS",
+ roomFilterClosed: "TANCADES",
+ roomCreate: "Crear sala",
+ roomUpdate: "Actualitzar",
+ roomDelete: "Eliminar",
+ roomClose: "Tancar",
+ roomCreateSectionTitle: "Crear sala",
+ roomUpdateSectionTitle: "Actualitzar sala",
+ roomTitlePlaceholder: "Títol de la sala",
+ roomDescriptionLabel: "Descripció",
+ roomDescriptionPlaceholder: "De què parlareu?",
+ roomTypeLabel: "Tipus de sala",
+ roomTagsLabel: "Etiquetes",
+ roomStatusOpen: "OBERTA",
+ roomStatusInviteOnly: "NOMÉS CONVIDATS",
+ roomStatusClosed: "TANCADA",
+ roomParticipants: "Participants",
+ roomJoin: "Entrar",
+ roomLeave: "Sortir",
+ roomFull: "Sala plena",
+ roomLiveChip: "EN DIRECTE",
+ roomMuted: "silenciat",
+ roomRec: "Gravar àudio",
+ roomRecStop: "Atura la gravació",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} ha entrat a la sala",
+ roomEventLeft: "{name} ha sortit de la sala",
+ roomEventRecStart: "{name} ha començat a gravar",
+ roomEventRecStop: "{name} ha deixat de gravar",
+ roomEventMuted: "{name} s'ha silenciat",
+ roomEventUnmuted: "{name} ha tret el silenci",
+ roomEventHand: "{name} ha aixecat la mà",
+ roomRaiseHand: "Aixecar la mà",
+ roomLowerHand: "Abaixar la mà",
+ confirmActionTitle: "Confirma aquesta acció",
+ confirmActionButton: "Confirmar",
+ confirmJoinText: "Estàs a punt d'unir-te amb aquesta invitació.",
+ confirmFollowText: "Estàs a punt de donar suport a aquest habitant.",
+ confirmSignText: "Estàs a punt de signar aquesta campanya.",
+ confirmDownloadText: "Estàs a punt de descarregar aquest fitxer al teu dispositiu.",
+ roomRecordings: "Gravacions",
+ roomClearNotices: "Netejar",
+ roomLineSwitchboard: "Centraleta",
+ roomLineDndError: "El número d'aquesta sala no accepta trucades.",
+ roomNumberHint: "Marca aquest número des de Telèfon per entrar a la sala.",
+ liveRefresh: "Refrescar",
+ roomNobody: "Ara mateix no hi ha ningú a la sala.",
+ roomSomeone: "{n} a la sala ara mateix.",
+ roomYou: "tu",
+ roomYouAreIn: "Hi ets dins",
+ roomNobodyInside: "Ara mateix no hi ha ningú en aquesta sala.",
+ roomErrorFull: "La sala és plena. Podràs entrar quan algú en surti.",
+ roomErrorUnreachable: "Ara mateix no es pot arribar a la sala. Torna-ho a provar més tard.",
+ roomErrorBusy: "Ja ets en una trucada o en una altra sala.",
+ roomErrorClosed: "Aquesta sala està tancada.",
+ roomAccessDenied: "Aquesta sala és només amb invitació. Necessites una invitació per entrar.",
+ roomsNoItems: "No s'han trobat sales.",
+ roomSearchPlaceholder: "Cercar sales...",
+ roomInviteMode: "Invitació",
+ tribeSectionRooms: "SALES",
+ tribeRoomCreate: "Crear sala",
+ tribeRoomsEmpty: "Encara no hi ha sales.",
+ typeRoom: "SALES",
+ typeRoomMember: "PARTICIPANT DE SALA",
+ statsRoom: "Sales",
+ statsRoomMember: "Participants de sales",
+ favoritesFilterRooms: "SALES",
+ invitesRoomsTitle: "Sales",
+ inviteCodeInvalid: "Aquest codi d'invitació no és vàlid o ja s'ha fet servir.",
+ inviteAlreadyMember: "Ja en formes part. Pots obrir-ho des del seu mòdul.",
+ actionFailed: "No s'ha pogut fer. Torna-ho a provar.",
+ publishTooShort: "La teva publicació és massa curta.",
+ walletSendFailed: "No s'ha pogut enviar el pagament: {reason}",
+ pixeliaCoordsError: "Aquestes coordenades són fora de la quadrícula.",
+ courtsErrTitle: "Cal un títol.",
+ courtsErrRespondent: "Indica contra qui és el cas.",
+ courtsErrRespondentId: "Aquest no és un Oasis ID vàlid.",
+ courtsErrMethod: "Tria com es resoldrà el cas.",
+ courtsErrCaseNotFound: "No s'ha trobat aquest cas.",
+ courtsErrBrief: "Escriu la teva resposta.",
+ courtsErrStance: "Tria la teva postura.",
+ courtsErrResult: "Escriu el resultat.",
+ courtsErrTerms: "Escriu els termes de l'acord.",
+ courtsErrMediator: "Afegeix almenys un mediador.",
+ courtsErrSelfMediator: "No pots ser mediador en el teu propi cas.",
+ courtsErrJudge: "Tria un jutge.",
+ courtsErrSelfJudge: "No pots ser jutge del teu propi cas.",
+ courtsErrVisibility: "Tria qui pot veure el cas.",
+ courtsErrNomination: "No s'ha trobat aquesta nominació.",
+ opinionAlreadyGiven: "Ja has donat la teva opinió.",
+ cipherPasswordShort: "La contrasenya ha de tenir almenys 32 caràcters.",
+ errorForbidden: "No hi tens accés.",
+ errorNotFound: "No s'ha trobat.",
+ errorClosed: "Està tancat.",
+ errorInviteOnly: "Això és només amb invitació. Necessites una invitació.",
+ errorTooLong: "Aquest text és massa llarg.",
+ errorRequired: "Falta informació obligatòria.",
+ errorInvalid: "Part de la informació no és vàlida.",
+ errorNotAuthor: "Només qui ho va crear pot fer això.",
+ panicRemoved: "La teva blockchain s'ha eliminat.",
+ padRecentSectionTitle: "Pads recents",
+ padOpenSectionTitle: "Pads oberts",
+ padClosedSectionTitle: "Pads tancats",
+ padCreateSectionTitle: "Crear un pad nou",
+ padUpdateSectionTitle: "Actualitzar el pad",
+ typePad: "PADS",
+ padNew: "NOU",
+ padAddFavorite: "Afegir a preferits",
+ padRemoveFavorite: "Treure de preferits",
+ padClose: "Tancar",
+ padBackToEditor: "Tornar a l'editor",
+ padSearchPlaceholder: "Cercar a Pads...",
+
+ calendarsTitle: "Calendaris",
+ calendarTitle: "Calendari",
+ modulesCalendarsLabel: "Calendaris",
+ modulesCalendarsDescription: "Mòdul per descobrir i gestionar calendaris.",
+ typeCalendar: "CALENDARIS",
+ calendarCreate: "Crear un calendari",
+ calendarUpdate: "Actualitzar",
+ calendarTitleLabel: "Títol",
+ calendarTitlePlaceholder: "Títol del calendari...",
+ calendarStatusLabel: "Estat",
+ calendarTypeLabel: "Tipus de calendari",
+ calendarStatusOpen: "OBERT",
+ calendarStatusClosed: "TANCAT",
+ calendarDeadlineLabel: "Data límit",
+ calendarTagsLabel: "Etiquetes",
+ calendarTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ calendarParticipantsLabel: "Participants",
+ calendarCreated: "Creat",
+ calendarJoin: "Unir-se al calendari",
+ calendarGenerateInvite: "Generar una invitació",
+ calendarDateLabel: "Data",
+ calendarDatePlaceholder: "Descriu aquesta data...",
+ calendarNoteLabel: "Notes",
+ calendarNotePlaceholder: "Afegir una nota...",
+ calendarFirstDateLabel: "Data",
+ calendarFirstNoteLabel: "Notes",
+ calendarIntervalLabel: "Interval",
+ calendarIntervalNone: "Sense repetició",
+ calendarIntervalWeekly: "Setmanal",
+ calendarIntervalMonthly: "Mensual",
+ calendarIntervalYearly: "Anual",
+ calendarFormDescription: "Descripció",
+ calendarNoDates: "No hi ha dates afegides.",
+ calendarNoNotes: "Sense notes.",
+ calendarsNoItems: "No s'han trobat calendaris.",
+ calendarsDescription: "Descobreix i gestiona calendaris a la teva xarxa.",
+ calendarMonthPrev: "← Anterior",
+ calendarMonthNext: "Següent →",
+ calendarMonthNames: "Gener,Febrer,Març,Abril,Maig,Juny,Juliol,Agost,Setembre,Octubre,Novembre,Desembre",
+ calendarDayInitials: "Dl,Dt,Dc,Dj,Dv,Ds,Dg",
+ calendarAllSectionTitle: "Calendaris",
+ calendarRecentSectionTitle: "Calendaris recents",
+ calendarFavoritesSectionTitle: "Preferits",
+ calendarMineSectionTitle: "Els teus calendaris",
+ calendarOpenSectionTitle: "Calendaris oberts",
+ calendarClosedSectionTitle: "Calendaris tancats",
+ calendarCreateSectionTitle: "Crear un calendari nou",
+ calendarUpdateSectionTitle: "Actualitzar el calendari",
+ calendarAddFavorite: "Afegir a preferits",
+ calendarDeleteNote: "Eliminar",
+ calendarRemoveFavorite: "Treure de preferits",
+ calendarSearchPlaceholder: "Cercar al calendari...",
+ calendarAddEntry: "Afegir una entrada",
+ statsCalendar: "Calendaris",
+ statsCalendarDate: "Dates de calendari",
+ statsCalendarNote: "Notes de calendari",
+
+ modulesChatsLabel: "Xats",
+ modulesChatsDescription: "Mòdul per descobrir i gestionar xats.",
+ typeChat: "XATS",
+ typeChatMessage: "MISSATGE DE XAT",
+ chatsTitle: "Xats",
+ chatMineSectionTitle: "Els teus xats",
+ chatRecentTitle: "Xats recents",
+ chatFavoritesTitle: "Preferits",
+ chatOpenTitle: "Xats oberts",
+ chatClosedTitle: "Xats tancats",
+ chatDescription: "Descripció",
+ chatCategory: "Categoria",
+ chatStatus: "ESTAT",
+ chatCreate: "Crear un xat",
+ chatUpdate: "Actualitzar",
+ chatDelete: "Esborrar",
+ chatClose: "Tancar el xat",
+ chatVisitChat: "VEURE EL XAT",
+ chatUntitled: "Xat sense títol",
+ chatNoItems: "No s'han trobat xats.",
+ chatParticipants: "Participants",
+ chatMessagesLabel: "Missatges",
+ chatThreadsLabel: "Fils",
+ chatCreatedAt: "CREAT",
+ chatSearchPlaceholder: "Cercar a Xats...",
+ chatStatusOpen: "OBERT",
+ chatStatusInviteOnly: "NOMÉS CONVIDATS",
+ chatStatusClosed: "TANCAT",
+ chatSendMessage: "Enviar",
+ chatJumpLatest: "Darrer missatge",
+ chatReply: "Respondre",
+ chatReplyCancel: "Cancel·lar la resposta",
+ chatPin: "Fixar",
+ chatUnpin: "Desfixar",
+ chatPinned: "Fixats",
+ chatPickChat: "Tria un xat per obrir-lo",
+ chatNoneYet: "Encara no hi ha cap xat disponible.",
+ activitySearchPlaceholder: "Cercar a Activitat...",
+ trendingSearchPlaceholder: "Cercar a Tendències...",
+ opinionsSearchPlaceholder: "Cercar a Opinions...",
+ votesSearchPlaceholder: "Cercar a Votacions...",
+ gamesSearchPlaceholder: "Cercar a Jocs...",
+ schoolTitle: "Escola",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "S'ha editat una pàgina wiki que segueixes.",
+ wikiBotRestoredTitle: "S'ha restaurat una versió anterior d'una pàgina wiki que segueixes.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Un estudiant nou s'ha apuntat al teu curs.",
+ schoolBotInvitedTitle: "T'han convidat a un curs.",
+ schoolBotAdmittedTitle: "T'han admès en un curs.",
+ schoolBotCertificateTitle: "Has rebut un certificat.",
+ schoolBotPassedTitle: "Un estudiant ha aprovat el teu curs.",
+ schoolBotLessonTitle: "S'ha publicat una lliçó nova.",
+ invitesSchoolTitle: "Escola",
+ schoolEnrollLabel: "Unir-se al curs",
+ schoolExamRetryLater: "Ho podràs tornar a provar passades 24 hores.",
+ schoolApproved: "APROVAT",
+ schoolExamPassMark: "Nota d'aprovat (0-10)",
+ schoolExamPassed: "APROVAT",
+ schoolExamPending: "Pendent",
+ schoolExamFailed: "SUSPÈS",
+ schoolExamAddQuestion: "Afegir una pregunta",
+ schoolExamCreateQuestion: "Crear una pregunta",
+ schoolExamOption: "Opció",
+ schoolExamCorrect: "Opció correcta",
+ schoolExamPoints: "Punts",
+ schoolMaterialTextPlaceholder: "Notes per a aquesta lliçó...",
+ schoolMaterials: "Materials",
+ schoolAddMaterial: "Afegir material",
+ schoolNoMaterials: "Encara no hi ha materials.",
+ bankYourSchoolBalance: "Els teus ingressos de l'escola",
+ schoolProgress: "Progrés",
+ schoolProgressMark: "Marcar com a completada",
+ schoolProgressDone: "Completada",
+ schoolExams: "Exàmens",
+ schoolExamCreate: "Crear un examen",
+ schoolExamTitlePlaceholder: "Títol de l'examen",
+ schoolExamHelp: "Una pregunta per línia: Pregunta? ; opció ; opció correcta* ; opció",
+ schoolExamQuestionsPlaceholder: "Què és SSB? ; Una base de dades ; Un protocol P2P* ; Un navegador",
+ schoolExamSubmit: "Enviar les respostes",
+ schoolExamScore: "La teva nota",
+ schoolNoScoresYet: "Encara no hi ha resultats.",
+ schoolLessonUnit: "Unitat / fase",
+ schoolLessonUnitPlaceholder: "p. ex. Fase 1",
+ schoolLessonOrder: "Ordre",
+ profileClearnetSchoolLabel: "Escola",
+ schoolStartDate: "Data d'inici",
+ schoolSessionDate: "Data de la sessió",
+ schoolCourseChat: "Xat del curs",
+ agendaFilterSchool: "ESCOLA",
+ agendaFilterCampaigns: "CAMPANYES",
+ agendaFilterLogistics: "LOGÍSTICA",
+ schoolCourseType: "Tipus de curs",
+ schoolTypeOpen: "OBERT",
+ schoolTypePaid: "DE PAGAMENT",
+ schoolTypeInvite: "NOMÉS PER INVITACIÓ",
+ schoolLessonLocked: "Lliçó xifrada — demana la clau del curs al professor.",
+ schoolGrantAccess: "Enviar la clau del curs",
+ schoolKeySent: "Clau enviada",
+ schoolOngoing: "En curs",
+ schoolFilterApplied: "APUNTAT",
+ schoolFilterOpen: "OBERTS",
+ schoolFilterFavorites: "PREFERITS",
+ schoolPendingPayment: "Pagament pendent",
+ schoolPendingStudents: "Inscripcions pendents",
+ schoolViewBill: "Veure la factura",
+ schoolPaymentNote: "En inscriure't es genera una factura en ECO (una transferència). La teva inscripció es confirma quan la transferència queda signada.",
+ schoolCloseCourse: "Tancar el curs",
+ schoolReopenCourse: "Reobrir el curs",
+ schoolDescription: "Ensenya i aprèn cursos a la teva xarxa.",
+ schoolFilterAll: "TOTS",
+ schoolFilterMine: "MEUS",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RECENTS",
+ schoolCreateButton: "Crear un curs",
+ schoolCreateSectionTitle: "Crear un curs",
+ schoolUpdateSectionTitle: "Actualitzar el curs",
+ schoolCourseTitlePlaceholder: "Nom del teu curs",
+ schoolCourseDescriptionPlaceholder: "Què ensenyaràs en aquest curs?",
+ schoolCourseImage: "Imatge del curs (mida màx.: 75MB)",
+ schoolTags: "Etiquetes",
+ schoolTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ schoolPrice: "Preu (ECO)",
+ schoolVisibility: "Visibilitat",
+ schoolVisibilityPublic: "Públic",
+ schoolVisibilityInvite: "Per invitació",
+ schoolStatus: "Estat",
+ schoolClosed: "Tancat",
+ schoolFree: "Gratis",
+ schoolCreate: "Crear el curs",
+ schoolUpdate: "Actualitzar el curs",
+ schoolSearchPlaceholder: "Cercar a l'Escola...",
+ schoolSortTitle: "Títol",
+ schoolNoCourses: "No s'han trobat cursos.",
+ schoolStudents: "Estudiants",
+ schoolTeacher: "Professor",
+ schoolCreatedAt: "CREAT",
+ schoolLessons: "Lliçons",
+ schoolNoLessons: "Encara no hi ha lliçons.",
+ schoolEnrollToSee: "Inscriu-te per veure les lliçons d'aquest curs.",
+ schoolEnrollButton: "INSCRIURE'S",
+ schoolUnenrollButton: "Abandonar el curs",
+ schoolInviteRequired: "Aquest curs és per invitació.",
+ schoolTeacherPanel: "Tauler del professor",
+ schoolStudentPanel: "Tauler de l'estudiant",
+ schoolAddLesson: "Crear una lliçó",
+ schoolLessonTitlePlaceholder: "Títol de la lliçó",
+ schoolLessonTextPlaceholder: "Descriu les nocions que cobreix aquesta lliçó...",
+ schoolInviteStudents: "Convidar estudiants",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "CONVIDAR",
+ schoolInvited: "Convidats",
+ schoolIssueCertificate: "Crear un certificat",
+ schoolCertified: "Certificat",
+ schoolCertificateTextPlaceholder: "Nota del certificat (opcional)",
+ schoolLessonOpen: "Obrir la lliçó",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificats",
+ schoolNoCertificates: "Encara no s'han emès certificats.",
+ schoolEditButton: "Editar",
+ schoolDeleteButton: "Esborrar",
+ typeSchool: "ESCOLA",
+ schoolCourseLabel: "CURS",
+ emergencyLabel: "EMERGÈNCIA",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Cursos",
+ statsSchoolLesson: "Lliçons",
+ statsSchoolEnroll: "Inscripcions",
+ statsSchoolCertificate: "Certificats de l'escola",
+ modulesSchoolLabel: "Escola",
+ modulesSchoolDescription: "Mòdul per intercanviar coneixement.",
+ welcomeStepUxAction: "Desar vista",
+ welcomeStepWorkflowTitle: "Quin ús d'OASIS tens al cap?",
+ welcomeStepWorkflowText: "Oasis té molts mòduls. Tria la configuració que s'adapti a tu i només quedaran activats els útils. Pots ajustar-ho quan vulguis a Mòduls.",
+ welcomeStepWorkflowAction: "Desar configuració",
+ welcomeWorkflow_full: "Per defecte",
+ chatRateLimitTitle: "Massa missatges",
+ chatRateLimitMessage: "Has arribat al límit de missatges que aquesta sala accepta en una hora. Torna-ho a provar més tard.",
+ chatMessagePlaceholder: "Escriu el teu missatge...",
+ chatNoMessages: "Encara no hi ha missatges.",
+ chatTitlePlaceholder: "Títol del xat",
+ chatDescriptionPlaceholder: "Descripció del xat",
+ chatTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ chatImageLabel: "Selecciona un fitxer d'imatge (.jpeg, .jpg, .png, .gif)",
+ chatAuthor: "Autor",
+ chatAddFavorite: "Afegir a preferits",
+ chatRemoveFavorite: "Treure de preferits",
+ chatPM: "MP",
+ chatStatusLabel: "Estat",
+ chatTypeLabel: "Tipus de xat",
+ chatCategoryLabel: "Categoria",
+ gamesTitle: "Jocs",
+ gamesDescription: "Descobreix alguns jocs i juga-hi.",
+ gamesFilterAll: "TOTS",
+ gamesPlayButton: "JUGAR!",
+ modulesGamesLabel: "Jocs",
+ modulesGamesDescription: "Mòdul per descobrir alguns jocs i jugar-hi.",
+ modulesGraphosLabel: "Graphos",
+ modulesGraphosDescription: "Mòdul per explorar la xarxa com un mapa interactiu de nodes.",
+ gamesCocolandTitle: "Cocoland",
+ gamesCocolandDesc: "Un coco amb ulls que salta palmeres i col·lecciona ECOins. Fins on pots arribar?",
+ gamesTheFlowTitle: "ECOinflow",
+ gamesTheFlowDesc: "Connecta PUBs amb habitants mitjançant validadors, botigues i acumuladors. Sobreviu a l'amenaça CBDC!",
+ gamesNeonInfiltratorTitle: "Neon Infiltrator",
+ gamesNeonInfiltratorDesc: "Infiltra't a la graella, recull dades confidencials, esquiva els drons de seguretat i escapa. Quants nivells pots superar?",
+ gamesSpaceInvadersTitle: "Space Invaders",
+ gamesSpaceInvadersDesc: "Atura la invasió alienígena! Destrueix onades d'invasors abans que arribin a terra.",
+ gamesArkanoidTitle: "Arkanoid",
+ gamesArkanoidDesc: "Trenca tots els maons amb la pala i la pilota. Un clàssic desafiament arcade.",
+ gamesPingPongTitle: "PingPong",
+ gamesPingPongDesc: "Ping-pong clàssic contra una IA. Guanya qui arriba primer a 5 punts.",
+ gamesAsteroidsTitle: "Asteroids",
+ gamesAsteroidsDesc: "Pilota la teva nau per un camp d'asteroides mortal. Dispara'ls abans que t'atrapin.",
+ gamesRockPaperScissorsTitle: "Pedra, paper, tisores",
+ gamesRockPaperScissorsDesc: "Pedra, paper o tisores contra una IA. Guanya qui s'emporta dues de tres rondes.",
+ gamesTikTakToeTitle: "TikTakToe",
+ gamesTikTakToeDesc: "Tres en ratlla clàssic contra la IA. Fes tres en línia per guanyar.",
+ gamesFlipFlopTitle: "FlipFlop",
+ gamesFlipFlopDesc: "Llança una moneda i aposta cara o creu. Quanta sort tens?",
+ games8BallTitle: "8Ball Pool",
+ games8BallDesc: "Billar vist des de dalt. Fes clic per apuntar i mantén premut per carregar la potència. Entra totes les boles amb el mínim de tirs.",
+ gamesArtilleryTitle: "Artilleria",
+ gamesArtilleryDesc: "Apunta el canó, tingues en compte el vent i encerta el blanc. 5 rondes: guanya qui fa menys tirs.",
+ gamesLabyrinthTitle: "Laberint",
+ gamesLabyrinthDesc: "Surt del laberint abans que s'acabin els moviments. Cada nivell és més gran i més difícil.",
+ gamesCocomanTitle: "Cocoman",
+ gamesCocomanDesc: "Menja't tots els punts i esquiva els fantasmes. Els fantasmes es mouen en temps real: no t'aturis!",
+ gamesTetrisTitle: "Tetris",
+ gamesAudioPendulumTitle: "Pèndol sonor",
+ gamesAudioPendulumDesc: "Simulador de física caòtica amb síntesi d'àudio en temps real. Les velocitats angulars es converteixen en freqüències i els pics, en cops de percussió. No hi ha dues simulacions que sonin igual.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Punxa visuals en directe amb dos plats: tria un patró per a cadascun, ajusta velocitat, color i zoom, mescla entre tots dos i llança flaixos al ritme. Marca el tempo o deixa que el micròfon porti el pols.",
+ gamesTetrisDesc: "Els clàssics blocs que cauen. Completa línies per puntuar. Quant de temps aguantaràs?",
+ gamesMinesweeperTitle: "Pescamines",
+ gamesMinesweeperDesc: "La clàssica caça de mines. Neteja el tauler per pujar de nivell — graelles més grans, més mines, més puntuació.",
+ gamesFilterScoring: "PUNTUACIONS",
+ gamesHallOfFame: "Saló de la fama",
+ gamesHallPlayer: "Jugador",
+ gamesHallScore: "Puntuació",
+ gamesNoScores: "Encara no hi ha puntuacions.",
+ chatAccessDenied: "No tens accés a aquest xat. Demana una invitació per accedir al contingut.",
+ padAccessDenied: "No tens accés a aquest pad. Demana una invitació per accedir al contingut.",
+ contentAccessDenied: "No tens accés a aquest contingut.",
+ blockAccessRestricted: "Accés restringit",
+ tribeContentAccessDenied: "Accés denegat",
+ tribeContentAccessDeniedMsg: "Aquest contingut pertany a una tribu. N'has de ser membre per accedir-hi.",
+ tribeViewTribes: "Veure les tribus",
+ tribeFilesEmpty: "Encara no hi ha fitxers.",
+ filesLabel: "Fitxers",
+ profileClearnetFilesLabel: "Fitxers",
+ filesTitle: "Fitxers",
+ filesDescription: "Explora i gestiona fitxers a la teva xarxa.",
+ fileAllSectionTitle: "Fitxers",
+ fileMineSectionTitle: "Els teus fitxers",
+ fileRecentSectionTitle: "Fitxers recents",
+ fileTopSectionTitle: "Fitxers destacats",
+ fileFavoritesSectionTitle: "Preferits",
+ fileFilterAll: "TOTS",
+ fileFilterMine: "MEUS",
+ fileFilterRecent: "RECENTS",
+ fileFilterTop: "DESTACATS",
+ fileFilterFavorites: "PREFERITS",
+ fileCreateSectionTitle: "Pujar un fitxer",
+ fileUpdateSectionTitle: "Actualitzar el fitxer",
+ fileCreateButton: "Pujar un fitxer",
+ fileUpdateButton: "Actualitzar",
+ fileAddFavoriteButton: "Afegir a preferits",
+ fileRemoveFavoriteButton: "Treure de preferits",
+ fileFileLabel: "Selecciona un fitxer (màx.: 75MB)",
+ calendarFilterRecent: "RECENTS",
+ calendarFilterAll: "TOTS",
+ calendarFilterMine: "MEUS",
+ calendarFilterFavorites: "PREFERITS",
+ calendarFilterOpen: "OBERTS",
+ calendarFilterClosed: "TANCATS",
+ padFilterRecent: "RECENTS",
+ padFilterAll: "TOTS",
+ padFilterMine: "MEUS",
+ padFilterOpen: "OBERTS",
+ padFilterClosed: "TANCATS",
+ chatFilterRecent: "RECENTS",
+ chatFilterAll: "TOTS",
+ chatFilterMine: "MEUS",
+ chatFilterFavorites: "PREFERITS",
+ chatFilterOpen: "OBERTS",
+ chatFilterClosed: "TANCATS",
+ licenseLabel: "Llicència",
+ phoneTitle: "Telèfon",
+ phoneDescription: "Gestiona les teves videotrucades xifrades d'extrem a extrem.",
+ phoneUnavailable: "Les trucades no estan disponibles en aquest dispositiu.",
+ phoneCallButton: "Trucar",
+ profileVisibilityPhone: "Número de telèfon",
+ phoneNumberUnknown: "Ningú de la teva xarxa té el número {number}.",
+ phoneNumberChoose: "Comprova a qui vols trucar al {number}:",
+ phoneAnswer: "Respondre",
+ phoneSpeaker: "Altaveu",
+ phoneEarpiece: "Auricular",
+ phoneReject: "Rebutjar",
+ phoneHangup: "Penjar",
+ phoneMute: "Silenciar",
+ phoneUnmute: "Activar micròfon",
+ phoneCameraOn: "Càmera on",
+ phoneCameraOff: "Càmera off",
+ settingsPhoneVideo: "Vídeo",
+ settingsPhoneVideoOn: "Permès en trucades i sales",
+ settingsPhoneVideoOff: "Només àudio",
+ phoneSilence: "No sentir",
+ phoneUnsilence: "Tornar a sentir",
+ phoneCalling: "Trucant a",
+ phoneIsCalling: "t'està trucant",
+ notifyNewPmFrom: "Nou MP de",
+ notifyNewPamFrom: "Nou PaM de",
+ notifyUpdateLabel: "Actualització",
+ updateInstalledLabel: "Versió instal·lada",
+ updateAvailableLabel: "Versió disponible",
+ updateChangesLabel: "Canvis",
+ updateFilesLabel: "Fitxers",
+ updateOriginLabel: "Origen",
+ phoneRecording: "Gravant PaM per a",
+ phoneLeaveMessage: "Ningú respon: deixa el teu missatge després del senyal.",
+ phoneLeaveMessageBusy: "És en una altra trucada: deixa el teu missatge després del senyal.",
+ phoneLeaveMessageUnreachable: "No s'ha pogut contactar: deixa el teu missatge després del senyal.",
+ phoneConnecting: "Connectant amb",
+ phoneSendPam: "Enviar PaM",
+ phoneCancel: "Cancel·lar",
+ phoneSearchPlaceholder: "Cercar a Telèfon...",
+ phonePamTitle: "Enregistraments d'àudio",
+ phoneNew: "Nou",
+ phoneDelete: "Esborrar",
+ phoneNoPams: "No tens enregistraments d'àudio.",
+ phoneHistoryTitle: "Historial",
+ phoneLatestTitle: "Últimes trucades",
+ phoneCreateButton: "Nova trucada",
+ phoneLimitsHint: "Fins a 7 habitants per trucada; amb més d'un és una trucada conjunta.",
+ phoneErrorPub: "No es pot trucar a un pub.",
+ phoneJointCall: "Trucada conjunta",
+ phoneWith: "Amb",
+ phoneResult: "Resultat",
+ phoneWhen: "Quan",
+ phoneDuration: "Durada",
+ phoneOutgoing: "Sortint",
+ phoneIncoming: "Entrant",
+ phoneNoHistory: "Encara no hi ha registres.",
+ phoneOutcomeEnded: "Atesa",
+ phoneOutcomeMissed: "Perduda",
+ phoneOutcomeRejected: "Rebutjada",
+ phoneOutcomeNoanswer: "Sense resposta",
+ phoneOutcomeCancelled: "Cancel·lada",
+ phoneOutcomePam: "PaM enviat",
+ phoneOutcomeFailed: "Fallida",
+ phoneDialAdd: "Afegir",
+ phoneDialBack: "Esborrar",
+ phoneDialClear: "Netejar",
+ phoneDialPlaceholder: "Número o Oasis ID",
+ phoneDialInhabitants: "Habitants",
+ phoneDialRemove: "Treure",
+ phoneOwnNumber: "Aquest és el teu propi número.",
+ phoneSettingsDesc: "Tria qui et pot trucar.",
+ phoneDnd: "No molestar",
+ phoneOpen: "Obert",
+ phoneRecipientRefuses: "L'habitant a qui intentes trucar no permet rebre trucades.",
+ phoneRefusedNotice: "Aquests habitants no permeten rebre trucades i no se'ls ha trucat:",
+ fileEmptyError: "L'arxiu és buit. Tria un altre arxiu.",
+ fileTitleLabel: "Títol",
+ fileTitlePlaceholder: "Títol",
+ fileDescriptionLabel: "Descripció",
+ fileDescriptionPlaceholder: "Descripció",
+ fileTagsLabel: "Etiquetes",
+ fileTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ fileSizeLabel: "Mida",
+ fileDownloadButton: "BAIXA",
+ fileDetailsButton: "DETALLS",
+ fileNoFile: "Sense fitxer fitxer",
+ fileSearchPlaceholder: "Cercar a Fitxers...",
+ fileSearchButton: "Cercar",
+ fileSortRecent: "Més recents",
+ fileSortOldest: "Més antics",
+ fileSortTop: "Més votats",
+ fileNoMatch: "No s'han trobat fitxers coincidents.",
+ fileUpdatedAt: "Actualitzat",
+ typeFile: "FITXERS",
+ modulesFilesLabel: "Fitxers",
+ modulesFilesDescription: "Mòdul per descobrir i gestionar àudios.",
+ tribeSectionFiles: "FITXERS",
+ fileDescription: "Descripció",
+ fileDownload: "Baixar",
+ fileTypeLabel: "Tipus",
+ torrentsTitle: "Torrents",
+ torrentsDescription: "Explora i gestiona torrents a la teva xarxa.",
+ torrentAllSectionTitle: "Torrents",
+ torrentMineSectionTitle: "Els teus torrents",
+ torrentRecentSectionTitle: "Torrents recents",
+ torrentTopSectionTitle: "Torrents destacats",
+ torrentFavoritesSectionTitle: "Preferits",
+ torrentFilterAll: "TOTS",
+ torrentFilterMine: "MEUS",
+ torrentFilterRecent: "RECENTS",
+ torrentFilterTop: "DESTACATS",
+ torrentFilterFavorites: "PREFERITS",
+ torrentCreateSectionTitle: "Pujar un torrent",
+ torrentUpdateSectionTitle: "Actualitzar el torrent",
+ torrentCreateButton: "Pujar un torrent",
+ torrentUpdateButton: "Actualitzar",
+ torrentDeleteButton: "Eliminar",
+ torrentAddFavoriteButton: "Afegir a preferits",
+ torrentRemoveFavoriteButton: "Treure de preferits",
+ torrentFileLabel: "Seleccionar un fitxer torrent (.torrent)",
+ torrentTitleLabel: "Títol",
+ torrentTitlePlaceholder: "Títol",
+ torrentDescriptionLabel: "Descripció",
+ torrentDescriptionPlaceholder: "Descripció",
+ torrentTagsLabel: "Etiquetes",
+ torrentTagsPlaceholder: "Introdueix etiquetes separades per comes",
+ torrentSizeLabel: "Mida",
+ torrentFromContent: "Generar torrent",
+ torrentFromContentMissing: "El fitxer encara no està disponible en aquest node. Torna-ho a provar d'aquí a una estona.",
+ torrentDownloads: "Baixades",
+ torrentFetchOasis: "Baixar a Oasis",
+ torrentSaveFile: "Desar fitxer",
+ torrentSeeds: "llavors",
+ seedsLabel: "Llavors",
+ seedAction: "Donar suport",
+ torrentSourceFile: "Fitxer",
+ torrentStateQueued: "En cua",
+ torrentStateProbing: "Cercant llavors",
+ torrentStateDownloading: "Baixant",
+ torrentStateDone: "Completada",
+ torrentStateFailed: "Fallida",
+ torrentStateNoSource: "Sense llavors connectades, esperant",
+ torrentStateCancelled: "Cancel·lada",
+ torrentNoDownloads: "Encara no hi ha baixades.",
+ torrentOriginalSection: "Original",
+ torrentCancel: "Cancel·lar",
+ torrentDownloadButton: "BAIXA",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETALLS",
+ torrentNoFile: "Sense fitxer torrent",
+ noTorrents: "No s'han trobat torrents.",
+ noFiles: "No s'han trobat fitxers.",
+ torrentSearchPlaceholder: "Cercar a Torrents...",
+ torrentSearchButton: "Cercar",
+ torrentSortRecent: "Més recents",
+ torrentSortOldest: "Més antics",
+ torrentSortTop: "Més votats",
+ torrentNoMatch: "No s'han trobat torrents coincidents.",
+ torrentUpdatedAt: "Actualitzat",
+ statsTorrent: "Torrents",
+ statsFile: "Fitxers",
+ typeTorrent: "TORRENTS",
+ modulesTorrentsLabel: "Torrents",
+ modulesTorrentsDescription: "Mòdul per descobrir i gestionar torrents.",
+ favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "FITXERS",
+ favoritesFilterMarket: "MERCAT",
+ favoritesFilterEvents: "ESDEVENIMENTS",
+ favoritesFilterForum: "FÒRUM",
+ favoritesFilterHousing: "HABITATGE",
+ favoritesFilterJobs: "FEINES",
+ favoritesFilterProjects: "PROJECTES",
+ favoritesFilterReports: "INFORMES",
+ favoritesFilterTasks: "TASQUES",
+ favoritesFilterTransfers: "TRANSFERÈNCIES",
+ favoritesFilterVotes: "VOTACIONS",
+ favoritesFilterShopProducts: "ARTICLES DE BOTIGA",
+ tribeSectionTorrents: "TORRENTS",
+ tribeCreateTorrent: "Pujar un torrent",
+ tribeCreateFile: "Pujar fitxer",
+ settingsWishTitle: "Desig",
+ settingsWishDesc: "Determina com accedeixes a tot el contingut i la teva experiència a la xarxa Oasis.",
+ settingsWishWhole: "Multivers",
+ settingsWishMutuals: "Només suport mutu",
+ settingsWishOnlyLan: "Només LAN",
+ settingsWishLocal: "Local",
+ settingsPmVisibilityTitle: "Missatges privats",
+ settingsPmVisibilityDesc: "Configura el nivell d'exposició a missatges privats que vols tenir a la xarxa.",
+ settingsPmVisibilityWhole: "Multivers",
+ settingsPmVisibilityMutuals: "Només suport mutu",
+ pmMutualNotice: "L'enviament és una barrera d'UX. La recepció és un filtre d'atenció (el xifratge ja està replicat).",
+ inhabitantsPendingFollowsTitle: "Sol·licituds de suport pendents",
+ inhabitantsPendingAccept: "Acceptar",
+ inhabitantsPendingReject: "Rebutjar",
+ tribeSectionGovernance: "GOVERN",
+ tribePadInviteRequired: "No tens accés al pad. Demana una invitació per accedir al contingut.",
+ tribeChatInviteRequired: "No tens accés al xat. Demana una invitació per accedir al contingut.",
+ tribeGovernanceDesc: "Govern intern d'aquesta tribu.",
+ tribeGovernanceNoGov: "Sense govern actiu",
+ tribeGovernanceNoGovDesc: "Aquesta tribu encara no té govern. Proposa candidatures per iniciar el procés.",
+ tribeGovCardTitle: "Govern actual",
+ tribeGovCycleSince: "INICI DEL CICLE",
+ tribeGovCycleEnd: "FI DEL CICLE",
+ tribeGovTimeRemaining: "TEMPS RESTANT",
+ tribeGovPopulation: "POBLACIÓ",
+ tribeGovMethod: "MÈTODE",
+ tribeGovVotesReceived: "VOTS REBUTS",
+ tribeGovLeader: "LÍDER",
+ tribeGovFilterGovernment: "GOVERN",
+ tribeGovFilterCandidatures: "CANDIDATURES",
+ tribeGovFilterLaws: "LLEIS",
+ tribeGovCandidatureId: "Candidatura",
+ tribeGovCandidatureMethod: "Mètode",
+ tribeGovCandidatureProposeBtn: "Publicar la candidatura",
+ tribeGovRuleTitle: "Títol de la regla",
+ tribeGovRuleBody: "Cos de la regla",
+ tribeGovProposals: "PROPOSTES",
+ tribeGovRevocations: "REVOCACIONS",
+ tribeGovHistorical: "HISTÒRIC",
+ tribeGovRules: "REGLES",
+ tribeGovernanceAlreadyPublished: "Aquesta tribu ja té una candidatura oberta en el cicle actual del parlament global.",
+ tribeGovernanceProposeInternal: "Proposar una candidatura interna",
+ tribeGovernanceInternalCandidatures: "Candidatures internes",
+ tribeGovernanceNoCandidatures: "No hi ha candidatures obertes.",
+ tribeGovernanceAddRule: "Afegir una regla",
+ tribeGovernanceNoRules: "Encara no hi ha regles.",
+ tribeGovernanceNoLeaders: "Encara no hi ha líders elegits.",
+ tribeGovernanceComingSoon: "Aviat al mòdul de govern d'aquesta tribu.",
+ tribeGovNoProposals: "Encara no hi ha cap proposta",
+ tribeGovNoLaws: "Encara no hi ha cap llei",
+ tribeGovNoRevocations: "Encara no hi ha cap revocació",
+ tribeGovNoHistorical: "Encara no hi ha cap registre",
+ logsTitle: "Bitàcola",
+ logsDescription: "Porta un diari privat de les teves experiències.",
+ logsViewTitle: "Bitàcola",
+ logsColumnType: "Tipus",
+ logsView: "Veure",
+ logsUpdateButton: "Actualitzar",
+ logsEditTitle: "Actualitzar el registre",
+ logsCreateTitle: "Crear una entrada",
+ logsWriteButton: "Escriure",
+ logsTextPlaceholder: "Descriu les teves experiències...",
+ logsModeAIWritten: "Assistent d'IA",
+ logsModeManual: "Manual",
+ logsModeAI: "IA",
+ logsColumnLog: "Bitàcola",
+ logsColumnDate: "Data",
+ logsDelete: "Eliminar",
+ logsEdit: "Actualitzar",
+ logsFilterAlways: "SEMPRE",
+ logsFilterYear: "DARRER ANY",
+ logsFilterMonth: "DARRER MES",
+ logsFilterWeek: "DARRERA SETMANA",
+ logsFilterToday: "AVUI",
+ logsComments: "Comentaris",
+ logsAuthorEntries: "Entrades",
+ logsCreate: "Crear una entrada",
+ logsExport: "Exportar la bitàcola",
+ logsExportOne: "Exportar el registre",
+ logsViewDetails: "Veure els detalls",
+ logsGenerateButton: "Generar el text",
+ logsSearchText: "Cercar a la Bitàcola...",
+ logsSearchAnyType: "Qualsevol tipus",
+ logsSearchButton: "Cercar",
+ logsEmpty: "Encara no hi ha entrades.",
+ logsNothingNew: "No hi ha accions noves per registrar.",
+ modulesLogsLabel: "Bitàcola",
+ modulesLogsDescription: "Mòdul per portar un diari privat de les teves experiències.",
+ statsLogsTitle: "Bitàcola",
+ typeLog: "BITÀCOLA",
+
+ larpTitle: "L.A.R.P.",
+ larpDescription: "Una capa de joc de rol en viu per a l'experimentació col·laborativa.",
+ larpNoHousesMatch: "Cap casa no coincideix amb la teva cerca.",
+ larpSearchPlaceholder: "Cercar a L.A.R.P....",
+ larpAllHouses: "Cases:",
+ larpFilterRuling: "GOVERNA",
+ larpFilterHouses: "CASES",
+ larpFilterRules: "PMF",
+ larpRulesTitle: "PMF del L.A.R.P.",
+ larpRulesEntryText: "Tot habitant comença per defecte a ACADÈMIA. Des d'ACADÈMIA, tria una casa al tauler \"Unir-se a una casa\": això n'obre el test d'entrada. Respon les 10 preguntes i envia. Si superes el llindar (7/10), t'admetran automàticament en aquella casa; si no, seràs rebutjat i romandràs a ACADÈMIA. En tots dos casos el sistema registra el teu OasisID i el cicle de l'intent, i impedeix un altre intent fins que passi el període d'espera de 30 cicles.",
+ larpRulesGovernanceText: "Durant el seu cicle, la casa governant llueix la insígnia \"Governa\" i és l'única el Mur de la qual es mostra públicament a la pestanya GOVERNA.",
+ larpRulesWallText: "Cada casa té un Mur on escriuen els seus membres. El Mur d'una casa és privat per a la casa, excepte el de la casa governant i el d'ACADÈMIA, que pot llegir qualsevol.",
+ larpRulesSignText: "Els habitants el poden activar (a /profile/edit > Sensors) per mostrar la imatge de la seva casa actual com un segell al seu perfil, a la seva targeta d'autor i d'habitant. El segell enllaça a la pàgina de la casa.",
+ larpPostsTitle: "Mur",
+ larpPostsEmpty: "Encara no hi ha publicacions.",
+ larpPostPlaceholder: "Què té a dir aquesta casa?",
+ larpPostSubmit: "Publicar",
+ larpCycleLabel: "Cicle:",
+ bankRulesArchTaxFormula: "Taxa ARCH(usuari) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory",
+ bankRulesArchTaxNote: "L'impost ARCH reflecteix el cost a llarg termini de fer créixer i mantenir l'arxiu de la xarxa: com més antigues siguin les teves dades a la xarxa, més gran serà la teva part del cost de manteniment.",
+ bankRulesChipFormula: "band = ratio / reducer, on ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). alt ≥ 0.66, mitjà ≥ 0.33, altrament baix.",
+ bankRulesChipNote: "El xip de cada element s'acoloreix respecte al missatge més gran vist a la xarxa i se suavitza segons el nombre d'habitants actius — una xarxa més gran reparteix la càrrega i empeny més elements cap a la banda verda.",
+ bankRulesEcoTaxFormula: "Taxa ECO(usuari) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
+ bankRulesEcoTaxNote: "L'impost ECO es dedueix de la RBU bruta quan es calcula l'assignació de l'època. Els ECO deduïts no es redistribueixen en aquesta època — es queden al saldo del pub i alimenten el fons de la pròxima època a través dels límits reserveMin / alpha.",
+ bankRulesKarmaFormula: "karma = log10(1 + actions) + reputation",
+ bankRulesKarmaNote: "El karma es deriva de les teves accions (publicacions, vots, participació al parlament/tribunals, etc.) amb un factor de decaïment temporal, menys els grams de carboni que genera el teu feed.",
+ bankRulesNetFormula: "net_UBI = floor + max(0, gross_UBI − floor) − ECO Tax − ARCH Tax",
+ bankRulesPoolFormula: "pool = min(pubBal − reserveMin, capPerEpoch, alpha · pubBal)",
+ bankRulesShareFormula: "share = clamp(1 + karma/100, w_min, w_max) / sum(weights)",
+ bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
+ bankTaxesArchTaxFootprintNote: "L'impost ARCH reflecteix el cost de fer créixer i mantenir l'arxiu de la xarxa. Es calcula a partir del temps transcorregut entre el primer bloc que vas publicar i el bloc més nou de la xarxa — com més temps visqui la teva història a l'arxiu, més gran serà la teva part del cost de manteniment.",
+ bankTaxesArchTaxNoteBold: "reduir directament l'impost ARCH",
+ bankTaxesArchTaxNoteIntro: "El teu impost ARCH es dedueix de l'excedent que la xarxa genera per sobre de la teva RBU; el valor base de la RBU és un mínim inamovible. L'impost mai no es dedueix de l'import fix que correspon a cada habitant com a RBU. Els fons deduïts alimenten l'algorisme de redistribució de la riquesa i es canalitzen cap a altres habitants a través de les seves reclamacions de RBU. Els habitants més nous i els que es dediquin específicament a tasques d'arxiu, replicació i manteniment probablement tindran alguna tasca dedicada a mantenir sa l'arxiu de la xarxa en nom teu. O poden dedicar-se a ",
+ bankTaxesArchTaxNoteOutro: " mitjançant acords de poda, deduplicació de dades redundants i infraestructura de manteniment compartida, i el consens de la xarxa pot requerir-ne la contribució contínua.",
+ bankTaxesUserNoteChips: "El xip d'impost ECO que es mostra al costat de cada element canvia de color (verd / groc / vermell) segons la mida de l'element en relació amb el bloc més gran vist a la xarxa, suavitzat pel nombre d'habitants actius — una xarxa solar-punk més gran reparteix la càrrega i empeny més elements cap a la banda verda.",
+ bankTaxesUserNoteOtherParams: "Ara com ara l'impost ECO es deriva de la petjada de carboni de cada bloc, però amb el temps pot incorporar altres paràmetres — energia gastada en la replicació, emmagatzematge redundant entre nodes, amplada de banda dels blobs, cost computacional del desxifratge, petjada de mineria de les transaccions associades o qualsevol altra càrrega mesurable que la xarxa acordi valorar.",
+ gamesHallDate: "Data",
+ gamesNewRecord: "Nou rècord!",
+ indexingRefreshNote: "Aquesta pàgina es recarrega cada 10 segons.",
+ indexingMessage: "Oasis està sincronitzant la xarxa de nodes distribuïda. Si us plau, espera.",
+ indexingTitle: "Sincronitzant",
+ padsNoItems: "Encara no hi ha pads.",
+ padVersionHistory: "Historial",
+ padAttributionView: "Per autora",
+ padVersionView: "Veure la versió",
+ statsChat: "Xats",
+ statsChatMessage: "Missatges de xat",
+ statsGameScore: "Jocs",
+ statsWiki: "Pàgines wiki",
+ statsPad: "Pads",
+ statsPadEntry: "Entrades de pad",
+ typeGameScore: "PUNTUACIONS",
+ bankTaxesLookupNote: "Introdueix un ID de bloc per cercar-lo al teu feed local.",
+ bankTaxesUserNoteChipsClick: "Fes clic a qualsevol xip per inspeccionar-ne el bloc al blockexplorer.",
+ mapUrlPlaceholder: "/maps/MAP_ID",
+ larpRulesInviteEntryText: "Els membres de les cases poden generar codis d'invitació que donen accés directe a la casa.",
+ larpRulesOneHouseText: "Només pots pertànyer a una casa alhora. Si no pertanys a cap, ets a ACADÈMIA. Cada pàgina de casa (excepte ACADÈMIA) mostra als seus membres un botó \"Sortir de la casa\" que torna la pertinença a ACADÈMIA. Sortir NO anul·la el període d'espera del test.",
+ larpRulesTestEntryText: "Al test WILL cada opció pondera una o més cases; en enviar-lo, el sistema suma les puntuacions i t'admet automàticament a la casa amb més punts.",
+ larpWillTestHint: "Un cop completat, se t'assignarà la casa que més s'ajusti a les teves respostes. Les teves respostes individuals es processen localment i no s'emmagatzemen mai — només es publica al teu feed l'assignació de casa resultant.",
+ larpWillTestTitle: "Test WILL",
+ settingsLanDesc: "Anuncia periòdicament aquest node a altres instàncies d'Oasis de la mateixa xarxa local. Desactiva-ho per aturar les difusions UDP.",
+ settingsLanEnable: "Activar la difusió LAN",
+ settingsLanTitle: "Difusió LAN",
+ settingsReplicationTitle: "Replicació",
+ settingsReplicationDesc: "Configura el nombre de salts que el teu node segueix des del teu propi feed en replicar contingut.",
+ settingsReplicationHopsLabel: "Salts",
+ settingsBlobCacheTitle: "Memòria cau de mitjans",
+ settingsBlobCacheDesc: "El contingut d'altres habitants es desa en aquest dispositiu. Tria quant d'espai pot ocupar.",
+ settingsBlobCacheUsage: "Ús actual",
+ settingsBlobCacheFiles: "fitxers",
+ settingsBlobCacheLimit: "Límit",
+ settingsBlobCacheUnlimited: "Sense límit",
+ settingsBlobCacheCleanNow: "Netejar ara",
+ settingsBlobCacheCleaned: "{n} fitxers eliminats, {size} alliberats.",
+ aiApproveTagsLabel: "Etiquetes (separades per comes)",
+ aiApproveTagsPlaceholder: "p. ex. oasis, governança, ecologia",
+ aiApproveRatingLabel: "Valoració",
+ aiExchangeLang: "Idioma",
+ aiExchangeTags: "Etiquetes",
+ aiExchangeRating: "Valoració",
+ aiExchangeHelpful: "Útil",
+ aiExchangeMarkHelpful: "+1 útil",
+ larpCyclesUntilRuling: "Pròxim cicle de govern",
+ larpVisitTribe: "Visitar la tribu",
+ larpStartJourney: "Començar el viatge",
+ larpGoverning: "Governa:",
+ larpStartHere: "Comença aquí:",
+ larpMyHouse: "La meva casa:",
+ larpMembersCount: "Membres",
+ larpRolesLabel: "Rols",
+ larpFunctionLabel: "Funció",
+ larpMonthLabel: "Cicle de govern",
+ larpLeaveToAcademia: "Tornar a ACADÈMIA",
+ larpAcademiaJoinTitle: "Cases L.A.R.P.",
+ larpInviteRedeem: "Unir-se a la casa",
+ larpInviteCreate: "Generar un codi d'invitació",
+ larpInvitePlaceholder: "Codi d'invitació",
+ larpInviteBannerTitle: "Nou codi d'invitació",
+ larpInviteBannerHint: "Comparteix aquest codi amb algú que sigui a ACADÈMIA. Caduca d'aquí a 30 cicles o després d'un ús.",
+ larpTestRankingTitle: "Puntuació per casa",
+ invitesHousesTitle: "L.A.R.P.",
+ ecoTaxLabel: "Taxa ECO",
+ bankTaxes: "Impostos",
+ bankOverviewYourTaxes: "Impostos totals",
+ bankTaxesEcoTaxTitle: "Taxa ECO",
+ bankTaxesArchTaxTitle: "Taxa ARCH",
+ bankTaxesUserAmount: "La teva taxa ECO (import a retornar)",
+ bankTaxesArchTaxUserAmount: "La teva taxa ARCH (import a retornar)",
+ bankTaxesArchTaxFirstBlock: "Edat del teu primer bloc",
+ bankTaxesArchTaxRate: "Tipus",
+ bankTaxesTotalBlocks: "Blocs totals",
+ bankTaxesTotalBytes: "Bytes totals",
+ bankTaxesTotalCarbon: "Carboni total",
+ bankTaxesTotalEcoin: "Taxa ECO total (tota la vida)",
+ bankTaxesEcoTaxLifetime: "Taxa ECO (tota la vida)",
+ bankTaxesAnnualEcoin: "Taxa ECO (anual)",
+ bankTaxesMonthlyEcoin: "Taxa ECO (mensual)",
+ bankTaxesArchTaxLifetime: "Taxa ARCH (tota la vida)",
+ bankTaxesArchTaxAnnual: "Taxa ARCH (anual)",
+ bankTaxesArchTaxMonthly: "Taxa ARCH (mensual)",
+ bankTaxesTotalLifetime: "Total (tota la vida)",
+ bankTaxesTotalAnnual: "Total (anual)",
+ bankTaxesTotalMonthly: "Total (mensual)",
+ bankTaxesRate: "Tipus",
+ bankTaxesSpan: "Període de mostreig",
+ bankTaxesLookupTitle: "Inspeccionar un bloc",
+ bankTaxesLookupPlaceholder: "ID del bloc (p. ex. %abc...=.sha256)",
+ bankTaxesLookupButton: "Inspeccionar",
+ bankTaxesLookupNotFound: "No s'ha trobat cap bloc amb aquest ID al teu feed local.",
+ bankTaxesLookupAuthor: "Autor",
+ bankTaxesLookupType: "Tipus",
+ bankTaxesLookupSize: "Mida",
+ bankTaxesLookupCarbon: "Petjada de carboni",
+ bankTaxesLookupEcoin: "Taxa ECO",
+ bankExchangeEcoTaxAnnual: "Impostos d'ECOin (anual)",
+ bankExchangeEcoTaxMonthly: "Impostos d'ECOin (mensual)",
+ bankTaxesTypesLabel: "Selecciona quins impostos vols pagar",
+ bankTaxesTypesApply: "Establir els meus impostos",
+ bankRulesPoolTitle: "Fons mensual",
+ bankRulesShareTitle: "Repartiment per usuari",
+ bankRulesKarmaTitle: "Karma (puntuació d'implicació)",
+ bankRulesEcoTaxTitle: "Taxa ECO",
+ bankRulesArchTaxTitle: "Taxa ARCH",
+ bankRulesChipTitle: "Banda de color del xip de la taxa ECO",
+ bankRulesEpochKind: "Granularitat de l'època",
+ bankRulesAlpha: "Alpha (quota màx. del saldo del pub per època)",
+ bankRulesReserveMin: "Reserva mínima (es manté al saldo del pub)",
+ bankRulesCapPerEpoch: "Límit per època (absolut)",
+ bankRulesGraceDays: "Període de gràcia de la reclamació",
+ bankRulesWMin: "Pes mínim (w_min)",
+ bankRulesWMax: "Pes màxim (w_max)",
+ bankRulesFloor: "Mínim per usuari (brut)",
+ bankRulesCapUser: "Límit per usuari i època",
+ bankRulesEcoTaxRate: "Tipus",
+ bankRulesArchTaxRate: "Tipus",
+ bankRulesCarbonFactor: "Factor de carboni",
+ statsTombstoneEmpty: "Encara no hi ha esborrats (tombstones) a la xarxa.",
+ blockchainBlockNotAvailable: "Aquest bloc no és al teu feed local. Pot pertànyer a un node que encara no repliques.",
+ blockchainBackToBlockexplorer: "Tornar a Blockexplorer",
+ audioFilterBcs: "BCS",
+ audioTranscodeButton: "TRANSCODIFICAR",
+ audioTranscodeDetailTitle: "Transcodificar",
+ audioTranscodeDetailDescription: "Descodifica la càrrega útil incrustada i el mapa de composició original de la blockchain.",
+ audioTranscodeStegoTimestamp: "Generat el",
+ audioTranscodeStegoMessage: "TEXT",
+ audioTranscodeStegoEmpty: "(cap)",
+ audioTranscodeStegoUnknown: "—",
+ audioTranscodeStegoNotFound: "No s'ha pogut descodificar cap càrrega esteganogràfica en aquest àudio.",
+ audioTranscodeCompositionEmpty: "Aquest àudio no inclou cap composició de blockchain desada.",
+ audioBackToBcs: "Tornar a BCS",
+ melodyCompositionTitle: "Mapa de composició de la blockchain",
+ melodyFilterMine: "MEVES",
+ melodyAllEmpty: "Encara no hi ha composicions BCS d'altres habitants.",
+ melodyNoteUnavailable: "el bloc no és al teu feed local",
+ melodyUploadBcsTitle: "Publicar",
+ melodyUploadBcsButton: "Publicar",
+ melodyUploadStegoLabel: "Missatge ocult (esteganografia)",
+ melodyUploadStegoMaxLabel: "màx. 280 caràcters",
+ melodyUploadStegoPlaceholder: "Opcional.",
+ melodyUploadBcsNameNote: "L'àudio es publicarà amb el nom generat automàticament",
+ larpLastAttemptTitle: "El teu darrer intent",
+ larpLastAttemptHouse: "Casa",
+ larpLastAttemptWhen: "Quan",
+ larpLastAttemptCooldown: "Pròxim intent d'aquí a",
+ larpTestTitle: "Test d'entrada",
+ larpTestIntro: "Respon les 10 preguntes. Necessites almenys 7 respostes correctes per ser admès. Pots intentar un test cada 30 cicles sigui quin sigui el resultat.",
+ larpTestSubmit: "Unir-se a la casa",
+ larpTestCooldownActive: "Pròxim test disponible d'aquí a",
+ larpTestCooldownDays: "cicles",
+ larpTestResultTitle: "Resultat del test",
+ larpTestScore: "Puntuació",
+ larpTestNextAttempt: "Pots intentar un altre test d'aquí a 30 cicles.",
+ larpGoToHouse: "Anar a la teva casa",
+ larpBackToAcademia: "Tornar a ACADÈMIA",
+ larpBadgeYou: "Tu",
+ larpBadgeRuling: "Governa",
+ modulesLarpLabel: "L.A.R.P.",
+ modulesLarpDescription: "Mòdul per a la capa de joc de rol en viu.",
+ larpProfileQ1: "Quan t'enfrontes a un problema complex, què fas primer?",
+ larpProfileQ1O1: "Parlar amb altres persones per buscar consens",
+ larpProfileQ1O2: "Construir un prototip per provar-lo",
+ larpProfileQ1O3: "Investigar la bibliografia",
+ larpProfileQ1O4: "Sabotejar el sistema que el provoca",
+ larpProfileQ2: "Què dona sentit a la teva feina diària?",
+ larpProfileQ2O1: "Defensar els habitants que estimo",
+ larpProfileQ2O2: "Crear alguna cosa tangible",
+ larpProfileQ2O3: "Guarir o tenir cura de la vida",
+ larpProfileQ2O4: "Treballar amb paraules i idees",
+ larpProfileQ2O5: "Fer riure els altres",
+ larpProfileQ3: "Quan sorgeix un conflicte al teu grup, tu…",
+ larpProfileQ3O1: "Lideres el diàleg",
+ larpProfileQ3O2: "Prens partit i et mantens ferm",
+ larpProfileQ3O3: "Deixes anar una broma per rebaixar la tensió",
+ larpProfileQ3O4: "Qüestiones si el conflicte és real",
+ larpProfileQ3O5: "Busques les causes ecològiques d'arrel",
+ larpProfileQ4: "El teu projecte preferit a llarg termini seria…",
+ larpProfileQ4O1: "Construir una ciutat",
+ larpProfileQ4O2: "Restaurar un bosc",
+ larpProfileQ4O3: "Redactar una constitució",
+ larpProfileQ4O4: "Organitzar un festival",
+ larpProfileQ4O5: "Muntar una xarxa de defensa",
+ larpProfileQ4O6: "Dissenyar una màquina nova",
+ larpProfileQ4O7: "Curar un arxiu",
+ larpProfileQ4O8: "Desmuntar un ordre injust",
+ larpProfileQ5: "Què fa una bona líder?",
+ larpProfileQ5O1: "Algú que escolta i fa de mediadora",
+ larpProfileQ5O2: "Algú capaç de lluitar i protegir",
+ larpProfileQ5O3: "Algú que coneix la història",
+ larpProfileQ5O4: "Algú que et fa somriure",
+ larpProfileQ6: "La teva relació amb les regles:",
+ larpProfileQ6O1: "Les regles sorgeixen del diàleg i la llei",
+ larpProfileQ6O2: "Les regles s'han de complir estrictament",
+ larpProfileQ6O3: "Les regles s'han de trencar sovint",
+ larpProfileQ6O4: "Les regles han de servir la vida",
+ larpProfileQ6O5: "Les regles aixequen infraestructures sòlides",
+ larpProfileQ7: "Com gestiones la informació?",
+ larpProfileQ7O1: "La curo i la preservo",
+ larpProfileQ7O2: "La comparteixo a través d'històries",
+ larpProfileQ7O3: "En qüestiono els orígens",
+ larpProfileQ7O4: "N'extrec el que és útil",
+ larpProfileQ7O5: "La faig servir per guarir",
+ larpProfileQ8: "La teva idea d'èxit és…",
+ larpProfileQ8O1: "Una màquina que funciona",
+ larpProfileQ8O2: "Una comunitat en pau",
+ larpProfileQ8O3: "Un festival animat",
+ larpProfileQ8O4: "Una família segura",
+ larpProfileQ8O5: "Un arxiu intacte",
+ larpProfileQ8O6: "Un dogma esquerdat",
+ larpProfileQ8O7: "Una collita pròspera",
+ larpProfileQ8O8: "Un edifici acabat",
+ larpProfileQ9: "En llevar-te, el que vols és…",
+ larpProfileQ9O1: "Entrenar el cos",
+ larpProfileQ9O2: "Llegir o escriure",
+ larpProfileQ9O3: "Conrear o cuinar",
+ larpProfileQ9O4: "Remenar alguna cosa",
+ larpProfileQ9O5: "Qüestionar l'autoritat",
+ larpProfileQ9O6: "Planificar un projecte",
+ larpProfileQ9O7: "Parlar amb les teves amigues",
+ larpProfileQ9O8: "Fer art",
+ larpProfileQ10: "La teva debilitat podria ser:",
+ larpProfileQ10O1: "Parlar massa",
+ larpProfileQ10O2: "Ser massa pragmàtica",
+ larpProfileQ10O3: "Ser massa idealista",
+ larpProfileQ10O4: "Ser massa disruptiva",
+ larpProfileQ10O5: "Ser massa rígida",
+ larpProfileQ10O6: "Ser massa despreocupada",
+ larpProfileQ10O7: "Ser massa prudent",
+ larpProfileQ10O8: "Ser massa ambiciosa",
+ uxModeTitle: "UX",
+ uxModeDescription: "Selecciona quin mode de navegació UX vols per a la teva interfície.",
+ uxModeMenus: "Blocs",
+ uxModeChats: "Converses",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Etiquetes en tendència",
+ feedActiveTitle: "Habitants actius",
+ cnBrandSub: "Lliure · P2P · Federada",
+ cnSyncedPeers: "Nodes sincronitzats",
+ cnLicense: "Llicència",
+ cnNotAccessible: "El contingut no és accessible en aquest moment.",
+ cnUntitled: "Sense títol",
+ cnSearchPlaceholder: "Cercar…",
+ cnHubTitle: "HUB Clearnet",
+ cnHubDescription: "Contingut públic compartit pels habitants d'aquesta xarxa Oasis.",
+ cnHubEmpty: "Encara no s'ha compartit contingut públic a la Clearnet.",
+ cnPublicContent: "Contingut",
+ cnTribesContent: "Tribus",
+ cnNetworkContent: "Xarxa",
+ cnCategoryEmpty: "No hi ha contingut en aquesta categoria.",
+ cnInhabitantEmpty: "Aquest habitant encara no ha publicat contingut a la Clearnet.",
+ cnPrevPage: "← Anterior",
+ cnNextPage: "Següent →",
+ cnPageOf: "Pàgina {page} de {pages}",
+ cnMoreInfo: "Més informació →",
+ cnOpenCourse: "Curs obert",
+ cnAuction: "SUBHASTA",
+ cnExchange: "INTERCANVI",
+ cnRssDescription: "publicats pels habitants d'aquest HUB",
+ cnKindAudio: "Àudio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Marcador",
+ cnKindDocument: "Document",
+ cnKindEvent: "Esdeveniment",
+ cnKindFeed: "Feed",
+ cnKindImage: "Imatge",
+ cnKindJob: "Feina",
+ cnKindMarket: "Mercat",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Projecte",
+ cnKindCourse: "Curs",
+ cnKindShop: "Botiga",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "Fitxer",
+ cnKindVideo: "Vídeo",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Sala",
+ cnKindMap: "Mapa",
+ uxModeAINav: "IA",
+
+ }
+};
diff --git a/src/client/assets/translations/oasis_de.js b/src/client/assets/translations/oasis_de.js
index dfa3426..075db92 100644
--- a/src/client/assets/translations/oasis_de.js
+++ b/src/client/assets/translations/oasis_de.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "Einkäufe",
shopMyOrdersDescription: "Deine Bestellungen.",
shopMyOrdersEmpty: "Du hast noch keine Käufe.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PN Verkäufer",
shopOrderSeller: "Verkäufer",
shopOrderInvoice: "Rechnung",
shopOrderInvoiceConcept: "Rechnung",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Annehmen",
shopOrderReject: "Ablehnen",
shopOrderMarkShipped: "Als versandt markieren",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PN Käufer",
shopOrderContractConcept: "Shop-Bestellung",
shopOrdersPending: "Ausstehende Bestellungen",
all: "Alle",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Aktuell",
anonymous: "Anonym",
unnamed: "Anonym",
- authorLabel: "AUTOR",
+ authorLabel: "Autor",
delete: "Löschen",
save: "Speichern",
vote: "Abstimmen",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "Inhaltswarnung",
invalidPost: "Ungültiger Inhalt",
invalidPostHint: "Diese Nachricht hat ungültigen/leeren Text.",
- spreadBy: "Von",
spreadChron: "Verbreitung",
spreaded: "Verbreitet",
spreadContentUnavailable: "Inhalt noch nicht verfügbar (Replikation ausstehend)",
filteredByTag: "Nach Tag gefiltert",
filteredByTagTitle: "Nach Tag gefiltert",
feedPublishedSuccess: "Beitrag erfolgreich veröffentlicht!",
+ feedMastodonFailed: "In Oasis veröffentlicht, konnte aber nicht an Mastodon gesendet werden.",
tribeFeedSent: "Nachricht erfolgreich gesendet!",
tribeContentEncrypted: "Verschlüsselter Inhalt",
tribeTorrentsEmpty: "Noch keine Torrents.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Letzter Besuch",
profileClearnetBookmarksLabel: "Lesezeichen",
invitesPort: "Port",
- currentlyUnrecheable: "FEHLER!",
- peerHostValidation: "Gültige IPv4 (z. B. 192.168.1.100) oder Hostname (z. B. pub.example.com)",
+ peerHostValidation: "Gültige IPv4 (z. B. 192.168.1.100) oder Hostname (z. B. pub.solarnethub.com)",
peerPortValidation: "Port 1-65535",
peerKeyValidation: "SSB ed25519 öffentlicher Schlüssel (@<44 Zeichen base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Abmeldung von deinem Stellenangebot",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Aufgabenbeschreibung",
exportPasswordLabel: "Export-Passwort",
importPasswordPlaceholder: "Passwort eingeben",
- searchCasesPlaceholder: "Fälle suchen…",
+ searchCasesPlaceholder: "In Gerichte suchen...",
shopBuyDeliveryAddressPlaceholder: "Lieferadresse",
shopBuyNotesPlaceholder: "Notizen",
bankTaxesUserNoteBold: "die ECO-Steuer direkt senken",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Fall unterstützen",
courtsSettlementAcceptBtn: "Vergleich annehmen",
courtsSupportCount: "Unterstützer",
- courtsVerdictVoteTitle: "Über das Urteil abstimmen",
- courtsVerdictVoteLabel: "Urteilsabstimmung",
- courtsVerdictVoteAccept: "Annehmen",
- courtsVerdictVoteReject: "Ablehnen",
- courtsVerdictVoteSubmit: "Stimme abgeben",
reportsSetStatus: "Status setzen",
reportsStatusClosed: "GESCHLOSSEN",
statsAvgPerInhabitant: "Durchschnitt pro Bewohner",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Avatar",
inhabitants: "Bewohner",
- peersReplicatedFeeds: "Replizierte Feeds",
+ peersReplicatedFeeds: "Repliziert",
+ peersTorColumn: "TOR",
+ peersTorYes: "Über Tor erreichbar",
+ peersTorNo: "Nicht über Tor erreichbar",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Version",
graphos: "Graphos",
graphosDescription: "Interaktive Karte des Netzwerks um dich herum.",
+ graphosFederation: "Föderation",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Nicht erreichbar",
+ graphosFedLinks: "Gegenseitige Verbindungen",
+ graphosFedIsolated: "Isoliert",
+ graphosFedNoData: "Keine Daten",
+ graphosFedMutual: "Gegenseitig",
+ graphosFedOneWay: "Einseitig",
+ graphosFedTransport: "Netz",
+ graphosFedWith: "Föderiert mit",
+ graphosZoom: "Vergrößern",
+ graphosFedInhabitants: "Bewohner",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "Dein Knoten kennt noch keinen PUB.",
graphosViewingGraphOf: "Ansicht",
graphosBackToMine: "← Mein Netzwerk",
graphosShowing: "Zeige",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "Du hast noch keine @Erwähnungen erhalten.",
- mentionsSearchPlaceholder: "Erwähnungen suchen...",
+ mentionsSearchPlaceholder: "In Erwähnungen suchen...",
privateReminders: "ERINNERUNGEN",
+ inboxFilterPms: "PNs",
+ inboxFilterNotifications: "Benachrichtigungen",
+ inboxMarkRead: "Als gelesen markieren",
+ inboxMarkUnread: "Als ungelesen markieren",
+ inboxUnreadChip: "Ungelesen",
+ inboxMarkAllRead: "Alle als gelesen markieren",
+ inboxDeleteShown: "Alle löschen",
+ inboxArchive: "Archivieren",
+ inboxUnarchive: "Dearchivieren",
+ inboxFilterArchived: "Archiviert",
+ inboxEarlierMessages: "frühere Nachrichten",
+ inboxSortThread: "Nach Thread",
+ inboxSortRecent: "Neueste zuerst",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Inbox-Benachrichtigungen",
+ settingsInboxBotsDesc: "Wähle, welche Bots dich in deiner Inbox benachrichtigen dürfen. Abgewählte Bots werden ausgeblendet und ihre Hinweise nicht gezählt.",
inboxFiltersLabel: "Filter:",
inboxToggleToMutuals: "Auf Gegenseitige umschalten",
inboxToggleToWhole: "Auf Alle umschalten",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "Antworten",
pmReplies: "Antworten",
inReplyTo: "ALS ANTWORT AUF",
+ forumInThread: "IM THREAD",
pmPreview: "Vorschau",
pmPreviewTitle: "Nachrichtenvorschau",
peers: "Verbindungen",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "Von",
searchToLabel: "Bis",
searchQueryLabel: "Suche",
- searchPerPageLabel: "Ergebnisse pro Seite",
+ searchPerPageLabel: "Ergebnisse",
settings: "Einstellungen",
+ settingsDescription: "Richte deine Netzwerkumgebung ein.",
continueReading: "Weiterlesen",
moreComments: "weitere Kommentare",
readThread: "den Rest des Threads lesen",
@@ -239,7 +271,6 @@ module.exports = {
profileClearnetHelp: 'Module, die von außerhalb von Oasis aufgerufen werden können.',
profileHubAll: 'Alle',
footerLicenseLabel: 'Lizenz',
- profileSwitchToOasis: 'Zurück zu Oasis',
profileVisibilityFediverse: "Multiversum",
contributorsTitle: "Mitwirkende",
colorLabel: 'Farbe wählen',
@@ -249,6 +280,7 @@ module.exports = {
modulesViewTitle: "Module",
modulesViewDescription: "Konfiguriere deine Umgebung durch Aktivieren oder Deaktivieren von Modulen.",
inbox: "Posteingang",
+ inboxSearchPlaceholder: "In Posteingang suchen...",
multiverse: "Multiversum",
fediverse: "Multiversum",
fediverseDescription: "Verwalte deine anderen Multiversum-Konten, einschließlich Senden und Empfangen von Inhalten.",
@@ -257,9 +289,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Server",
+ nextcloudUserLabel: "Benutzer",
+ nextcloudFolderLabel: "Ordner",
+ nextcloudUploadButton: "Hochladen",
+ nextcloudFileLabel: "Datei auswählen",
+ fileExternalLink: "Externer Link",
+ nextcloudErrConnect: "Nextcloud war mit diesen Angaben nicht erreichbar.",
+ nextcloudErrUpload: "Der Upload zu Nextcloud ist fehlgeschlagen.",
+ nextcloudErrShare: "Nextcloud hat keinen öffentlichen Link für die Datei geliefert.",
fediverseDisconnect: "Trennen",
fediverseEmptyLink: "deinen Einstellungen",
fediverseComposePlaceholder: "Was denkst du gerade?",
@@ -288,6 +328,76 @@ module.exports = {
fediverseErrPost: "Konnte nicht veröffentlichen.",
fediverseErrMedia: "Datei konnte nicht hochgeladen werden.",
fediverseErrEmpty: "Schreibe etwas oder hänge eine Datei an.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API-Hash",
+ telegramPhoneLabel: "Telefonnummer",
+ telegramSendCode: "Code senden",
+ telegramCodeHelp: "Gib den Code ein, den Telegram dir gerade geschickt hat (App oder SMS).",
+ telegramCodeLabel: "Code",
+ telegramPasswordHelp: "Dieses Konto nutzt die Zwei-Schritt-Bestätigung. Gib dein Passwort ein.",
+ telegramPasswordLabel: "Passwort",
+ telegramVerify: "Bestätigen",
+ telegramCancel: "Abbrechen",
+ telegramChats: "Chats",
+ telegramUnread: "Ungelesen",
+ telegramOpen: "Öffnen",
+ telegramSend: "Senden",
+ telegramYou: "Du",
+ telegramNoChats: "Noch keine Chats.",
+ telegramNoMessages: "Noch keine Nachrichten.",
+ telegramComposePlaceholder: "Nachricht schreiben…",
+ telegramChannel: "Kanal",
+ telegramGroup: "Gruppe",
+ telegramPrivate: "Privat",
+ telegramErrConnect: "Telegram konnte nicht erreicht werden.",
+ telegramErrTimeout: "Telegram hat zu lange nicht geantwortet.",
+ telegramErrAuth: "Telegram-Sitzung ungültig oder abgelaufen. Erneut verbinden.",
+ telegramErrFetch: "Chats konnten nicht geladen werden.",
+ telegramErrSend: "Nachricht konnte nicht gesendet werden.",
+ telegramErrMissing: "API-ID, API-Hash und Telefonnummer sind erforderlich.",
+ telegramErrCode: "Ungültiger Code. Erneut versuchen.",
+ telegramErrCodeExpired: "Der Code ist abgelaufen. Neu beginnen.",
+ telegramErrPassword: "Falsches Passwort.",
+ telegramErrPhone: "Ungültige Telefonnummer.",
+ telegramErrApi: "Ungültige API-ID oder API-Hash.",
+ telegramErrFlood: "Zu viele Versuche. Warte kurz und versuche es erneut.",
+ telegramErrNoLogin: "Keine Anmeldung aktiv. Neu beginnen.",
+ peertubeUsernameLabel: "Benutzername",
+ peertubePasswordLabel: "Passwort",
+ peertubeSubscriptions: "Abonnements",
+ peertubeMyVideos: "Meine Videos",
+ peertubeVideos: "Videos",
+ peertubeFollowers: "Follower",
+ peertubeViews: "Aufrufe",
+ peertubeLikes: "Likes",
+ peertubeQuota: "Kontingent",
+ peertubeUpload: "Video hochladen",
+ peertubeUploadHelp: "Wähle eine Videodatei. Sie wird in deinen Kanal hochgeladen und danach von PeerTube verarbeitet.",
+ peertubeTitleLabel: "Titel",
+ peertubeDescriptionLabel: "Beschreibung",
+ peertubePrivacyLabel: "Sichtbarkeit",
+ peertubePrivacyPublic: "Öffentlich",
+ peertubePrivacyUnlisted: "Nicht gelistet",
+ peertubePrivacyPrivate: "Privat",
+ peertubeNoVideos: "Noch keine Videos.",
+ peertubeComments: "Kommentare",
+ peertubeComment: "Kommentieren",
+ peertubeCommentPlaceholder: "Kommentar schreiben…",
+ peertubeNoComments: "Noch keine Kommentare.",
+ peertubeOpen: "Auf PeerTube öffnen",
+ peertubeWatch: "Ansehen",
+ peertubeChannel: "Kanal",
+ peertubeNoStream: "Dieses Video kann hier noch nicht abgespielt werden. Öffne es auf PeerTube.",
+ peertubeUploaded: "Video hochgeladen. PeerTube verarbeitet es.",
+ peertubeErrConnect: "PeerTube ist nicht erreichbar.",
+ peertubeErrAuth: "Falscher Benutzername oder falsches Passwort, oder die Sitzung ist abgelaufen. Verbinde dich erneut.",
+ peertubeErrInstance: "Ungültige Instanz-URL.",
+ peertubeErrMissing: "Instanz, Benutzername und Passwort sind erforderlich.",
+ peertubeErrFetch: "Videos konnten nicht geladen werden.",
+ peertubeErrUpload: "Das Video konnte nicht hochgeladen werden.",
+ peertubeErrTitle: "Titel erforderlich.",
+ peertubeErrComment: "Der Kommentar konnte nicht veröffentlicht werden.",
+ peertubeErrNoFile: "Wähle eine Videodatei.",
bookmarksLabel: "Lesezeichen",
videosLabel: "Videos",
torrentsLabel: "Torrents",
@@ -310,7 +420,6 @@ module.exports = {
comment: "Kommentar",
subtopic: "Unterthema",
json: "JSON",
- createdBy: "von",
unfollow: "Nicht mehr unterstützen",
follow: "Unterstützen",
block: "Blockieren",
@@ -326,12 +435,15 @@ module.exports = {
relationshipNone: "Du unterstützt nicht",
relationshipBlockingPost: "Blockierter Beitrag",
viewLikes: "Verbreitungen ansehen",
+ viewSupporters: "Unterstützer ansehen",
spreadedDescription: "Liste der vom Bewohner verbreiteten Beiträge.",
preview: "Vorschau",
publish: "Schreiben",
contentWarningPlaceholder: "Betreff zum Beitrag hinzufügen (optional)",
- publishWarningPlaceholder: "Text auf 7000 Zeichen begrenzt.",
+ publishWarningPlaceholder: "Schreibe den Text deines Beitrags.",
publishTooLong: "Dein Beitrag ist zu lang. Bitte kürze ihn.",
+ keepTextRetry: "Erneut senden",
+ dateInPastError: "Das Datum darf nicht in der Vergangenheit liegen",
publishCustomDescription: [
"ACHTUNG: Aufgrund der Blockchain-Technologie kann ein veröffentlichter Beitrag nicht bearbeitet oder gelöscht werden.",
],
@@ -361,9 +473,8 @@ module.exports = {
mentionsMatching: "Passende Erwähnungen",
mentionsName: "Name",
mentionsRelationship: "Beziehung",
- updateit: "UPDATES HOLEN!",
updateBannerText: "Eine neue Version von Oasis ist verfügbar.",
- updateBannerAction: "Jetzt aktualisieren →",
+ updateBannerAction: "Jetzt aktualisieren!",
info: "Info",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -371,16 +482,14 @@ module.exports = {
timeAgo: "her",
sendTime: "etwa ",
theme: "Design",
- legacy: "Schlüssel",
- legacyTitle: "Schlüssel",
- legacyDescription: "Verwalte deinen geheimen Schlüssel (privater Schlüssel) schnell und sicher.",
- legacyExportButton: "Exportieren",
- legacyImportButton: "Importieren",
+ backupKeysExportButton: "Exportieren",
+ backupKeysImportButton: "Importieren",
ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Konfiguriere das Nachrichtenlimit für Blockchain-Streams.",
+ logWindowChip: "Letzte {n} Blockchain-Streams",
saveSettings: "Einstellungen speichern",
exportDescription: "Passwort festlegen (mind. 32 Zeichen), um deinen Schlüssel zu verschlüsseln",
- exportDataTitle: "Sicherung",
+ exportDataTitle: "Sofort-Sicherung",
exportDataDescription: "Lade deine Daten herunter (geheimer Schlüssel ausgeschlossen!)",
exportDataButton: "Datenbank herunterladen",
importDescription: "Importiere deinen verschlüsselten geheimen Schlüssel, um deinen Avatar zu aktivieren",
@@ -389,38 +498,33 @@ module.exports = {
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.",
+ welcomeBannerText: "Dein Avatar ist noch nicht eingerichtet.",
aiSuggestionBanner: "Vorschlag:",
aiSuggestionsEnable: "KI-Vorschläge",
- welcomeBannerAction: "Los geht es!",
+ welcomeBannerAction: "Loslegen",
welcomeTitle: "Willkommen",
+ welcomeStepIdentity: "Identität",
+ welcomeStepType: "Typ",
+ welcomeStepUse: "Nutzung",
+ welcomeStepLook: "Aussehen",
+ welcomeStepCommunity: "Gemeinschaft",
+ welcomeStepIntro: "Willkommen",
+ welcomeHintIdentity: "Dein Name und dein Bild.",
+ welcomeHintType: "Wie sich Oasis für dich öffnet.",
+ welcomeHintUse: "Welche Module aktiv bleiben.",
+ welcomeHintLook: "Das Design, das Oasis trägt.",
+ welcomeHintCommunity: "Tritt einem PUB bei, um andere Bewohner kennenzulernen.",
+ welcomeHintIntro: "Sende einen ersten Gruß an die Gemeinschaft.",
+ welcomeStepThemeAction: "Dieses Design verwenden",
+ welcomeJoinPubs: "PUBs beitreten",
+ welcomeNoFederation: "Ohne Föderation",
welcomeStepGreetingAction: "Senden",
- welcomeJoinPubButton: "Pub beitreten",
- welcomeStepLarpAction: "\"Der Akademie\" beitreten",
- welcomeStepLarpText: "Mach mit bei unserem Live-Rollenspiel.",
- welcomeStepLarpTitle: "L.A.R.P. beitreten",
- welcomeStepGreetingTitle: "Sende ein \"Hallo Welt!\"",
- welcomeStepGreetingText: "Sende eine Nachricht, damit andere Bewohner dich entdecken können.",
- welcomeJoinPub: "Beitreten:",
welcomeDescription: "Ein paar Dinge, die sich vor dem Start lohnen.",
- welcomeProgress: "Erledigt",
- welcomeStepDone: "fertig",
- welcomeStepPending: "offen",
welcomeSkip: "Jetzt nicht",
- welcomeStepLanguageTitle: "Wähle deine Sprache",
- welcomeStepLanguageText: "Oasis spricht mehrere Sprachen. Du kannst sie jederzeit ändern.",
- welcomeStepProfileTitle: "Bearbeite dein Profil",
- welcomeStepProfileText: "Wähle einen Namen, füge eine Beschreibung hinzu und setze ein Bild, damit andere Bewohner dich erkennen.",
welcomeStepProfileAction: "Profil speichern",
- welcomeStepFederationTitle: "Tritt dem Hauptnetzwerk bei",
- welcomeStepFederationText: "Verbinde dich mit unserem Pub, um andere Bewohner zu treffen und zu replizieren.",
- welcomeStepFederationAction: "Zu den Einladungen",
- welcomeStepBackupTitle: "Sichere deine ID",
- welcomeStepBackupText: "Deine Identität ist eine Schlüsseldatei auf diesem Gerät.",
- welcomeStepBackupWarning: "WENN SIE VERLOREN GEHT, KANN SIE NIEMAND WIEDERHERSTELLEN.",
- welcomeStepBackupAction: "Sicherung!",
+ welcomeBootstrapRunning: "Snapshot des Pubs wird geladen. Danach wird dem Pub automatisch beigetreten; du kannst Oasis währenddessen weiter nutzen.",
welcomeCompleteTitle: "Alles bereit.",
- welcomeCompleteText: "Dein Knoten ist bereit. Von hier an wächst das Netzwerk mit den Menschen, denen du folgst.",
+ welcomeCompleteText: "Dein Knoten ist bereit. Von hier an wächst das Netzwerk mit den Bewohnern, die du unterstützt.",
welcomeFindPeople: "Bewohner finden",
devFilterFiles: "DATEIEN",
devFilterSearch: "SUCHEN",
@@ -430,7 +534,7 @@ module.exports = {
devFilterTests: "TESTS",
devVersion: "Version",
devNodeVersion: "Node",
- devStatsTests: "Test-Suites",
+ devStatsTests: "Tests",
devParentFolder: "Übergeordneter Ordner",
devOpenFolder: "öffnen",
devDescription: "Erkunde den Quellcode, der auf diesem Knoten läuft.",
@@ -472,6 +576,27 @@ module.exports = {
languageDescription: "Wenn du eine andere Sprache verwenden möchtest, wähle sie hier aus.",
setLanguage: "Sprache festlegen",
peerConnectionsIntro: "Verwalte alle Verbindungen mit anderen Peers.",
+ peersConnectFailed: "Verbindung fehlgeschlagen: {reason}.",
+ peerStateLabel: "Status",
+ peerAddressLabel: "Adresse",
+ peerLastChangeLabel: "Letzte Änderung",
+ peerStateConnected: "Verbunden",
+ peerStateConnecting: "Verbindet",
+ peerStateStaged: "Verfügbar",
+ peerErrSilent: "Keine Aktivität",
+ peerErrTimeout: "Antwortet nicht",
+ peerErrRefused: "Lehnt die Verbindung ab",
+ peerErrNotFound: "Unbekannte Adresse",
+ peerErrUnreachable: "Netz nicht erreichbar",
+ peerErrKeys: "Verwendet andere Schlüssel",
+ peerErrIdentity: "Akzeptiert deine Verbindung nicht",
+ peerErrTor: "Nur TOR",
+ peerErrDropped: "Verbindung abgebrochen",
+ peerErrPaused: "Netzwerk pausiert",
+ peerErrOther: "Verbindungsfehler",
+ peerOutdated: "Veraltet",
+ peerVersionUnannounced: "Gibt seine Version nicht bekannt: ein altes Oasis",
+ peersTorMissing: "Dieser PUB erlaubt nur Verbindungen über TOR.",
peerConnectionsTitle: "Verbindungen",
online: "Online",
offline: "Offline",
@@ -490,22 +615,25 @@ module.exports = {
noConnections: "Keine Peers verbunden.",
noDiscovered: "Keine Peers entdeckt.",
noUnknownPeers: "Keine unbekannten Peers im Freundes-Graphen.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Noch keine Peers registriert.",
+ peerConnect: "Verbinden",
+ peerDisconnect: "Trennen",
peerRefresh: "Aktualisieren",
peerPruneIdle: "Inaktive entfernen",
+ peersPause: "Pausieren",
+ peersResume: "Fortsetzen",
+ peersPausedNote: "Pausiert: Oasis verbindet sich mit niemandem und niemand kann sich damit verbinden.",
+ peersPauseHint: "Stoppt alle Verbindungen: Oasis verbindet sich mit keinem anderen Knoten und nimmt keine an, bis du fortsetzt.",
peerExport: "Exportieren",
peerImport: "Importieren",
peerImportTitle: "Peer-Liste importieren",
peerImportPlaceholder: "Eine Multiserver-Adresse pro Zeile einfügen oder eine .txt-Datei hochladen…",
connectionActionIntro:
"",
- startNetworking: "Netzwerk starten",
- stopNetworking: "Netzwerk stoppen",
- restartNetworking: "Netzwerk neu starten",
- sync: "Netzwerk synchronisieren",
indexes: "Indizes",
+ indexesRebuilt: "Indizes neu aufgebaut",
+ indexesRebuildFailed: "Indizes konnten nicht neu aufgebaut werden",
+ indexesFiles: "Indexdateien",
indexesDescription: "Das Neuerstellen deiner Indizes ist sicher und kann einige Fehlerarten beheben.",
homePageTitle: "Startseite",
homePageDescription: "Wähle, welches Modul deine Startseite sein soll.",
@@ -514,44 +642,33 @@ module.exports = {
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",
invitesChatsTitle: "Chats",
- invitesChatInviteCodePlaceholder: "Chat-Einladungscode eingeben",
- invitesChatJoinButton: "Chat beitreten",
invitesPadsTitle: "Pads",
- invitesPadInviteCodePlaceholder: "Pad-Einladungscode eingeben",
- invitesPadJoinButton: "Pad beitreten",
invitesCalendarsTitle: "Kalender",
- invitesCalendarInviteCodePlaceholder: "Kalender-Einladungscode eingeben",
- invitesCalendarJoinButton: "Kalender beitreten",
invitesEventsTitle: "Termine",
- invitesEventInviteCodePlaceholder: "Termin-Einladungscode eingeben",
- invitesEventJoinButton: "Termin beitreten",
invitesForumsTitle: "Foren",
- invitesForumInviteCodePlaceholder: "Forum-Einladungscode eingeben",
- invitesForumJoinButton: "Forum beitreten",
invitesMapsTitle: "Karten",
- invitesMapInviteCodePlaceholder: "Karten-Einladungscode eingeben",
- invitesMapJoinButton: "Karte beitreten",
invitesShopsTitle: "Shops",
- invitesShopInviteCodePlaceholder: "Shop-Einladungscode eingeben",
- invitesShopJoinButton: "Shop beitreten",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "Empfohlene PUBs",
+ invitesFilterOthers: "Andere",
+ invitesJoinTitle: "Einladungen",
+ invitesJoinHint: "Füge einen beliebigen Einladungscode ein, wofür er auch ist, oder die Oasis-ID eines Bewohners.",
+ invitesJoinPlaceholder: "Einladungscode oder Oasis-ID",
+ invitesJoinButton: "Beitreten",
+ invitesUsedTitle: "Letzte Einladungen",
+ invitesUsedEmpty: "Du hast noch keine Einladung eingelöst.",
+ invitesUsedType: "Typ",
+ invitesUsedName: "Name",
+ invitesUsedDate: "Datum",
invitesPubInviteCodePlaceholder: "PUB-Einladungscode eingeben",
invitesAcceptInvite: "PUB beitreten",
+ invitesPubUses: "Verwendete Einladungen",
+ invitesPubExhausted: "Dieser PUB hat keine Einladungen mehr.",
invitesAlreadyFederated: "Du bist bereits mit diesem Pub föderiert.",
+ invitesJoinPubMode: "Dieses Oasis läuft als PUB im Nur-Lese-Modus. Um es mit einem anderen PUB zu verbinden, im Terminal: ./oasis.sh join ",
+ invitesJoinLocalOnly: "Einladungen können nur auf dem Gerät angenommen werden, auf dem Oasis läuft, oder über den Admin-Link, der beim Start angezeigt wird.",
invitesFederationsTitle: "Föderationen",
invitesAcceptedInvites: "Föderiert",
invitesUnfollow: "Entfolgen",
@@ -559,16 +676,12 @@ module.exports = {
invitesUnfollowedInvites: "Nicht föderiert",
invitesNoFederatedPubs: "Keine föderierten Pubs.",
invitesNoUnfollowed: "Keine nicht föderierten Pubs.",
- invitesUnreachablePubs: "Nicht erreichbar",
- invitesNoUnreachablePubs: "Keine nicht erreichbaren Pubs.",
invitesPubsRefresh: "Aktualisieren",
- invitesPubsClearUnreachable: "Nicht erreichbare entfernen",
+ invitesPubsClearUnreachable: "Bereinigen",
invitesPubsExport: "Exportieren",
invitesPubsImport: "Importieren",
invitesPubsImportTitle: "Pubs importieren",
invitesPubsImportPlaceholder: "Eine Multiserver-Adresse oder einen Einladungscode pro Zeile einfügen oder eine .txt-Datei hochladen…",
- currentlyUnreachable: "FEHLER!",
- errorDetails: "Fehlerdetails",
genericError: "Ein Fehler ist aufgetreten.",
panicMode: "Panikmodus!",
encryptData: "Passwort festlegen (mind. 32 Zeichen), um deine Blockchain zu verschlüsseln",
@@ -595,7 +708,6 @@ module.exports = {
votesOptionNoLabel:"Nein",
votesOptionAbstentionLabel: "Enthaltung",
votesQuestionLabel: "Frage",
- votesCreatedByLabel: "Erstellt von",
voteStatusOpen: "OFFEN",
voteStatusClosed: "GESCHLOSSEN",
commentDescription: ({ parentUrl }) => [
@@ -613,21 +725,21 @@ module.exports = {
votesLabel: "ABSTIMMUNGEN",
pdfFallbackLabel: "PDF-Dokument",
shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ voteLabel: "STIMMEN",
submit: "Absenden",
editProfile: "Avatar bearbeiten",
oasisIdLabel: "OasisID",
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- /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.",
+ 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- [/avatar](/profile) — Bearbeite deinen Avatar, Namen, deine Beschreibung und welche Module auf deiner öffentlichen Seite erscheinen.\n- /settings — Passe deine lokale Instanz an: Sprache, Design, Module, Privatsphäre und Synchronisierung.\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 Bewohner.\n- /tribes — Erstelle private Gruppen mit Ende-zu-Ende-Verschlüsselung oder tritt ihnen bei.\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",
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",
- profileVisibilityWallet: "ECOIN-Wallet",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityWallet: "ECOin-Wallet",
+ profileVisibilityEcoTax: "ECO-Steuer",
+ profileVisibilityLarpSign: "L.A.R.P.-Siegel",
profileVisibilityGpg: "GPG-Schlüssel",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Shops",
@@ -640,6 +752,10 @@ module.exports = {
profileClearnetImagesLabel: "Bilder",
profileClearnetDocumentsLabel: "Dokumente",
profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Markt",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
editProfileDescription:
"",
profileName: "Name",
@@ -665,7 +781,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Best.",
walletConfirm: "Bestätigen",
- walletDescription: "Verwalte deine digitalen Vermögenswerte.",
+ walletDescription: "Verwalte dein ECOin-Wallet.",
walletDate: "Datum",
walletFee: "Gebühr (Je höher, desto schneller)",
walletFeeLine: ({ fee }) => `Gebühr: ECO ${fee}`,
@@ -673,6 +789,86 @@ module.exports = {
walletReceive: "Empfangen",
walletReset: "Zurücksetzen",
walletSend: "Senden",
+ walletPayingTransfer: "Überweisung wird bezahlt",
+ walletCreateTransferLabel: "Smart Contract erzeugen (Transfer)",
+ walletTransferNotifiedNote: "Die Gegenseite wurde über diese Zahlung informiert",
+ walletTransferCreatedNote: "Für diese Zahlung wurde ein Transfer (Beleg) erstellt",
+ walletTransferNoPayeeNote: "Niemand hat diese Adresse veröffentlicht, daher wurde kein Transfer erstellt",
+ walletTransferReceiptConcept: "Zahlung aus dem Wallet",
+ walletPaymentPmText: "hat dir eine Zahlung gesendet",
+ walletPayeeLabel: "Empfänger",
+ walletConceptLabel: "Verwendungszweck",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Du hast dein UBI erhalten.",
+ bankingBotPaymentTitle: "Du hast eine Zahlung erhalten.",
+ bankingBotUbiPaidText: "Dein bedingungsloses Grundeinkommen wurde ausgezahlt",
+ bankUbiPubThisNode: "Dieser Knoten zahlt das UBI",
+ bankUbiPubConnected: "UBI-PUB",
+ bankUbiPubNone: "Noch kein PUB kündigt UBI in deinem Netz an",
+ bankUbiAddressPublished: "ECOin-Adresse veröffentlicht",
+ bankUbiAddressMissing: "Veröffentliche deine ECOin-Adresse, um UBI zu erhalten",
+ bankUbiClaimedThisMonth: "Diesen Monat beansprucht",
+ bankUbiPubBalance: "PUB-Wallet verfügbar für UBI",
+ bankNoPubAddress: "Das UBI-PUB hat noch keine ECOin-Adresse veröffentlicht.",
+ bankUbiTab: "UBI",
+ bankDonateEco: "SPENDEN!",
+ donateTooltip: "ECOin spenden",
+ bankNoUserAddress: "Dieser Bewohner teilt keine ECOin-Adresse.",
+ bankUbiPubDefault: "Standard",
+ bankUbiPool: "Fonds",
+ bankUbiLastSeen: "Zuletzt gesehen",
+ bankUbiLastPayout: "Letzte Aktion",
+ bankUbiPaidOut: "Ausgezahlt",
+ bankRangeToday: "Heute",
+ bankRangeWeek: "Woche",
+ bankRangeMonth: "Monat",
+ bankRangeYear: "Jahr",
+ bankRangeFiveYears: "5 Jahre",
+ bankRangeAll: "Alles",
+ bankChartValueTitle: "Entwicklung des ECOin-Werts",
+ bankChartValueHours: "Zeitäquivalent (Std.)",
+ bankChartWealthTitle: "Umverteilung des ECOin-Vermögens",
+ bankChartDistributed: "Verteiltes UBI (ECO)",
+ bankChartRebalanceTitle: "Umverteilung des Reichtums zwischen PUBs",
+ bankChartRebalanced: "Zwischen PUBs verschobene ECO",
+ bankChartTaxes: "Einbehaltene Steuern (ECO)",
+ bankChartNoDataRange: "Keine Daten in diesem Zeitraum.",
+ bankChartNoDataYet: "Noch keine Daten",
+ bankChartPerHour: "pro Stunde",
+ bankChartPerDay: "pro Tag",
+ bankChartPerMonth: "pro Monat",
+ bankTotalUbiDistributed: "Insgesamt umverteiltes UBI (Netz)",
+ bankTotalTaxesWithheld: "Insgesamt einbehaltene Steuern (Netz)",
+ bankInflationIssuance: "Emissionsrate (jährlich, aus Blockbelohnung)",
+ bankRulesEligibilityTitle: "Wer das UBI erhalten kann",
+ bankRulesEligibility1: "Eine im Profil veröffentlichte ECOin-Adresse (Profil → Sensoren → ECOin-Wallet).",
+ bankRulesEligibility2: "Ein Feed, der älter als 30 Tage ist und Aktivität im Netz hat: Karma über null.",
+ bankRulesEligibility3: "Ein Anspruch pro Monat (Epoche), in Banking mit der Schaltfläche UBI beanspruchen. Der laufende Monat kann mit UBI ablehnen abgelehnt werden.",
+ bankRulesEligibility4: "Der Sockel von 1 ECO wird immer gezahlt; Steuern mindern nur den Teil darüber und werden nie getrennt erhoben.",
+ bankRulesEligibility5: "Das PUB zahlt im nächsten Zyklus und veröffentlicht einen UBI-Transfer, den du bestätigen kannst.",
+ bankRulesEligibility6: "Fehlt die Adresse, ist der Feed zu jung, wurde der Monat abgelehnt oder hat das PUB keine Mittel, wird der Anspruch übersprungen und auf dem PUB protokolliert.",
+ copyLinkTitle: "Link kopieren",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "UBI ablehnen",
+ bankUbiRefusedThisMonth: "Du hast das UBI dieses Monats abgelehnt.",
+ bankingBotUbiAvailableTitle: "Du kannst dein UBI beanspruchen.",
+ bankingBotUbiAvailableText: "Dein UBI für diesen Monat ist verfügbar",
+ bankingBotConfirmTitle: "Du hast einen Smart Contract, der auf Bestätigung wartet",
+ bankingBotConfirmText: "Smart Contracts, die auf deine Bestätigung warten",
+ bankChartZoomHint: "Zum Vergrößern klicken",
+ bankChartPoolTitle: "UBI-Fonds (im Zeitverlauf)",
+ bankChartNetworkUbiTitle: "Insgesamt umverteiltes UBI (Netz)",
+ bankChartSupplyTitle: "Umlaufender ECOin-Bestand (im Zeitverlauf)",
+ bankChartInflationTitle: "ECOin-Inflation (im Zeitverlauf)",
+ bankChartInflationSeries: "Annualisierte Rate (%)",
+ bankChartPool: "Gesamtfonds (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (im Zeitverlauf)",
+ bankChartFundsTitle: "Dein ECOin-Guthaben (im Zeitverlauf)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin verbunden",
+ bankWalletNotConfigured: "ECOin getrennt",
+ transfersPayWithWallet: "BEZAHLEN!",
walletStatus: "Status",
walletDisconnected: [
"ECOin ",
@@ -682,8 +878,11 @@ module.exports = {
" oder den Verbindungsstatus.",
],
walletSentToLine: ({ destination, amount }) => `ECO ${amount} gesendet an ${destination}`,
+ walletNotConfigured: "Deine ECOin-Wallet ist noch nicht eingerichtet.",
walletSettingsDescription: "Integriere Oasis mit deiner ECOin-Wallet.",
- walletSettingsDocLink: "ECOin-Installationsanleitung",
+ walletSettingsMobileDescription: "Verbinde Oasis mit der ECOin-Wallet-App auf diesem Gerät.",
+ walletDownloadEcoin: "ECOin herunterladen!",
+ walletRpcUrl: "RPC-URL",
walletStatusMessages: {
invalid_amount: "Ungültiger Betrag",
invalid_dest: "Ungültige Zieladresse",
@@ -699,6 +898,7 @@ module.exports = {
walletUser: "Benutzername",
walletPass: "Passwort",
walletConfiguration: "Wallet konfigurieren",
+ walletDisconnectButton: "Wallet trennen",
cipher: "Verschlüsselung",
cipherTitle: "Verschlüsselung",
cipherDescription: "Verschlüssele und entschlüssele Text symmetrisch.",
@@ -731,17 +931,16 @@ module.exports = {
bookmarkFilterRecent: "NEUESTE",
bookmarkCreateButton: "Lesezeichen erstellen",
bookmarkUpdateButton: "Aktualisieren",
- bookmarkDeleteButton: "Löschen",
bookmarkAddFavoriteButton: "Favorit hinzufügen",
bookmarkRemoveFavoriteButton: "Favorit entfernen",
bookmarkUrlLabel: "Link",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Beschreibung",
bookmarkDescriptionPlaceholder: "Optional",
bookmarkTagsLabel: "Tags",
bookmarkTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
bookmarkLastVisitLabel: "Letzter Besuch",
- bookmarkSearchPlaceholder: "URL, Tags, Kategorie, Autor suchen...",
+ bookmarkSearchPlaceholder: "In Lesezeichen suchen...",
bookmarkSortRecent: "Neueste zuerst",
bookmarkSortOldest: "Älteste zuerst",
bookmarkSortTop: "Meistgewählt",
@@ -780,7 +979,7 @@ module.exports = {
videoDescriptionPlaceholder: "Optional",
videoNoFile: "Keine Videodatei angegeben",
noVideos: "Keine Videos vorhanden.",
- videoSearchPlaceholder: "Titel, Tags, Autor suchen...",
+ videoSearchPlaceholder: "In Videos suchen...",
videoSortRecent: "Neueste zuerst",
videoSortOldest: "Älteste zuerst",
videoSortTop: "Meistgewählt",
@@ -803,7 +1002,6 @@ module.exports = {
documentFilterFavorites: "FAVORITEN",
documentCreateButton: "Dokument hochladen",
documentUpdateButton: "Aktualisieren",
- documentDeleteButton: "Löschen",
documentAddFavoriteButton: "Favorit hinzufügen",
documentRemoveFavoriteButton: "Aus Favoriten entfernen",
documentMessageAuthorButton: "PN",
@@ -816,7 +1014,7 @@ module.exports = {
documentDescriptionPlaceholder: "Optional",
documentNoFile: "Keine Datei.",
noDocuments: "Keine Dokumente vorhanden.",
- documentSearchPlaceholder: "Titel, Tags, Beschreibung, Autor suchen...",
+ documentSearchPlaceholder: "In Dokumente suchen...",
documentSortRecent: "Neueste zuerst",
documentSortOldest: "Älteste zuerst",
documentSortTop: "Meistgewählt",
@@ -837,19 +1035,19 @@ module.exports = {
audioFilterTop: "TOP",
audioCreateButton: "Audio hochladen",
audioUpdateButton: "Aktualisieren",
- audioDeleteButton: "Löschen",
audioAddFavoriteButton: "Favorit hinzufügen",
audioRemoveFavoriteButton: "Favorit entfernen",
audioFileLabel: "Audiodatei auswählen (.mp3, .wav, .ogg)",
audioTagsLabel: "Tags",
audioTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ tagsPlaceholder: "Tags durch Kommas getrennt eingeben",
audioTitleLabel: "Titel",
audioTitlePlaceholder: "Optional",
audioDescriptionLabel: "Beschreibung",
audioDescriptionPlaceholder: "Optional",
audioNoFile: "Keine Audiodatei angegeben",
noAudios: "Keine Audios vorhanden.",
- audioSearchPlaceholder: "Titel, Tags, Autor suchen...",
+ audioSearchPlaceholder: "In Audios suchen...",
audioSortRecent: "Neueste zuerst",
audioSortOldest: "Älteste zuerst",
audioSortTop: "Meistgewählt",
@@ -861,7 +1059,7 @@ module.exports = {
audioFilterFavorites: "FAVORITEN",
favoritesTitle: "Favoriten",
favoritesDescription: "Alle deine favorisierten Inhalte an einem Ort.",
- favoritesSearchPlaceholder: "Favoriten durchsuchen...",
+ favoritesSearchPlaceholder: "In Favoriten suchen...",
favoritesFilterAll: "ALLE",
favoritesFilterRecent: "NEUESTE",
favoritesFilterAudios: "AUDIOS",
@@ -873,13 +1071,12 @@ module.exports = {
favoritesFilterChats: "CHATS",
favoritesFilterCalendars: "KALENDER",
favoritesFilterVideos: "VIDEOS",
- favoritesRemoveButton: "Aus Favoriten entfernen",
favoritesNoItems: "Noch keine Favoriten.",
yourContacts: "Deine Kontakte",
allInhabitants: "Bewohner",
allCVs: "Lebensläufe",
discoverPeople: "Entdecke Bewohner in deinem Netzwerk.",
- searchInhabitantsPlaceholder: "BEWOHNER NACH NAME FILTERN …",
+ searchInhabitantsPlaceholder: "In Bewohner suchen...",
filterLocation: "BEWOHNER NACH ORT FILTERN …",
filterLanguage: "BEWOHNER NACH SPRACHE FILTERN …",
filterSkills: "BEWOHNER NACH FÄHIGKEITEN FILTERN …",
@@ -903,7 +1100,6 @@ module.exports = {
topSectionTitle: "TOP",
blockedLabel: "Blockierter Bewohner",
inhabitantviewDetails: "Details anzeigen",
- cvVisitButton: "Lebenslauf ansehen",
keepReading: "Weiterlesen...",
oasisId: "ID",
noInhabitantsFound: "Noch keine Bewohner gefunden.",
@@ -921,6 +1117,18 @@ module.exports = {
parliamentFilterLeaders: "FÜHRUNG",
parliamentFilterRules: "REGELN",
parliamentGovernmentCard: "Aktuelle Regierung",
+ parliamentSeatsGovernment: "Regierung",
+ parliamentSeatsOpposition: "Opposition",
+ parliamentSeatsAbstention: "Enthaltung",
+ parliamentSeatsQuorum: "Wahlquorum",
+ parliamentSeatsPass: "Zustimmungsschwelle",
+ parliamentSeatsByElection: "Nach Wahl",
+ parliamentSeatsByHouses: "Nach LARP-Haus",
+ parliamentSeatsSeats: "Sitze",
+ parliamentSeatsSeat: "Sitz",
+ parliamentSeatsLeader: "Anführer",
+ parliamentSeatsVotesFor: "Stimmen für",
+ parliamentSeatsNoHouse: "Ohne Haus",
parliamentActorInPowerInhabitant: 'REGIERENDER BEWOHNER',
parliamentActorInPowerTribe: 'REGIERENDER STAMM',
parliamentHistoricalGovernmentsTitle: 'REGIERUNGEN',
@@ -988,6 +1196,7 @@ module.exports = {
parliamentTimeRemaining: "Verbleibende Zeit",
parliamentElectionsStatusTitle: "Nächste Regierung",
parliamentProposalDeadlineLabel: "Frist",
+ parliamentViewReport: "Bericht ansehen",
parliamentProposalTimeLeft: "Verbleibende Zeit",
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.",
@@ -1002,6 +1211,7 @@ module.exports = {
parliamentRulesLaws: "Wenn ein Vorschlag seine Schwelle erreicht, wird er zum Gesetz und erscheint im Gesetze-Tab mit seinem Inkrafttretungsdatum.",
parliamentRulesHistorical: "Im Historisch-Tab kannst du jeden Regierungszyklus sehen, der stattgefunden hat, und Daten über dessen Verwaltung.",
parliamentRulesLeaders: "Im Anführer-Tab kannst du ein Ranking der Bewohner/Stämme sehen, die regiert (oder kandidiert) haben, sortiert nach Effizienz.",
+ parliamentRulesHemicycle: "Das Halbrund vergibt einen Sitz pro Bewohner: den Regierungsblock (Wähler der siegreichen Kandidatur und der Anführer), je einen Oppositionsblock pro weiterer Kandidatur des Zyklus und die Enthaltung. Die gestrichelten Marken zeigen das Wahlquorum (25 % des Zensus) und die Zustimmungsschwelle der aktuellen Methode. „Nach LARP-Haus“ färbt dieselben Sitze nach Haus.",
parliamentProposalVoteStatusLabel: "Abstimmungsstatus",
parliamentProposalOnTrackYes: "Schwelle erreicht",
parliamentProposalOnTrackNo: "Unter der Schwelle",
@@ -1015,6 +1225,7 @@ module.exports = {
courtsCaseFormTitle: "Fall eröffnen",
courtsCaseRespondent: "Angeklagter / Beklagter",
courtsCaseRespondentPh: "Oasis-ID (@...) oder Stammname",
+ courtsCaseSubjectPlaceholder: "Betreff oder kurze Beschreibung",
courtsCaseMethod: "Lösungsmethode",
courtsCaseSubmit: "Fall einreichen",
courtsNominateJudge: "Richter nominieren",
@@ -1048,15 +1259,30 @@ module.exports = {
courtsMethodDICTATOR: "Diktator",
courtsMethodPOPULAR: "Volksabstimmung",
courtsMethodKARMATOCRACY: "Karmatokratie",
+ courtsCaseType: "Art des Falls",
+ courtsPresetMinorConflict: "Leichter Konflikt",
+ courtsPresetModerateConflict: "Mittlerer Konflikt",
+ courtsPresetSevereConflict: "Schwerer Konflikt",
+ courtsPresetHarassment: "Belästigung oder Missbrauch",
+ courtsPresetContentModeration: "Inhaltsmoderation",
+ courtsPresetBanRestriction: "Sperre oder Einschränkung",
+ courtsPresetGovernanceDispute: "Governance-Streit",
+ courtsStatusOPEN: "Offen",
+ courtsStatusIN_PROGRESS: "In Bearbeitung",
+ courtsStatusDECIDED: "Entschieden",
+ courtsStatusCLOSED: "Geschlossen",
+ courtsStatusSOLVED: "Gelöst",
+ courtsStatusUNSOLVED: "Ungelöst",
+ courtsStatusDISCARDED: "Verworfen",
courtsRulesTitle: "Wie Gerichte funktionieren",
courtsRulesIntro: "Gerichte sind ein gemeinschaftlich geführter Prozess zur Konfliktlösung und Förderung restaurativer Gerechtigkeit. Dialog, klare Beweise und verhältnismäßige Maßnahmen werden priorisiert.",
courtsRulesLifecycle: "Ablauf: 1) Fall eröffnen 2) Methode wählen 3) Beweise einreichen 4) Anhörung und Beratung 5) Urteil und Maßnahme 6) Einhaltung und Abschluss 7) Berufung (falls zutreffend).",
- courtsRulesRoles: "Ankläger: eröffnet den Fall. Verteidigung: angeklagte Person oder Stamm. Methode: von der Gemeinschaft gewählter Mechanismus zur Erleichterung, Beweiswürdigung und Urteilsfindung. Zeuge: liefert Aussagen oder Beweise. Mediatoren: neutrale Personen, eingeladen vom Ankläger und/oder der Verteidigung, mit Zugang zu allen Details, die helfen, den Konflikt zu deeskalieren und Vereinbarungen zu schaffen.",
+ courtsRulesRoles: "Ankläger: eröffnet den Fall. Verteidigung: angeklagter Bewohner oder Stamm. Methode: von der Gemeinschaft gewählter Mechanismus zur Erleichterung, Beweiswürdigung und Urteilsfindung. Zeuge: liefert Aussagen oder Beweise. Mediatoren: neutrale Bewohner, eingeladen vom Ankläger und/oder der Verteidigung, mit Zugang zu allen Details, die helfen, den Konflikt zu deeskalieren und Vereinbarungen zu schaffen.",
courtsRulesEvidence: "Beschreibung bis zu 1000 Zeichen. Relevante und rechtmäßige Bilder, Audios, Videos und PDF-Dokumente anhängen. Keine sensiblen privaten Daten ohne Einwilligung teilen.",
courtsRulesDeliberation: "Anhörungen können öffentlich oder privat sein. Richter sorgen für Respekt, fordern Klarstellungen an und können irrelevantes oder rechtswidriges Material verwerfen.",
courtsRulesVerdict: "Wiederherstellung wird priorisiert: Entschuldigungen, Mediationsvereinbarungen, Inhaltsmoderation, vorübergehende Einschränkungen oder andere verhältnismäßige Maßnahmen. Die Begründung muss protokolliert werden.",
courtsRulesAppeals: "Berufung: zulässig bei neuen Beweisen oder einem klaren Verfahrensfehler. Muss innerhalb von 7 Tagen eingereicht werden, sofern nicht anders angegeben.",
- courtsRulesPrivacy: "Privatsphäre und Sicherheit respektieren. Doxxing, Hass oder Drohungen werden entfernt. Richter können Teile der Akte bearbeiten oder versiegeln, um gefährdete Personen zu schützen.",
+ courtsRulesPrivacy: "Privatsphäre und Sicherheit respektieren. Doxxing, Hass oder Drohungen werden entfernt. Richter können Teile der Akte bearbeiten oder versiegeln, um gefährdete Bewohner zu schützen.",
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",
@@ -1072,12 +1298,16 @@ module.exports = {
exploreTrending: "Entdecke die beliebtesten Inhalte in deinem Netzwerk.",
votesButton: "ABSTIMMUNGEN",
shopProductButton: "SHOP",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISODE",
+ campaignButton: "KAMPAGNE",
+ logisticsRouteButton: "ROUTE",
trendingTotalOpinions: "Meinungen gesamt",
trendingNoContentMessage: "Noch keine Trends vorhanden.",
trendingTotalCount: "Gesamtzahl",
tasksTitle: "Aufgaben",
tasksDescription: "Aufgaben in deinem Netzwerk entdecken und verwalten.",
- taskSearchPlaceholder: "Aufgaben suchen...",
+ taskSearchPlaceholder: "In Aufgaben suchen...",
taskTitleLabel: "Titel",
taskDescriptionLabel: "Beschreibung",
taskStartTimeLabel: "Startzeit",
@@ -1096,7 +1326,7 @@ module.exports = {
taskStatusOpen: "Öffnen",
taskStatusInProgress: "In Bearbeitung",
taskStatusClosed: "Geschlossen",
- taskAssignedTo: "Zugewiesen an",
+ taskAssignedTo: "Zugewiesen",
taskAssignedChip: "Zugewiesen",
taskUnassignedChip: "Nicht zugewiesen",
taskAssignees: "Zugewiesene",
@@ -1106,6 +1336,7 @@ module.exports = {
taskUpdateButton: "Aktualisieren",
taskDeleteButton: "Löschen",
taskFilterAll: "ALLE",
+ taskFilterRecent: "NEUESTE",
taskFilterMine: "MEINE",
taskFilterOpen: "OFFEN",
taskFilterInProgress: "IN BEARBEITUNG",
@@ -1133,14 +1364,13 @@ module.exports = {
eventUpcomingDates: "Nächste Termine",
eventsTitle: "Termine",
eventsDescription: "Termine in deinem Netzwerk entdecken und verwalten.",
- eventSearchPlaceholder: "Veranstaltungen suchen...",
+ eventSearchPlaceholder: "In Termine suchen...",
eventPrice: "Preis",
eventStatus: "Status",
eventAllSectionTitle: "Termine",
eventMineSectionTitle: "Deine Termine",
eventCreateSectionTitle: "Termin erstellen",
eventUpdateSectionTitle: "Termin aktualisieren",
- eventDeleteButton: "Löschen",
eventCreateButton: "Termin erstellen",
eventAddToCalendar: "Zum Kalender hinzufügen",
eventVisitCalendar: "Kalender ansehen",
@@ -1158,11 +1388,11 @@ module.exports = {
viewPlace: "Ort Ansehen",
generatePdf: "PDF Erzeugen",
sharePm: "Per PN Teilen",
- galleryImages: "Bilder (max. 50 MB pro Datei)",
+ galleryImages: "Bilder (max. 75 MB pro Datei)",
galleryPhotos: "Bilder",
galleryAddPhoto: "Bild Hinzufügen",
galleryRemovePhoto: "Entfernen",
- galleryVideo: "Video (max. 50 MB)",
+ galleryVideo: "Video (max. 75 MB)",
galleryAddVideo: "Video Hinzufügen",
galleryRemoveVideo: "Video entfernen",
viewVotation: "Abstimmung ansehen",
@@ -1182,6 +1412,7 @@ module.exports = {
eventDate: "Datum",
eventAttendButton: "Teilnehmen",
eventFilterAll: "ALLE",
+ eventFilterRecent: "NEUESTE",
eventFilterMine: "MEINE",
eventFilterToday: "HEUTE",
eventFilterWeek: "DIESE WOCHE",
@@ -1208,7 +1439,7 @@ module.exports = {
tagsFilterTop: "TOP",
tagsFilterCloud: "WOLKE",
tagsNoItems: "Keine Tags vorhanden.",
- tagsSearchPlaceholder: "Tags suchen...",
+ tagsSearchPlaceholder: "In Tags suchen...",
tagsTableHeaderTag: "TAG/LINK:",
tagsTableHeaderCount: "ANZAHL:",
transfersTitle: "Überweisungen",
@@ -1216,7 +1447,10 @@ module.exports = {
transfersFrom: "Von",
transfersTo: "An",
transfersFilterAll: "ALLE",
+ transfersFilterRecent: "NEUESTE",
transfersFilterMine: "MEINE",
+ transfersFilterMinePending: "AUSSTEHEND",
+ transfersFilterMineConfirmed: "SIGNIERT",
transfersFilterUBI: "UBI",
transfersFilterMarket: "MARKT",
transfersFilterTop: "TOP",
@@ -1231,7 +1465,6 @@ module.exports = {
transfersCategoryEconomic: "Wirtschaftlich",
transfersCategoryTime: "Zeit",
transfersCategoryTrust: "Vertrauen",
- transfersCategoryApply: "Anwenden",
transfersUnitEco: "ECO",
transfersUnitHours: "Std",
transfersUnitTrust: "Vertrauen",
@@ -1261,7 +1494,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Verworfene Überweisungen",
transfersCreateSectionTitle: "Transfer erstellen",
transfersAllSectionTitle: "Überweisungen",
- transfersSearchPlaceholder: "Konzept, Tags, Bewohner suchen...",
+ transfersSearchPlaceholder: "In Überweisungen suchen...",
transfersMinAmountLabel: "Mindestbetrag",
transfersMaxAmountLabel: "Höchstbetrag",
transfersSortRecent: "Neueste zuerst",
@@ -1283,6 +1516,7 @@ module.exports = {
voteErrorTitle: "Formular prüfen",
voteErrorDeadlineMin: "Die Frist muss mindestens {days} Tage in der Zukunft liegen.",
voteErrorGeneric: "Die Abstimmung konnte nicht gespeichert werden.",
+ voteLocked: "Diese Abstimmung hat bereits Stimmen oder Meinungen erhalten oder gehört zum Parlament oder zu den Gerichten: Sie kann nicht mehr bearbeitet oder gelöscht werden.",
voteUpdateButton: "Aktualisieren",
voteDeleteButton: "Löschen",
voteOptionYes: "JA",
@@ -1292,6 +1526,7 @@ module.exports = {
voteFollowMajority: "MEHRHEIT FOLGEN",
voteNotInterested: "NICHT INTERESSIERT",
voteFilterAll: "ALLE",
+ voteFilterRecent: "NEUESTE",
voteFilterMine: "MEINE",
voteFilterOpen: "OFFEN",
voteFilterClosed: "GESCHLOSSEN",
@@ -1307,7 +1542,6 @@ module.exports = {
voteTags: "Tags",
voteOpinions: "Meinungen",
novotes: "Keine Abstimmungsvorschläge vorhanden.",
- voteBy: "Von",
voteCreatedAt: "Erstellt am",
voteNoQuestion: "Keine Frage angegeben",
voteUnknownCreator: "Unbekannter Ersteller",
@@ -1317,6 +1551,7 @@ module.exports = {
voteCommentsForumButton: 'Diskussion eröffnen',
voteCommentsSectionTitle: 'Offene Diskussion',
voteNoCommentsYet: 'Noch keine Kommentare. Sei der Erste, der antwortet.',
+ commentsGoToLast: "Zum letzten Kommentar",
voteNewCommentPlaceholder: 'Schreibe deinen Kommentar hier…',
voteNewCommentButton: 'Kommentar veröffentlichen',
voteNewCommentLabel: 'Einen Kommentar hinzufügen',
@@ -1327,6 +1562,8 @@ module.exports = {
cvNameLabel: "Vollständiger Name",
cvDescriptionLabel: "Zusammenfassung",
cvPhotoLabel: "Foto",
+ cvPdfLabel: "Lebenslauf (PDF)",
+ cvVisitButton: "Lebenslauf ansehen",
cvPersonalExperiencesLabel: "Persönliche Erfahrungen",
cvPersonalSkillsLabel: "Persönliche Fähigkeiten (durch Komma getrennt)",
cvOasisExperiencesLabel: "Oasis-Beitragserfahrungen",
@@ -1356,9 +1593,9 @@ module.exports = {
cvNoCV: "Kein Lebenslauf gefunden.",
blogSubject: "Betreff",
blogMessage: "Nachricht",
- blogImage: "Medien hochladen (max: 50MB)",
+ blogImage: "Medien hochladen (max: 75MB)",
blogMedia: "Anhänge (bis zu 8 Bilder und ein Video)",
- blogPublish: "Vorschau",
+ blogPublish: "Veröffentlichen",
pollsTitle: "Umfragen",
dataTitle: "Übereinstimmungen",
dataDescription: "Erkunde und visualisiere die Übereinstimmungen in deinem Netzwerk.",
@@ -1377,12 +1614,23 @@ module.exports = {
dataKindTasks: "AUFGABEN",
dataKindReports: "BERICHTE",
dataKindVotes: "ABSTIMMUNGEN",
- dataSearchPlaceholder: "Querdaten durchsuchen...",
+ dataSearchPlaceholder: "In Übereinstimmungen suchen...",
dataCohesionTitle: "Kohäsionskoeffizient (CC)",
dataCcShort: "CC",
dataCohesionHint: "Durchschnittliche Affinität zwischen allem, was das Netzwerk veröffentlicht hat.",
dataAffinity: "Affinität",
dataCommonTerms: "Schlüsselwort",
+ dataReasonFollowing: "Du unterstützt diesen Bewohner",
+ dataReasonTribe: "Teilt einen Stamm mit dir",
+ dataReasonPinned: "Passt zu etwas, das du angeheftet hast",
+ dataReasonCv: "Passt zu den Fähigkeiten in deinem Lebenslauf",
+ dataReasonContent: "Verwandt mit dem, was du veröffentlichst",
+ dataReasonRelated: "Verwandt mit deinen Interessen",
+ dataReasonAlike: "Veröffentlicht von einem Bewohner wie dir",
+ dataReasonSupportsYou: "Unterstützt dich",
+ dataReasonMutual: "Gegenseitige Unterstützung",
+ dataReasonRated: "Vom Netzwerk gut bewertet",
+ dataReasonNear: "In deiner Nähe",
dataStatPeople: "Lebensläufe",
dataStatConnected: "Verbunden",
dataStatSkills: "Fähigkeiten",
@@ -1435,7 +1683,7 @@ module.exports = {
pollStatusLabel: "Status",
pollStatusOpen: "OFFEN",
pollStatusClosed: "GESCHLOSSEN",
- pollSearchPlaceholder: "Umfragen suchen...",
+ pollSearchPlaceholder: "In Umfragen suchen...",
pollsNoItems: "Keine Umfragen gefunden.",
viewPoll: "Umfrage Ansehen",
pollChatCreate: "Umfrage Erstellen",
@@ -1448,7 +1696,7 @@ module.exports = {
blogFilterFavorites: "FAVORITEN",
blogFilterTop: "TOP",
blogCreateButton: "Blog Erstellen",
- blogSearchPlaceholder: "Blogs suchen...",
+ blogSearchPlaceholder: "In Blogs suchen...",
blogComments: "Kommentare",
blogAllowComments: "Kommentare erlauben",
blogCommentsClosed: "Der Autor hat die Kommentare für diesen Blog geschlossen.",
@@ -1461,12 +1709,11 @@ module.exports = {
forumCreateButton: "Forum erstellen",
forumCreateSectionTitle: "Forum erstellen",
forumDescription: "Diskutiere offen mit anderen Bewohnern in deinem Netzwerk.",
- forumSearchPlaceholder: "Forum durchsuchen...",
+ forumSearchPlaceholder: "In Foren suchen...",
forumFilterAll: "ALLE",
forumFilterMine: "MEINE",
forumFilterRecent: "NEUESTE",
forumFilterTop: "TOP",
- forumDeleteButton: "Löschen",
forumParticipants: "Teilnehmer",
forumMessages: "Nachrichten",
forumMessageLabel: "Nachricht",
@@ -1493,7 +1740,6 @@ module.exports = {
imageFilterGallery: "GALERIE",
imageCreateButton: "Bild hochladen",
imageUpdateButton: "Aktualisieren",
- imageDeleteButton: "Löschen",
imageAddFavoriteButton: "Favorit hinzufügen",
imageRemoveFavoriteButton: "Favorit entfernen",
imageFileLabel: "Bilddatei auswählen (.jpeg, .jpg, .png, .gif)",
@@ -1505,13 +1751,14 @@ module.exports = {
imageDescriptionPlaceholder: "Optional",
imageNoFile: "Keine Bilddatei angegeben",
noImages: "Keine Bilder vorhanden.",
- imageSearchPlaceholder: "Titel, Tags, Beschreibung, Autor suchen...",
+ imageSearchPlaceholder: "In Bilder suchen...",
imageSortRecent: "Neueste zuerst",
imageSortOldest: "Älteste zuerst",
imageSortTop: "Meistgewählt",
imageSearchButton: "Suche",
imageUpdatedAt: "Aktualisiert",
imageNoMatch: "Keine Bilder gefunden.",
+ feedSearchPlaceholder: "In Feed suchen...",
feedTitle: "Feed",
createFeedTitle: "Feed erstellen",
createFeedButton: "Feed senden!",
@@ -1522,11 +1769,11 @@ module.exports = {
noFeedsFound: "Keine Feeds gefunden.",
createdAtLabel: "Erstellt am",
FeedshareYourOpinions: "Kurztexte in deinem Netzwerk entdecken und teilen.",
- refeedButton: "Refeed",
+ refeedButton: "Weiterleiten",
alreadyRefeeded: "Du hast dies bereits refeeded.",
activityTitle: "Aktivität",
yourActivity: "Deine Aktivität",
- globalActivity: "Globale Aktivität",
+ globalActivity: "Aktivität",
activityList: "Aktivität",
activityDesc: "Sieh dir die neueste Aktivität in deinem Netzwerk an.",
allButton: "ALLE",
@@ -1541,7 +1788,8 @@ module.exports = {
meme: "Meme",
typeRecent: "NEUESTE",
typeTop: "TOP",
- typePost: "BLOGS",
+ typePost: "BLOG",
+ activityUpdateLabel: "AKTUALISIERUNG",
typeTribe: "STÄMME",
typeLarp: "L.A.R.P.",
typeInhabitants: "BEWOHNER",
@@ -1566,7 +1814,7 @@ module.exports = {
typeFeed: "FEEDS",
typeContact: "KONTAKT",
typePub: "PUB",
- typeTombstone: "TOMBSTONE",
+ typeTombstone: "GELÖSCHT",
typeBanking: "BANKWESEN",
typeBankWallet: "BANKWESEN/WALLET",
typeBankClaim: "BANKWESEN/UBI",
@@ -1613,8 +1861,8 @@ module.exports = {
bankingUserEngagementScore: "KARMA-Bewertung",
viewDetails: "Details anzeigen",
link: "Link",
- activityProjectFollow: "%OASIS% unterstützt jetzt dieses Projekt %PROJECT%",
- activityProjectUnfollow: "%OASIS% unterstützt dieses Projekt nicht mehr %PROJECT%",
+ activityProjectFollow: "%OASIS% %ACTION% jetzt dieses Projekt %PROJECT%",
+ activityProjectUnfollow: "%OASIS% %ACTION% dieses Projekt %PROJECT%",
following: "UNTERSTÜTZT",
unfollowing: "NICHT MEHR UNTERSTÜTZT",
pledged: "ZUGESAGT",
@@ -1679,7 +1927,7 @@ module.exports = {
courtsNoCases: 'Keine Fälle.',
reportsTitle: "Berichte",
reportsDescription: "Verwalte und verfolge die Meldungen in deinem Netzwerk.",
- reportsSearchPlaceholder: "Meldungen suchen...",
+ reportsSearchPlaceholder: "In Berichte suchen...",
reportsFilterAll: "ALLE",
reportsFilterRecent: "NEU",
reportsFilterTop: "TOP",
@@ -1727,7 +1975,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Berichte in Prüfung",
reportsResolvedSectionTitle: "Gelöste Berichte",
reportsInvalidSectionTitle: "Ungültige Berichte",
- reportsTemplateSectionTitle: 'Berichtsvorlage',
reportsBugTemplateTitle: 'Reproduktionsdetails (Fehler)',
reportsFeatureTemplateTitle: 'Details (Funktionen)',
reportsAbuseTemplateTitle: 'Details (Missbrauch)',
@@ -1787,17 +2034,15 @@ module.exports = {
tribeGallerySectionTitle: "Stämme-Galerie",
tribeRecentSectionTitle: "Neueste Stämme",
tribeTopSectionTitle: "Beliebte Stämme",
- tribeviewTribeButton: "Stamm besuchen",
- tribeviewSubTribeButton: "Unter-Stamm besuchen",
tribeRootLabel: "WURZEL",
tribeDescription: "Stämme in deinem Netzwerk erkunden oder erstellen.",
tribeMainTribeLabel: "HAUPTSTAMM",
tribeCreateButton: "Stamm erstellen",
tribeUpdateButton: "Aktualisieren",
tribeDeleteButton: "Löschen",
- tribeImageLabel: "Medien hochladen (max: 50MB)",
+ tribeImageLabel: "Medien hochladen (max: 75MB)",
tribeTitleLabel: "Titel",
- searchTribesPlaceholder: "STÄMME NACH NAME FILTERN …",
+ searchTribesPlaceholder: "In Stämme suchen...",
tribeTitlePlaceholder: "Name des Stammes",
tribeDescriptionLabel: "Beschreibung",
tribeDescriptionPlaceholder: "Diesen Stamm beschreiben",
@@ -1810,6 +2055,15 @@ module.exports = {
tribeIsAnonymousLabel: "STATUS",
tribeMembersCount: "Mitgliederzahl",
tribeEnterInvite: "CODE EINGEBEN",
+ subscriptionTitle: "Abonnements",
+ subscriptionOn: "Abonniert",
+ subscriptionOff: "Nicht abonniert",
+ subscriptionSubscribe: "Abonnieren",
+ subscriptionUnsubscribe: "Abbestellen",
+ subscriptionSubscribers: "Abonnenten",
+ pmListLabel: "Senden an",
+ pmListNone: "— Keine Liste —",
+ pmListNoSubscribers: "Keine Abonnenten",
tribeLeaveButton: "VERLASSEN",
tribePublic: "ÖFFENTLICH",
tribePrivate: "PRIVAT",
@@ -1842,16 +2096,16 @@ module.exports = {
tribeSectionVideos: "VIDEOS",
tribeSectionDocuments: "DOKUMENTE",
tribeSectionBookmarks: "LESEZEICHEN",
- tribeSectionMaps: "MAPS",
+ tribeSectionMaps: "KARTEN",
tribeSectionPads: "PADS",
tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionCalendars: "KALENDER",
+ tribePadCreate: "Pad erstellen",
+ tribeChatCreate: "Chat erstellen",
+ tribeCalendarCreate: "Kalender erstellen",
+ tribePadsEmpty: "Noch keine Pads.",
+ tribeChatsEmpty: "Noch keine Chats.",
+ tribeCalendarsEmpty: "Noch keine Kalender.",
tribeInhabitantsEmpty: "Noch keine Bewohner in diesem Stamm.",
tribeEventCreate: "Termin erstellen",
tribeEventsEmpty: "Noch keine Termine.",
@@ -1906,9 +2160,14 @@ module.exports = {
tribeMediaTypeDocument: "Dokument",
tribeMediaTypeBookmark: "Lesezeichen",
tribeContentDelete: "LÖSCHEN",
+ tribeReachTribe: "STAMM",
+ tribeReachNotice: "OASIS zeigt es allen Bewohnern und CLEARNET zusätzlich im offenen Web. Das Öffnen hinterlässt eine lesbare Kopie außerhalb des Stammes: Zurück zu STAMM blendet es aus, aber bereits geteilte Kopien lassen sich nicht löschen.",
+ tribeReachPrivate: "Inhalte eines privaten Stammes können nur im Stamm bleiben.",
+ tribeReachOpenedBy: "Geöffnet von",
+ tribeReachChange: "Wo es veröffentlicht wird",
tribeInviteCodeText: "Einladungscode: ",
oasisVersionLabel: "Oasis-Version",
- tribeInviteCodeHint: "Teile diesen Code mit jemandem, den du einladen möchtest. Er kann über /invites → Tribes beitreten.",
+ tribeInviteCodeHint: "Teile diesen Code mit jemandem, den du einladen möchtest. Er kann über /invites beitreten.",
tribeStatusOpen: "OFFEN",
tribeStatusClosed: "GESCHLOSSEN",
tribeStatusInProgress: "IN BEARBEITUNG",
@@ -1948,7 +2207,7 @@ module.exports = {
tribeSearchMinChars: "Mindestens 2 Zeichen eingeben, um zu suchen.",
agendaTitle: "Agenda",
agendaDescription: "Hier findest du alle dir zugewiesenen Einträge.",
- agendaSearchPlaceholder: "Agenda durchsuchen...",
+ agendaSearchPlaceholder: "In Agenda suchen...",
agendaFilterAll: "ALLE",
agendaFilterToday: "HEUTE",
agendaFilterUpcoming: "BEVORSTEHEND",
@@ -1969,6 +2228,7 @@ module.exports = {
agendaNoItems: "Keine Zuweisungen gefunden.",
agendaDiscardButton: "Verwerfen",
agendaRestoreButton: "Wiederherstellen",
+ agendaRemoveButton: "Entfernen",
agendaMembersCount: "Mitglieder",
agendaLocationLabel: "Ort",
agendaYes: "JA",
@@ -2035,8 +2295,8 @@ module.exports = {
pmComposeTitle: "Nachricht senden",
pmRecipients: "Empfänger",
pmRecipientsHint: "Oasis-IDs durch Kommas getrennt eingeben",
- pmLimitsHint: "Bis zu 7 Empfänger pro Nachricht.",
- pmTextPlaceholder: "Text auf 7000 Zeichen begrenzt.",
+ pmLimitsHint: "Bis zu 7 Bewohner pro Nachricht.",
+ pmTextPlaceholder: "Schreibe deine Nachricht.",
pmSubject: "Betreff",
pmSubjectHint: "Nachrichtenbetreff eingeben",
pmText: "Nachricht",
@@ -2058,8 +2318,8 @@ module.exports = {
pmCrypterCharsLabel: "Zeichen",
pmInvalidRecipients: "Ungültige Oasis-ID (sollte wie @…=.ed25519 aussehen).",
pmEncryptionLabel: "Verschlüsselung",
- private: "Privat",
- privateDescription: "Deine verschlüsselten Nachrichten.",
+ private: "Posteingang",
+ privateDescription: "Verwalte deine privaten Nachrichten.",
privateInbox: "POSTEINGANG",
privateSent: "GESENDET",
privateDelete: "Löschen",
@@ -2094,7 +2354,7 @@ module.exports = {
inboxProjectPledgedTitle: "Neue Zusage für dein Projekt",
pmHasPledged: "hat zugesagt",
pmToYourProject: "für dein Projekt",
- blockchain: 'BlockExplorer',
+ blockchain: "Block-Explorer",
blockchainDescription: 'Blöcke in der Blockchain erkunden und visualisieren.',
blockchainNoBlocks: 'Keine Blöcke in der Blockchain gefunden.',
blockchainStatsTitle: 'Statistiken',
@@ -2115,24 +2375,24 @@ module.exports = {
visitContent: "Inhalt besuchen",
favoriteAdd: "Zu Favoriten anheften",
pmContentTooltip: "Private Nachricht senden",
+ phoneCallTooltip: "Anruf tätigen",
favoriteRemove: "Von Favoriten lösen",
reportContent: "Inhalt melden",
banking: 'Bankwesen',
bankingTitle: 'Bankwesen',
- bankingDescription: "Die ECOin-Wirtschaft: Guthaben, Grundeinkommen, Steuern und Industriewert.",
+ bankingDescription: "Die kollektive ECOin-Wirtschaft.",
bankOverview: 'Übersicht',
bankEpochs: 'Epochen',
bankRules: 'Regeln',
pending: 'Ausstehend',
closed: 'Geschlossen',
- bankViewTx: 'Tx anzeigen',
bankClaimNow: 'Jetzt beanspruchen',
- bankClaimUBI: 'UBI beanspruchen!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: 'UBI beanspruchen',
+ bankClaimAndPay: "Beanspruchen & zahlen",
+ bankClaimedPending: "Anspruch ausstehend...",
+ bankStatusClaimed: "Beansprucht",
+ bankStatusExpired: "Abgelaufen",
+ bankPubOnly: "Nur für PUBs",
bankEpoch: 'Epoche',
bankPool: 'Pool (diese Epoche)',
bankWeightsSum: 'Gewichtssumme',
@@ -2151,8 +2411,8 @@ module.exports = {
bankViewEpoch: 'Epoche anzeigen',
bankYourIndustryBalance: "Dein Industrieanteil",
bankYourUbiMonth: "Dein BGE (diesen Monat)",
- bankYourFundsMonth: "Deine Mittel (diesen Monat)",
- bankIndustryBalance: "Industrieproduktion (geschätzt)",
+ bankYourFundsMonth: "Mittel gesamt",
+ bankIndustryBalance: "Industrieproduktion",
bankUserBalance: 'Dein Kontostand',
bankAddresses: 'Adressen',
bankNoAddresses: 'Keine Adressen gefunden.',
@@ -2160,6 +2420,10 @@ module.exports = {
bankAddress: 'Adresse',
bankAddAddressTitle: 'ECOIN-Adresse hinzufügen',
bankAddAddressUser: 'Oasis-ID',
+ bankAddAddressLabel: "Bezeichnung (optional)",
+ bankAddAddressLabelPlaceholder: "Bobs Wallet, Alices Laden…",
+ bankAddAddressUserOptional: "Oasis-ID (optional)",
+ bankAddressUnnamed: "Adresse ohne Namen",
bankAddAddressAddress: 'ECOIN-Adresse',
bankAddAddressSave: 'Speichern',
bankAddressAdded: 'Adresse hinzugefügt',
@@ -2177,11 +2441,11 @@ module.exports = {
bankAddressDeleteConfirm: 'Diese Adresse löschen?',
search: 'Suchen!',
bankLocal: 'Lokal',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Netz",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "KEIN GUTHABEN!",
bankUbiAvailableOk: "VERFÜGBAR!",
- bankUbiAvailability: "BGE (Netzwerk)",
+ bankUbiAvailability: "UBI",
bankAlreadyClaimedThisMonth: "Diesen Monat bereits beansprucht",
bankUbiThisMonth: "UBI (diesen Monat)",
bankUbiLastClaimed: "UBI (zuletzt beansprucht)",
@@ -2190,7 +2454,7 @@ module.exports = {
bankUbiPub: "PUB",
bankUbiInhabitant: "BEWOHNER",
bankUbiClaimedAmount: "BEANSPRUCHT (ECO)",
- typeBankUbiResult: "BANKING - UBI",
+ typeBankUbiResult: "BANKWESEN - UBI",
bankNoPubConfigured: "Kein PUB konfiguriert. Lege deine PUB-ID in den Einstellungen fest.",
shopsTitle: "Shops",
shopDescription: "Shops im Netzwerk entdecken und verwalten.",
@@ -2211,6 +2475,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Verschlüsselt übertragen",
shopAddFavorite: "Favorit hinzufügen",
shopRemoveFavorite: "Favorit entfernen",
shopOpen: "OFFEN",
@@ -2218,6 +2483,13 @@ module.exports = {
shopMakePrivate: "PRIVAT MACHEN (E2E)",
shopMakePublic: "ÖFFENTLICH MACHEN",
shopProducts: "Produkte",
+ shopFilterAll: "ALLE",
+ shopFilterRecent: "NEU",
+ shopFilterMine: "MEINE",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUKTE",
+ shopFilterPrices: "PREISE",
+ shopFilterFavorites: "FAVORITEN",
shopProductAdd: "Produkt hinzufügen",
shopProductTitle: "Produkt",
shopProductUpdate: "Produkt aktualisieren",
@@ -2245,7 +2517,7 @@ module.exports = {
marketVisitItem: "ARTIKEL ANZEIGEN",
shopStatus: "STATUS",
shopCreatedAt: "ERSTELLT",
- shopSearchPlaceholder: "Shops suchen...",
+ shopSearchPlaceholder: "In Shops suchen...",
shopUrl: "URL",
shopLocation: "Standort",
shopTags: "Tags",
@@ -2255,45 +2527,49 @@ module.exports = {
shopTitlePlaceholder: "Name Ihres Shops",
shopDescriptionPlaceholder: "Detaillierte Beschreibung Ihres Shops",
shopLocationPlaceholder: "Stadt, Land",
- shopTagsPlaceholder: "tag1, tag2, tag3",
+ shopTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
mapTitlePlaceholder: "Kartentitel",
shopProductFeatured: "Hervorgehobenes Produkt",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "An den Markt senden",
typeShop: "SHOPS",
typeShopProduct: "SHOP-PRODUKT",
bankExchange: 'Umtausch',
bankExchangeCurrentValue: 'ECOin-Wert (1h)',
- bankTotalSupply: 'ECOin Gesamtmenge',
- bankEcoinHours: "ECOin-Äquivalent in Zeit",
+ bankTotalSupply: "ECOin-Gesamtbestand",
+ bankPubsSupply: "ECOin-Bestand im PUB-Pool",
+ bankHoldingSupply: "ECOin-Bestand außerhalb des BGE",
+ bankEcoinHours: "ECOin-Äquivalent in Zeit (1 ECO)",
bankHoursOfWork: 'Stunden',
bankUnitMs: "ms",
bankUnitSeconds: "Sekunden",
bankUnitMinutes: "Minuten",
bankUnitDays: "Tage",
bankExchangeNoData: 'Keine Daten verfügbar',
- bankInflation: 'ECOin-Inflation (anual)',
- bankInflationMonthly: 'ECOin-Inflation (mensual)',
+ bankInflation: "ECOin-Inflation (jährlich)",
+ bankInflationMonthly: "ECOin-Inflation (monatlich)",
bankExchangeChartTitle: 'Progression des ECOin-Werts im Zeitverlauf',
bankExchangeChartValue: 'Wert (ECO/h)',
bankExchangeChartSupply: 'Umlauf',
bankExchangeChartInflation: 'Inflation %',
bankExchangeChartEmpty: 'Noch nicht genug Datenpunkte — komm später zurück',
- bankCurrentSupply: 'ECOin aktuelle Menge',
+ bankCurrentSupply: "Aktueller ECOin-Bestand",
bankingSyncStatus: 'ECOin-Status',
bankingSyncStatusSynced: 'Synchronisiert',
- bankingSyncStatusOutdated: 'Veraltet',
+ bankingSyncStatusOutdated: "Nicht synchron",
statsTitle: 'Statistiken',
statistics: "Statistiken",
statsDescription: "Entdecke Statistiken über dein Netzwerk.",
ALLButton: "ALLE",
+ RECENTButton: "NEUESTE",
MINEButton: "MEINE",
- TOMBSTONEButton: "TOMBSTONES",
+ TOMBSTONEButton: "GELÖSCHT",
statsCreatedAt: "Erstellt am",
statsYourContent: "Inhalt",
statsYourOpinions: "Meinungen",
statsNetworkContent: "Inhalt",
statsNetworkOpinions: "Meinungen",
- statsEcoWalletLabel: "ECOIN Wallet",
+ statsEcoWalletLabel: "ECOin Wallet",
+ walletAddressCopyHint: "Klicken zum Markieren, dann kopieren",
statsEcoWalletNotConfigured: "Nicht konfiguriert!",
statsBookmark: "Lesezeichen",
statsEvent: "Termine",
@@ -2315,6 +2591,8 @@ module.exports = {
statsTransfer: "Überweisungen",
statsAiExchange: "KI",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "Verbindungen",
+ statsTotalLabel: "Gesamt",
statsPost: "Beiträge",
statsSize: "Gesamt (Größe)",
statsBlockchainSize: "Blockchain (Größe)",
@@ -2366,8 +2644,14 @@ module.exports = {
aiPrompt: "Gib eine informative und präzise Antwort.",
aiConfiguration: "Prompt setzen",
aiPromptUsed: "Prompt",
- aiClearHistory: "Chatverlauf löschen",
- aiServerError: "Die KI konnte nicht antworten. Bitte versuche es erneut.",
+ aiClearHistory: "Verlauf löschen",
+ aiServerError: "Ich kann nicht richtig antworten. Bitte versuch es noch einmal.",
+ aiStatusLoading: "42 lädt das Modell. Frag gleich noch einmal.",
+ aiThinking: "Denkt nach",
+ aiWaiting: "Wartet",
+ aiStatusMissingModel: "Das KI-Modell ist nicht installiert: src/AI/oasis-42-1-chat.Q4_K_M.gguf fehlt.",
+ aiExportFineTuning: "Fine-Tuning exportieren",
+ aiFactsTitle: "Daten aus deinem Netzwerk",
aiInputPlaceholder: "Was gibt es Neues?",
typeAiExchange: "KI",
aiApproveTrain: "Zum kollektiven Training hinzufügen",
@@ -2396,7 +2680,7 @@ module.exports = {
marketFilterDiscarded: "VERWORFEN",
marketFilterRecent: "NEUESTE",
marketFilterMyBids: "GEBOTE",
- marketCreateButton: "Artikel erstellen",
+ marketCreateButton: "Etwas verkaufen",
marketItemType: "Typ",
marketItemTitle: "Titel",
marketItemAvailable: "Frist",
@@ -2423,8 +2707,8 @@ module.exports = {
marketItemSeller: "Verkäufer",
marketNoItems: "Noch keine Artikel vorhanden.",
marketYourBid: "Dein Gebot",
- marketCreateFormImageLabel: "Medien hochladen (max: 50MB)",
- marketSearchPlaceholder: "Titel oder Tags suchen",
+ marketCreateFormImageLabel: "Medien hochladen (max: 75MB)",
+ marketSearchPlaceholder: "In Markt suchen...",
marketMinPriceLabel: "Mindestpreis",
marketMaxPriceLabel: "Höchstpreis",
marketSortRecent: "Neueste zuerst",
@@ -2490,8 +2774,7 @@ module.exports = {
housingSetClosed: "Nicht verfügbar machen",
housingCreateButton: "Ort erstellen",
housingUpdateButton: "Aktualisieren",
- housingDeleteButton: "Löschen",
- housingSearchPlaceholder: "Orte suchen...",
+ housingSearchPlaceholder: "In Wohnen suchen...",
housingSearchButton: "Suchen",
housingMinPrice: "Min. Preis",
housingMaxPrice: "Max. Preis",
@@ -2547,7 +2830,7 @@ module.exports = {
jobLocationPresencial: "Vor Ort",
jobLocationRemote: "Remote",
jobVacantsPlaceholder: "Anzahl der Positionen",
- jobImage: "Medien hochladen (max: 50MB)",
+ jobImage: "Medien hochladen (max: 75MB)",
jobTasks: "Aufgaben",
jobType: "Stellenart",
jobTime: "Arbeitszeit",
@@ -2569,12 +2852,11 @@ module.exports = {
jobsExchangeSkill: "Im Tausch gefragte Fähigkeit",
jobTimePartial: "Teilzeit",
jobTimeComplete: "Vollzeit",
- jobsDeleteButton: "LÖSCHEN",
jobsUpdateButton: "AKTUALISIEREN",
jobsFilterApplied: "BEWORBEN",
jobsAppliedTitle: "Meine Bewerbungen",
jobsAppliedBadge: "Beworben",
- jobsSearchPlaceholder: "Titel, Tags, Beschreibung suchen...",
+ jobsSearchPlaceholder: "In Stellen suchen...",
jobsMinSalaryLabel: "Mindestgehalt",
jobsMaxSalaryLabel: "Höchstgehalt",
jobsSortRecent: "Neueste zuerst",
@@ -2586,23 +2868,23 @@ module.exports = {
jobSetOpen: "Als OFFEN setzen",
jobsTagsLabel: "Tags",
noJobsMatch: "Keine Stellen gefunden.",
- industrySearchPlaceholder: "Fabriken suchen…",
+ industrySearchPlaceholder: "In Industrie suchen...",
industryAllSectors: "Alle Sektoren",
industryVisitButton: "Industrie besuchen",
industryAdvanceTo: "Setzen auf",
industryAmount: "Betrag",
industryApproveBuild: "Genehmigen",
- industryBlueprint: "Blueprint",
- industryBlueprints: "Blueprints",
- industryBuild: "Build",
+ industryBlueprint: "Bauplan",
+ industryBlueprints: "Baupläne",
+ industryBuild: "Produktion",
industryBuildNotes: "Notizen",
industryBuildStart: "Startdatum",
- industryVoteUpdateButton: "Update abstimmen",
+ industryVoteUpdateButton: "Über Aktualisierung abstimmen",
industryVoteDeleteButton: "Löschung abstimmen",
industryRevokeVote: "Widerrufen",
industryTimeLeft: "Verbleibende Zeit",
industryBuildEnd: "Enddatum",
- industryBuilds: "Builds",
+ industryBuilds: "Produktionen",
industryBuildTitle: "Titel",
industryContribute: "Beitragen",
industryContributeButton: "Beitragen",
@@ -2660,7 +2942,6 @@ 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",
@@ -2687,7 +2968,7 @@ module.exports = {
industryRulesIntro: "Industry lässt die Bewohner die Produktionsmittel gemeinschaftlich besitzen: Eine Fabrik ist eine netzwerkeigene Werkstatt, die niemand privat besitzt.",
industryRulesSteward: "Der Gründer ist der Verwalter — ein Treuhänder, kein Eigentümer: Er kann die Fabrik nicht allein verkaufen, privatisieren oder auflösen.",
industryRulesMembership: "Die Mitgliedschaftsrichtlinie legt fest, wie man beitritt: Offen (sofort), Per Abstimmung (durch die Stimme der Mitglieder) oder Nur mit Einladung (ein Mitglied muss zuerst einladen).",
- industryRulesQuorum: "Das Quorum ist die Mindestzahl an Mitgliedern, die abstimmen müssen, damit eine Entscheidung zählt, damit eine kleine Fabrik nicht von einer Person entschieden wird.",
+ industryRulesQuorum: "Das Quorum ist die Mindestzahl an Mitgliedern, die abstimmen müssen, damit eine Entscheidung zählt, damit eine kleine Fabrik nicht von einem einzigen Bewohner entschieden wird.",
industryRulesMajority: "Die Mehrheit ist der Stimmenanteil zum Bestehen (0,5 = Hälfte, 1 = Einstimmigkeit); eine Entscheidung besteht, wenn die JA-Stimmen mindestens max(Quorum, Mitglieder × Mehrheit) erreichen.",
industryRulesDecisions: "Mitglieder stimmen über Aufnahme, Genehmigung von Builds und Auflösung der Fabrik ab; der Verwalter kann diese kollektiven Entscheidungen nicht übergehen.",
industryRulesBlueprints: "Blueprints sind freie (Copyleft-)Rezepte — die Eingaben (Materialien, Arbeitsstunden, Fähigkeiten) und die Ausgabe (ein physisches oder digitales Gut) — und jeder kann sie forken.",
@@ -2706,13 +2987,14 @@ module.exports = {
industryPauseVotes: "Status-Stimmen",
industryTitle: "Industrie",
industryDescription: "Modul zur gemeinschaftlichen Verwaltung der Produktionsmittel.",
- typeIndustryBuild: "BUILD",
- typeIndustryBlueprint: "BLUEPRINT",
+ typeIndustryBuild: "PRODUKTION",
+ typeIndustryBlueprint: "BAUPLAN",
typeIndustryAllocation: "VERTEILUNG",
typeIndustry: "INDUSTRIE",
modulesIndustryLabel: "Industrie",
modulesIndustryDescription: "Modul zur gemeinschaftlichen Verwaltung der Produktionsmittel.",
industryFilterAll: "ALLE",
+ industryFilterRecent: "NEUESTE",
industryFilterMember: "MITGLIED",
industryFilterBlueprints: "BAUPLÄNE",
industryFilterBuilds: "PRODUKTIONEN",
@@ -2721,6 +3003,7 @@ module.exports = {
industryFilterPaused: "PAUSIERT",
industryFilterDissolved: "AUFGELÖST",
industryAllTitle: "Industrie",
+ industryRecentTitle: "Neueste Fabriken",
industryMemberTitle: "Fabriken, in denen ich bin",
industryMineTitle: "Meine Fabriken",
industryActiveTitle: "In Betrieb",
@@ -2768,7 +3051,7 @@ module.exports = {
industryPolicy_invite: "Nur mit Einladung",
projectsTitle: "Projekte",
projectsDescription: "Gemeinschaftsprojekte in deinem Netzwerk erstellen, finanzieren und verfolgen.",
- projectSearchPlaceholder: "Projekte suchen...",
+ projectSearchPlaceholder: "In Projekte suchen...",
projectCreateProject: "Projekt erstellen",
projectCreateButton: "Projekt erstellen",
projectUpdateButton: "AKTUALISIEREN",
@@ -2791,7 +3074,7 @@ module.exports = {
projectRecentTitle: "Neueste Projekte",
projectTopTitle: "Meistfinanziert",
projectTitlePlaceholder: "Projektname",
- projectImage: "Medien hochladen (max: 50MB)",
+ projectImage: "Medien hochladen (max: 75MB)",
projectDescription: "Beschreibung",
projectDescriptionPlaceholder: "Erzähle die Geschichte und Ziele…",
projectGoal: "Ziel (ECO)",
@@ -2863,15 +3146,13 @@ module.exports = {
modulesModuleName: "Name",
modulesModuleDescription: "Beschreibung",
modulesModuleStatus: "Status",
- modulesTotalModulesLabel: "Geladene Module",
+ modulesTotalModulesLabel: "Gesamt",
modulesEnabledModulesLabel: "Aktiviert",
modulesDisabledModulesLabel: "Deaktiviert",
modulesInvitesLabel: "Einladungen",
modulesInvitesDescription: "Modul zum Verwalten und Einlösen von Einladungscodes.",
modulesWalletLabel: "Geldbörse",
modulesWalletDescription: "Modul zum Verwalten deiner digitalen Vermögenswerte (ECOin).",
- modulesLegacyLabel: "Schlüssel",
- modulesLegacyDescription: "Modul zum schnellen und sicheren Verwalten deines geheimen Schlüssels (privater Schlüssel).",
modulesCipherLabel: "Verschlüsselung",
modulesCipherDescription: "Modul zum symmetrischen Ver- und Entschlüsseln von Text (mit einem gemeinsamen Passwort).",
modulesBookmarksLabel: "Lesezeichen",
@@ -2933,20 +3214,23 @@ module.exports = {
modulesProjectsLabel: "Projekte",
modulesProjectsDescription: "Modul zum Erkunden, Crowdfunding und Verwalten von Projekten.",
modulesBankingLabel: "Bankwesen",
- modulesBankingDescription: "Modul zur Bestimmung des realen Werts von ECOIN und Verteilung eines UBI über die gemeinsame Kasse.",
+ modulesBankingDescription: "Modul zur Verwaltung der gemeinsamen Kasse: ECOIN-Wert, Steuern und BGE.",
modulesFavoritesLabel: "Favoriten",
modulesFavoritesDescription: "Modul zum Verwalten deiner favorisierten Inhalte.",
fileTooLargeTitle: "Datei zu groß",
- fileTooLargeMessage: "Die Datei überschreitet die maximal erlaubte Größe (50 MB). Bitte wähle eine kleinere Datei.",
+ fileTooLargeMessage: "Die Datei überschreitet die maximal erlaubte Größe (75 MB). Bitte wähle eine kleinere Datei.",
goBack: "Zurück",
+ errorDismiss: "OK",
errorPageTitle: "Etwas ist schiefgelaufen",
+ errorNoAllocation: "Keine Zuteilung für diesen Anspruch gefunden.",
+ errorInvalidClaim: "Diese Zuteilung kann nicht beansprucht werden.",
visibilityLabel: "Sichtbarkeit",
+ clearnetPrivateConflict: "Private, versteckte, geschlossene, nur auf Einladung zugängliche oder kostenpflichtige Inhalte können nicht im CLEARNET veröffentlicht werden. Wähle OASIS oder mache sie öffentlich.",
visibilityPublic: "Öffentlich",
visibilityHidden: "Versteckt",
visibilityMakePublic: "Öffentlich machen",
visibilityMakeHidden: "Verstecken",
invitesInhabitantsTitle: "Bewohner",
- invitesInhabitantsFollow: "Folgen",
aiNavPlaceholder: "Beschreib, was du brauchst...",
aiNavDisabled: "KI-Navigation ist deaktiviert.",
aiNavResultsTitle: "AINav-Vorschläge",
@@ -2957,7 +3241,7 @@ module.exports = {
modulesAINavDescription: "Modul für natürlichsprachliche Anfragen zum Inhalt des Netzwerks.",
directConnectDescription: "Verbinde dich direkt mit einem Peer, indem du IP-Adresse, Port und öffentlichen Schlüssel eingibst.",
peerHost: "IP",
- peerPort: "Port (Standard: 8008)",
+ peerPort: "Port",
peerPublicKey: "Öffentlicher Schlüssel (@...ed25519)",
connectAndFollow: "Verbinden",
modulesPresetTitle: "Gängige Konfigurationen",
@@ -2966,15 +3250,15 @@ module.exports = {
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_kids: "Kinder",
+ workflow_activists: "Aktivismus",
workflow_mobile: "Mobil",
statsCarbonFootprintTitle: "CO2-Fußabdruck",
statsCarbonTombstone: "Tombstoning-Fußabdruck",
- uploadMedia: "Medien hochladen (max: 50MB)",
+ uploadMedia: "Medien hochladen (max: 75MB)",
cipherPasswordDecryptLabel: "Passwort (zum Entschlüsseln)",
courtsRespondentInvalid: "Ungültiger Beklagter",
feedDetailTitle: "Feed-Details",
@@ -2983,7 +3267,7 @@ module.exports = {
noComments: "Noch keine Kommentare.",
mapsLabel: "Karten",
mapTitle: "Karten",
- mapDescription: "Erkunden und verwalten Sie Offline-Karten in Ihrem Netzwerk.",
+ mapDescription: "Verwalten und teilen Sie Offline-Karten in Ihrem Netzwerk.",
mapMineSectionTitle: "Ihre Karten",
mapCreateSectionTitle: "Karte erstellen",
mapUpdateSectionTitle: "Karte aktualisieren",
@@ -3023,9 +3307,22 @@ module.exports = {
markerImageLabel: "Marker-Bild",
mapAddMarkerTitle: "Markierung hinzufügen",
mapAddMarkerButton: "Markierung hinzufügen",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Markierung entfernen",
mapApplyZoom: "Zoom anwenden",
- mapSearchPlaceholder: "Beschreibung, Tags, Autor suchen...",
+ mapPlaceSearchPlaceholder: "Ort oder Land suchen...",
+ mapNoPlaces: "Keine Orte gefunden.",
+ mapClusterTitle: "Markierungen hier, klicken zum Vergrößern",
+ mapDeleteMarker: "Markierung löschen",
+ mapZoomIn: "Vergrößern",
+ mapZoomOut: "Verkleinern",
+ mapFitMarkers: "Alle Markierungen einpassen",
+ mapPanLabel: "Karte verschieben",
+ mapCenterHere: "Hier zentrieren",
+ mapNear: "nahe",
+ mapPickedSpot: "Gewählter Punkt",
+ mapPickHint: "Klicke auf die Karte, um einen Punkt zu wählen.",
+ mapClearPick: "Leeren",
+ mapSearchPlaceholder: "In Karten suchen...",
mapSearchButton: "Suchen",
mapUpdatedAt: "Aktualisiert",
mapNoMatch: "Keine Karten entsprechen Ihrer Suche.",
@@ -3036,6 +3333,465 @@ module.exports = {
typeMapMarker: "KARTENMARKIERUNG",
modulesMapLabel: "Karten",
modulesMapDescription: "Modul zum Verwalten und Teilen von Offline-Karten.",
+ emergenciesTitle: "Notfälle",
+ modulesEmergenciesLabel: "Notfälle",
+ modulesEmergenciesDescription: "Modul zum Auslösen, Bestätigen und Verfolgen von Notfällen im Netzwerk.",
+ emergenciesDescription: "Modul zum Auslösen, Bestätigen und Verfolgen von Notfällen im Netzwerk.",
+ emergencyCreate: "Notfall erstellen",
+ emergencyUpdate: "Aktualisieren",
+ emergencyDelete: "Löschen",
+ emergencyTitleLabel: "Titel",
+ emergencyTitlePlaceholder: "Was passiert?",
+ emergencyTextLabel: "Details",
+ emergencyTextPlaceholder: "Wo, seit wann, was tun...",
+ emergencyCategoryLabel: "Kategorie",
+ emergencyCategoryWeather: "WETTER",
+ emergencyCategoryInfrastructure: "INFRASTRUKTUR",
+ emergencyCategoryHealth: "GESUNDHEIT",
+ emergencyCategorySecurity: "SICHERHEIT",
+ emergencyCategoryLost: "FUNDSACHEN",
+ emergencyCategoryNeighborhood: "NACHBARSCHAFT",
+ emergencyExpiresLabel: "Läuft ab in",
+ emergencyExpires1d: "1 Tag",
+ emergencyExpires3d: "3 Tage",
+ emergencyExpires7d: "1 Woche",
+ emergencyExpires30d: "1 Monat",
+ emergencyExpiresNone: "Unbestimmt",
+ emergencyExpiresKeep: "Aktuelles Datum behalten",
+ emergencyTagsLabel: "Tags",
+ emergencyTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ emergencyFilterAll: "ALLE",
+ emergencyFilterMine: "MEINE",
+ emergencyFilterRecent: "NEUESTE",
+ emergencySeverityUnverified: "UNBESTÄTIGT",
+ emergencySeverityLow: "NIEDRIG",
+ emergencySeverityMedium: "MITTEL",
+ emergencySeverityHigh: "HOCH",
+ emergencyStatusActive: "AKTIV",
+ emergencyStatusResolved: "GELÖST",
+ emergencyStatusExpired: "ABGELAUFEN",
+ emergencyConfirmations: "Bestätigungen",
+ emergencyConfirmButton: "Bestätigen",
+ emergencyConfirmed: "Du hast diesen Notfall bestätigt",
+ emergencyResolveButton: "Lösen",
+ emergencyReopenButton: "Wieder öffnen",
+ emergencyGenerateReport: "Bericht erzeugen",
+ emergencyUpdateEdited: "Bearbeitet",
+ emergencyLastUpdate: "LETZTE AKTUALISIERUNG",
+ emergencyUpdatesTitle: "Letzte Aktualisierungen:",
+ emergencyNoUpdates: "Noch keine Aktualisierungen.",
+ emergencyAddUpdate: "Aktualisierung veröffentlichen",
+ emergencyUpdatePlaceholder: "Was hat sich geändert?",
+ emergencyNoItems: "Keine Notfälle gefunden.",
+ emergencyExpiresAt: "Läuft ab",
+ emergencyBannerLabel: "Aktiver Notfall",
+ emergencyCreateSectionTitle: "Notfall erstellen",
+ emergencyUpdateSectionTitle: "Notfall aktualisieren",
+ emergencySearchPlaceholder: "In Notfällen suchen...",
+ typeEmergency: "NOTFÄLLE",
+ typeEmergencyConfirm: "NOTFALLBESTÄTIGUNG",
+ typeEmergencyUpdate: "NOTFALLAKTUALISIERUNG",
+ statsEmergency: "Notfälle",
+ statsEmergencyConfirm: "Notfallbestätigungen",
+ statsEmergencyUpdate: "Notfallaktualisierungen",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Ein Notfall, dem du folgst, hat eine Aktualisierung.",
+ emergencyBotResolvedTitle: "Ein Notfall, dem du folgst, wurde gelöst.",
+ dataKindEmergencies: "NOTFÄLLE",
+ mailingTitle: "Mailinglisten",
+ modulesMailingLabel: "Mailinglisten",
+ modulesMailingDescription: "Entdecke und verwalte Mailinglisten in deinem Netzwerk.",
+ modulesPhoneLabel: "Telefon",
+ modulesPhoneDescription: "Modul für Ende-zu-Ende-verschlüsselte Videoanrufe mit anderen Bewohnern.",
+ mailingDescription: "Entdecke und verwalte Mailinglisten in deinem Netzwerk.",
+ mailingCreate: "Mailingliste erstellen",
+ mailingUpdate: "Aktualisieren",
+ mailingArchive: "Archivieren",
+ mailingActivate: "Aktivieren",
+ mailingCreateSectionTitle: "Mailingliste erstellen",
+ mailingUpdateSectionTitle: "Mailingliste aktualisieren",
+ mailingTitleLabel: "Titel",
+ mailingTitlePlaceholder: "Name der Mailingliste",
+ mailingDescriptionLabel: "Beschreibung",
+ mailingDescriptionPlaceholder: "Worum geht es in dieser Liste?",
+ mailingTypeLabel: "Typ der Mailingliste",
+ mailingTypeOpen: "OFFEN",
+ mailingTypeClosed: "GESCHLOSSEN",
+ mailingStatusLabel: "Status",
+ mailingStatusActive: "AKTIV",
+ mailingStatusArchived: "ARCHIVIERT",
+ mailingMembersLabel: "Bewohner einladen",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Abonnenten",
+ mailingTagsLabel: "Tags",
+ mailingTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ mailingFilterAll: "ALLE",
+ mailingFilterMine: "MEINE",
+ mailingFilterSubscribed: "ABONNIERT",
+ mailingFilterRecent: "NEU",
+ mailingHistoryDate: "DATUM",
+ mailingHistoryThreads: "THREADS",
+ mailingHistoryInhabitants: "BEWOHNER",
+ mailingHistorySearchPlaceholder: "Im Verlauf suchen...",
+ mailingNoMessages: "Noch keine Nachrichten.",
+ mailingNoItems: "Keine Mailinglisten gefunden.",
+ mailingSearchPlaceholder: "In Mailinglisten suchen...",
+ mailingWriteButton: "Nachricht schreiben",
+ mailingWriteTitle: "An die Liste schreiben",
+ mailingReplyTitle: "Der Liste antworten",
+ mailingSend: "Senden",
+ mailingTextPlaceholder: "Deine Nachricht erreicht alle Teilnehmer der Liste.",
+ mailingParticipants: "Teilnehmer",
+ inboxFilterMailing: "Mailinglisten",
+ mailingReplyPlaceholder: "Der Liste antworten...",
+ mailingReplyToList: "Der Liste antworten",
+ typeMailingList: "MAILINGLISTE",
+ statsMailingList: "Mailinglisten",
+ mailingListLabel: "MAILINGLISTE",
+ logisticsTitle: "Logistik",
+ modulesLogisticsLabel: "Logistik",
+ modulesLogisticsDescription: "Entdecke und verwalte Logistikpläne in deinem Netzwerk.",
+ logisticsDescription: "Entdecke und verwalte Logistikpläne in deinem Netzwerk.",
+ logisticsCreate: "Route erstellen",
+ logisticsUpdate: "Aktualisieren",
+ logisticsClose: "Schließen",
+ logisticsReopen: "Wieder öffnen",
+ logisticsCreateSectionTitle: "Route erstellen",
+ logisticsUpdateSectionTitle: "Route aktualisieren",
+ logisticsTitleLabel: "Titel",
+ logisticsTitlePlaceholder: "Fahrt zum Markt, Transporter verfügbar...",
+ logisticsKindLabel: "Logistiktyp",
+ logisticsKindTrip: "FAHRT",
+ logisticsKindShipment: "SENDUNG",
+ logisticsKindTrips: "FAHRTEN",
+ logisticsKindShipments: "SENDUNGEN",
+ logisticsModeLabel: "Modus",
+ logisticsModeOffer: "BIETE",
+ logisticsModeRequest: "SUCHE",
+ logisticsModeOffers: "ANGEBOTE",
+ logisticsModeRequests: "GESUCHE",
+ logisticsDescriptionLabel: "Beschreibung",
+ logisticsDescriptionPlaceholder: "Treffpunkt, was du transportierst, Bedingungen...",
+ logisticsOriginLabel: "Start",
+ logisticsOriginPlaceholder: "Wo es losgeht",
+ logisticsDestinationLabel: "Ziel",
+ logisticsDestinationPlaceholder: "Wo es endet",
+ logisticsDateLabel: "Datum und Uhrzeit",
+ logisticsRecurrenceLabel: "Wiederholung",
+ logisticsFrequencyLabel: "Häufigkeit",
+ logisticsRecurrenceNone: "EINMALIG",
+ logisticsRecurrenceDaily: "TÄGLICH",
+ logisticsRecurrenceWeekly: "WÖCHENTLICH",
+ logisticsRecurrenceMonthly: "MONATLICH",
+ logisticsSeatsLabel: "Plätze",
+ logisticsSizeLabel: "Größe",
+ logisticsSizePlaceholder: "z. B. 2m x 1m",
+ logisticsWeightLabel: "Gewicht",
+ logisticsWeightPlaceholder: "z. B. 40kg",
+ logisticsPriceFree: "GRATIS",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "ZEIT",
+ logisticsPriceLabel: "Preis",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Bestell-Link",
+ logisticsOrderRefPlaceholder: "/shops/... oder /market/... der zu liefernden Bestellung",
+ logisticsOrderLink: "Verknüpfte Bestellung",
+ logisticsTagsLabel: "Tags",
+ logisticsTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ logisticsFilterAll: "ALLE",
+ logisticsFilterMine: "MEINE",
+ logisticsFilterBooked: "GEBUCHT",
+ logisticsFilterRecent: "NEU",
+ logisticsFilterHistory: "VERLAUF",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "OFFEN",
+ logisticsStatusUpcoming: "BEVORSTEHEND",
+ logisticsStatusPast: "VERGANGEN",
+ logisticsStatusClosed: "GESCHLOSSEN",
+ logisticsZoneLabel: "Zone",
+ logisticsSearchPlaceholder: "In Logistik suchen...",
+ logisticsNoItems: "Keine Routen gefunden.",
+ logisticsBookingPending: "AUSSTEHEND",
+ logisticsBookingConfirmed: "BESTÄTIGT",
+ logisticsBookingRejected: "ABGELEHNT",
+ logisticsBookingCancelled: "STORNIERT",
+ logisticsBookingDelivered: "GELIEFERT",
+ logisticsConfirm: "Bestätigen",
+ logisticsReject: "Ablehnen",
+ logisticsDeliver: "Liefern",
+ logisticsReceiptLabel: "Beleg",
+ logisticsReceiptPlaceholder: "Lieferhinweis (optional)",
+ logisticsCancelBooking: "Buchung stornieren",
+ logisticsBookTitle: "Diese Route buchen",
+ logisticsNotesLabel: "Notizen",
+ logisticsNotesPlaceholder: "Was der Anbieter wissen sollte",
+ logisticsBook: "Buchen",
+ logisticsBookingsTitle: "Buchungen",
+ logisticsMyBookingTitle: "Deine Buchung",
+ logisticsRatingsTitle: "Bewertungen",
+ logisticsNoRatings: "Noch keine Bewertungen.",
+ logisticsRatingsWhenClosed: "Bewertungen sind möglich, sobald die Route geschlossen ist.",
+ logisticsScoreLabel: "Punkte",
+ logisticsRatingPlaceholder: "Wie lief es?",
+ logisticsRate: "Bewerten",
+ typeLogisticsRoute: "ROUTE",
+ typeLogisticsRating: "ROUTENBEWERTUNG",
+ statsLogisticsRoute: "Routen",
+ statsLogisticsRating: "Routenbewertungen",
+ logisticsRouteLabel: "ROUTE",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Modul zum Veröffentlichen von Podcast-Kanälen.",
+ podcastsDescription: "Modul zum Veröffentlichen von Podcast-Kanälen.",
+ podcastCreate: "Podcast erstellen",
+ podcastUpdate: "Aktualisieren",
+ podcastDelete: "Löschen",
+ podcastCreateSectionTitle: "Podcast erstellen",
+ podcastUpdateSectionTitle: "Podcast aktualisieren",
+ podcastTitleLabel: "Titel",
+ podcastTitlePlaceholder: "Name des Kanals",
+ podcastDescriptionLabel: "Beschreibung",
+ podcastDescriptionPlaceholder: "Worum geht es in diesem Podcast?",
+ podcastCategoryLabel: "Kategorie",
+ podcastCategoryNews: "NACHRICHTEN",
+ podcastCategoryMusic: "MUSIK",
+ podcastCategoryTalk: "GESPRÄCH",
+ podcastCategoryEducation: "BILDUNG",
+ podcastCategoryTech: "TECHNIK",
+ podcastCategoryCulture: "KULTUR",
+ podcastCategoryCommunity: "GEMEINSCHAFT",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "SONSTIGES",
+ podcastTagsLabel: "Tags",
+ podcastCoverLabel: "Cover (Bild oder Video)",
+ podcastEpisodeAudioLabel: "Audio- oder Videodatei (max: 75MB)",
+ podcastTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ podcastFilterAll: "ALLE",
+ podcastFilterMine: "MEINE",
+ podcastFilterRecent: "NEU",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "HÖRER",
+ podcastSearchPlaceholder: "In Podcasts suchen...",
+ podcastNoItems: "Keine Podcasts gefunden.",
+ podcastEpisodesLabel: "Episoden",
+ podcastPlaysLabel: "Aufrufe",
+ podcastLastEpisode: "Letzte Episode",
+ podcastEpisodesTitle: "Episoden",
+ podcastNoEpisodes: "Noch keine Episoden.",
+ podcastEpisodeAdd: "Episode hinzufügen",
+ podcastEpisodeCreateTitle: "Episode veröffentlichen",
+ podcastEpisodeUpdateTitle: "Episode aktualisieren",
+ podcastEpisodeTitleLabel: "Episodentitel",
+ podcastEpisodeTitlePlaceholder: "Titel der Episode",
+ podcastEpisodeDescriptionLabel: "Shownotes",
+ podcastEpisodeDescriptionPlaceholder: "Was in dieser Episode passiert, Links, Credits...",
+ podcastEpisodePublish: "Veröffentlichen",
+ podcastPlayed: "Gehört",
+ podcastMarkPlayed: "Als gehört markieren",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISODE",
+ typePodcastOpinion: "EPISODENMEINUNG",
+ typePodcastPlay: "WIEDERGABE",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Episoden",
+ statsPodcastPlay: "Wiedergaben",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Ein Blog, dem du folgst, hat einen neuen Eintrag.",
+ podcastBotEpisodeTitle: "Ein Podcast, dem du folgst, hat eine neue Episode.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISODE",
+ campaignsTitle: "Kampagnen",
+ modulesCampaignsLabel: "Kampagnen",
+ modulesCampaignsDescription: "Entdecke und verwalte Kampagnen in deinem Netzwerk.",
+ campaignsDescription: "Entdecke und verwalte Kampagnen in deinem Netzwerk.",
+ campaignCreate: "Kampagne erstellen",
+ campaignUpdate: "Aktualisieren",
+ campaignDelete: "Löschen",
+ campaignClose: "Schließen",
+ campaignReopen: "Wieder öffnen",
+ campaignCreateSectionTitle: "Kampagne erstellen",
+ campaignUpdateSectionTitle: "Kampagne aktualisieren",
+ campaignTitleLabel: "Titel",
+ campaignTitlePlaceholder: "Was willst du erreichen?",
+ campaignTextLabel: "Text",
+ campaignTextPlaceholder: "Erkläre das Anliegen, wer entscheidet und was du forderst...",
+ campaignCategoryLabel: "Kategorie",
+ campaignCategoryEnvironment: "UMWELT",
+ campaignCategoryRights: "RECHTE",
+ campaignCategoryHealth: "GESUNDHEIT",
+ campaignCategoryEducation: "BILDUNG",
+ campaignCategoryInfrastructure: "INFRASTRUKTUR",
+ campaignCategoryCulture: "KULTUR",
+ campaignCategoryEconomy: "WIRTSCHAFT",
+ campaignCategoryOther: "SONSTIGES",
+ campaignGoalLabel: "Unterschriftenziel",
+ campaignDeadlineLabel: "Frist",
+ campaignTagsLabel: "Tags",
+ campaignTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ campaignFilterAll: "ALLE",
+ campaignFilterMine: "MEINE",
+ campaignFilterSigned: "UNTERSCHRIEBEN",
+ campaignFilterRecent: "NEU",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "OFFEN",
+ campaignStatusAchieved: "ERREICHT",
+ campaignStatusUnachieved: "NICHT ERREICHT",
+ campaignStatusClosed: "GESCHLOSSEN",
+ campaignSearchPlaceholder: "In Kampagnen suchen...",
+ campaignNoItems: "Keine Kampagnen gefunden.",
+ campaignSignaturesLabel: "Unterschriften",
+ campaignSignaturesTitle: "Unterstützer",
+ campaignNoSignatures: "Noch keine Unterschriften.",
+ campaignSignTitle: "Diese Kampagne unterschreiben",
+ campaignSignPlaceholder: "Warum unterstützt du sie? (optional)",
+ campaignSign: "Unterschreiben",
+ campaignSigned: "Du hast bereits unterschrieben!",
+ campaignNotSigned: "Deine Unterschrift fehlt noch",
+ campaignElevate: "Ins Parlament bringen",
+ campaignElevated: "Ins Parlament gebracht",
+ campaignUpdatesTitle: "Aktualisierungen",
+ campaignNoUpdates: "Noch keine Aktualisierungen.",
+ campaignUpdatePlaceholder: "Was ist passiert?",
+ campaignAddUpdate: "Aktualisierung veröffentlichen",
+ campaignQrAlt: "QR zum Unterschreiben dieser Kampagne",
+ campaignQrCaption: "Scannen zum Unterschreiben",
+ typeCampaign: "KAMPAGNE",
+ typeCampaignSignature: "UNTERSCHRIFT",
+ typeCampaignUpdate: "KAMPAGNEN-AKTUALISIERUNG",
+ statsCampaign: "Kampagnen",
+ statsCampaignSignature: "Kampagnenunterschriften",
+ statsCampaignUpdate: "Kampagnenaktualisierungen",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Eine Kampagne, der du folgst, hat eine Aktualisierung.",
+ campaignBotAchievedTitle: "Eine Kampagne, der du folgst, hat ihr Ziel erreicht.",
+ campaignBotRaisedTitle: "Eine von dir unterschriebene Kampagne wurde ins Parlament gebracht.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Eine von dir gebuchte Route hat sich geändert.",
+ logisticsBotClosedTitle: "Eine von dir gebuchte Route wurde geschlossen.",
+ logisticsBotBookedTitle: "Jemand hat deine Route gebucht.",
+ logisticsBotCancelledTitle: "Eine Buchung deiner Route wurde storniert.",
+ logisticsBotConfirmedTitle: "Deine Buchung wurde bestätigt: das Paket ist unterwegs.",
+ logisticsBotRejectedTitle: "Deine Buchung wurde abgelehnt.",
+ logisticsBotDeliveredTitle: "Dein Paket ist angekommen.",
+ campaignLabel: "KAMPAGNE",
+ campaignGenerateReport: "Bericht erzeugen",
+ logisticsGenerateReport: "Bericht erzeugen",
+ mailingGenerateReport: "Bericht erzeugen",
+ campaignUpdateEdited: "Bearbeitet",
+ mailingMessagesLabel: "Nachrichten",
+ logisticsBookingsLabel: "Buchungen",
+ backupTitle: "Sicherung",
+ modulesBackupLabel: "Sicherung",
+ modulesBackupDescription: "Modul zum Exportieren und Importieren deiner Schlüssel und für verschlüsselte Sicherungen.",
+ backupDescription: "Modul zum Exportieren und Importieren deiner Schlüssel und für verschlüsselte Sicherungen.",
+ backupTypeRecovery: "WIEDERHERSTELLUNG",
+ backupTypeKeys: "SCHLÜSSEL EXPORTIEREN",
+ backupTypeFull: "VOLLSICHERUNG",
+ backupTypeRestore: "SICHERUNG WIEDERHERSTELLEN",
+ backupTypeInstant: "SOFORT",
+ backupInstantDescription: "Ein einfaches .zip deines gesamten Logs und deiner Dateien, ohne geheimen Schlüssel und ohne Passwort. Schnell, aber ",
+ backupInstantRisk: "wer die Datei hat, liest alles.",
+ backupKitPageDescription: "Das Wiederherstellungskit kann nur von diesem Gerät aus geöffnet werden.",
+ backupKitId: "Oasis-ID",
+ backupKitDate: "Erstellt",
+ backupKitQrAlt: "QR-Code deines geheimen Schlüssels",
+ backupKitStep1: "Drucke oder schreibe ihn ab und bewahre ihn sicher und offline auf.",
+ backupKitStep2: "Zur Wiederherstellung installiere Oasis auf einem neuen Gerät und importiere dieses Geheimnis unter Sicherung › Schlüssel.",
+ backupKitStep3: "Vernichte diese Seite, falls sie jemals offengelegt wird.",
+ backupKitPdfButton: "PDF erzeugen",
+ backupScopeLabel: "Umfang",
+ backupScopeAll: "ALLES",
+ backupScopeMine: "NUR MEINE INHALTE",
+ backupSinceLabel: "Seit",
+ backupEstimateTitle: "Schätzung",
+ backupFileInfo: "Deine verschlüsselte Kopie wird auf dein Gerät heruntergeladen (Name: oasis-backup-DATUM.oasisbk)",
+ backupExportButton: "Sicherung herunterladen",
+ backupRestorePassword: "Gib das Passwort ein, das bei der Sicherung verwendet wurde",
+ backupRestoreButton: "Sicherung wiederherstellen",
+ backupRestoredLine: "Sicherung wiederhergestellt.",
+ backupRestoredMessages: "Nachrichten hinzugefügt",
+ backupRestoredSkipped: "Bereits vorhanden",
+ backupRestoredBlobs: "Dateien hinzugefügt",
+ backupRestoredState: "Einstellungen wiederhergestellt",
+ backupRestoredFailed: "Fehlgeschlagen",
+ backupRestoredForked: "Abweichend",
+ backupRestoreRunning: "Die Sicherung wird wiederhergestellt. Diese Seite aktualisiert sich automatisch; du kannst Oasis währenddessen weiter benutzen.",
+ backupRestoreElapsed: "Vergangen",
+ backupRestoreFailedLine: "Die Sicherung konnte nicht wiederhergestellt werden.",
+ backupRestoreForkMine: "Dieses Gerät hat bereits Nachrichten mit deiner Identität veröffentlicht, die nicht in der Sicherung sind, daher konnte die Kopie nicht darüber angewendet werden. Stelle auf einer sauberen Installation direkt nach dem Import deiner Schlüssel wieder her, bevor du etwas anderes tust.",
+ verificationTitle: "Prüfung",
+ verificationDescription: "Prüfe die Kette deines Feeds, erkenne Abzweigungen und sieh dir verwaiste oder fehlende Dateien an.",
+ verificationRun: "Prüfung starten",
+ verificationTotalMessages: "Nachrichten im Log",
+ verificationFeed: "Dein Feed",
+ verificationMessages: "Nachrichten",
+ verificationLastSequence: "letzte Sequenz",
+ verificationGaps: "Lücken",
+ verificationBrokenLinks: "Gebrochene Verweise",
+ verificationBadHashes: "Falsche Hashes",
+ verificationBadSignatures: "Falsche Signaturen",
+ verificationDuplicates: "Doppelte Sequenzen",
+ verificationForks: "Abzweigungen",
+ verificationBlobs: "Dateien",
+ verificationBlobsPresent: "vorhanden",
+ verificationBlobsReferenced: "referenziert",
+ verificationBlobsOrphan: "verwaist",
+ verificationBlobsMissing: "fehlend",
+ verificationBlobsMissingOwn: "Eigene Dateien, die auf diesem Gerät fehlen",
+ verificationBlobsMissingOthers: "Dateien anderer Bewohner noch nicht heruntergeladen",
+ verificationBlobsUnavailable: "Dateien konnten auf diesem Gerät nicht aufgelistet werden.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Modul zum Entdecken und Verwalten von Wikis.",
+ wikiDescription: "Modul zum Entdecken und Verwalten von Wikis.",
+ wikiCreate: "Wiki erstellen",
+ wikiUpdate: "Aktualisieren",
+ wikiDelete: "Löschen",
+ wikiEdit: "Bearbeiten",
+ wikiTitleLabel: "Titel",
+ wikiTitlePlaceholder: "Wiki-Titel...",
+ wikiBodyLabel: "Inhalt",
+ wikiBodyPlaceholder: "Verlinke andere Wikis mit [[Wiki-Titel]] oder [[Wiki-Titel|eigener Text]].\n\nErwähne Bewohner mit @id.\n\nTagge mit #oasis.\n\nFüge Links wie https://solarnethub.com ein\n\nEine Leerzeile beginnt einen neuen Absatz; einfache Zeilenumbrüche bleiben erhalten.\n\nHänge beliebige unterstützte Medien an – sie werden hier eingebettet.",
+ formatBarLabel: "Format",
+ wikiStatusLabel: "Wiki-Typ",
+ wikiStatusOpen: "OFFEN",
+ wikiStatusClosed: "GESCHLOSSEN",
+ wikiTagsLabel: "Tags",
+ wikiTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ wikiSummaryLabel: "Zusammenfassung der Änderung",
+ wikiSummaryPlaceholder: "Was hat sich geändert?",
+ wikiFilterAll: "ALLE",
+ wikiFilterMine: "MEINE",
+ wikiFilterRecent: "NEUESTE",
+ wikiFilterLinked: "VERKNÜPFT",
+ wikiChanges: "Letzte Änderungen",
+ wikiNoPages: "Keine Wikis gefunden.",
+ wikiNoChanges: "Noch keine Änderungen.",
+ wikiHistory: "Verlauf",
+ wikiVersion: "Version",
+ wikiVersions: "Versionen",
+ wikiRestore: "Wiederherstellen",
+ wikiDiff: "Änderungen",
+ wikiViewVersion: "Ansehen",
+ wikiLinkedPages: "Verknüpfte Seiten",
+ wikiNoLinkedPages: "Diese Seite ist noch mit keiner anderen verknüpft.",
+ wikiMissingLink: "Seite existiert noch nicht",
+ wikiDuplicateTitle: "Es gibt bereits eine Seite mit diesem Titel. Ändere den Titel, um eine andere Seite anzulegen.",
+ wikiCreateSectionTitle: "Wiki erstellen",
+ wikiUpdateSectionTitle: "Wiki aktualisieren",
+ wikiSearchPlaceholder: "Im Wiki suchen...",
+ wikiCurrentVersion: "Aktuelle Version",
+ wikiViewingVersion: "Du siehst eine alte Version",
+ wikiBackToPage: "Zurück zur Seite",
+ wikiLinkedChip: "Verknüpft",
+ wikiRestoredSummary: "Wiederhergestellte Version",
+ wikiExportPdf: "Seite erzeugen",
+ wikiPreview: "Vorschau",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Wiki erstellen",
+ tribeWikiEmpty: "Noch keine Wikis.",
+ typeWiki: "WIKI",
padsTitle: "Pads",
padTitle: "Pad",
modulesPadsLabel: "Pads",
@@ -3046,21 +3802,133 @@ module.exports = {
padTitleLabel: "Titel",
padTitlePlaceholder: "Pad-Titel eingeben...",
padStatusLabel: "Status",
+ padTypeLabel: "Pad-Typ",
padStatusOpen: "OFFEN",
padStatusInviteOnly: "NUR AUF EINLADUNG",
padStatusClosed: "GESCHLOSSEN",
padDeadlineLabel: "Frist",
padTagsLabel: "Tags",
- padTagsPlaceholder: "tag1, tag2, ...",
+ padTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
padMembersLabel: "Mitglieder",
padCreated: "Erstellt",
- padStartEditing: "BEARBEITUNG STARTEN!",
+ padStartEditing: "Bearbeiten",
padEditorPlaceholder: "Schreiben beginnen...",
padSubmitEntry: "Senden",
padNoEntries: "Noch keine Einträge.",
padAllSectionTitle: "Alle Pads",
padMineSectionTitle: "Meine Pads",
padsDescription: "Verwalte kollaborative verschlüsselte Texteditoren in deinem Netzwerk.",
+ roomsTitle: "Räume",
+ roomsDescription: "Entdecke verschlüsselte Videokonferenzräume in deinem Netzwerk und tritt ihnen bei.",
+ modulesRoomsLabel: "Räume",
+ modulesRoomsDescription: "Modul zum Entdecken und Betreten verschlüsselter Videokonferenzräume.",
+ roomFilterRecent: "NEUESTE",
+ roomFilterMine: "MEINE",
+ roomFilterAll: "ALLE",
+ roomFilterLive: "LIVE",
+ roomFilterOpen: "OFFEN",
+ roomFilterInvite: "NUR AUF EINLADUNG",
+ roomFilterClosed: "GESCHLOSSEN",
+ roomCreate: "Raum erstellen",
+ roomUpdate: "Aktualisieren",
+ roomDelete: "Löschen",
+ roomClose: "Schließen",
+ roomCreateSectionTitle: "Raum erstellen",
+ roomUpdateSectionTitle: "Raum aktualisieren",
+ roomTitlePlaceholder: "Titel des Raums",
+ roomDescriptionLabel: "Beschreibung",
+ roomDescriptionPlaceholder: "Worüber wollt ihr sprechen?",
+ roomTypeLabel: "Raumtyp",
+ roomTagsLabel: "Tags",
+ roomStatusOpen: "OFFEN",
+ roomStatusInviteOnly: "NUR AUF EINLADUNG",
+ roomStatusClosed: "GESCHLOSSEN",
+ roomParticipants: "Teilnehmer",
+ roomJoin: "Beitreten",
+ roomLeave: "Verlassen",
+ roomFull: "Raum voll",
+ roomLiveChip: "LIVE",
+ roomMuted: "stumm",
+ roomRec: "Audio aufnehmen",
+ roomRecStop: "Aufnahme beenden",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} hat den Raum betreten",
+ roomEventLeft: "{name} hat den Raum verlassen",
+ roomEventRecStart: "{name} hat die Aufnahme gestartet",
+ roomEventRecStop: "{name} hat die Aufnahme beendet",
+ roomEventMuted: "{name} hat sich stummgeschaltet",
+ roomEventUnmuted: "{name} hat die Stummschaltung aufgehoben",
+ roomEventHand: "{name} hat die Hand gehoben",
+ roomRaiseHand: "Hand heben",
+ roomLowerHand: "Hand senken",
+ confirmActionTitle: "Diese Aktion bestätigen",
+ confirmActionButton: "Bestätigen",
+ confirmJoinText: "Du bist dabei, mit dieser Einladung beizutreten.",
+ confirmFollowText: "Du bist dabei, diese Bewohnerin bzw. diesen Bewohner zu unterstützen.",
+ confirmSignText: "Du bist dabei, diese Kampagne zu unterzeichnen.",
+ confirmDownloadText: "Du bist dabei, diese Datei auf dein Gerät herunterzuladen.",
+ roomRecordings: "Aufnahmen",
+ roomClearNotices: "Leeren",
+ roomLineSwitchboard: "Zentrale",
+ roomLineDndError: "Die Nummer dieses Raums nimmt keine Anrufe an.",
+ roomNumberHint: "Wähle diese Nummer im Telefon, um den Raum zu betreten.",
+ liveRefresh: "Aktualisieren",
+ roomNobody: "Gerade ist niemand im Raum.",
+ roomSomeone: "{n} gerade im Raum.",
+ roomYou: "du",
+ roomYouAreIn: "Du bist drin",
+ roomNobodyInside: "Gerade ist niemand in diesem Raum.",
+ roomErrorFull: "Der Raum ist voll. Du kannst beitreten, sobald jemand geht.",
+ roomErrorUnreachable: "Der Raum ist gerade nicht erreichbar. Versuche es später erneut.",
+ roomErrorBusy: "Du bist bereits in einem Anruf oder in einem anderen Raum.",
+ roomErrorClosed: "Dieser Raum ist geschlossen.",
+ roomAccessDenied: "Dieser Raum ist nur auf Einladung. Du brauchst eine Einladung, um beizutreten.",
+ roomsNoItems: "Keine Räume gefunden.",
+ roomSearchPlaceholder: "Räume suchen...",
+ roomInviteMode: "Einladung",
+ tribeSectionRooms: "RÄUME",
+ tribeRoomCreate: "Raum erstellen",
+ tribeRoomsEmpty: "Noch keine Räume.",
+ typeRoom: "RÄUME",
+ typeRoomMember: "RAUMTEILNEHMER",
+ statsRoom: "Räume",
+ statsRoomMember: "Raumteilnehmer",
+ favoritesFilterRooms: "RÄUME",
+ invitesRoomsTitle: "Räume",
+ inviteCodeInvalid: "Dieser Einladungscode ist ungültig oder wurde schon benutzt.",
+ inviteAlreadyMember: "Du bist schon dabei. Du kannst es über sein Modul öffnen.",
+ actionFailed: "Das hat nicht geklappt. Bitte versuche es erneut.",
+ publishTooShort: "Dein Beitrag ist zu kurz.",
+ walletSendFailed: "Die Zahlung konnte nicht gesendet werden: {reason}",
+ pixeliaCoordsError: "Diese Koordinaten liegen außerhalb des Rasters.",
+ courtsErrTitle: "Ein Titel ist erforderlich.",
+ courtsErrRespondent: "Gib an, gegen wen sich der Fall richtet.",
+ courtsErrRespondentId: "Das ist keine gültige Oasis-ID.",
+ courtsErrMethod: "Wähle, wie der Fall gelöst wird.",
+ courtsErrCaseNotFound: "Dieser Fall wurde nicht gefunden.",
+ courtsErrBrief: "Schreibe deine Antwort.",
+ courtsErrStance: "Wähle deine Haltung.",
+ courtsErrResult: "Schreibe das Ergebnis.",
+ courtsErrTerms: "Schreibe die Bedingungen der Einigung.",
+ courtsErrMediator: "Füge mindestens eine vermittelnde Person hinzu.",
+ courtsErrSelfMediator: "Du kannst in deinem eigenen Fall nicht vermitteln.",
+ courtsErrJudge: "Wähle eine richtende Person.",
+ courtsErrSelfJudge: "Du kannst nicht über deinen eigenen Fall richten.",
+ courtsErrVisibility: "Wähle, wer den Fall sehen kann.",
+ courtsErrNomination: "Diese Nominierung wurde nicht gefunden.",
+ opinionAlreadyGiven: "Du hast deine Meinung schon abgegeben.",
+ cipherPasswordShort: "Das Passwort muss mindestens 32 Zeichen lang sein.",
+ errorForbidden: "Darauf hast du keinen Zugriff.",
+ errorNotFound: "Das wurde nicht gefunden.",
+ errorClosed: "Das ist geschlossen.",
+ errorInviteOnly: "Das ist nur auf Einladung. Du brauchst eine Einladung.",
+ errorTooLong: "Dieser Text ist zu lang.",
+ errorRequired: "Es fehlen Pflichtangaben.",
+ errorInvalid: "Einige Angaben sind ungültig.",
+ errorNotAuthor: "Nur wer es erstellt hat, kann das tun.",
+ panicRemoved: "Deine Blockchain wurde gelöscht.",
padRecentSectionTitle: "Aktuelle Pads",
padOpenSectionTitle: "Offene Pads",
padClosedSectionTitle: "Geschlossene Pads",
@@ -3072,7 +3940,7 @@ module.exports = {
padRemoveFavorite: "Aus Favoriten Entfernen",
padClose: "Schließen",
padBackToEditor: "Zurück zum Editor",
- padSearchPlaceholder: "Pads suchen...",
+ padSearchPlaceholder: "In Pads suchen...",
gamesTitle: "Spiele",
gamesDescription: "Entdecke und spiele einige Spiele.",
gamesFilterAll: "ALLE",
@@ -3102,24 +3970,28 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Werfe eine Münze und wette auf Kopf oder Zahl. Wie viel Glück hast du?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
+ games8BallDesc: "Billard von oben. Klicken zum Zielen, gedrückt halten zum Aufladen. Versenke alle Kugeln mit möglichst wenigen Stößen.",
+ gamesArtilleryTitle: "Artillerie",
+ gamesArtilleryDesc: "Richte deine Kanone aus, berücksichtige den Wind und triff das Ziel. 5 Runden, die wenigsten Schüsse gewinnen.",
gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ gamesLabyrinthDesc: "Entkomme dem Labyrinth, bevor dir die Züge ausgehen. Jedes Level wird größer und schwerer.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Friss alle Punkte, weiche den Geistern aus. Die Geister bewegen sich in Echtzeit — bleib in Bewegung!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
+ gamesAudioPendulumTitle: "Klangpendel",
+ gamesAudioPendulumDesc: "Chaotischer Physiksimulator mit Echtzeit-Audiosynthese. Winkelgeschwindigkeiten werden zu Frequenzen, Spitzen zu Trommelschlägen. Keine zwei Simulationen klingen gleich.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Mische Visuals live auf zwei Decks: wähle je ein Muster, stelle Tempo, Farbe und Zoom ein, blende zwischen beiden über und lass es im Takt blitzen. Tippe das Tempo oder lass das Mikrofon den Puls vorgeben.",
+ gamesTetrisDesc: "Klassische fallende Blöcke. Räume Reihen ab, um zu punkten. Wie lange hältst du durch?",
+ gamesMinesweeperTitle: "Minesweeper",
+ gamesMinesweeperDesc: "Klassische Minensuche. Räume das Feld, um aufzusteigen — größere Felder, mehr Minen, höhere Punktzahl.",
+ gamesFilterScoring: "PUNKTESTAND",
+ gamesHallOfFame: "Ruhmeshalle",
+ gamesHallPlayer: "Spieler",
+ gamesHallScore: "Punktzahl",
gamesNoScores: "Noch keine Ergebnisse.",
modulesChatsLabel: "Chats",
- modulesChatsDescription: "Modul zum Entdecken und Verwalten verschlüsselter Chats.",
+ modulesChatsDescription: "Modul zum Entdecken und Verwalten von Chats.",
chatsTitle: "Chats",
chatMineSectionTitle: "Meine Chats",
chatRecentTitle: "Aktuelle Chats",
@@ -3140,34 +4012,172 @@ module.exports = {
chatMessagesLabel: "Nachrichten",
chatThreadsLabel: "Threads",
chatCreatedAt: "ERSTELLT",
- chatSearchPlaceholder: "Chats suchen...",
+ chatSearchPlaceholder: "In Chats suchen...",
chatStatusOpen: "OFFEN",
chatStatusInviteOnly: "NUR AUF EINLADUNG",
chatStatusClosed: "GESCHLOSSEN",
chatSendMessage: "Senden",
chatJumpLatest: "Neueste Nachricht",
+ chatReply: "Antworten",
+ chatReplyCancel: "Antwort abbrechen",
+ chatPin: "Anheften",
+ chatUnpin: "Lösen",
+ chatPinned: "Angeheftet",
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",
+ activitySearchPlaceholder: "In Aktivität suchen...",
+ trendingSearchPlaceholder: "In Trends suchen...",
+ opinionsSearchPlaceholder: "In Meinungen suchen...",
+ votesSearchPlaceholder: "In Abstimmungen suchen...",
+ gamesSearchPlaceholder: "In Spiele suchen...",
+ schoolTitle: "Schule",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Eine Wiki-Seite, der du folgst, wurde bearbeitet.",
+ wikiBotRestoredTitle: "Eine frühere Version einer Wiki-Seite, der du folgst, wurde wiederhergestellt.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Ein neuer Student hat sich in deinen Kurs eingeschrieben.",
+ schoolBotInvitedTitle: "Du wurdest zu einem Kurs eingeladen.",
+ schoolBotAdmittedTitle: "Du wurdest in einen Kurs aufgenommen.",
+ schoolBotCertificateTitle: "Du hast ein Zertifikat erhalten.",
+ schoolBotPassedTitle: "Ein Student hat deinen Kurs bestanden.",
+ schoolBotLessonTitle: "Eine neue Lektion wurde veröffentlicht.",
+ invitesSchoolTitle: "Schule",
+ schoolEnrollLabel: "Kurs beitreten",
+ schoolExamRetryLater: "Du kannst es nach 24 Stunden erneut versuchen.",
+ schoolApproved: "BESTANDEN",
+ schoolExamPassMark: "Bestehensgrenze (0-10)",
+ schoolExamPassed: "BESTANDEN",
+ schoolExamPending: "Ausstehend",
+ schoolExamFailed: "NICHT BESTANDEN",
+ schoolExamAddQuestion: "Frage hinzufügen",
+ schoolExamCreateQuestion: "Frage erstellen",
+ schoolExamOption: "Option",
+ schoolExamCorrect: "Richtige Option",
+ schoolExamPoints: "Punkte",
+ schoolMaterialTextPlaceholder: "Notizen zu dieser Lektion...",
+ schoolMaterials: "Materialien",
+ schoolAddMaterial: "Material hinzufügen",
+ schoolNoMaterials: "Noch keine Materialien.",
+ bankYourSchoolBalance: "Deine Schul-Einnahmen",
+ schoolProgress: "Fortschritt",
+ schoolProgressMark: "Als abgeschlossen markieren",
+ schoolProgressDone: "Abgeschlossen",
+ schoolExams: "Prüfungen",
+ schoolExamCreate: "Prüfung erstellen",
+ schoolExamTitlePlaceholder: "Titel der Prüfung",
+ schoolExamHelp: "Eine Frage pro Zeile: Frage? ; Option ; richtige Option* ; Option",
+ schoolExamQuestionsPlaceholder: "Was ist SSB? ; Eine Datenbank ; Ein P2P-Protokoll* ; Ein Browser",
+ schoolExamSubmit: "Antworten absenden",
+ schoolExamScore: "Deine Punktzahl",
+ schoolNoScoresYet: "Noch keine Ergebnisse.",
+ schoolLessonUnit: "Einheit / Phase",
+ schoolLessonUnitPlaceholder: "z. B. Phase 1",
+ schoolLessonOrder: "Reihenfolge",
+ profileClearnetSchoolLabel: "Schule",
+ schoolStartDate: "Startdatum",
+ schoolSessionDate: "Sitzungsdatum",
+ schoolCourseChat: "Kurs-Chat",
+ agendaFilterSchool: "SCHULE",
+ agendaFilterCampaigns: "KAMPAGNEN",
+ agendaFilterLogistics: "LOGISTIK",
+ schoolCourseType: "Kursart",
+ schoolTypeOpen: "OFFEN",
+ schoolTypePaid: "KOSTENPFLICHTIG",
+ schoolTypeInvite: "NUR MIT EINLADUNG",
+ schoolLessonLocked: "Verschlüsselte Lektion — bitte den Lehrer um den Kursschlüssel.",
+ schoolGrantAccess: "Kursschlüssel senden",
+ schoolKeySent: "Schlüssel gesendet",
+ schoolOngoing: "Laufend",
+ schoolFilterApplied: "ANGEMELDET",
+ schoolFilterOpen: "OFFEN",
+ schoolFilterFavorites: "FAVORITEN",
+ schoolPendingPayment: "Zahlung ausstehend",
+ schoolPendingStudents: "Ausstehende Einschreibungen",
+ schoolViewBill: "Rechnung ansehen",
+ schoolPaymentNote: "Die Einschreibung erzeugt eine ECO-Rechnung (einen Transfer). Deine Einschreibung ist bestätigt, sobald der Transfer signiert ist.",
+ schoolCloseCourse: "Kurs schließen",
+ schoolReopenCourse: "Kurs wieder öffnen",
+ schoolDescription: "Lehre und lerne Kurse in deinem Netzwerk.",
+ schoolFilterAll: "ALLE",
+ schoolFilterMine: "MEINE",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "NEUESTE",
+ schoolCreateButton: "Kurs Erstellen",
+ schoolCreateSectionTitle: "Kurs erstellen",
+ schoolUpdateSectionTitle: "Kurs aktualisieren",
+ schoolCourseTitlePlaceholder: "Name deines Kurses",
+ schoolCourseDescriptionPlaceholder: "Was wirst du in diesem Kurs unterrichten?",
+ schoolCourseImage: "Kursbild (max. Größe: 75MB)",
+ schoolTags: "Tags",
+ schoolTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ schoolPrice: "Preis (ECO)",
+ schoolVisibility: "Sichtbarkeit",
+ schoolVisibilityPublic: "Öffentlich",
+ schoolVisibilityInvite: "Auf Einladung",
+ schoolStatus: "Status",
+ schoolClosed: "Geschlossen",
+ schoolFree: "Kostenlos",
+ schoolCreate: "Kurs erstellen",
+ schoolUpdate: "Kurs aktualisieren",
+ schoolSearchPlaceholder: "In Schule suchen...",
+ schoolSortTitle: "Titel",
+ schoolNoCourses: "Keine Kurse gefunden.",
+ schoolStudents: "Studenten",
+ schoolTeacher: "Lehrer",
+ schoolCreatedAt: "ERSTELLT",
+ schoolLessons: "Lektionen",
+ schoolNoLessons: "Noch keine Lektionen.",
+ schoolEnrollToSee: "Schreibe dich ein, um die Lektionen dieses Kurses zu sehen.",
+ schoolEnrollButton: "EINSCHREIBEN",
+ schoolUnenrollButton: "Kurs verlassen",
+ schoolInviteRequired: "Dieser Kurs ist nur auf Einladung.",
+ schoolTeacherPanel: "Lehrerbereich",
+ schoolStudentPanel: "Schülerbereich",
+ schoolAddLesson: "Lektion erstellen",
+ schoolLessonTitlePlaceholder: "Titel der Lektion",
+ schoolLessonTextPlaceholder: "Beschreibe die Inhalte dieser Lektion...",
+ schoolInviteStudents: "Studenten einladen",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "EINLADEN",
+ schoolInvited: "Eingeladen",
+ schoolIssueCertificate: "Zertifikat erstellen",
+ schoolCertified: "Zertifiziert",
+ schoolCertificateTextPlaceholder: "Zertifikatsnotiz (optional)",
+ schoolLessonOpen: "Lektion öffnen",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Zertifikate",
+ schoolNoCertificates: "Noch keine Zertifikate ausgestellt.",
+ schoolEditButton: "Bearbeiten",
+ schoolDeleteButton: "Löschen",
+ typeSchool: "SCHULE",
+ schoolCourseLabel: "KURS",
+ emergencyLabel: "NOTFALL",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Kurse",
+ statsSchoolLesson: "Lektionen",
+ statsSchoolEnroll: "Einschreibungen",
+ statsSchoolCertificate: "Schulzertifikate",
+ modulesSchoolLabel: "Schule",
+ modulesSchoolDescription: "Modul zum Wissensaustausch.",
+ welcomeStepUxAction: "Ansicht speichern",
+ welcomeStepWorkflowTitle: "Welche Nutzung von OASIS hast du im Sinn?",
+ welcomeStepWorkflowText: "Oasis hat viele Module. Wähle die Konfiguration, die zu dir passt, und nur die nützlichen bleiben aktiv. Du kannst sie jederzeit unter Module anpassen.",
+ welcomeStepWorkflowAction: "Konfiguration speichern",
+ welcomeWorkflow_full: "Standard",
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.",
chatTitlePlaceholder: "Chat-Titel",
chatDescriptionPlaceholder: "Chat-Beschreibung",
- chatTagsPlaceholder: "tag1, tag2, tag3",
+ chatTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
chatImageLabel: "Bilddatei auswählen (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Autor",
chatAddFavorite: "Zu Favoriten Hinzufügen",
chatRemoveFavorite: "Aus Favoriten Entfernen",
chatPM: "PM",
chatStatusLabel: "Status",
+ chatTypeLabel: "Chat-Typ",
chatCategoryLabel: "Kategorie",
calendarsTitle: "Kalender",
calendarTitle: "Kalender",
@@ -3176,15 +4186,15 @@ module.exports = {
typeCalendar: "KALENDER",
calendarCreate: "Kalender erstellen",
calendarUpdate: "Aktualisieren",
- calendarDelete: "Löschen",
calendarTitleLabel: "Titel",
calendarTitlePlaceholder: "Kalendertitel...",
calendarStatusLabel: "Status",
+ calendarTypeLabel: "Kalender-Typ",
calendarStatusOpen: "OFFEN",
calendarStatusClosed: "GESCHLOSSEN",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Frist",
calendarTagsLabel: "Tags",
- calendarTagsPlaceholder: "tag1, tag2...",
+ calendarTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
calendarParticipantsLabel: "Teilnehmer",
calendarCreated: "Erstellt",
calendarJoin: "Beitreten",
@@ -3195,11 +4205,11 @@ module.exports = {
calendarNotePlaceholder: "Notiz hinzufügen...",
calendarFirstDateLabel: "Datum",
calendarFirstNoteLabel: "Notizen",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Intervall",
calendarIntervalNone: "Keine Wiederholung",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Wöchentlich",
+ calendarIntervalMonthly: "Monatlich",
+ calendarIntervalYearly: "Jährlich",
calendarFormDescription: "Beschreibung",
calendarNoDates: "Noch keine Daten hinzugefügt.",
calendarNoNotes: "Keine Notizen.",
@@ -3207,6 +4217,8 @@ module.exports = {
calendarsDescription: "Entdecke und verwalte Kalender in deinem Netzwerk.",
calendarMonthPrev: "← Zurück",
calendarMonthNext: "Weiter →",
+ calendarMonthNames: "Januar,Februar,März,April,Mai,Juni,Juli,August,September,Oktober,November,Dezember",
+ calendarDayInitials: "Mo,Di,Mi,Do,Fr,Sa,So",
calendarAllSectionTitle: "Kalender",
calendarRecentSectionTitle: "Kürzliche Kalender",
calendarFavoritesSectionTitle: "Favoriten",
@@ -3216,9 +4228,9 @@ module.exports = {
calendarCreateSectionTitle: "Neuen Kalender erstellen",
calendarUpdateSectionTitle: "Kalender aktualisieren",
calendarAddFavorite: "Zu Favoriten hinzufügen",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Löschen",
calendarRemoveFavorite: "Aus Favoriten entfernen",
- calendarSearchPlaceholder: "Kalender suchen...",
+ calendarSearchPlaceholder: "In Kalender suchen...",
calendarAddEntry: "Eintrag hinzufügen",
statsCalendar: "Kalender",
statsCalendarDate: "Kalenderdaten",
@@ -3230,6 +4242,146 @@ module.exports = {
tribeContentAccessDenied: "Zugang Verweigert",
tribeContentAccessDeniedMsg: "Dieser Inhalt gehört zu einem Stamm. Sie müssen Mitglied sein, um darauf zuzugreifen.",
tribeViewTribes: "Stämme Anzeigen",
+ tribeFilesEmpty: "Noch keine Dateien.",
+ filesLabel: "Dateien",
+ profileClearnetFilesLabel: "Dateien",
+ filesTitle: "Dateien",
+ filesDescription: "Dateien in Ihrem Netzwerk erkunden und verwalten.",
+ fileAllSectionTitle: "Dateien",
+ fileMineSectionTitle: "Ihre Dateien",
+ fileRecentSectionTitle: "Neueste Dateien",
+ fileTopSectionTitle: "Top Dateien",
+ fileFavoritesSectionTitle: "Favoriten",
+ fileFilterAll: "ALLE",
+ fileFilterMine: "MEINE",
+ fileFilterRecent: "NEUESTE",
+ fileFilterTop: "TOP",
+ fileFilterFavorites: "FAVORITEN",
+ fileCreateSectionTitle: "Datei Hochladen",
+ fileUpdateSectionTitle: "Datei Aktualisieren",
+ fileCreateButton: "Datei Hochladen",
+ fileUpdateButton: "Aktualisieren",
+ fileAddFavoriteButton: "Zu Favoriten Hinzufügen",
+ fileRemoveFavoriteButton: "Aus Favoriten Entfernen",
+ fileFileLabel: "Datei auswählen (max: 75MB)",
+ calendarFilterRecent: "NEUESTE",
+ calendarFilterAll: "ALLE",
+ calendarFilterMine: "MEINE",
+ calendarFilterFavorites: "FAVORITEN",
+ calendarFilterOpen: "OFFEN",
+ calendarFilterClosed: "GESCHLOSSEN",
+ padFilterRecent: "NEUESTE",
+ padFilterAll: "ALLE",
+ padFilterMine: "MEINE",
+ padFilterOpen: "OFFEN",
+ padFilterClosed: "GESCHLOSSEN",
+ chatFilterRecent: "NEUESTE",
+ chatFilterAll: "ALLE",
+ chatFilterMine: "MEINE",
+ chatFilterFavorites: "FAVORITEN",
+ chatFilterOpen: "OFFEN",
+ chatFilterClosed: "GESCHLOSSEN",
+ licenseLabel: "Lizenz",
+ phoneTitle: "Telefon",
+ phoneDescription: "Verwalte deine Ende-zu-Ende-verschlüsselten Videoanrufe.",
+ phoneUnavailable: "Anrufe sind auf diesem Gerät nicht verfügbar.",
+ phoneCallButton: "Anrufen",
+ profileVisibilityPhone: "Telefonnummer",
+ phoneNumberUnknown: "Niemand in deinem Netzwerk hat die Nummer {number}.",
+ phoneNumberChoose: "Prüfe, wen du unter {number} anrufen möchtest:",
+ phoneAnswer: "Annehmen",
+ phoneSpeaker: "Lautsprecher",
+ phoneEarpiece: "Hörer",
+ phoneReject: "Ablehnen",
+ phoneHangup: "Auflegen",
+ phoneMute: "Stummschalten",
+ phoneUnmute: "Mikrofon an",
+ phoneCameraOn: "Kamera an",
+ phoneCameraOff: "Kamera aus",
+ settingsPhoneVideo: "Video",
+ settingsPhoneVideoOn: "In Anrufen und Räumen erlaubt",
+ settingsPhoneVideoOff: "Nur Audio",
+ phoneSilence: "Nicht hören",
+ phoneUnsilence: "Wieder hören",
+ phoneCalling: "Anruf an",
+ phoneIsCalling: "ruft dich an",
+ notifyNewPmFrom: "Neue PN von",
+ notifyNewPamFrom: "Neue PaM von",
+ notifyUpdateLabel: "Update",
+ updateInstalledLabel: "Installierte Version",
+ updateAvailableLabel: "Verfügbare Version",
+ updateChangesLabel: "Änderungen",
+ updateFilesLabel: "Dateien",
+ updateOriginLabel: "Quelle",
+ phoneRecording: "PaM wird aufgenommen für",
+ phoneLeaveMessage: "Niemand nimmt ab: Hinterlasse deine Nachricht nach dem Signalton.",
+ phoneLeaveMessageBusy: "Gerade in einem anderen Gespräch: Hinterlasse deine Nachricht nach dem Signalton.",
+ phoneLeaveMessageUnreachable: "Nicht erreichbar: Hinterlasse deine Nachricht nach dem Signalton.",
+ phoneConnecting: "Verbindung zu",
+ phoneSendPam: "PaM senden",
+ phoneCancel: "Abbrechen",
+ phoneSearchPlaceholder: "In Telefon suchen...",
+ phonePamTitle: "Audioaufnahmen",
+ phoneNew: "Neu",
+ phoneDelete: "Löschen",
+ phoneNoPams: "Du hast keine Audioaufnahmen.",
+ phoneHistoryTitle: "Verlauf",
+ phoneLatestTitle: "Letzte Anrufe",
+ phoneCreateButton: "Neuer Anruf",
+ phoneLimitsHint: "Bis zu 7 Bewohner pro Anruf; mit mehr als einem ist es ein gemeinsamer Anruf.",
+ phoneErrorPub: "Pubs können nicht angerufen werden.",
+ phoneJointCall: "Gemeinsamer Anruf",
+ phoneWith: "Mit",
+ phoneResult: "Ergebnis",
+ phoneWhen: "Wann",
+ phoneDuration: "Dauer",
+ phoneOutgoing: "Ausgehend",
+ phoneIncoming: "Eingehend",
+ phoneNoHistory: "Noch keine Protokolle.",
+ phoneOutcomeEnded: "Angenommen",
+ phoneOutcomeMissed: "Verpasst",
+ phoneOutcomeRejected: "Abgelehnt",
+ phoneOutcomeNoanswer: "Keine Antwort",
+ phoneOutcomeCancelled: "Abgebrochen",
+ phoneOutcomePam: "PaM gesendet",
+ phoneOutcomeFailed: "Fehlgeschlagen",
+ phoneDialAdd: "Hinzufügen",
+ phoneDialBack: "Löschen",
+ phoneDialClear: "Leeren",
+ phoneDialPlaceholder: "Nummer oder Oasis-ID",
+ phoneDialInhabitants: "Bewohner",
+ phoneDialRemove: "Entfernen",
+ phoneOwnNumber: "Das ist deine eigene Nummer.",
+ phoneSettingsDesc: "Wähle, wer dich anrufen kann.",
+ phoneDnd: "Nicht stören",
+ phoneOpen: "Offen",
+ phoneRecipientRefuses: "Der Bewohner, den du anrufen möchtest, nimmt keine Anrufe an.",
+ phoneRefusedNotice: "Diese Bewohner nehmen keine Anrufe an und wurden nicht angerufen:",
+ fileEmptyError: "Die Datei ist leer. Wähle eine andere Datei.",
+ fileTitleLabel: "Titel",
+ fileTitlePlaceholder: "Titel",
+ fileDescriptionLabel: "Beschreibung",
+ fileDescriptionPlaceholder: "Beschreibung",
+ fileTagsLabel: "Tags",
+ fileTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
+ fileSizeLabel: "Größe",
+ fileDownloadButton: "HERUNTERLADEN",
+ fileDetailsButton: "DETAILS",
+ fileNoFile: "Keine Datei-Datei",
+ fileSearchPlaceholder: "In Dateien suchen...",
+ fileSearchButton: "Suchen",
+ fileSortRecent: "Neueste",
+ fileSortOldest: "Älteste",
+ fileSortTop: "Meistgewählt",
+ fileNoMatch: "Keine passenden Dateien.",
+ fileUpdatedAt: "Aktualisiert",
+ typeFile: "DATEIEN",
+ modulesFilesLabel: "Dateien",
+ modulesFilesDescription: "Modul zum Entdecken und Verwalten von Dateien.",
+ tribeSectionFiles: "DATEIEN",
+ fileDescription: "Beschreibung",
+ fileDownload: "Herunterladen",
+ fileTypeLabel: "Typ",
torrentsTitle: "Torrents",
torrentsDescription: "Torrents in Ihrem Netzwerk erkunden und verwalten.",
torrentAllSectionTitle: "Torrents",
@@ -3257,10 +4409,33 @@ module.exports = {
torrentTagsLabel: "Tags",
torrentTagsPlaceholder: "Tags durch Kommas getrennt eingeben",
torrentSizeLabel: "Größe",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Torrent erzeugen",
+ torrentFromContentMissing: "Die Datei ist auf diesem Knoten noch nicht verfügbar. Versuche es später erneut.",
+ torrentDownloads: "Downloads",
+ torrentFetchOasis: "In Oasis herunterladen",
+ torrentSaveFile: "Datei speichern",
+ torrentSeeds: "Seeds",
+ seedsLabel: "Seeds",
+ seedAction: "Unterstützen",
+ torrentSourceFile: "Datei",
+ torrentStateQueued: "In Warteschlange",
+ torrentStateProbing: "Suche Seeds",
+ torrentStateDownloading: "Lädt herunter",
+ torrentStateDone: "Abgeschlossen",
+ torrentStateFailed: "Fehlgeschlagen",
+ torrentStateNoSource: "Keine Seeds verbunden, warte",
+ torrentStateCancelled: "Abgebrochen",
+ torrentNoDownloads: "Noch keine Downloads.",
+ torrentOriginalSection: "Original",
+ torrentCancel: "Abbrechen",
+ torrentDownloadButton: "HERUNTERLADEN",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETAILS",
torrentNoFile: "Keine Torrent-Datei",
noTorrents: "Keine Torrents gefunden.",
- torrentSearchPlaceholder: "Titel, Tags, Autor suchen...",
+ noFiles: "Keine Dateien gefunden.",
+ torrentSearchPlaceholder: "In Torrents suchen...",
torrentSearchButton: "Suchen",
torrentSortRecent: "Neueste",
torrentSortOldest: "Älteste",
@@ -3268,10 +4443,12 @@ module.exports = {
torrentNoMatch: "Keine passenden Torrents.",
torrentUpdatedAt: "Aktualisiert",
statsTorrent: "Torrents",
+ statsFile: "Dateien",
typeTorrent: "TORRENTS",
modulesTorrentsLabel: "Torrents",
modulesTorrentsDescription: "Modul zum Entdecken und Verwalten von Torrents.",
favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "DATEIEN",
favoritesFilterMarket: "MARKT",
favoritesFilterEvents: "EREIGNISSE",
favoritesFilterForum: "FORUM",
@@ -3285,15 +4462,17 @@ module.exports = {
favoritesFilterShopProducts: "SHOP-ARTIKEL",
tribeSectionTorrents: "TORRENTS",
tribeCreateTorrent: "Torrent Hochladen",
+ tribeCreateFile: "Datei hochladen",
settingsWishTitle: "Wunsch",
- settingsWishDesc: "Konfiguriere den Wunsch deines Avatars.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Legt fest, wie du auf alle Inhalte zugreifst und wie du das Oasis-Netzwerk erlebst.",
+ settingsWishWhole: "Multiversum",
+ settingsWishMutuals: "Nur gegenseitige Unterstützung",
+ settingsWishOnlyLan: "Nur LAN",
+ settingsWishLocal: "Lokal",
settingsPmVisibilityTitle: "Private Nachrichten",
settingsPmVisibilityDesc: "Konfiguriere dein Niveau der Offenlegung für private Nachrichten.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Multiversum",
+ settingsPmVisibilityMutuals: "Nur gegenseitige Unterstützung",
pmMutualNotice: "Ausgang ist ein UX-Schutz. Eingang ist ein Aufmerksamkeitsfilter.",
inhabitantsPendingFollowsTitle: "Ausstehende Unterstützungsanfragen",
inhabitantsPendingAccept: "Akzeptieren",
@@ -3337,7 +4516,7 @@ module.exports = {
tribeGovNoRevocations: "Noch kein Widerruf",
tribeGovNoHistorical: "Noch kein Eintrag",
logsTitle: "Logbuch",
- logsDescription: "Erfasse deine Erfahrung im Netzwerk.",
+ logsDescription: "Führe ein privates Tagebuch deiner Erfahrungen.",
logsViewTitle: "Logbuch",
logsColumnType: "Typ",
logsView: "Ansehen",
@@ -3346,7 +4525,7 @@ module.exports = {
logsCreateTitle: "Eintrag erstellen",
logsWriteButton: "Schreiben",
logsTextPlaceholder: "Beschreibe deine Erfahrungen...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "KI-Assistent",
logsModeManual: "Manuell",
logsModeAI: "KI",
logsColumnLog: "Logbuch",
@@ -3365,19 +4544,20 @@ module.exports = {
logsExportOne: "Log exportieren",
logsViewDetails: "Details ansehen",
logsGenerateButton: "Text generieren",
- logsSearchText: "In Logbüchern suchen...",
+ logsSearchText: "In Logbuch suchen...",
logsSearchAnyType: "Beliebiger Typ",
logsSearchButton: "Suchen",
logsEmpty: "Noch keine Einträge.",
+ logsNothingNew: "Es gibt keine neuen Aktionen zum Aufzeichnen.",
modulesLogsLabel: "Logbuch",
- modulesLogsDescription: "Modul, um (über einen KI-Assistenten) deine Erfahrungen aufzuzeichnen.",
+ modulesLogsDescription: "Modul für ein privates Tagebuch deiner Erfahrungen.",
statsLogsTitle: "Logbuch",
typeLog: "LOGBUCH",
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...",
+ larpSearchPlaceholder: "In L.A.R.P. suchen...",
larpAllHouses: "Häuser:",
larpFilterRuling: "REGIERT",
larpFilterHouses: "HÄUSER",
@@ -3393,37 +4573,38 @@ module.exports = {
larpPostSubmit: "Veröffentlichen",
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.",
+ bankRulesArchTaxNote: "Die ARCH-Steuer spiegelt die langfristigen Kosten für Wachstum und Pflege des Netzwerkarchivs wider: Je älter deine Daten im Netzwerk sind, desto größer dein Anteil an den Wartungskosten.",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
+ bankRulesChipNote: "Der Chip jedes Elements wird im Verhältnis zur größten jemals im Netzwerk beobachteten Nachricht eingefärbt und durch die Zahl der aktiven Bewohner abgeschwächt — ein größeres Netzwerk verteilt die Last und schiebt mehr Elemente in den grünen Bereich.",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
+ bankRulesEcoTaxNote: "Die ECO-Steuer wird vom Brutto-UBI abgezogen, wenn die Zuteilung der Epoche berechnet wird. Die abgezogenen ECO werden in dieser Epoche nicht umverteilt — sie bleiben im Pub-Guthaben und speisen den Pool der nächsten Epoche über die Obergrenzen reserveMin / alpha.",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
+ bankRulesKarmaNote: "Karma ergibt sich aus deinen Aktionen (Beiträge, Stimmen, Beteiligung an Parlament/Gerichten usw.) mit einem zeitlichen Abklingfaktor, abzüglich der von deinem Feed erzeugten Gramm CO2.",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, 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.",
- 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.",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
+ bankTaxesArchTaxFootprintNote: "Die ARCH-Steuer spiegelt die Kosten für Wachstum und Pflege des Netzwerkarchivs wider. Sie wird aus der Zeitspanne zwischen deinem ersten veröffentlichten Block und dem neuesten Block im Netzwerk berechnet — je länger deine Geschichte im Archiv lebt, desto größer dein Anteil an den Wartungskosten.",
+ bankTaxesArchTaxNoteBold: "der direkten Senkung der ARCH-Steuer",
+ bankTaxesArchTaxNoteIntro: "Deine ARCH-Steuer wird von dem Überschuss abgezogen, den das Netzwerk über dein UBI hinaus erzeugt; der Basiswert des UBI gilt als unverrückbares Minimum. Die Steuer wird nie von dem festen Betrag abgezogen, der jedem Bewohner als UBI zusteht. Die abgezogenen Mittel speisen den Algorithmus zur Umverteilung des Wohlstands und fließen über deren UBI-Ansprüche an andere Bewohner zurück. Neuere Bewohner und jene, die sich speziell Archivierungs-, Replikations- und Wartungsaufgaben widmen, haben wahrscheinlich die Aufgabe, das Netzwerkarchiv in deinem Namen gesund zu halten. Oder sie widmen sich ",
+ bankTaxesArchTaxNoteOutro: " durch Pruning-Vereinbarungen, Deduplizierung redundanter Daten und gemeinsame Wartungsinfrastruktur, und ihr fortlaufender Beitrag kann durch Netzwerkkonsens verlangt werden.",
+ bankTaxesUserNoteChips: "Der ECO-Steuer-Chip neben jedem Element wechselt die Farbe (grün / gelb / rot) je nach Größe des Elements im Verhältnis zum größten jemals im Netzwerk gesehenen Block, abgeschwächt durch die Zahl der aktiven Bewohner — ein größeres Solarpunk-Netzwerk verteilt die Last und schiebt mehr Elemente in den grünen Bereich.",
+ bankTaxesUserNoteOtherParams: "Die ECO-Steuer wird derzeit aus dem CO2-Fußabdruck jedes Blocks abgeleitet, kann aber mit der Zeit weitere Parameter einbeziehen — Energie für die Replikation, redundanter Speicher zwischen Peers, Blob-Bandbreite, Rechenaufwand für die Entschlüsselung, Mining-Fußabdruck zugehöriger Transaktionen oder jede andere messbare Last, deren Bewertung das Netzwerk vereinbart.",
+ gamesHallDate: "Datum",
+ gamesNewRecord: "Neuer Rekord!",
+ indexingRefreshNote: "Diese Seite wird alle 10 Sekunden neu geladen.",
+ indexingMessage: "Oasis synchronisiert das verteilte Netzwerk aus Knoten. Bitte warten.",
+ indexingTitle: "Synchronisierung",
+ padsNoItems: "Keine Pads gefunden.",
+ padVersionHistory: "Versionsverlauf",
+ padAttributionView: "Nach Autorin",
+ padVersionView: "Ansehen",
statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
+ statsChatMessage: "Chat-Nachrichten",
+ statsGameScore: "Spiele",
+ statsWiki: "Wiki-Seiten",
statsPad: "Pads",
- statsPadEntry: "Pad entries",
+ statsPadEntry: "Pad-Einträge",
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",
@@ -3438,6 +4619,14 @@ module.exports = {
settingsReplicationTitle: "Replikation",
settingsReplicationDesc: "Konfiguriere die Anzahl der Hops, die dein Peer von deinem eigenen Feed aus beim Replizieren von Inhalten folgt.",
settingsReplicationHopsLabel: "Hops",
+ settingsBlobCacheTitle: "Medien-Cache",
+ settingsBlobCacheDesc: "Inhalte anderer Bewohner werden auf diesem Gerät gespeichert. Lege fest, wie viel Platz sie belegen dürfen.",
+ settingsBlobCacheUsage: "Aktuelle Belegung",
+ settingsBlobCacheFiles: "Dateien",
+ settingsBlobCacheLimit: "Limit",
+ settingsBlobCacheUnlimited: "Unbegrenzt",
+ settingsBlobCacheCleanNow: "Jetzt aufräumen",
+ settingsBlobCacheCleaned: "{n} Dateien entfernt, {size} freigegeben.",
aiApproveTagsLabel: "Tags (kommagetrennt)",
aiApproveTagsPlaceholder: "z. B. oasis, governance, Ökologie",
aiApproveRatingLabel: "Bewertung",
@@ -3465,17 +4654,15 @@ module.exports = {
larpInviteBannerHint: "Teile diesen Code mit jemandem in ACADEMIA. Er läuft in 30 Zyklen oder nach einmaliger Nutzung ab.",
larpTestRankingTitle: "Punktzahl nach Haus",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "Haus-Einladungscode",
- invitesHouseJoinButton: "Haus beitreten",
- ecoTaxLabel: "ECO Tax",
+ ecoTaxLabel: "ECO-Steuer",
bankTaxes: "Steuern",
- bankOverviewYourTaxes: "Deine Steuern",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesArchTaxTitle: "ARCH Tax",
+ bankOverviewYourTaxes: "Steuern gesamt",
+ bankTaxesEcoTaxTitle: "ECO-Steuer",
+ bankTaxesArchTaxTitle: "ARCH-Steuer",
bankTaxesUserAmount: "Deine ECO Tax (zu zahlender Beitrag)",
bankTaxesArchTaxUserAmount: "Deine ARCH Tax (zu zahlender Beitrag)",
bankTaxesArchTaxFirstBlock: "Alter deines ersten Blocks",
- bankTaxesArchTaxRate: "Rate",
+ bankTaxesArchTaxRate: "Satz",
bankTaxesTotalBlocks: "Blöcke gesamt",
bankTaxesTotalBytes: "Bytes gesamt",
bankTaxesTotalCarbon: "Kohlenstoff gesamt",
@@ -3489,7 +4676,7 @@ module.exports = {
bankTaxesTotalLifetime: "Total (Lebenszeit)",
bankTaxesTotalAnnual: "Total (jährlich)",
bankTaxesTotalMonthly: "Total (monatlich)",
- bankTaxesRate: "Rate",
+ bankTaxesRate: "Satz",
bankTaxesSpan: "Beobachtungszeitraum",
bankTaxesLookupTitle: "Block inspizieren",
bankTaxesLookupPlaceholder: "Block-ID (z. B. %abc...=.sha256)",
@@ -3499,7 +4686,7 @@ module.exports = {
bankTaxesLookupType: "Typ",
bankTaxesLookupSize: "Größe",
bankTaxesLookupCarbon: "CO₂-Fußabdruck",
- bankTaxesLookupEcoin: "ECO Tax",
+ bankTaxesLookupEcoin: "ECO-Steuer",
bankExchangeEcoTaxAnnual: "ECOin-Steuern (jährlich)",
bankExchangeEcoTaxMonthly: "ECOin-Steuern (monatlich)",
bankTaxesTypesLabel: "Wähle, welche Steuern du zahlen willst",
@@ -3507,8 +4694,8 @@ module.exports = {
bankRulesPoolTitle: "Monatlicher Pool",
bankRulesShareTitle: "Anteil pro Nutzer",
bankRulesKarmaTitle: "Karma (Engagement-Score)",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesArchTaxTitle: "ARCH Tax",
+ bankRulesEcoTaxTitle: "ECO-Steuer",
+ bankRulesArchTaxTitle: "ARCH-Steuer",
bankRulesChipTitle: "ECO-Tax-Chip-Farbband",
bankRulesEpochKind: "Epoch-Granularität",
bankRulesAlpha: "Alpha (max. Anteil am Pub-Balance pro Epoch)",
@@ -3519,17 +4706,16 @@ module.exports = {
bankRulesWMax: "Höchstgewicht (w_max)",
bankRulesFloor: "Sockel pro Nutzer (brutto)",
bankRulesCapUser: "Obergrenze pro Nutzer pro Epoch",
- bankRulesEcoTaxRate: "Rate",
- bankRulesArchTaxRate: "Rate",
+ bankRulesEcoTaxRate: "Satz",
+ bankRulesArchTaxRate: "Satz",
bankRulesCarbonFactor: "Kohlenstofffaktor",
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",
- audioTranscodeDetailTitle: "Transcode",
+ audioTranscodeButton: "TRANSKODIEREN",
+ audioTranscodeDetailTitle: "Transkodieren",
audioTranscodeDetailDescription: "Entschlüssle die eingebettete Nutzlast und die ursprüngliche Blockchain-Kompositionskarte.",
- audioTranscodeStegoOasisId: "Von",
audioTranscodeStegoTimestamp: "Erzeugt am",
audioTranscodeStegoMessage: "TEXT",
audioTranscodeStegoEmpty: "(keine)",
@@ -3539,7 +4725,6 @@ module.exports = {
audioBackToBcs: "Zurück zu BCS",
melodyCompositionTitle: "Blockchain-Kompositionskarte",
melodyFilterMine: "MEINS",
- melodyByLabel: "Von",
melodyAllEmpty: "Noch keine BCS-Kompositionen anderer Bewohner.",
melodyNoteUnavailable: "Block ist nicht in deinem lokalen Feed",
melodyUploadBcsTitle: "Veröffentlichen",
@@ -3565,14 +4750,14 @@ module.exports = {
larpBadgeYou: "Du",
larpBadgeRuling: "Regiert",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "Modul für die Live-Rollenspielschicht von Oasis (die 9 Häuser).",
+ modulesLarpDescription: "Modul für die Live-Rollenspiel-Ebene.",
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",
larpProfileQ1O3: "Die Literatur erforschen",
larpProfileQ1O4: "Das System sabotieren, das es verursacht",
larpProfileQ2: "Was gibt deiner täglichen Arbeit Sinn?",
- larpProfileQ2O1: "Die Menschen verteidigen, die ich liebe",
+ larpProfileQ2O1: "Die Bewohner verteidigen, die ich liebe",
larpProfileQ2O2: "Etwas Greifbares schaffen",
larpProfileQ2O3: "Leben heilen oder nähren",
larpProfileQ2O4: "Worte und Ideen formen",
@@ -3639,7 +4824,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Wähle den UX-Navigationsmodus für deine Oberfläche.",
uxModeMenus: "Blöcke",
- uxModeAINav: "AI",
+ uxModeChats: "Unterhaltungen",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Trend-Tags",
+ feedActiveTitle: "Aktive Bewohner",
+ cnBrandSub: "Frei · P2P · Föderiert",
+ cnSyncedPeers: "Synchronisierte Peers",
+ cnLicense: "Lizenz",
+ cnNotAccessible: "Der Inhalt ist im Moment nicht erreichbar.",
+ cnUntitled: "Ohne Titel",
+ cnSearchPlaceholder: "Suchen…",
+ cnHubTitle: "Clearnet-HUB",
+ cnHubDescription: "Öffentliche Inhalte, geteilt von den Bewohnern dieses Oasis-Netzwerks.",
+ cnHubEmpty: "Es wurden noch keine öffentlichen Inhalte im Clearnet geteilt.",
+ cnPublicContent: "Inhalte",
+ cnTribesContent: "Stämme",
+ cnNetworkContent: "Netzwerk",
+ cnCategoryEmpty: "Keine Inhalte in dieser Kategorie.",
+ cnInhabitantEmpty: "Dieser Bewohner hat noch keine Inhalte im Clearnet veröffentlicht.",
+ cnPrevPage: "← Zurück",
+ cnNextPage: "Weiter →",
+ cnPageOf: "Seite {page} von {pages}",
+ cnMoreInfo: "Mehr Infos →",
+ cnOpenCourse: "Offener Kurs",
+ cnAuction: "AUKTION",
+ cnExchange: "TAUSCH",
+ cnRssDescription: "veröffentlicht von den Bewohnern dieses HUBs",
+ cnKindAudio: "Audio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Lesezeichen",
+ cnKindDocument: "Dokument",
+ cnKindEvent: "Termin",
+ cnKindFeed: "Feed",
+ cnKindImage: "Bild",
+ cnKindJob: "Stelle",
+ cnKindMarket: "Markt",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Projekt",
+ cnKindCourse: "Kurs",
+ cnKindShop: "Shop",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "Datei",
+ cnKindVideo: "Video",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Raum",
+ cnKindMap: "Karte",
+ uxModeAINav: "KI",
}
}
\ No newline at end of file
diff --git a/src/client/assets/translations/oasis_en.js b/src/client/assets/translations/oasis_en.js
index 3ad88f5..32a6205 100644
--- a/src/client/assets/translations/oasis_en.js
+++ b/src/client/assets/translations/oasis_en.js
@@ -28,7 +28,7 @@ module.exports = {
recent: "Recent",
anonymous: "Anonymous",
unnamed: "Anonymous",
- authorLabel: "AUTHOR",
+ authorLabel: "Author",
delete: "Delete",
save: "Save",
vote: "Vote",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "Content warning",
invalidPost: "Invalid content",
invalidPostHint: "This message has invalid/empty text.",
- spreadBy: "By",
spreadChron: "Spread",
spreaded: "Spread",
spreadContentUnavailable: "Content not yet available (pending replication)",
filteredByTag: "Filtered by tag",
filteredByTagTitle: "Filtered by tag",
feedPublishedSuccess: "Feed published successfully!",
+ feedMastodonFailed: "Published in Oasis, but it could not be sent to Mastodon.",
tribeFeedSent: "Message sent successfully!",
tribeContentEncrypted: "Encrypted content",
tribeTorrentsEmpty: "No torrents, yet.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Last visit",
profileClearnetBookmarksLabel: "Bookmarks",
invitesPort: "Port",
- currentlyUnrecheable: "ERROR!",
- peerHostValidation: "Valid IPv4 (e.g. 192.168.1.100) or hostname (e.g. pub.example.com)",
+ peerHostValidation: "Valid IPv4 (e.g. 192.168.1.100) or hostname (e.g. pub.solarnethub.com)",
peerPortValidation: "Port 1-65535",
peerKeyValidation: "SSB ed25519 public key (@<44 chars base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Unsubscription from your job offer",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Task description",
exportPasswordLabel: "Export password",
importPasswordPlaceholder: "Enter password",
- searchCasesPlaceholder: "Search cases…",
+ searchCasesPlaceholder: "Search in Courts...",
shopBuyDeliveryAddressPlaceholder: "Delivery address",
shopBuyNotesPlaceholder: "Notes",
bankTaxesUserNoteBold: "reducing the ECO tax directly",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Support case",
courtsSettlementAcceptBtn: "Accept settlement",
courtsSupportCount: "Supporters",
- courtsVerdictVoteTitle: "Vote on verdict",
- courtsVerdictVoteLabel: "Verdict vote",
- courtsVerdictVoteAccept: "Accept",
- courtsVerdictVoteReject: "Reject",
- courtsVerdictVoteSubmit: "Submit vote",
reportsSetStatus: "Set status",
reportsStatusClosed: "CLOSED",
statsAvgPerInhabitant: "Avg per inhabitant",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Avatar",
inhabitants: "Inhabitants",
- peersReplicatedFeeds: "Replicated feeds",
+ peersReplicatedFeeds: "Replicated",
+ peersTorColumn: "TOR",
+ peersTorYes: "Reachable over Tor",
+ peersTorNo: "Not reachable over Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Version",
graphos: "Graphos",
graphosDescription: "Interactive map of the network around you.",
+ graphosFederation: "Federation",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Unreachable",
+ graphosFedLinks: "Mutual links",
+ graphosFedIsolated: "Isolated",
+ graphosFedNoData: "No data",
+ graphosFedMutual: "Mutual",
+ graphosFedOneWay: "One way",
+ graphosFedTransport: "Network",
+ graphosFedWith: "Federated with",
+ graphosZoom: "Enlarge",
+ graphosFedInhabitants: "Inhabitants",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "Your node does not know any PUB yet.",
graphosViewingGraphOf: "Viewing",
graphosBackToMine: "← My network",
graphosShowing: "Showing",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "You haven't received @mentions, yet.",
- mentionsSearchPlaceholder: "Search mentions...",
+ mentionsSearchPlaceholder: "Search in Mentions...",
privateReminders: "REMINDERS",
+ inboxFilterPms: "PMs",
+ inboxFilterNotifications: "Notifications",
+ inboxMarkRead: "Mark as Read",
+ inboxMarkUnread: "Mark as Unread",
+ inboxUnreadChip: "Unread",
+ inboxMarkAllRead: "Mark all as Read",
+ inboxDeleteShown: "Delete all",
+ inboxArchive: "Archive",
+ inboxUnarchive: "Unarchive",
+ inboxFilterArchived: "Archived",
+ inboxEarlierMessages: "earlier messages",
+ inboxSortThread: "By thread",
+ inboxSortRecent: "Newest first",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Inbox Notifications",
+ settingsInboxBotsDesc: "Choose which bots can notify you in your Inbox. Unchecked bots are hidden and their notices are not counted.",
inboxFiltersLabel: "Filters:",
inboxToggleToMutuals: "Switch to mutuals",
inboxToggleToWhole: "Switch to whole",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "Reply",
pmReplies: "replies",
inReplyTo: "IN REPLY TO",
+ forumInThread: "IN THREAD",
pmPreview: "Preview",
pmPreviewTitle: "Message preview",
peers: "Peers",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "From",
searchToLabel: "To",
searchQueryLabel: "Query",
- searchPerPageLabel: "Results per page",
+ searchPerPageLabel: "Results",
settings: "Settings",
+ settingsDescription: "Set your network environment.",
continueReading: "Continue reading",
moreComments: "more comment",
readThread: "read the rest of the thread",
@@ -244,7 +276,6 @@ module.exports = {
blockchainBackToBlockexplorer: "Back to blockexplorer",
melodyUploadBcsNameNote: "The audio will be published with the auto-generated name",
melodyFilterMine: "MINE",
- melodyByLabel: "By",
melodyAllEmpty: "No BCS compositions from other inhabitants yet.",
profileContentSectionTitle: 'Avatar Content',
profileContentHelp: 'Choose which of your modules will be displayed on your avatar.',
@@ -252,7 +283,6 @@ module.exports = {
profileClearnetHelp: 'Modules that can be accessed from outside Oasis.',
profileHubAll: 'All',
footerLicenseLabel: 'License',
- profileSwitchToOasis: 'Return to Oasis',
profileVisibilityFediverse: "Multiverse",
contributorsTitle: "Contributors",
colorLabel: 'Pick a color',
@@ -262,6 +292,7 @@ module.exports = {
modulesViewTitle: "Modules",
modulesViewDescription: "Set your environment by enabling or disabling modules.",
inbox: "Inbox",
+ inboxSearchPlaceholder: "Search in Inbox...",
multiverse: "Multiverse",
fediverse: "Multiverse",
fediverseDescription: "Manage your other multiverse accounts, including sending and receiving content.",
@@ -270,9 +301,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Server",
+ nextcloudUserLabel: "User",
+ nextcloudFolderLabel: "Folder",
+ nextcloudUploadButton: "Upload",
+ nextcloudFileLabel: "Select a file",
+ fileExternalLink: "External link",
+ nextcloudErrConnect: "Nextcloud could not be reached with these details.",
+ nextcloudErrUpload: "The upload to Nextcloud failed.",
+ nextcloudErrShare: "Nextcloud did not give a public link for the file.",
fediverseDisconnect: "Disconnect",
fediverseEmptyLink: "your settings",
fediverseComposePlaceholder: "What's on your mind?",
@@ -301,6 +340,76 @@ module.exports = {
fediverseErrPost: "Could not publish.",
fediverseErrMedia: "Could not upload the file.",
fediverseErrEmpty: "Write something or attach a file.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Phone number",
+ telegramSendCode: "Send code",
+ telegramCodeHelp: "Enter the login code Telegram just sent you (app or SMS).",
+ telegramCodeLabel: "Login code",
+ telegramPasswordHelp: "This account has two-step verification. Enter your cloud password.",
+ telegramPasswordLabel: "Password",
+ telegramVerify: "Verify",
+ telegramCancel: "Cancel",
+ telegramChats: "Chats",
+ telegramUnread: "Unread",
+ telegramOpen: "Open",
+ telegramSend: "Send",
+ telegramYou: "You",
+ telegramNoChats: "No chats yet.",
+ telegramNoMessages: "No messages yet.",
+ telegramComposePlaceholder: "Write a message…",
+ telegramChannel: "Channel",
+ telegramGroup: "Group",
+ telegramPrivate: "Private",
+ telegramErrConnect: "Could not contact Telegram.",
+ telegramErrTimeout: "Telegram took too long to respond.",
+ telegramErrAuth: "Telegram session invalid or expired. Connect again.",
+ telegramErrFetch: "Could not load chats.",
+ telegramErrSend: "Could not send the message.",
+ telegramErrMissing: "API ID, API hash and phone number are required.",
+ telegramErrCode: "Invalid code. Try again.",
+ telegramErrCodeExpired: "The code expired. Start again.",
+ telegramErrPassword: "Wrong password.",
+ telegramErrPhone: "Invalid phone number.",
+ telegramErrApi: "Invalid API ID or API hash.",
+ telegramErrFlood: "Too many attempts. Wait a while and try again.",
+ telegramErrNoLogin: "No login in progress. Start again.",
+ peertubeUsernameLabel: "Username",
+ peertubePasswordLabel: "Password",
+ peertubeSubscriptions: "Subscriptions",
+ peertubeMyVideos: "My videos",
+ peertubeVideos: "Videos",
+ peertubeFollowers: "Followers",
+ peertubeViews: "views",
+ peertubeLikes: "likes",
+ peertubeQuota: "Quota",
+ peertubeUpload: "Upload video",
+ peertubeUploadHelp: "Pick a video file. It is uploaded to your channel and PeerTube processes it afterwards.",
+ peertubeTitleLabel: "Title",
+ peertubeDescriptionLabel: "Description",
+ peertubePrivacyLabel: "Privacy",
+ peertubePrivacyPublic: "Public",
+ peertubePrivacyUnlisted: "Unlisted",
+ peertubePrivacyPrivate: "Private",
+ peertubeNoVideos: "No videos yet.",
+ peertubeComments: "Comments",
+ peertubeComment: "Comment",
+ peertubeCommentPlaceholder: "Write a comment…",
+ peertubeNoComments: "No comments yet.",
+ peertubeOpen: "Open on PeerTube",
+ peertubeWatch: "Watch",
+ peertubeChannel: "Channel",
+ peertubeNoStream: "This video cannot be played here yet. Open it on PeerTube.",
+ peertubeUploaded: "Video uploaded. PeerTube is processing it.",
+ peertubeErrConnect: "Could not contact PeerTube.",
+ peertubeErrAuth: "Wrong username or password, or the session expired. Connect again.",
+ peertubeErrInstance: "Invalid instance URL.",
+ peertubeErrMissing: "Instance, username and password are required.",
+ peertubeErrFetch: "Could not load videos.",
+ peertubeErrUpload: "Could not upload the video.",
+ peertubeErrTitle: "Title required.",
+ peertubeErrComment: "Could not publish the comment.",
+ peertubeErrNoFile: "Choose a video file.",
bookmarksLabel: "Bookmarks",
videosLabel: "Videos",
torrentsLabel: "Torrents",
@@ -323,7 +432,6 @@ module.exports = {
comment: "Comment",
subtopic: "Subtopic",
json: "JSON",
- createdBy: "by",
unfollow: "Unsupport",
follow: "Support",
block: "Block",
@@ -339,12 +447,15 @@ module.exports = {
relationshipNone: "You are not supporting",
relationshipBlockingPost: "Blocked post",
viewLikes: "View spreads",
+ viewSupporters: "View supporters",
spreadedDescription: "List of posts spread by the inhabitant.",
preview: "Preview",
publish: "Write",
contentWarningPlaceholder: "Add a subject to the post (optional)",
- publishWarningPlaceholder: "Body capped at 7000 characters.",
+ publishWarningPlaceholder: "Write the body of your entry.",
publishTooLong: "Your post is too long. Please shorten it.",
+ keepTextRetry: "Send again",
+ dateInPastError: "The date cannot be in the past",
publishCustomDescription: [
"REMEMBER: Due to blockchain technology, once a post is published it cannot be edited or deleted.",
],
@@ -374,9 +485,8 @@ module.exports = {
mentionsMatching: "Matching Mentions",
mentionsName: "Name",
mentionsRelationship: "Relationship",
- updateit: "GET UPDATES!",
updateBannerText: "A new version of Oasis is available.",
- updateBannerAction: "Update now →",
+ updateBannerAction: "Update now!",
info: "Info",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -384,22 +494,28 @@ module.exports = {
timeAgo: "ago",
sendTime: "about ",
theme: "Theme",
- legacy: "Keys",
- legacyTitle: "Keys",
- legacyDescription: "Manage your secret (private key) quickly and safely.",
- legacyExportButton: "Export",
- legacyImportButton: "Import",
- ssbLogStream: "Blokchain",
+ backupKeysExportButton: "Export",
+ backupKeysImportButton: "Import",
+ ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Configure the message limit for Blockchain streams.",
+ logWindowChip: "Last {n} blockchain streams",
settingsLanTitle: "LAN Broadcasting",
settingsLanDesc: "Periodically announce this peer to other Oasis instances on the same local network. Disable to stop UDP broadcasts.",
settingsReplicationTitle: "Replication",
settingsReplicationDesc: "Configure the number of hops your peer follows out from your own feed when replicating content.",
settingsReplicationHopsLabel: "Hops",
+ settingsBlobCacheTitle: "Media cache",
+ settingsBlobCacheDesc: "Content from other inhabitants is kept on this device. Choose how much space it may take.",
+ settingsBlobCacheUsage: "Current usage",
+ settingsBlobCacheFiles: "files",
+ settingsBlobCacheLimit: "Limit",
+ settingsBlobCacheUnlimited: "Unlimited",
+ settingsBlobCacheCleanNow: "Clean now",
+ settingsBlobCacheCleaned: "{n} files removed, {size} freed.",
settingsLanEnable: "Enable LAN broadcasting",
saveSettings: "Save settings",
exportDescription: "Set password (min 32 characters long) to encrypt your key",
- exportDataTitle: "Backup",
+ exportDataTitle: "Instant Backup",
exportDataDescription: "Download your data (secret key excluded!)",
exportDataButton: "Download database",
importDescription: "Import your encrypted secret (private key) to enable your avatar",
@@ -408,38 +524,33 @@ module.exports = {
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.",
+ welcomeBannerText: "Your avatar is not set up yet.",
aiSuggestionBanner: "Suggestion:",
aiSuggestionsEnable: "AI Suggestions",
- welcomeBannerAction: "Start wizard!",
+ welcomeBannerAction: "Start",
welcomeTitle: "Welcome",
+ welcomeStepIdentity: "Identity",
+ welcomeStepType: "Type",
+ welcomeStepUse: "Use",
+ welcomeStepLook: "Appearance",
+ welcomeStepCommunity: "Community",
+ welcomeStepIntro: "Welcome",
+ welcomeHintIdentity: "Your name and picture.",
+ welcomeHintType: "How Oasis opens for you.",
+ welcomeHintUse: "Which modules stay on.",
+ welcomeHintLook: "The theme Oasis wears.",
+ welcomeHintCommunity: "Join a PUB to meet other inhabitants.",
+ welcomeHintIntro: "Send a first greeting to the community.",
+ welcomeStepThemeAction: "Use this theme",
+ welcomeJoinPubs: "Join PUBs",
+ welcomeNoFederation: "No federation",
welcomeStepGreetingAction: "Send Feed",
- welcomeJoinPubButton: "Join Pub",
- welcomeStepLarpAction: "Join \"The Academy\"",
- welcomeStepLarpText: "Join our live action role playing game.",
- welcomeStepLarpTitle: "Join L.A.R.P.",
- welcomeStepGreetingTitle: "Send a \"Hello world!\"",
- welcomeStepGreetingText: "Send a message so other inhabitants can discover you.",
- welcomeJoinPub: "Join",
welcomeDescription: "A few things worth doing before you start.",
- welcomeProgress: "Completed",
- welcomeStepDone: "done",
- welcomeStepPending: "pending",
welcomeSkip: "Skip for now",
- welcomeStepLanguageTitle: "Choose your language",
- welcomeStepLanguageText: "Oasis speaks different languages. You can change it whenever you want.",
- welcomeStepProfileTitle: "Edit your profile",
- welcomeStepProfileText: "Pick a name, add a description and set a picture so other inhabitants can recognise you.",
welcomeStepProfileAction: "Save Profile",
- welcomeStepFederationTitle: "Join Main Network",
- welcomeStepFederationText: "Connect to our pub to meet other inhabitants and start replicating.",
- welcomeStepFederationAction: "Go to invites",
- welcomeStepBackupTitle: "Backup your ID",
- welcomeStepBackupText: "Your identity is a key file on this device.",
- welcomeStepBackupWarning: "IF YOU LOSE IT, NOBODY CAN RECOVER IT FOR YOU.",
- welcomeStepBackupAction: "Backup!",
+ welcomeBootstrapRunning: "Loading the pub's snapshot. The pub is joined as soon as it finishes; you can keep using Oasis meanwhile.",
welcomeCompleteTitle: "All set.",
- welcomeCompleteText: "Your node is ready. From here the network grows with the people you follow.",
+ welcomeCompleteText: "Your node is ready. From here the network grows with the inhabitants you support.",
welcomeFindPeople: "Find inhabitants",
devFilterFiles: "FILES",
devFilterSearch: "SEARCH",
@@ -449,7 +560,7 @@ module.exports = {
devFilterTests: "TESTS",
devVersion: "Version",
devNodeVersion: "Node",
- devStatsTests: "Test suites",
+ devStatsTests: "Tests",
devParentFolder: "Parent folder",
devOpenFolder: "open",
devDescription: "Explore the source code running on this node.",
@@ -493,6 +604,27 @@ module.exports = {
"If you'd like to use another language, select it here.",
setLanguage: "Set Language",
peerConnectionsIntro: "Manage all your connections with other peers.",
+ peersConnectFailed: "Could not connect: {reason}.",
+ peerStateLabel: "State",
+ peerAddressLabel: "Address",
+ peerLastChangeLabel: "Last change",
+ peerStateConnected: "Connected",
+ peerStateConnecting: "Connecting",
+ peerStateStaged: "Available",
+ peerErrSilent: "No activity",
+ peerErrTimeout: "Not responding",
+ peerErrRefused: "Refuses the connection",
+ peerErrNotFound: "Unknown address",
+ peerErrUnreachable: "Network unreachable",
+ peerErrKeys: "Using different keys",
+ peerErrIdentity: "Does not accept your connection",
+ peerErrTor: "TOR only",
+ peerErrDropped: "Connection dropped",
+ peerErrPaused: "Network paused",
+ peerErrOther: "Connection error",
+ peerOutdated: "Outdated",
+ peerVersionUnannounced: "It does not announce its version: an old Oasis",
+ peersTorMissing: "This PUB only allows connections through TOR.",
peerConnectionsTitle: "Connections",
online: "Online",
offline: "Offline",
@@ -516,17 +648,20 @@ module.exports = {
peerDisconnect: "Disconnect",
peerRefresh: "Refresh",
peerPruneIdle: "Remove idle",
+ peersPause: "Pause",
+ peersResume: "Resume",
+ peersPausedNote: "Paused: Oasis does not connect to anyone and nobody can connect to it.",
+ peersPauseHint: "Stops every connection: Oasis neither connects to other nodes nor accepts them until you resume.",
peerExport: "Export",
peerImport: "Import",
peerImportTitle: "Import peer list",
peerImportPlaceholder: "Paste one multiserver address per line, or upload a .txt file…",
connectionActionIntro:
"",
- startNetworking: "Start networking",
- stopNetworking: "Stop networking",
- restartNetworking: "Restart networking",
- sync: "Sync network",
indexes: "Indexes",
+ indexesRebuilt: "Indexes rebuilt",
+ indexesRebuildFailed: "Could not rebuild the indexes",
+ indexesFiles: "Index files",
indexesDescription:
"Rebuilding your indexes is safe, and may fix some types of bugs.",
homePageTitle: "Home",
@@ -536,44 +671,33 @@ module.exports = {
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",
invitesChatsTitle: "Chats",
- invitesChatInviteCodePlaceholder: "Enter chat invite code",
- invitesChatJoinButton: "Join Chat",
invitesPadsTitle: "Pads",
- invitesPadInviteCodePlaceholder: "Enter pad invite code",
- invitesPadJoinButton: "Join Pad",
invitesCalendarsTitle: "Calendars",
- invitesCalendarInviteCodePlaceholder: "Enter calendar invite code",
- invitesCalendarJoinButton: "Join Calendar",
invitesEventsTitle: "Events",
- invitesEventInviteCodePlaceholder: "Enter event invite code",
- invitesEventJoinButton: "Join Event",
invitesForumsTitle: "Forums",
- invitesForumInviteCodePlaceholder: "Enter forum invite code",
- invitesForumJoinButton: "Join Forum",
invitesMapsTitle: "Maps",
- invitesMapInviteCodePlaceholder: "Enter map invite code",
- invitesMapJoinButton: "Join Map",
invitesShopsTitle: "Shops",
- invitesShopInviteCodePlaceholder: "Enter shop invite code",
- invitesShopJoinButton: "Join Shop",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "Suggested PUBs",
+ invitesFilterOthers: "Others",
+ invitesJoinTitle: "Invitations",
+ invitesJoinHint: "Paste any invitation code, whatever it is for, or an inhabitant's Oasis ID.",
+ invitesJoinPlaceholder: "Invitation code or Oasis ID",
+ invitesJoinButton: "Join",
+ invitesUsedTitle: "Latest invitations",
+ invitesUsedEmpty: "You have not used any invitation yet.",
+ invitesUsedType: "Type",
+ invitesUsedName: "Name",
+ invitesUsedDate: "Date",
invitesPubInviteCodePlaceholder: "Enter PUB invite code",
invitesAcceptInvite: "Join PUB",
+ invitesPubUses: "Invitations used",
+ invitesPubExhausted: "This PUB has no invitations left.",
invitesAlreadyFederated: "You are already federated with this pub.",
+ invitesJoinPubMode: "This Oasis runs as a PUB, in read-only mode. To join it to another PUB, use the terminal: ./oasis.sh join ",
+ invitesJoinLocalOnly: "Invites can only be accepted from the device where Oasis runs, or through the admin link it shows when it starts.",
invitesFederationsTitle: "Federations",
invitesAcceptedInvites: "Federated",
invitesUnfollow: "Unfollow",
@@ -581,16 +705,12 @@ module.exports = {
invitesUnfollowedInvites: "Unfederated",
invitesNoFederatedPubs: "No federated pubs.",
invitesNoUnfollowed: "No unfederated pubs.",
- invitesUnreachablePubs: "Unreachable",
- invitesNoUnreachablePubs: "No unreachable networks.",
invitesPubsRefresh: "Refresh",
- invitesPubsClearUnreachable: "Remove unreachable",
+ invitesPubsClearUnreachable: "Clean",
invitesPubsExport: "Export",
invitesPubsImport: "Import",
invitesPubsImportTitle: "Import pubs",
invitesPubsImportPlaceholder: "Paste one multiserver address or invite code per line, or upload a .txt file…",
- currentlyUnreachable: "ERROR!",
- errorDetails: "Error Details",
genericError: "An error occurred.",
panicMode: "Panic Mode!",
encryptData: "Set password (min 32 characters long) to encrypt your blockchain",
@@ -617,7 +737,6 @@ module.exports = {
votesOptionNoLabel:"No",
votesOptionAbstentionLabel:"Abstention",
votesQuestionLabel:"Question",
- votesCreatedByLabel:"Created by",
voteStatusOpen:"OPEN",
voteStatusClosed:"CLOSED",
commentDescription: ({ parentUrl }) => [
@@ -641,17 +760,16 @@ module.exports = {
oasisIdLabel: "OasisID",
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- /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.",
+ 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- [/avatar](/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 inhabitants' avatars.\n- /tribes — Create or join private groups with end-to-end encryption.\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",
+ indexingMessage: "Oasis is synchronizing the distributed network of nodes. Please wait.",
profileSensorsSectionTitle: "Sensors",
profileVisibilityActivity: "Activity Level",
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",
- profileVisibilityWallet: "ECOIN Wallet",
+ profileVisibilityWallet: "ECOin Wallet",
profileVisibilityEcoTax: "ECO Tax",
profileVisibilityLarpSign: "L.A.R.P. Sign",
profileVisibilityGpg: "GPG Key",
@@ -666,6 +784,10 @@ module.exports = {
profileClearnetImagesLabel: "Images",
profileClearnetDocumentsLabel: "Documents",
profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Market",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
editProfileDescription:
"",
profileName: "Name",
@@ -691,7 +813,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Cnfrs",
walletConfirm: "Confirm",
- walletDescription: "Manage your digital assets, including sending and receiving ECOin, viewing your balance, and accessing your transaction history.",
+ walletDescription: "Manage your ECOin wallet.",
walletDate: "Date",
walletFee: "Fee (The higher the fee, the faster your transaction will be processed)",
walletFeeLine: ({ fee }) => `Fee: ECO ${fee}`,
@@ -699,6 +821,86 @@ module.exports = {
walletReceive: "Receive",
walletReset: "Reset",
walletSend: "Send",
+ walletPayingTransfer: "Paying transfer",
+ walletCreateTransferLabel: "Generate smart-contract (transfer)",
+ walletTransferNotifiedNote: "The other party has been notified of this payment",
+ walletTransferCreatedNote: "A transfer (receipt) has been created for this payment",
+ walletTransferNoPayeeNote: "No inhabitant has published this address, so no transfer was created",
+ walletTransferReceiptConcept: "Wallet payment",
+ walletPaymentPmText: "sent you a payment",
+ walletPayeeLabel: "Recipient",
+ walletConceptLabel: "Concept",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "You have received your UBI.",
+ bankingBotPaymentTitle: "You have received a payment.",
+ bankingBotUbiPaidText: "Your Universal Basic Income has been paid",
+ bankUbiPubThisNode: "This node pays the UBI",
+ bankUbiPubConnected: "UBI PUB",
+ bankUbiPubNone: "No PUB is announcing UBI in your network yet",
+ bankUbiAddressPublished: "ECOin address published",
+ bankUbiAddressMissing: "Publish your ECOin address to receive UBI",
+ bankUbiClaimedThisMonth: "Claimed this month",
+ bankUbiPubBalance: "PUB wallet available for UBI",
+ bankNoPubAddress: "The UBI PUB has not published an ECOin address yet.",
+ bankUbiTab: "UBI",
+ bankDonateEco: "DONATE!",
+ donateTooltip: "Donate ECOin",
+ bankNoUserAddress: "This inhabitant has not shared an ECOin address.",
+ bankUbiPubDefault: "Default",
+ bankUbiPool: "Pool",
+ bankUbiLastSeen: "Last seen",
+ bankUbiLastPayout: "Last action",
+ bankUbiPaidOut: "Paid out",
+ bankRangeToday: "Today",
+ bankRangeWeek: "Week",
+ bankRangeMonth: "Month",
+ bankRangeYear: "Year",
+ bankRangeFiveYears: "5 years",
+ bankRangeAll: "All",
+ bankChartValueTitle: "ECOin Value Evolution",
+ bankChartValueHours: "Equivalence in time (h)",
+ bankChartWealthTitle: "ECOin Wealth Redistribution",
+ bankChartDistributed: "UBI distributed (ECO)",
+ bankChartRebalanceTitle: "Redistribution of wealth between PUBs",
+ bankChartRebalanced: "ECO moved between PUBs",
+ bankChartTaxes: "Taxes withheld (ECO)",
+ bankChartNoDataRange: "No data in this range.",
+ bankChartNoDataYet: "No data available, yet",
+ bankChartPerHour: "per hour",
+ bankChartPerDay: "per day",
+ bankChartPerMonth: "per month",
+ bankTotalUbiDistributed: "Total UBI redistributed (network)",
+ bankTotalTaxesWithheld: "Total taxes withheld (network)",
+ bankInflationIssuance: "Issuance rate (annual, from block reward)",
+ bankRulesEligibilityTitle: "Who can receive the UBI",
+ bankRulesEligibility1: "An ECOin address published in your profile (Profile → Sensors → ECOin Wallet).",
+ bankRulesEligibility2: "A feed older than 30 days with activity in the network: karma above zero.",
+ bankRulesEligibility3: "One claim per month (epoch), made from Banking with the Claim UBI button. It can be refused for the current month with Refuse UBI.",
+ bankRulesEligibility4: "The floor of 1 ECO is always paid; taxes only reduce the part above it and are never charged apart.",
+ bankRulesEligibility5: "The PUB pays on its next cycle and publishes a UBI transfer that you can confirm.",
+ bankRulesEligibility6: "If your address is missing, the feed is too young, you refused the month or the PUB has no funds, the claim is skipped and logged on the PUB.",
+ copyLinkTitle: "Copy link",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Refuse UBI",
+ bankUbiRefusedThisMonth: "You refused this month's UBI.",
+ bankingBotUbiAvailableTitle: "You can claim your UBI.",
+ bankingBotUbiAvailableText: "Your UBI for this month is available",
+ bankingBotConfirmTitle: "You have a smart-contract awaiting confirmation",
+ bankingBotConfirmText: "Smart-contracts awaiting your confirmation",
+ bankChartZoomHint: "Click to enlarge",
+ bankChartPoolTitle: "UBI Pool (over time)",
+ bankChartNetworkUbiTitle: "Total UBI redistributed (network)",
+ bankChartSupplyTitle: "ECOin Current Supply (over time)",
+ bankChartInflationTitle: "ECOin Inflation (over time)",
+ bankChartInflationSeries: "Annualised rate (%)",
+ bankChartPool: "Total Pool (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (over time)",
+ bankChartFundsTitle: "Your ECOin funds (over time)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin connected",
+ bankWalletNotConfigured: "ECOin disconnected",
+ transfersPayWithWallet: "PAY!",
walletStatus: "Status",
walletDisconnected: [
"ECOin ",
@@ -708,8 +910,11 @@ module.exports = {
" or connection status.",
],
walletSentToLine: ({ destination, amount }) => `Sent ECO ${amount} to ${destination}`,
+ walletNotConfigured: "Your ECOin wallet is not configured yet.",
walletSettingsDescription: "Integrate Oasis with your ECOin wallet.",
- walletSettingsDocLink: "ECOin installation guide",
+ walletSettingsMobileDescription: "Link Oasis with the ECOin Wallet app on this device.",
+ walletDownloadEcoin: "Download ECOin!",
+ walletRpcUrl: "RPC URL",
walletStatusMessages: {
invalid_amount: "Invalid amount",
invalid_dest: "Invalid destination address",
@@ -725,6 +930,7 @@ module.exports = {
walletUser: "Username",
walletPass: "Password",
walletConfiguration: "Set wallet",
+ walletDisconnectButton: "Disconnect wallet",
cipher: "Crypter",
cipherTitle: "Crypter",
cipherDescription: "Encrypt and decrypt your text symmetrically (using a shared password).",
@@ -758,17 +964,16 @@ module.exports = {
bookmarkFilterRecent: "RECENT",
bookmarkCreateButton: "Create Bookmark",
bookmarkUpdateButton: "Update",
- bookmarkDeleteButton: "Delete",
bookmarkAddFavoriteButton: "Add favorite",
bookmarkRemoveFavoriteButton: "Remove favorite",
bookmarkUrlLabel: "Link",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Description",
bookmarkDescriptionPlaceholder: "Optional",
bookmarkTagsLabel: "Tags",
bookmarkTagsPlaceholder: "Enter tags separated by commas",
bookmarkLastVisitLabel: "Last Visit",
- bookmarkSearchPlaceholder: "Search URL, tags, category, author...",
+ bookmarkSearchPlaceholder: "Search in Bookmarks...",
bookmarkSortRecent: "Most recent",
bookmarkSortOldest: "Oldest",
bookmarkSortTop: "Most voted",
@@ -807,7 +1012,7 @@ module.exports = {
videoDescriptionPlaceholder: "Optional",
videoNoFile: "No video file provided",
noVideos: "No videos available.",
- videoSearchPlaceholder: "Search title, tags, author...",
+ videoSearchPlaceholder: "Search in Videos...",
videoSortRecent: "Most recent",
videoSortOldest: "Oldest",
videoSortTop: "Most voted",
@@ -830,7 +1035,6 @@ module.exports = {
documentFilterFavorites: "FAVORITES",
documentCreateButton: "Upload Document",
documentUpdateButton: "Update",
- documentDeleteButton: "Delete",
documentAddFavoriteButton: "Add favorite",
documentRemoveFavoriteButton: "Remove from favorites",
documentMessageAuthorButton: "PM",
@@ -843,7 +1047,7 @@ module.exports = {
documentDescriptionPlaceholder: "Optional",
documentNoFile: "No file.",
noDocuments: "No documents available.",
- documentSearchPlaceholder: "Search title, tags, description, author...",
+ documentSearchPlaceholder: "Search in Documents...",
documentSortRecent: "Most recent",
documentSortOldest: "Oldest",
documentSortTop: "Most voted",
@@ -890,7 +1094,7 @@ module.exports = {
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.",
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",
+ bankOverviewYourTaxes: "Total Taxes",
bankTaxesTotalBlocks: "Total blocks",
bankTaxesTotalBytes: "Total bytes",
bankTaxesTotalCarbon: "Total carbon",
@@ -942,7 +1146,6 @@ module.exports = {
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.",
statsTombstoneEmpty: "No tombstones in the network yet.",
- audioTranscodeStegoOasisId: "By",
audioTranscodeStegoTimestamp: "Generated at",
audioTranscodeStegoMessage: "TEXT",
audioTranscodeStegoEmpty: "(none)",
@@ -952,19 +1155,19 @@ module.exports = {
audioBackToBcs: "Back to BCS",
audioCreateButton: "Upload Audio",
audioUpdateButton: "Update",
- audioDeleteButton: "Delete",
audioAddFavoriteButton: "Add favorite",
audioRemoveFavoriteButton: "Remove favorite",
audioFileLabel: "Select an audio file (.mp3, .wav, .ogg)",
audioTagsLabel: "Tags",
audioTagsPlaceholder: "Enter tags separated by commas",
+ tagsPlaceholder: "Enter tags separated by commas",
audioTitleLabel: "Title",
audioTitlePlaceholder: "Optional",
audioDescriptionLabel: "Description",
audioDescriptionPlaceholder: "Optional",
audioNoFile: "No audio file provided",
noAudios: "No audios available.",
- audioSearchPlaceholder: "Search title, tags, author...",
+ audioSearchPlaceholder: "Search in Audios...",
audioSortRecent: "Most recent",
audioSortOldest: "Oldest",
audioSortTop: "Most voted",
@@ -976,7 +1179,7 @@ module.exports = {
audioFilterFavorites: "FAVORITES",
favoritesTitle: "Favorites",
favoritesDescription: "All your favorited content in one place.",
- favoritesSearchPlaceholder: "Search favorites...",
+ favoritesSearchPlaceholder: "Search in Favorites...",
favoritesFilterAll: "ALL",
favoritesFilterRecent: "RECENT",
favoritesFilterAudios: "AUDIOS",
@@ -988,13 +1191,12 @@ module.exports = {
favoritesFilterChats: "CHATS",
favoritesFilterCalendars: "CALENDARS",
favoritesFilterVideos: "VIDEOS",
- favoritesRemoveButton: "Remove from favorites",
favoritesNoItems: "No favorites yet.",
yourContacts: "Your Contacts",
allInhabitants: "Inhabitants",
allCVs: "CVs",
discoverPeople: "Discover inhabitants in your network.",
- searchInhabitantsPlaceholder: "FILTER inhabitants BY NAME …",
+ searchInhabitantsPlaceholder: "Search in Inhabitants...",
filterLocation: "FILTER inhabitants BY LOCATION …",
filterLanguage: "FILTER inhabitants BY LANGUAGE …",
filterSkills: "FILTER inhabitants BY SKILLS …",
@@ -1018,7 +1220,6 @@ module.exports = {
topSectionTitle: "TOP",
blockedLabel: "Blocked User",
inhabitantviewDetails: "View Details",
- cvVisitButton: "Visit CV",
keepReading: "Keep reading...",
oasisId: "ID",
noInhabitantsFound: "No inhabitants found, yet.",
@@ -1036,6 +1237,18 @@ module.exports = {
parliamentFilterLeaders: "LEADERS",
parliamentFilterRules: "RULES",
parliamentGovernmentCard: "Current Government",
+ parliamentSeatsGovernment: "Government",
+ parliamentSeatsOpposition: "Opposition",
+ parliamentSeatsAbstention: "Abstention",
+ parliamentSeatsQuorum: "Election quorum",
+ parliamentSeatsPass: "Approval threshold",
+ parliamentSeatsByElection: "By election",
+ parliamentSeatsByHouses: "By LARP house",
+ parliamentSeatsSeats: "seats",
+ parliamentSeatsSeat: "seat",
+ parliamentSeatsLeader: "Leader",
+ parliamentSeatsVotesFor: "votes for",
+ parliamentSeatsNoHouse: "No house",
parliamentActorInPowerInhabitant: 'INHABITANT RULING',
parliamentActorInPowerTribe: 'TRIBE RULING',
parliamentHistoricalGovernmentsTitle: 'GOVERMENTS',
@@ -1103,6 +1316,7 @@ module.exports = {
parliamentTimeRemaining: "Time remaining",
parliamentElectionsStatusTitle: "Next Government",
parliamentProposalDeadlineLabel: "Deadline",
+ parliamentViewReport: "View Report",
parliamentProposalTimeLeft: "Time left",
parliamentRulesTitle: "How Parliament works",
parliamentRulesIntro: "Election resolve every 2 months; candidatures are continuous and reset when a government is chosen.",
@@ -1117,6 +1331,7 @@ module.exports = {
parliamentRulesLaws: "When a proposal meets its threshold, it becomes a Law and appears in the Laws tab with its enactment date.",
parliamentRulesHistorical: "In the Historical tab you can see every government cycle that has occurred and data about its management.",
parliamentRulesLeaders: "In the Leaders tab you can see a ranking of inhabitants/tribes that have governed (or stood as candidates), ordered by efficiency.",
+ parliamentRulesHemicycle: "The hemicycle gives one seat per inhabitant: the government bloc (the winning candidature's voters and the leader), one opposition bloc per other candidature of the cycle, and abstention. The dashed marks show the election quorum (25% of the census) and the approval threshold of the current method. \"By LARP house\" colours the same seats by house.",
parliamentProposalVoteStatusLabel: "Vote status",
parliamentProposalOnTrackYes: "Threshold reached",
parliamentProposalOnTrackNo: "Below threshold",
@@ -1130,6 +1345,7 @@ module.exports = {
courtsCaseFormTitle: "Open Case",
courtsCaseRespondent: "Accused / Respondent",
courtsCaseRespondentPh: "Oasis ID (@...) or Tribe name",
+ courtsCaseSubjectPlaceholder: "Subject or short description",
courtsCaseMethod: "Resolution method",
courtsCaseSubmit: "File Case",
courtsNominateJudge: "Nominate Judge",
@@ -1164,15 +1380,30 @@ module.exports = {
courtsMethodDICTATOR: "Dictator",
courtsMethodPOPULAR: "Popular",
courtsMethodKARMATOCRACY: "Karmatocracy",
+ courtsCaseType: "Case type",
+ courtsPresetMinorConflict: "Minor conflict",
+ courtsPresetModerateConflict: "Moderate conflict",
+ courtsPresetSevereConflict: "Severe conflict",
+ courtsPresetHarassment: "Harassment or abuse",
+ courtsPresetContentModeration: "Content moderation",
+ courtsPresetBanRestriction: "Ban or restriction",
+ courtsPresetGovernanceDispute: "Governance dispute",
+ courtsStatusOPEN: "Open",
+ courtsStatusIN_PROGRESS: "In progress",
+ courtsStatusDECIDED: "Decided",
+ courtsStatusCLOSED: "Closed",
+ courtsStatusSOLVED: "Solved",
+ courtsStatusUNSOLVED: "Unsolved",
+ courtsStatusDISCARDED: "Discarded",
courtsRulesTitle: "How Courts work",
courtsRulesIntro: "Courts are a community-run process to resolve conflicts and promote restorative justice. Dialogue, clear evidence, and proportional remedies are prioritized.",
courtsRulesLifecycle: "Process: 1) Open case 2) Select method 3) Submit evidence 4) Hearing and deliberation 5) Verdict and remedy 6) Compliance and closure 7) Appeal (if applicable).",
- courtsRulesRoles: "Accuser: opens the case. Defence: accused person or tribe. Method: mechanism chosen by the community to facilitate, assess evidence, and issue a verdict. Witness: provides testimony or evidence. Mediators: neutral people invited by the accuser and/or the defence, with access to all details, who help de-escalate the conflict and co-create agreements.",
+ courtsRulesRoles: "Accuser: opens the case. Defence: accused inhabitant or tribe. Method: mechanism chosen by the community to facilitate, assess evidence, and issue a verdict. Witness: provides testimony or evidence. Mediators: neutral inhabitants invited by the accuser and/or the defence, with access to all details, who help de-escalate the conflict and co-create agreements.",
courtsRulesEvidence: "Description up to 1000 characters. Attach relevant and lawful images, audio, video, and PDF documents. Do not share sensitive private data without consent.",
courtsRulesDeliberation: "Hearings may be public or private. Judges ensure respect, request clarifications, and may discard irrelevant or unlawful material.",
courtsRulesVerdict: "Restoration is prioritized: apologies, mediation agreements, content moderation, temporary restrictions, or other proportional measures. The reasoning must be recorded.",
courtsRulesAppeals: "Appeal: allowed when there is new evidence or a clear procedural error. Must be filed within 7 days unless otherwise stated.",
- courtsRulesPrivacy: "Respect privacy and safety. Doxing, hate, or threats are removed. Judges may edit or seal parts of the record to protect people at risk.",
+ courtsRulesPrivacy: "Respect privacy and safety. Doxing, hate, or threats are removed. Judges may edit or seal parts of the record to protect inhabitants at risk.",
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",
@@ -1188,12 +1419,16 @@ module.exports = {
exploreTrending: "Explore the most popular content in your network.",
votesButton: "VOTATIONS",
shopProductButton: "SHOP",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISODE",
+ campaignButton: "CAMPAIGN",
+ logisticsRouteButton: "ROUTE",
trendingTotalOpinions: "Total Opinions",
trendingNoContentMessage: "No trending available, yet.",
trendingTotalCount: "Total Count",
tasksTitle: "Tasks",
tasksDescription: "Discover and manage tasks in your network.",
- taskSearchPlaceholder: "Search tasks...",
+ taskSearchPlaceholder: "Search in Tasks...",
taskTitleLabel: "Title",
taskDescriptionLabel: "Description",
taskStartTimeLabel: "Start Time",
@@ -1212,7 +1447,7 @@ module.exports = {
taskStatusOpen: "Open",
taskStatusInProgress: "In Progress",
taskStatusClosed: "Closed",
- taskAssignedTo: "Assigned to",
+ taskAssignedTo: "Assigned",
taskAssignedChip: "Assigned",
taskUnassignedChip: "Unassigned",
taskAssignees: "Assignees",
@@ -1222,6 +1457,7 @@ module.exports = {
taskUpdateButton: "Update",
taskDeleteButton: "Delete",
taskFilterAll: "ALL",
+ taskFilterRecent: "RECENT",
taskFilterMine: "MINE",
taskFilterOpen: "OPEN",
taskFilterInProgress: "IN-PROGRESS",
@@ -1249,14 +1485,13 @@ module.exports = {
eventUpcomingDates: "Upcoming dates",
eventsTitle: "Events",
eventsDescription: "Discover and manage events in your network.",
- eventSearchPlaceholder: "Search events...",
+ eventSearchPlaceholder: "Search in Events...",
eventPrice: "Price",
eventStatus: "Status",
eventAllSectionTitle: "Events",
eventMineSectionTitle: "Your Events",
eventCreateSectionTitle: "Create Event",
eventUpdateSectionTitle: "Update Event",
- eventDeleteButton: "Delete",
eventCreateButton: "Create Event",
eventAddToCalendar: "Add to Calendar",
eventVisitCalendar: "Visit Calendar",
@@ -1274,11 +1509,11 @@ module.exports = {
viewPlace: "View Place",
generatePdf: "Generate PDF",
sharePm: "Share via PM",
- galleryImages: "Images (max-size: 50MB each)",
+ galleryImages: "Images (max-size: 75MB each)",
galleryPhotos: "Images",
galleryAddPhoto: "Add Image",
galleryRemovePhoto: "Remove",
- galleryVideo: "Video (max-size: 50MB)",
+ galleryVideo: "Video (max-size: 75MB)",
galleryAddVideo: "Add Video",
galleryRemoveVideo: "Remove video",
viewVotation: "View Votation",
@@ -1298,6 +1533,7 @@ module.exports = {
eventDate: "Date",
eventAttendButton: "Attend Event",
eventFilterAll: "ALL",
+ eventFilterRecent: "RECENT",
eventFilterMine: "MINE",
eventFilterToday: "TODAY",
eventFilterWeek: "THIS WEEK",
@@ -1324,7 +1560,7 @@ module.exports = {
tagsFilterTop: "TOP",
tagsFilterCloud: "CLOUD",
tagsNoItems: "No tags available.",
- tagsSearchPlaceholder: "Search tags...",
+ tagsSearchPlaceholder: "Search in Tags...",
tagsTableHeaderTag: "TAG/LINK:",
tagsTableHeaderCount: "COUNTER:",
transfersTitle: "Transfers",
@@ -1332,7 +1568,10 @@ module.exports = {
transfersFrom: "From",
transfersTo: "To",
transfersFilterAll: "ALL",
+ transfersFilterRecent: "RECENT",
transfersFilterMine: "MINE",
+ transfersFilterMinePending: "PENDING",
+ transfersFilterMineConfirmed: "SIGNED",
transfersFilterUBI: "UBI",
transfersFilterMarket: "MARKET",
transfersFilterTop: "TOP",
@@ -1347,7 +1586,6 @@ module.exports = {
transfersCategoryEconomic: "Economic",
transfersCategoryTime: "Time",
transfersCategoryTrust: "Trust",
- transfersCategoryApply: "Apply",
transfersUnitEco: "ECO",
transfersUnitHours: "h",
transfersUnitTrust: "trust",
@@ -1377,7 +1615,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Discarded Transfers",
transfersCreateSectionTitle: "Create transfer",
transfersAllSectionTitle: "Transfers",
- transfersSearchPlaceholder: "Search concept, tags, users...",
+ transfersSearchPlaceholder: "Search in Transfers...",
transfersMinAmountLabel: "Min amount",
transfersMaxAmountLabel: "Max amount",
transfersSortRecent: "Most recent",
@@ -1399,6 +1637,7 @@ module.exports = {
voteErrorTitle: "Check the form",
voteErrorDeadlineMin: "The deadline must be at least {days} days from now.",
voteErrorGeneric: "The vote could not be saved.",
+ voteLocked: "This vote has already received votes or opinions, or belongs to Parliament or Courts: it can no longer be edited or deleted.",
voteUpdateButton: "Update",
voteDeleteButton: "Delete",
voteOptionYes: "YES",
@@ -1408,6 +1647,7 @@ module.exports = {
voteFollowMajority: "FOLLOW MAJORITY",
voteNotInterested: "NOT INTERESTED",
voteFilterAll: "ALL",
+ voteFilterRecent: "RECENT",
voteFilterMine: "MINE",
voteFilterOpen: "OPEN",
voteFilterClosed: "CLOSED",
@@ -1423,7 +1663,6 @@ module.exports = {
voteTags: "Tags",
voteOpinions: "Opinions",
novotes: "No voting proposals available.",
- voteBy: "By",
voteCreatedAt: "Created At",
voteNoQuestion: "No question provided",
voteUnknownCreator: "Unknown Creator",
@@ -1433,6 +1672,7 @@ module.exports = {
voteCommentsForumButton: 'Open discussion',
voteCommentsSectionTitle: 'Open discussion',
voteNoCommentsYet: 'There are no comments yet. Be the first to reply.',
+ commentsGoToLast: "Go to the last comment",
voteNewCommentPlaceholder: 'Write your comment here…',
voteNewCommentButton: 'Post comment',
voteNewCommentLabel: 'Add a comment',
@@ -1443,6 +1683,8 @@ module.exports = {
cvNameLabel: "Full Name",
cvDescriptionLabel: "Summary",
cvPhotoLabel: "Photo",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Visit CV",
cvPersonalExperiencesLabel: "Personal Experiences",
cvPersonalSkillsLabel: "Personal Skills (comma-separated)",
cvOasisExperiencesLabel: "Oasis Contribution Experiences",
@@ -1472,9 +1714,9 @@ module.exports = {
cvNoCV: "No CV found.",
blogSubject: "Subject",
blogMessage: "Message",
- blogImage: "Upload media (max-size: 50MB)",
+ blogImage: "Upload media (max-size: 75MB)",
blogMedia: "Attachments (up to 8 images and a video)",
- blogPublish: "Preview",
+ blogPublish: "Publish",
pollsTitle: "Polls",
dataTitle: "Matches",
dataDescription: "Explore and visualize the matches in your network.",
@@ -1493,12 +1735,23 @@ module.exports = {
dataKindTasks: "TASKS",
dataKindReports: "REPORTS",
dataKindVotes: "VOTATIONS",
- dataSearchPlaceholder: "Search the cross-data...",
+ dataSearchPlaceholder: "Search in Matches...",
dataCohesionTitle: "Cohesion Coefficient (CC)",
dataCcShort: "CC",
dataCohesionHint: "Average affinity between everything the network has published.",
dataAffinity: "Affinity",
dataCommonTerms: "Keyword",
+ dataReasonFollowing: "You support this inhabitant",
+ dataReasonTribe: "Shares a tribe with you",
+ dataReasonPinned: "Matches something you pinned",
+ dataReasonCv: "Matches your CV skills",
+ dataReasonContent: "Related to what you publish",
+ dataReasonRelated: "Related to your interests",
+ dataReasonAlike: "Published by an inhabitant like you",
+ dataReasonSupportsYou: "Supports you",
+ dataReasonMutual: "Mutual support",
+ dataReasonRated: "Well rated by the network",
+ dataReasonNear: "Near you",
dataStatPeople: "CVs",
dataStatConnected: "Connected",
dataStatSkills: "Skills",
@@ -1551,7 +1804,7 @@ module.exports = {
pollStatusLabel: "Status",
pollStatusOpen: "OPEN",
pollStatusClosed: "CLOSED",
- pollSearchPlaceholder: "Search polls...",
+ pollSearchPlaceholder: "Search in Polls...",
pollsNoItems: "No polls found.",
viewPoll: "View Poll",
pollChatCreate: "Create Poll",
@@ -1564,7 +1817,7 @@ module.exports = {
blogFilterFavorites: "FAVORITES",
blogFilterTop: "TOP",
blogCreateButton: "Create Blog",
- blogSearchPlaceholder: "Search blogs...",
+ blogSearchPlaceholder: "Search in Blogs...",
blogComments: "Comments",
blogAllowComments: "Allow comments",
blogCommentsClosed: "The author has closed comments on this blog.",
@@ -1577,12 +1830,11 @@ module.exports = {
forumCreateButton: "Create forum",
forumCreateSectionTitle: "Create forum",
forumDescription: "Talk openly with other inhabitants in your network.",
- forumSearchPlaceholder: "Search forums...",
+ forumSearchPlaceholder: "Search in Forums...",
forumFilterAll: "ALL",
forumFilterMine: "MINE",
forumFilterRecent: "RECENT",
forumFilterTop: "TOP",
- forumDeleteButton: "Delete",
forumParticipants: "participants",
forumMessages: "messages",
forumMessageLabel: "Message",
@@ -1594,7 +1846,7 @@ module.exports = {
larpTitle: "L.A.R.P.",
larpDescription: "A live action role-playing layer for collaborative experimentation.",
larpNoHousesMatch: "No houses match your search.",
- larpSearchPlaceholder: "Search houses...",
+ larpSearchPlaceholder: "Search in L.A.R.P....",
larpAllHouses: "Houses:",
larpFilterRuling: "RULING",
larpFilterHouses: "HOUSES",
@@ -1630,8 +1882,6 @@ module.exports = {
larpInviteCreate: "Generate invitation code",
larpInvitePlaceholder: "Invitation code",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "House invitation code",
- invitesHouseJoinButton: "Join House",
larpInviteBannerTitle: "New invitation code",
larpInviteBannerHint: "Share this code with someone in ACADEMIA. It expires in 30 cycles or after one use.",
larpTestRankingTitle: "Score by house",
@@ -1647,7 +1897,7 @@ module.exports = {
larpProfileQ1O3: "Research the literature",
larpProfileQ1O4: "Disrupt the system that creates it",
larpProfileQ2: "What gives meaning to your daily work?",
- larpProfileQ2O1: "Defending the people I love",
+ larpProfileQ2O1: "Defending the inhabitants I love",
larpProfileQ2O2: "Creating something tangible",
larpProfileQ2O3: "Healing or nurturing life",
larpProfileQ2O4: "Crafting words and ideas",
@@ -1722,7 +1972,7 @@ module.exports = {
larpBadgeYou: "You",
larpBadgeRuling: "Ruling",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "Module for the live-action role-playing layer of Oasis (the 9 Houses).",
+ modulesLarpDescription: "Module for the live-action role-playing layer.",
imageTitle: "Images",
imageDescription: "Explore and manage image content in your network.",
imageMineSectionTitle: "Your Images",
@@ -1741,7 +1991,6 @@ module.exports = {
imageFilterGallery: "GALLERY",
imageCreateButton: "Upload Image",
imageUpdateButton: "Update",
- imageDeleteButton: "Delete",
imageAddFavoriteButton: "Add favorite",
imageRemoveFavoriteButton: "Remove favorite",
imageFileLabel: "Select an image file (.jpeg, .jpg, .png, .gif)",
@@ -1753,13 +2002,14 @@ module.exports = {
imageDescriptionPlaceholder: "Optional",
imageNoFile: "No image file provided",
noImages: "No images available.",
- imageSearchPlaceholder: "Search title, tags, description, author...",
+ imageSearchPlaceholder: "Search in Images...",
imageSortRecent: "Most recent",
imageSortOldest: "Oldest",
imageSortTop: "Most voted",
imageSearchButton: "Search",
imageUpdatedAt: "Updated",
imageNoMatch: "No images match your search.",
+ feedSearchPlaceholder: "Search in Feed...",
feedTitle: "Feed",
feedDetailTitle: "Feed",
feedOpenDiscussion: "Open discussion",
@@ -1778,7 +2028,7 @@ module.exports = {
alreadyRefeeded: "You already refeeded this.",
activityTitle: "Activity",
yourActivity: "Your Activity",
- globalActivity: "Global Activity",
+ globalActivity: "Activity",
activityList: "Activity",
activityDesc: "See the latest activity in your network.",
allButton: "ALL",
@@ -1793,7 +2043,8 @@ module.exports = {
meme: "Meme",
typeRecent: "RECENT",
typeTop: "TOP",
- typePost: "BLOGS",
+ typePost: "BLOG",
+ activityUpdateLabel: "UPDATE",
typeTribe: "TRIBES",
typeLarp: "L.A.R.P.",
typeInhabitants: "INHABITANTS",
@@ -1936,7 +2187,7 @@ module.exports = {
courtsNoCases: 'No cases.',
reportsTitle: "Reports",
reportsDescription: "Manage and track reports in your network.",
- reportsSearchPlaceholder: "Search reports...",
+ reportsSearchPlaceholder: "Search in Reports...",
reportsFilterAll: "ALL",
reportsFilterRecent: "RECENT",
reportsFilterTop: "TOP",
@@ -1984,7 +2235,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Under Review Reports",
reportsResolvedSectionTitle: "Resolved Reports",
reportsInvalidSectionTitle: "Invalid Reports",
- reportsTemplateSectionTitle: 'Report template',
reportsBugTemplateTitle: 'Reproduction details (Bugs)',
reportsFeatureTemplateTitle: 'Details (Features)',
reportsAbuseTemplateTitle: 'Details (Abuse)',
@@ -2044,17 +2294,15 @@ module.exports = {
tribeGallerySectionTitle: "Tribes Gallery",
tribeRecentSectionTitle: "Recent Tribes",
tribeTopSectionTitle: "Popular Tribes",
- tribeviewTribeButton: "Visit Tribe",
- tribeviewSubTribeButton: "Visit Sub-Tribe",
tribeRootLabel: "ROOT",
tribeDescription: "Explore or create tribes on your network.",
tribeMainTribeLabel: "MAIN TRIBE",
tribeCreateButton: "Create Tribe",
tribeUpdateButton: "Update",
tribeDeleteButton: "Delete",
- tribeImageLabel: "Upload media (max-size: 50MB)",
+ tribeImageLabel: "Upload media (max-size: 75MB)",
tribeTitleLabel: "Title",
- searchTribesPlaceholder: "FILTER tribes BY NAME …",
+ searchTribesPlaceholder: "Search in Tribes...",
tribeTitlePlaceholder: "Name of the tribe",
tribeDescriptionLabel: "Description",
tribeDescriptionPlaceholder: "Describe this tribe",
@@ -2067,6 +2315,15 @@ module.exports = {
tribeIsAnonymousLabel: "STATUS",
tribeMembersCount: "Members",
tribeEnterInvite: "ENTER INVITE CODE",
+ subscriptionTitle: "Subscriptions",
+ subscriptionOn: "Subscribed",
+ subscriptionOff: "Not subscribed",
+ subscriptionSubscribe: "Subscribe",
+ subscriptionUnsubscribe: "Unsubscribe",
+ subscriptionSubscribers: "Subscribers",
+ pmListLabel: "Send to",
+ pmListNone: "— No list —",
+ pmListNoSubscribers: "No subscribers",
tribeLeaveButton: "LEAVE",
tribePublic: "PUBLIC",
tribePrivate: "PRIVATE",
@@ -2163,9 +2420,14 @@ module.exports = {
tribeMediaTypeDocument: "Document",
tribeMediaTypeBookmark: "Bookmark",
tribeContentDelete: "DELETE",
+ tribeReachTribe: "TRIBE",
+ tribeReachNotice: "OASIS shows it to every inhabitant and CLEARNET also on the open web. Opening it leaves a readable copy outside the tribe: moving it back to TRIBE hides it, but copies already shared cannot be erased.",
+ tribeReachPrivate: "Content of a private tribe can only stay inside the tribe.",
+ tribeReachOpenedBy: "Opened by",
+ tribeReachChange: "Where it is published",
tribeInviteCodeText: "Invite code: ",
oasisVersionLabel: "Oasis Version",
- tribeInviteCodeHint: "Share this code with someone you want to invite. They can join via /invites → Tribes.",
+ tribeInviteCodeHint: "Share this code with someone you want to invite. They can join via /invites.",
tribeStatusOpen: "OPEN",
tribeStatusClosed: "CLOSED",
tribeStatusInProgress: "IN PROGRESS",
@@ -2205,7 +2467,7 @@ module.exports = {
tribeSearchMinChars: "Enter at least 2 characters to search.",
agendaTitle: "Agenda",
agendaDescription: "Here you can find all your assigned items.",
- agendaSearchPlaceholder: "Search agenda...",
+ agendaSearchPlaceholder: "Search in Agenda...",
agendaFilterAll: "ALL",
agendaFilterToday: "TODAY",
agendaFilterUpcoming: "UPCOMING",
@@ -2226,6 +2488,7 @@ module.exports = {
agendaNoItems: "No assignments found.",
agendaDiscardButton: "Discard",
agendaRestoreButton: "Restore",
+ agendaRemoveButton: "Remove",
agendaMembersCount: "Members",
agendaLocationLabel: "Location",
agendaYes: "YES",
@@ -2292,8 +2555,8 @@ module.exports = {
pmComposeTitle: "Send a message",
pmRecipients: "Recipients",
pmRecipientsHint: "Enter Oasis IDs separated by commas",
- pmLimitsHint: "Up to 7 recipients per message.",
- pmTextPlaceholder: "Body capped at 7000 characters.",
+ pmLimitsHint: "Up to 7 inhabitants per message.",
+ pmTextPlaceholder: "Write your message.",
pmSubject: "Subject",
pmSubjectHint: "Enter the message subject",
pmText: "Message",
@@ -2315,8 +2578,8 @@ module.exports = {
pmCrypterCharsLabel: "characters",
pmInvalidRecipients: "Invalid Oasis ID (should be like @…=.ed25519).",
pmEncryptionLabel: "Encryption",
- private: "Private",
- privateDescription: "Your encrypted messages.",
+ private: "Inbox",
+ privateDescription: "Manage your private messages.",
privateInbox: "INBOX",
privateSent: "SENT",
privateDelete: "Delete",
@@ -2372,19 +2635,19 @@ module.exports = {
visitContent: "Visit Content",
favoriteAdd: "Pin to Favorites",
pmContentTooltip: "Send a Private Message",
+ phoneCallTooltip: "Make a Phone Call",
favoriteRemove: "Unpin from Favorites",
reportContent: "Report Content",
banking: 'Banking',
bankingTitle: 'Banking',
- bankingDescription: "The ECOin economy: balance, UBI, taxes and industry value.",
+ bankingDescription: "The ECOin collective economy.",
bankOverview: 'Overview',
bankEpochs: 'Epochs',
bankRules: 'Rules',
pending: 'Pending',
closed: 'Closed',
- bankViewTx: 'View Tx',
bankClaimNow: 'Claim now',
- bankClaimUBI: 'Claim UBI!',
+ bankClaimUBI: 'Claim UBI',
bankClaimAndPay: 'Claim & Pay',
bankClaimedPending: 'Claim pending...',
bankStatusClaimed: 'Claimed',
@@ -2408,8 +2671,8 @@ module.exports = {
bankViewEpoch: 'View Epoch',
bankYourIndustryBalance: "Your Industry Share",
bankYourUbiMonth: "Your UBI (this month)",
- bankYourFundsMonth: "Your Funds (this month)",
- bankIndustryBalance: "Industry Production (estimated)",
+ bankYourFundsMonth: "Total Funds",
+ bankIndustryBalance: "Industry Production",
bankUserBalance: 'Your Balance',
bankAddresses: 'Addresses',
bankNoAddresses: 'No addresses found.',
@@ -2417,6 +2680,10 @@ module.exports = {
bankAddress: 'Address',
bankAddAddressTitle: 'Add ECOIN address',
bankAddAddressUser: 'Oasis ID',
+ bankAddAddressLabel: "Label (optional)",
+ bankAddAddressLabelPlaceholder: "Bob's wallet, Alice's shop…",
+ bankAddAddressUserOptional: "Oasis ID (optional)",
+ bankAddressUnnamed: "Unnamed address",
bankAddAddressAddress: 'ECOIN Address',
bankAddAddressSave: 'Save',
bankAddressAdded: 'Address added',
@@ -2434,11 +2701,11 @@ module.exports = {
bankAddressDeleteConfirm: 'Delete this address?',
search: 'Search!',
bankLocal: 'Local',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Network",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "NO FUNDS!",
bankUbiAvailableOk: "AVAILABLE!",
- bankUbiAvailability: "UBI (network)",
+ bankUbiAvailability: "UBI",
bankAlreadyClaimedThisMonth: "Already claimed this month",
bankUbiThisMonth: "UBI (this month)",
bankUbiLastClaimed: "UBI (last claimed)",
@@ -2468,6 +2735,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Encrypted in transit",
shopAddFavorite: "Add Favorite",
shopRemoveFavorite: "Remove Favorite",
shopOpen: "OPEN",
@@ -2475,6 +2743,13 @@ module.exports = {
shopMakePrivate: "MAKE PRIVATE (E2E)",
shopMakePublic: "MAKE PUBLIC",
shopProducts: "Products",
+ shopFilterAll: "ALL",
+ shopFilterRecent: "RECENT",
+ shopFilterMine: "MINE",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUCTS",
+ shopFilterPrices: "PRICES",
+ shopFilterFavorites: "FAVORITES",
shopProductAdd: "Add Product",
shopProductTitle: "Product",
shopProductUpdate: "Update Product",
@@ -2502,7 +2777,7 @@ module.exports = {
marketVisitItem: "VISIT ITEM",
shopStatus: "STATUS",
shopCreatedAt: "CREATED",
- shopSearchPlaceholder: "Search shops...",
+ shopSearchPlaceholder: "Search in Shops...",
shopUrl: "URL",
shopLocation: "Location",
shopTags: "Tags",
@@ -2512,7 +2787,7 @@ module.exports = {
shopTitlePlaceholder: "Name of your shop",
shopDescriptionPlaceholder: "Detailed description of your shop",
shopLocationPlaceholder: "City, Country",
- shopTagsPlaceholder: "tag1, tag2, tag3",
+ shopTagsPlaceholder: "Enter tags separated by commas",
mapTitlePlaceholder: "Map title",
shopProductFeatured: "Featured Product",
shopSendToMarket: "Send to Market",
@@ -2520,29 +2795,32 @@ module.exports = {
typeShopProduct: "SHOP PRODUCT",
bankExchange: 'Exchange',
bankExchangeCurrentValue: 'ECOin Value (1h)',
- bankTotalSupply: 'ECOin Total Supply',
- bankEcoinHours: "ECOin Equivalence in Time",
+ bankTotalSupply: "ECOin Total Supply",
+ bankPubsSupply: "ECOin PUBs Pool Supply",
+ bankHoldingSupply: "ECOin Holding Supply",
+ bankEcoinHours: "ECOin Equivalence in Time (1 ECO)",
bankHoursOfWork: 'hours',
bankUnitMs: "ms",
bankUnitSeconds: "seconds",
bankUnitMinutes: "minutes",
bankUnitDays: "days",
bankExchangeNoData: 'No data available',
- bankInflation: 'ECOin Inflation (anual)',
- bankInflationMonthly: 'ECOin Inflation (mensual)',
+ bankInflation: "ECOin Inflation (annual)",
+ bankInflationMonthly: "ECOin Inflation (monthly)",
bankExchangeChartTitle: 'ECOin value progression over time',
bankExchangeChartValue: 'Value (ECO/h)',
bankExchangeChartSupply: 'Supply',
bankExchangeChartInflation: 'Inflation %',
bankExchangeChartEmpty: 'Not enough samples yet — revisit later',
- bankCurrentSupply: 'ECOin Current Supply',
+ bankCurrentSupply: "ECOin Current Supply",
bankingSyncStatus: 'ECOin Status',
bankingSyncStatusSynced: 'Synced',
- bankingSyncStatusOutdated: 'Outdated',
+ bankingSyncStatusOutdated: "Unsync",
statsTitle: 'Statistics',
statistics: "Statistics",
statsDescription: "Discover statistics about your network.",
ALLButton: "ALL",
+ RECENTButton: "RECENT",
MINEButton: "MINE",
TOMBSTONEButton: "TOMBSTONES",
statsCreatedAt: "Created At",
@@ -2550,7 +2828,8 @@ module.exports = {
statsYourOpinions: "Opinions",
statsNetworkContent: "Content",
statsNetworkOpinions: "Opinions",
- statsEcoWalletLabel: "ECOIN Wallet",
+ statsEcoWalletLabel: "ECOin Wallet",
+ walletAddressCopyHint: "Click to select, then copy",
statsEcoWalletNotConfigured: "Not configured!",
statsBookmark: "Bookmarks",
statsEvent: "Events",
@@ -2572,6 +2851,8 @@ module.exports = {
statsTransfer: "Transfers",
statsAiExchange: "AI",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "Peers",
+ statsTotalLabel: "Total",
statsPost: "Posts",
statsSize: "Total (size)",
statsBlockchainSize: "Blockchain (size)",
@@ -2623,8 +2904,14 @@ module.exports = {
aiPrompt: "Provide an informative and precise response.",
aiConfiguration: "Set prompt",
aiPromptUsed: "Prompt",
- aiClearHistory: "Clear chat history",
- aiServerError: "The AI could not answer. Please try again.",
+ aiClearHistory: "Clear history",
+ aiServerError: "I cannot answer properly. Please try again.",
+ aiStatusLoading: "42 is loading the model. Ask again in a moment.",
+ aiThinking: "Thinking",
+ aiWaiting: "Waiting",
+ aiStatusMissingModel: "The AI model is not installed: src/AI/oasis-42-1-chat.Q4_K_M.gguf is missing.",
+ aiExportFineTuning: "Export Fine-Tuning",
+ aiFactsTitle: "Data from your network",
aiInputPlaceholder: "What is Oasis?",
typeAiExchange: "AI",
aiApproveTrain: "Add to collective training",
@@ -2653,7 +2940,7 @@ module.exports = {
marketFilterDiscarded: "DISCARDED",
marketFilterRecent: "RECENT",
marketFilterMyBids: "BIDS",
- marketCreateButton: "Create Item",
+ marketCreateButton: "Sell Something",
marketItemType: "Type",
marketItemTitle: "Title",
marketItemAvailable: "Deadline",
@@ -2680,8 +2967,8 @@ module.exports = {
marketItemSeller: "Seller",
marketNoItems: "No items available, yet.",
marketYourBid: "Your Bid",
- marketCreateFormImageLabel: "Upload media (max-size: 50MB)",
- marketSearchPlaceholder: "Search title or tags",
+ marketCreateFormImageLabel: "Upload media (max-size: 75MB)",
+ marketSearchPlaceholder: "Search in Market...",
marketMinPriceLabel: "Min price",
marketMaxPriceLabel: "Max price",
marketSortRecent: "Most recent",
@@ -2747,8 +3034,7 @@ module.exports = {
housingSetClosed: "Make unavailable",
housingCreateButton: "Create Place",
housingUpdateButton: "Update",
- housingDeleteButton: "Delete",
- housingSearchPlaceholder: "Search places...",
+ housingSearchPlaceholder: "Search in Housing...",
housingSearchButton: "Search",
housingMinPrice: "Min price",
housingMaxPrice: "Max price",
@@ -2804,7 +3090,7 @@ module.exports = {
jobLocationPresencial: "On-place",
jobLocationRemote: "Remote",
jobVacantsPlaceholder: "Number of positions",
- jobImage: "Upload media (max-size: 50MB)",
+ jobImage: "Upload media (max-size: 75MB)",
jobTasks: "Tasks",
jobType: "Job Type",
jobTime: "Job Time",
@@ -2826,12 +3112,11 @@ module.exports = {
jobsExchangeSkill: "Skill wanted in exchange",
jobTimePartial: "Part-time",
jobTimeComplete: "Full-time",
- jobsDeleteButton: "DELETE",
jobsUpdateButton: "UPDATE",
jobsFilterApplied: "APPLIED",
jobsAppliedTitle: "My applications",
jobsAppliedBadge: "Applied",
- jobsSearchPlaceholder: "Search title, tags, description...",
+ jobsSearchPlaceholder: "Search in Jobs...",
jobsMinSalaryLabel: "Min salary",
jobsMaxSalaryLabel: "Max salary",
jobsSortRecent: "Most recent",
@@ -2843,7 +3128,7 @@ module.exports = {
jobSetOpen: "Set open",
jobsTagsLabel: "Tags",
noJobsMatch: "No jobs match your search.",
- industrySearchPlaceholder: "Search facilities…",
+ industrySearchPlaceholder: "Search in Industry...",
industryAllSectors: "All sectors",
industryVisitButton: "Visit Industry",
industryAdvanceTo: "Set to",
@@ -2917,7 +3202,6 @@ 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",
@@ -2932,7 +3216,7 @@ module.exports = {
housingBotYouRequestedTitle: "You have requested a place.",
housingBotYouCancelledTitle: "You have cancelled a request.",
housingBotUnavailableTitle: "A place you requested is no longer available.",
- housingBotUnavailableSentTitle: "You have told the people who requested this place.",
+ housingBotUnavailableSentTitle: "You have told the inhabitants who requested this place.",
industryBotAdmittedTitle: "You have been admitted to a facility.",
industryBotApplicationTitle: "New membership application in your facility.",
industryBotInvitedTitle: "You have been invited to a facility.",
@@ -2943,8 +3227,8 @@ module.exports = {
industryRulesTitle: "Rules",
industryRulesIntro: "Industry lets inhabitants collectively own the means of production: a Facility is a network-owned workshop that nobody owns privately.",
industryRulesSteward: "The founder is the steward — a caretaker, not an owner: they cannot sell, privatize or dissolve the Facility on their own.",
- industryRulesMembership: "Membership policy sets how people join: Open (join instantly), By vote (admitted by the members' vote) or Invite only (a member must invite them first).",
- industryRulesQuorum: "Quorum is the minimum number of members that must vote for a decision to count, so a small Facility isn't decided by a single person.",
+ industryRulesMembership: "Membership policy sets how inhabitants join: Open (join instantly), By vote (admitted by the members' vote) or Invite only (a member must invite them first).",
+ industryRulesQuorum: "Quorum is the minimum number of members that must vote for a decision to count, so a small Facility isn't decided by a single inhabitant.",
industryRulesMajority: "Majority is the fraction of votes needed to pass (0.5 = half, 1 = unanimity); a decision passes when YES votes reach at least max(quorum, members × majority).",
industryRulesDecisions: "Members vote to admit newcomers, approve builds and dissolve the Facility; the steward cannot override these collective decisions.",
industryRulesBlueprints: "Blueprints are libre (COPYLEFT) recipes — the inputs (materials, labor hours, skills) and the output (a physical or digital good) — and anyone can fork them.",
@@ -2970,6 +3254,7 @@ module.exports = {
modulesIndustryLabel: "Industry",
modulesIndustryDescription: "Module to manage the means of production collectively.",
industryFilterAll: "ALL",
+ industryFilterRecent: "RECENT",
industryFilterMember: "MEMBER",
industryFilterBlueprints: "BLUEPRINTS",
industryFilterBuilds: "BUILDS",
@@ -2978,6 +3263,7 @@ module.exports = {
industryFilterPaused: "PAUSED",
industryFilterDissolved: "DISSOLVED",
industryAllTitle: "Industry",
+ industryRecentTitle: "Recent facilities",
industryMemberTitle: "Facilities I'm in",
industryMineTitle: "My facilities",
industryActiveTitle: "Working",
@@ -3025,7 +3311,7 @@ module.exports = {
industryPolicy_invite: "Invite only",
projectsTitle: "Projects",
projectsDescription: "Create, fund, and follow community-driven projects in your network.",
- projectSearchPlaceholder: "Search projects...",
+ projectSearchPlaceholder: "Search in Projects...",
projectCreateProject: "Create Project",
projectCreateButton: "Create Project",
projectUpdateButton: "UPDATE",
@@ -3048,7 +3334,7 @@ module.exports = {
projectRecentTitle: "Recent Projects",
projectTopTitle: "Top Funded",
projectTitlePlaceholder: "Project name",
- projectImage: "Upload media (max-size: 50MB)",
+ projectImage: "Upload media (max-size: 75MB)",
projectDescription: "Description",
projectDescriptionPlaceholder: "Tell the story and goals…",
projectGoal: "Goal (ECO)",
@@ -3120,15 +3406,13 @@ module.exports = {
modulesModuleName: "Name",
modulesModuleDescription: "Description",
modulesModuleStatus: "Status",
- modulesTotalModulesLabel: "Loaded Modules",
+ modulesTotalModulesLabel: "Total",
modulesEnabledModulesLabel: "Enabled",
modulesDisabledModulesLabel: "Disabled",
modulesInvitesLabel: "Invites",
modulesInvitesDescription: "Module to manage and apply invite codes.",
modulesWalletLabel: "Wallet",
modulesWalletDescription: "Module to manage your digital assets (ECOin).",
- modulesLegacyLabel: "Legacy",
- modulesLegacyDescription: "Module to manage your secret (private key) quickly and securely.",
modulesCipherLabel: "Cipher",
modulesCipherDescription: "Module to encrypt and decrypt your text symmetrically (using a shared password).",
modulesBookmarksLabel: "Bookmarks",
@@ -3190,20 +3474,23 @@ module.exports = {
modulesProjectsLabel: "Projects",
modulesProjectsDescription: "Module to explore, crowd-funding and manage projects.",
modulesBankingLabel: "Banking",
- modulesBankingDescription: "Module to determine the real value of ECOIN and distribute a UBI using the common treasury.",
+ modulesBankingDescription: "Module to manage the common treasury: ECOIN value, taxes and UBI.",
modulesFavoritesLabel: "Favorites",
modulesFavoritesDescription: "Module to manage your favorite content.",
fileTooLargeTitle: "File too large",
- fileTooLargeMessage: "The file exceeds the maximum allowed size (50 MB). Please select a smaller file.",
+ fileTooLargeMessage: "The file exceeds the maximum allowed size (75 MB). Please select a smaller file.",
goBack: "Go back",
+ errorDismiss: "OK",
errorPageTitle: "Something went wrong",
+ errorNoAllocation: "No allocation found for this claim.",
+ errorInvalidClaim: "This allocation cannot be claimed.",
visibilityLabel: "Visibility",
+ clearnetPrivateConflict: "Private, hidden, closed, invite-only or paid content cannot be published on the CLEARNET. Choose OASIS or make it public.",
visibilityPublic: "Public",
visibilityHidden: "Hidden",
visibilityMakePublic: "Make public",
visibilityMakeHidden: "Make hidden",
invitesInhabitantsTitle: "Inhabitants",
- invitesInhabitantsFollow: "Give Support",
aiNavPlaceholder: "Describe what you need...",
aiNavDisabled: "AI navigation is disabled.",
aiNavResultsTitle: "AINav Suggestions",
@@ -3214,7 +3501,7 @@ module.exports = {
modulesAINavDescription: "Module for natural-language queries about the network's content.",
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)",
+ peerPort: "Port",
peerPublicKey: "Public Key (@...ed25519)",
connectAndFollow: "Connect",
modulesPresetTitle: "Common Configurations",
@@ -3223,18 +3510,18 @@ module.exports = {
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_kids: "Kids",
+ workflow_activists: "Activists",
workflow_mobile: "Mobile",
statsCarbonFootprintTitle: "Carbon Footprint",
statsCarbonTombstone: "Tombstoning footprint",
- uploadMedia: "Upload media (max-size: 50MB)",
+ uploadMedia: "Upload media (max-size: 75MB)",
mapsLabel: "Maps",
mapTitle: "Maps",
- mapDescription: "Explore and manage offline maps in your network.",
+ mapDescription: "Manage and share offline maps in your network.",
mapMineSectionTitle: "Your Maps",
mapCreateSectionTitle: "Create Map",
mapUpdateSectionTitle: "Update Map",
@@ -3276,7 +3563,20 @@ module.exports = {
mapAddMarkerButton: "Add Marker",
mapCleanMarkerButton: "Clean Marker",
mapApplyZoom: "Apply Zoom",
- mapSearchPlaceholder: "Search description, tags, author...",
+ mapPlaceSearchPlaceholder: "Find a place or country...",
+ mapNoPlaces: "No places found.",
+ mapClusterTitle: "markers here, click to zoom in",
+ mapDeleteMarker: "Delete marker",
+ mapZoomIn: "Zoom in",
+ mapZoomOut: "Zoom out",
+ mapFitMarkers: "Fit all markers",
+ mapPanLabel: "Move the map",
+ mapCenterHere: "Center here",
+ mapNear: "near",
+ mapPickedSpot: "Picked spot",
+ mapPickHint: "Click on the map to pick a spot.",
+ mapClearPick: "Clear",
+ mapSearchPlaceholder: "Search in Maps...",
mapSearchButton: "Search",
mapUpdatedAt: "Updated",
mapNoMatch: "No maps match your search.",
@@ -3288,6 +3588,465 @@ module.exports = {
typeMapMarker: "MAP MARKER",
modulesMapLabel: "Maps",
modulesMapDescription: "Module to manage and share offline maps.",
+ emergenciesTitle: "Emergencies",
+ modulesEmergenciesLabel: "Emergencies",
+ modulesEmergenciesDescription: "Module to raise, confirm and follow emergencies in the network.",
+ emergenciesDescription: "Module to raise, confirm and follow emergencies in the network.",
+ emergencyCreate: "Create Emergency",
+ emergencyUpdate: "Update",
+ emergencyDelete: "Delete",
+ emergencyTitleLabel: "Title",
+ emergencyTitlePlaceholder: "What is happening?",
+ emergencyTextLabel: "Details",
+ emergencyTextPlaceholder: "Where, since when, what to do...",
+ emergencyCategoryLabel: "Category",
+ emergencyCategoryWeather: "WEATHER",
+ emergencyCategoryInfrastructure: "INFRASTRUCTURE",
+ emergencyCategoryHealth: "HEALTH",
+ emergencyCategorySecurity: "SECURITY",
+ emergencyCategoryLost: "LOST & FOUND",
+ emergencyCategoryNeighborhood: "NEIGHBORHOOD",
+ emergencyExpiresLabel: "Expires in",
+ emergencyExpires1d: "1 day",
+ emergencyExpires3d: "3 days",
+ emergencyExpires7d: "1 week",
+ emergencyExpires30d: "1 month",
+ emergencyExpiresNone: "Undefined",
+ emergencyExpiresKeep: "Keep current date",
+ emergencyTagsLabel: "Tags",
+ emergencyTagsPlaceholder: "Enter tags separated by commas",
+ emergencyFilterAll: "ALL",
+ emergencyFilterMine: "MINE",
+ emergencyFilterRecent: "RECENT",
+ emergencySeverityUnverified: "UNVERIFIED",
+ emergencySeverityLow: "LOW",
+ emergencySeverityMedium: "MEDIUM",
+ emergencySeverityHigh: "HIGH",
+ emergencyStatusActive: "ACTIVE",
+ emergencyStatusResolved: "RESOLVED",
+ emergencyStatusExpired: "EXPIRED",
+ emergencyConfirmations: "Confirmations",
+ emergencyConfirmButton: "Confirm",
+ emergencyConfirmed: "You confirmed this emergency",
+ emergencyResolveButton: "Resolve",
+ emergencyReopenButton: "Reopen",
+ emergencyGenerateReport: "Generate Report",
+ emergencyUpdateEdited: "Edited",
+ emergencyLastUpdate: "LAST UPDATE",
+ emergencyUpdatesTitle: "Last Updates:",
+ emergencyNoUpdates: "No updates yet.",
+ emergencyAddUpdate: "Post update",
+ emergencyUpdatePlaceholder: "What changed?",
+ emergencyNoItems: "No emergencies found.",
+ emergencyExpiresAt: "Expires",
+ emergencyBannerLabel: "Active emergency",
+ emergencyCreateSectionTitle: "Create Emergency",
+ emergencyUpdateSectionTitle: "Update Emergency",
+ emergencySearchPlaceholder: "Search in Emergencies...",
+ typeEmergency: "EMERGENCIES",
+ typeEmergencyConfirm: "EMERGENCY CONFIRM",
+ typeEmergencyUpdate: "EMERGENCY UPDATE",
+ statsEmergency: "Emergencies",
+ statsEmergencyConfirm: "Emergency confirmations",
+ statsEmergencyUpdate: "Emergency updates",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "An emergency you follow has an update.",
+ emergencyBotResolvedTitle: "An emergency you follow has been resolved.",
+ dataKindEmergencies: "EMERGENCIES",
+ mailingTitle: "Mailing Lists",
+ modulesMailingLabel: "Mailing Lists",
+ modulesMailingDescription: "Discover and manage mailing lists in your network.",
+ modulesPhoneLabel: "Phone",
+ modulesPhoneDescription: "Module to call other inhabitants with end-to-end encrypted videocalls.",
+ mailingDescription: "Discover and manage mailing lists in your network.",
+ mailingCreate: "Create Mailing List",
+ mailingUpdate: "Update",
+ mailingArchive: "Archive",
+ mailingActivate: "Activate",
+ mailingCreateSectionTitle: "Create Mailing List",
+ mailingUpdateSectionTitle: "Update Mailing List",
+ mailingTitleLabel: "Title",
+ mailingTitlePlaceholder: "Name of the mailing list",
+ mailingDescriptionLabel: "Description",
+ mailingDescriptionPlaceholder: "What is this list about?",
+ mailingTypeLabel: "Mailing list type",
+ mailingTypeOpen: "OPEN",
+ mailingTypeClosed: "CLOSED",
+ mailingStatusLabel: "Status",
+ mailingStatusActive: "ACTIVE",
+ mailingStatusArchived: "ARCHIVED",
+ mailingMembersLabel: "Invite inhabitants",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Subscribers",
+ mailingTagsLabel: "Tags",
+ mailingTagsPlaceholder: "Enter tags separated by commas",
+ mailingFilterAll: "ALL",
+ mailingFilterMine: "MINE",
+ mailingFilterSubscribed: "SUBSCRIBED",
+ mailingFilterRecent: "RECENT",
+ mailingHistoryDate: "DATE",
+ mailingHistoryThreads: "THREADS",
+ mailingHistoryInhabitants: "INHABITANTS",
+ mailingHistorySearchPlaceholder: "Search in the history...",
+ mailingNoMessages: "No messages yet.",
+ mailingNoItems: "No mailing lists found.",
+ mailingSearchPlaceholder: "Search in Mailing Lists...",
+ mailingWriteButton: "Write message",
+ mailingWriteTitle: "Write to the list",
+ mailingReplyTitle: "Reply to the list",
+ mailingSend: "Send",
+ mailingTextPlaceholder: "Your message reaches every participant of the list.",
+ mailingParticipants: "Participants",
+ inboxFilterMailing: "Mailing lists",
+ mailingReplyPlaceholder: "Reply to the list...",
+ mailingReplyToList: "Reply to list",
+ typeMailingList: "MAILING LIST",
+ statsMailingList: "Mailing lists",
+ mailingListLabel: "MAILING LIST",
+ logisticsTitle: "Logistics",
+ modulesLogisticsLabel: "Logistics",
+ modulesLogisticsDescription: "Discover and manage logistic plans in your network.",
+ logisticsDescription: "Discover and manage logistic plans in your network.",
+ logisticsCreate: "Create Route",
+ logisticsUpdate: "Update",
+ logisticsClose: "Close",
+ logisticsReopen: "Reopen",
+ logisticsCreateSectionTitle: "Create Route",
+ logisticsUpdateSectionTitle: "Update Route",
+ logisticsTitleLabel: "Title",
+ logisticsTitlePlaceholder: "Ride to the market, van available...",
+ logisticsKindLabel: "Logistics type",
+ logisticsKindTrip: "TRIP",
+ logisticsKindShipment: "SHIPMENT",
+ logisticsKindTrips: "TRIPS",
+ logisticsKindShipments: "SHIPMENTS",
+ logisticsModeLabel: "Mode",
+ logisticsModeOffer: "OFFER",
+ logisticsModeRequest: "REQUEST",
+ logisticsModeOffers: "OFFERS",
+ logisticsModeRequests: "REQUESTS",
+ logisticsDescriptionLabel: "Description",
+ logisticsDescriptionPlaceholder: "Meeting point, what you carry, conditions...",
+ logisticsOriginLabel: "Origin",
+ logisticsOriginPlaceholder: "Where it starts",
+ logisticsDestinationLabel: "Destination",
+ logisticsDestinationPlaceholder: "Where it ends",
+ logisticsDateLabel: "Date and time",
+ logisticsRecurrenceLabel: "Recurrence",
+ logisticsFrequencyLabel: "Frequency",
+ logisticsRecurrenceNone: "ONE-OFF",
+ logisticsRecurrenceDaily: "DAILY",
+ logisticsRecurrenceWeekly: "WEEKLY",
+ logisticsRecurrenceMonthly: "MONTHLY",
+ logisticsSeatsLabel: "Seats",
+ logisticsSizeLabel: "Size",
+ logisticsSizePlaceholder: "e.g. 2m x 1m",
+ logisticsWeightLabel: "Weight",
+ logisticsWeightPlaceholder: "e.g. 40kg",
+ logisticsPriceFree: "FREE",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TIME",
+ logisticsPriceLabel: "Price",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Order link",
+ logisticsOrderRefPlaceholder: "/shops/... or /market/... of an order to deliver",
+ logisticsOrderLink: "Linked order",
+ logisticsTagsLabel: "Tags",
+ logisticsTagsPlaceholder: "Enter tags separated by commas",
+ logisticsFilterAll: "ALL",
+ logisticsFilterMine: "MINE",
+ logisticsFilterBooked: "BOOKED",
+ logisticsFilterRecent: "RECENT",
+ logisticsFilterHistory: "HISTORY",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "OPEN",
+ logisticsStatusUpcoming: "UPCOMING",
+ logisticsStatusPast: "PAST",
+ logisticsStatusClosed: "CLOSED",
+ logisticsZoneLabel: "Zone",
+ logisticsSearchPlaceholder: "Search in Logistics...",
+ logisticsNoItems: "No routes found.",
+ logisticsBookingPending: "PENDING",
+ logisticsBookingConfirmed: "CONFIRMED",
+ logisticsBookingRejected: "REJECTED",
+ logisticsBookingCancelled: "CANCELLED",
+ logisticsBookingDelivered: "DELIVERED",
+ logisticsConfirm: "Confirm",
+ logisticsReject: "Reject",
+ logisticsDeliver: "Deliver",
+ logisticsReceiptLabel: "Receipt",
+ logisticsReceiptPlaceholder: "Delivery note (optional)",
+ logisticsCancelBooking: "Cancel booking",
+ logisticsBookTitle: "Book this route",
+ logisticsNotesLabel: "Notes",
+ logisticsNotesPlaceholder: "Anything the owner should know",
+ logisticsBook: "Book",
+ logisticsBookingsTitle: "Bookings",
+ logisticsMyBookingTitle: "Your booking",
+ logisticsRatingsTitle: "Ratings",
+ logisticsNoRatings: "No ratings yet.",
+ logisticsRatingsWhenClosed: "Ratings open once the route is closed.",
+ logisticsScoreLabel: "Score",
+ logisticsRatingPlaceholder: "How did it go?",
+ logisticsRate: "Rate",
+ typeLogisticsRoute: "ROUTE",
+ typeLogisticsRating: "ROUTE RATING",
+ statsLogisticsRoute: "Routes",
+ statsLogisticsRating: "Route ratings",
+ logisticsRouteLabel: "ROUTE",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Module to publish podcast channels.",
+ podcastsDescription: "Module to publish podcast channels.",
+ podcastCreate: "Create Podcast",
+ podcastUpdate: "Update",
+ podcastDelete: "Delete",
+ podcastCreateSectionTitle: "Create Podcast",
+ podcastUpdateSectionTitle: "Update Podcast",
+ podcastTitleLabel: "Title",
+ podcastTitlePlaceholder: "Name of the channel",
+ podcastDescriptionLabel: "Description",
+ podcastDescriptionPlaceholder: "What is this podcast about?",
+ podcastCategoryLabel: "Category",
+ podcastCategoryNews: "NEWS",
+ podcastCategoryMusic: "MUSIC",
+ podcastCategoryTalk: "TALK",
+ podcastCategoryEducation: "EDUCATION",
+ podcastCategoryTech: "TECH",
+ podcastCategoryCulture: "CULTURE",
+ podcastCategoryCommunity: "COMMUNITY",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "OTHER",
+ podcastTagsLabel: "Tags",
+ podcastCoverLabel: "Cover (image or video)",
+ podcastEpisodeAudioLabel: "Audio or video file (max-size: 75MB)",
+ podcastTagsPlaceholder: "Enter tags separated by commas",
+ podcastFilterAll: "ALL",
+ podcastFilterMine: "MINE",
+ podcastFilterRecent: "RECENT",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "VIEWERS",
+ podcastSearchPlaceholder: "Search in Podcasts...",
+ podcastNoItems: "No podcasts found.",
+ podcastEpisodesLabel: "Episodes",
+ podcastPlaysLabel: "Views",
+ podcastLastEpisode: "Last episode",
+ podcastEpisodesTitle: "Episodes",
+ podcastNoEpisodes: "No episodes yet.",
+ podcastEpisodeAdd: "Add episode",
+ podcastEpisodeCreateTitle: "Publish episode",
+ podcastEpisodeUpdateTitle: "Update episode",
+ podcastEpisodeTitleLabel: "Episode title",
+ podcastEpisodeTitlePlaceholder: "Title of the episode",
+ podcastEpisodeDescriptionLabel: "Show notes",
+ podcastEpisodeDescriptionPlaceholder: "What happens in this episode, links, credits...",
+ podcastEpisodePublish: "Publish",
+ podcastPlayed: "Played",
+ podcastMarkPlayed: "Mark as played",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISODE",
+ typePodcastOpinion: "EPISODE OPINION",
+ typePodcastPlay: "EPISODE PLAY",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Episodes",
+ statsPodcastPlay: "Episode plays",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "A blog you follow has a new entry.",
+ podcastBotEpisodeTitle: "A podcast you follow has a new episode.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISODE",
+ campaignsTitle: "Campaigns",
+ modulesCampaignsLabel: "Campaigns",
+ modulesCampaignsDescription: "Discover and manage campaigns in your network.",
+ campaignsDescription: "Discover and manage campaigns in your network.",
+ campaignCreate: "Create Campaign",
+ campaignUpdate: "Update",
+ campaignDelete: "Delete",
+ campaignClose: "Close",
+ campaignReopen: "Reopen",
+ campaignCreateSectionTitle: "Create Campaign",
+ campaignUpdateSectionTitle: "Update Campaign",
+ campaignTitleLabel: "Title",
+ campaignTitlePlaceholder: "What do you want to achieve?",
+ campaignTextLabel: "Text",
+ campaignTextPlaceholder: "Explain the cause, who decides and what you ask for...",
+ campaignCategoryLabel: "Category",
+ campaignCategoryEnvironment: "ENVIRONMENT",
+ campaignCategoryRights: "RIGHTS",
+ campaignCategoryHealth: "HEALTH",
+ campaignCategoryEducation: "EDUCATION",
+ campaignCategoryInfrastructure: "INFRASTRUCTURE",
+ campaignCategoryCulture: "CULTURE",
+ campaignCategoryEconomy: "ECONOMY",
+ campaignCategoryOther: "OTHER",
+ campaignGoalLabel: "Signature goal",
+ campaignDeadlineLabel: "Deadline",
+ campaignTagsLabel: "Tags",
+ campaignTagsPlaceholder: "Enter tags separated by commas",
+ campaignFilterAll: "ALL",
+ campaignFilterMine: "MINE",
+ campaignFilterSigned: "SIGNED",
+ campaignFilterRecent: "RECENT",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "OPEN",
+ campaignStatusAchieved: "ACHIEVED",
+ campaignStatusUnachieved: "UNACHIEVED",
+ campaignStatusClosed: "CLOSED",
+ campaignSearchPlaceholder: "Search in Campaigns...",
+ campaignNoItems: "No campaigns found.",
+ campaignSignaturesLabel: "Signatures",
+ campaignSignaturesTitle: "Supporters",
+ campaignNoSignatures: "No signatures yet.",
+ campaignSignTitle: "Sign this campaign",
+ campaignSignPlaceholder: "Why do you support it? (optional)",
+ campaignSign: "Sign",
+ campaignSigned: "You already signed!",
+ campaignNotSigned: "Your signature is still missing",
+ campaignElevate: "Raise to Parliament",
+ campaignElevated: "Raised to Parliament",
+ campaignUpdatesTitle: "Updates",
+ campaignNoUpdates: "No updates yet.",
+ campaignUpdatePlaceholder: "What happened?",
+ campaignAddUpdate: "Post update",
+ campaignQrAlt: "QR to sign this campaign",
+ campaignQrCaption: "Scan to sign",
+ typeCampaign: "CAMPAIGN",
+ typeCampaignSignature: "SIGNATURE",
+ typeCampaignUpdate: "CAMPAIGN UPDATE",
+ statsCampaign: "Campaigns",
+ statsCampaignSignature: "Campaign signatures",
+ statsCampaignUpdate: "Campaign updates",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "A campaign you follow has an update.",
+ campaignBotAchievedTitle: "A campaign you follow has reached its goal.",
+ campaignBotRaisedTitle: "A campaign you signed has been raised to Parliament.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "A route you booked has changed.",
+ logisticsBotClosedTitle: "A route you booked has been closed.",
+ logisticsBotBookedTitle: "Someone booked your route.",
+ logisticsBotCancelledTitle: "A booking on your route was cancelled.",
+ logisticsBotConfirmedTitle: "Your booking was confirmed: the package is on its way.",
+ logisticsBotRejectedTitle: "Your booking was rejected.",
+ logisticsBotDeliveredTitle: "Your package has arrived.",
+ campaignLabel: "CAMPAIGN",
+ campaignGenerateReport: "Generate Report",
+ logisticsGenerateReport: "Generate Report",
+ mailingGenerateReport: "Generate Report",
+ campaignUpdateEdited: "Edited",
+ mailingMessagesLabel: "Messages",
+ logisticsBookingsLabel: "Bookings",
+ backupTitle: "Backup",
+ modulesBackupLabel: "Backup",
+ modulesBackupDescription: "Module to export and import your keys and make encrypted backups.",
+ backupDescription: "Module to export and import your keys and make encrypted backups.",
+ backupTypeRecovery: "RECOVERY",
+ backupTypeKeys: "EXPORT KEYS",
+ backupTypeFull: "FULL BACKUP",
+ backupTypeRestore: "RESTORE BACKUP",
+ backupTypeInstant: "INSTANT",
+ backupInstantDescription: "A plain .zip of your whole log and blobs, without your secret key and without a password. Quick, but ",
+ backupInstantRisk: "anyone who gets the file can read everything in it.",
+ backupKitPageDescription: "The recovery kit can only be opened from this device.",
+ backupKitId: "Oasis ID",
+ backupKitDate: "Generated",
+ backupKitQrAlt: "QR code of your secret key",
+ backupKitStep1: "Print it or write it down and store it somewhere safe and offline.",
+ backupKitStep2: "To recover, install Oasis on a new device and import this secret from Backup › Keys.",
+ backupKitStep3: "Destroy this page if it is ever exposed.",
+ backupKitPdfButton: "Generate PDF",
+ backupScopeLabel: "Scope",
+ backupScopeAll: "EVERYTHING",
+ backupScopeMine: "ONLY MY CONTENT",
+ backupSinceLabel: "Since",
+ backupEstimateTitle: "Estimate",
+ backupFileInfo: "Your encrypted copy will be downloaded to your device (name: oasis-backup-DATE.oasisbk)",
+ backupExportButton: "Download backup",
+ backupRestorePassword: "Write the password used when the backup was made",
+ backupRestoreButton: "Restore backup",
+ backupRestoredLine: "Backup restored.",
+ backupRestoredMessages: "Messages added",
+ backupRestoredSkipped: "Already present",
+ backupRestoredBlobs: "Files added",
+ backupRestoredState: "Settings restored",
+ backupRestoredFailed: "Failed",
+ backupRestoredForked: "Diverged",
+ backupRestoreRunning: "Restoring the backup. This page refreshes automatically; you can keep using Oasis meanwhile.",
+ backupRestoreElapsed: "Elapsed",
+ backupRestoreFailedLine: "The backup could not be restored.",
+ backupRestoreForkMine: "This device already published messages with your identity that are not in the backup, so the copy could not be applied on top of them. Restore on a clean installation right after importing your keys, before doing anything else.",
+ verificationTitle: "Verification",
+ verificationDescription: "Check the chain of your feed, detect forks and review orphan or missing files.",
+ verificationRun: "Run verification",
+ verificationTotalMessages: "messages in the log",
+ verificationFeed: "Your feed",
+ verificationMessages: "messages",
+ verificationLastSequence: "last sequence",
+ verificationGaps: "Gaps",
+ verificationBrokenLinks: "Broken links",
+ verificationBadHashes: "Bad hashes",
+ verificationBadSignatures: "Bad signatures",
+ verificationDuplicates: "Duplicated sequences",
+ verificationForks: "Forks",
+ verificationBlobs: "Files",
+ verificationBlobsPresent: "present",
+ verificationBlobsReferenced: "referenced",
+ verificationBlobsOrphan: "orphan",
+ verificationBlobsMissing: "missing",
+ verificationBlobsMissingOwn: "Your own files missing from this device",
+ verificationBlobsMissingOthers: "Files from other inhabitants not downloaded yet",
+ verificationBlobsUnavailable: "Files could not be listed on this device.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Module to discover and manage wikis.",
+ wikiDescription: "Module to discover and manage wikis.",
+ wikiCreate: "Create Wiki",
+ wikiUpdate: "Update",
+ wikiDelete: "Delete",
+ wikiEdit: "Edit",
+ wikiTitleLabel: "Title",
+ wikiTitlePlaceholder: "Wiki title...",
+ wikiBodyLabel: "Content",
+ wikiBodyPlaceholder: "Link other wikis with [[Wiki title]] or [[Wiki title|a custom label]].\n\nMention an inhabitant with @id.\n\nTag with #oasis.\n\nPaste links like https://solarnethub.com\n\nA blank line starts a new paragraph; single line breaks are kept.\n\nAttach any supported media and it will be embedded here.",
+ formatBarLabel: "Format",
+ wikiStatusLabel: "Wiki type",
+ wikiStatusOpen: "OPEN",
+ wikiStatusClosed: "CLOSED",
+ wikiTagsLabel: "Tags",
+ wikiTagsPlaceholder: "Enter tags separated by commas",
+ wikiSummaryLabel: "Change summary",
+ wikiSummaryPlaceholder: "What changed?",
+ wikiFilterAll: "ALL",
+ wikiFilterMine: "MINE",
+ wikiFilterRecent: "RECENT",
+ wikiFilterLinked: "LINKED",
+ wikiChanges: "Recent changes",
+ wikiNoPages: "No wikis found.",
+ wikiNoChanges: "No changes yet.",
+ wikiHistory: "History",
+ wikiVersion: "Version",
+ wikiVersions: "versions",
+ wikiRestore: "Restore",
+ wikiDiff: "Changes",
+ wikiViewVersion: "View",
+ wikiLinkedPages: "Linked pages",
+ wikiNoLinkedPages: "This page is not linked to any other yet.",
+ wikiMissingLink: "Page does not exist yet",
+ wikiDuplicateTitle: "A page with this title already exists. Change the title to create a different page.",
+ wikiCreateSectionTitle: "Create Wiki",
+ wikiUpdateSectionTitle: "Update Wiki",
+ wikiSearchPlaceholder: "Search in Wiki...",
+ wikiCurrentVersion: "Current version",
+ wikiViewingVersion: "You are viewing an old version",
+ wikiBackToPage: "Back to page",
+ wikiLinkedChip: "Linked",
+ wikiRestoredSummary: "Restored version",
+ wikiExportPdf: "Generate Page",
+ wikiPreview: "Preview",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Create Wiki",
+ tribeWikiEmpty: "No wikis, yet.",
+ typeWiki: "WIKI",
padsTitle: "Pads",
padTitle: "Pad",
modulesPadsLabel: "Pads",
@@ -3298,15 +4057,16 @@ module.exports = {
padTitleLabel: "Title",
padTitlePlaceholder: "Enter pad title...",
padStatusLabel: "Status",
+ padTypeLabel: "Pad type",
padStatusOpen: "OPEN",
padStatusInviteOnly: "INVITE-ONLY",
padStatusClosed: "CLOSED",
padDeadlineLabel: "Deadline",
padTagsLabel: "Tags",
- padTagsPlaceholder: "tag1, tag2, ...",
+ padTagsPlaceholder: "Enter tags separated by commas",
padMembersLabel: "Members",
padCreated: "Created",
- padStartEditing: "START EDITING!",
+ padStartEditing: "Edit",
padEditorPlaceholder: "Start writing...",
padSubmitEntry: "Submit",
padNoEntries: "No entries yet.",
@@ -3314,7 +4074,119 @@ module.exports = {
padMineSectionTitle: "Your Pads",
padsNoItems: "No pads found.",
padsDescription: "Manage collaborative encrypted text editors in your network.",
+ roomsTitle: "Rooms",
+ roomsDescription: "Discover and join encrypted videoconference rooms in your network.",
+ modulesRoomsLabel: "Rooms",
+ modulesRoomsDescription: "Module to discover and join encrypted videoconference rooms.",
+ roomFilterRecent: "RECENT",
+ roomFilterMine: "MINE",
+ roomFilterAll: "ALL",
+ roomFilterLive: "LIVE",
+ roomFilterOpen: "OPEN",
+ roomFilterInvite: "INVITE-ONLY",
+ roomFilterClosed: "CLOSED",
+ roomCreate: "Create Room",
+ roomUpdate: "Update",
+ roomDelete: "Delete",
+ roomClose: "Close",
+ roomCreateSectionTitle: "Create Room",
+ roomUpdateSectionTitle: "Update Room",
+ roomTitlePlaceholder: "Room title",
+ roomDescriptionLabel: "Description",
+ roomDescriptionPlaceholder: "What will you talk about?",
+ roomTypeLabel: "Room type",
+ roomTagsLabel: "Tags",
+ roomStatusOpen: "OPEN",
+ roomStatusInviteOnly: "INVITE-ONLY",
+ roomStatusClosed: "CLOSED",
+ roomParticipants: "Participants",
+ roomJoin: "Join",
+ roomLeave: "Leave",
+ roomFull: "Room full",
+ roomLiveChip: "LIVE",
+ roomMuted: "muted",
+ roomRec: "Record audio",
+ roomRecStop: "Stop recording",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} entered the room",
+ roomEventLeft: "{name} left the room",
+ roomEventRecStart: "{name} started recording",
+ roomEventRecStop: "{name} stopped recording",
+ roomEventMuted: "{name} muted",
+ roomEventUnmuted: "{name} unmuted",
+ roomEventHand: "{name} raised a hand",
+ roomRaiseHand: "Raise hand",
+ roomLowerHand: "Lower hand",
+ confirmActionTitle: "Confirm this action",
+ confirmActionButton: "Confirm",
+ confirmJoinText: "You are about to join using this invitation.",
+ confirmFollowText: "You are about to support this inhabitant.",
+ confirmSignText: "You are about to sign this campaign.",
+ confirmDownloadText: "You are about to download this file to your device.",
+ roomRecordings: "Recordings",
+ roomClearNotices: "Clear",
+ roomLineSwitchboard: "Switchboard",
+ roomLineDndError: "This room's number is not taking calls.",
+ roomNumberHint: "Dial this number from Phone to join the room.",
+ liveRefresh: "Refresh",
+ roomNobody: "Nobody is in the room right now.",
+ roomSomeone: "{n} in the room right now.",
+ roomYou: "you",
+ roomYouAreIn: "You are in",
+ roomNobodyInside: "Nobody is in this room right now.",
+ roomErrorFull: "The room is full. You can join when someone leaves.",
+ roomErrorUnreachable: "The room can't be reached right now. Try again later.",
+ roomErrorBusy: "You are already in a call or in another room.",
+ roomErrorClosed: "This room is closed.",
+ roomAccessDenied: "This room is invite-only. You need an invitation to join.",
+ roomsNoItems: "No rooms found.",
+ roomSearchPlaceholder: "Search rooms...",
+ roomInviteMode: "Invite",
+ tribeSectionRooms: "ROOMS",
+ tribeRoomCreate: "Create Room",
+ tribeRoomsEmpty: "No rooms, yet.",
+ typeRoom: "ROOMS",
+ typeRoomMember: "ROOM PARTICIPANT",
+ statsRoom: "Rooms",
+ statsRoomMember: "Room participants",
+ favoritesFilterRooms: "ROOMS",
+ invitesRoomsTitle: "Rooms",
+ inviteCodeInvalid: "This invitation code is not valid or has already been used.",
+ inviteAlreadyMember: "You are already in. You can open it from its module.",
+ actionFailed: "That could not be done. Please try again.",
+ publishTooShort: "Your post is too short.",
+ walletSendFailed: "The payment could not be sent: {reason}",
+ pixeliaCoordsError: "Those coordinates are outside the grid.",
+ courtsErrTitle: "A title is required.",
+ courtsErrRespondent: "Say who the case is against.",
+ courtsErrRespondentId: "That is not a valid Oasis ID.",
+ courtsErrMethod: "Choose how the case will be resolved.",
+ courtsErrCaseNotFound: "That case could not be found.",
+ courtsErrBrief: "Write your response.",
+ courtsErrStance: "Choose your stance.",
+ courtsErrResult: "Write the result.",
+ courtsErrTerms: "Write the terms of the agreement.",
+ courtsErrMediator: "Add at least one mediator.",
+ courtsErrSelfMediator: "You cannot be a mediator in your own case.",
+ courtsErrJudge: "Choose a judge.",
+ courtsErrSelfJudge: "You cannot be the judge of your own case.",
+ courtsErrVisibility: "Choose who can see the case.",
+ courtsErrNomination: "That nomination could not be found.",
+ opinionAlreadyGiven: "You have already given your opinion.",
+ cipherPasswordShort: "The password must be at least 32 characters long.",
+ errorForbidden: "You don't have access to this.",
+ errorNotFound: "That could not be found.",
+ errorClosed: "This is closed.",
+ errorInviteOnly: "This is invite-only. You need an invitation.",
+ errorTooLong: "That text is too long.",
+ errorRequired: "Some required information is missing.",
+ errorInvalid: "Some of the information is not valid.",
+ errorNotAuthor: "Only the author can do this.",
+ panicRemoved: "Your blockchain has been deleted.",
padVersionHistory: "Version History",
+ padAttributionView: "By author",
padVersionView: "View",
padRecentSectionTitle: "Recent Pads",
padOpenSectionTitle: "Open Pads",
@@ -3327,7 +4199,7 @@ module.exports = {
padRemoveFavorite: "Remove from Favorites",
padClose: "Close",
padBackToEditor: "Back to editor",
- padSearchPlaceholder: "Search pads...",
+ padSearchPlaceholder: "Search in Pads...",
calendarsTitle: "Calendars",
calendarTitle: "Calendar",
@@ -3336,15 +4208,15 @@ module.exports = {
typeCalendar: "CALENDARS",
calendarCreate: "Create Calendar",
calendarUpdate: "Update",
- calendarDelete: "Delete",
calendarTitleLabel: "Title",
calendarTitlePlaceholder: "Calendar title...",
calendarStatusLabel: "Status",
+ calendarTypeLabel: "Calendar type",
calendarStatusOpen: "OPEN",
calendarStatusClosed: "CLOSED",
calendarDeadlineLabel: "Deadline",
calendarTagsLabel: "Tags",
- calendarTagsPlaceholder: "tag1, tag2...",
+ calendarTagsPlaceholder: "Enter tags separated by commas",
calendarParticipantsLabel: "Participants",
calendarCreated: "Created",
calendarJoin: "Join Calendar",
@@ -3367,6 +4239,8 @@ module.exports = {
calendarsDescription: "Discover and manage calendars in your network.",
calendarMonthPrev: "\u2190 Prev",
calendarMonthNext: "Next \u2192",
+ calendarMonthNames: "January,February,March,April,May,June,July,August,September,October,November,December",
+ calendarDayInitials: "M,T,W,T,F,S,S",
calendarAllSectionTitle: "Calendars",
calendarRecentSectionTitle: "Recent Calendars",
calendarFavoritesSectionTitle: "Favorites",
@@ -3378,14 +4252,14 @@ module.exports = {
calendarAddFavorite: "Add to Favorites",
calendarDeleteNote: "Delete",
calendarRemoveFavorite: "Remove from Favorites",
- calendarSearchPlaceholder: "Search calendars...",
+ calendarSearchPlaceholder: "Search in Calendar...",
calendarAddEntry: "Add Entry",
statsCalendar: "Calendars",
statsCalendarDate: "Calendar Dates",
statsCalendarNote: "Calendar Notes",
modulesChatsLabel: "Chats",
- modulesChatsDescription: "Module to discover and manage encrypted chats.",
+ modulesChatsDescription: "Module to discover and manage chats.",
typeChat: "CHATS",
typeChatMessage: "CHAT MESSAGE",
chatsTitle: "Chats",
@@ -3408,34 +4282,172 @@ module.exports = {
chatMessagesLabel: "Messages",
chatThreadsLabel: "Threads",
chatCreatedAt: "CREATED",
- chatSearchPlaceholder: "Search chats...",
+ chatSearchPlaceholder: "Search in Chats...",
chatStatusOpen: "OPEN",
chatStatusInviteOnly: "INVITE-ONLY",
chatStatusClosed: "CLOSED",
chatSendMessage: "Send",
chatJumpLatest: "Latest Message",
+ chatReply: "Reply",
+ chatReplyCancel: "Cancel reply",
+ chatPin: "Pin",
+ chatUnpin: "Unpin",
+ chatPinned: "Pinned",
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",
+ activitySearchPlaceholder: "Search in Activity...",
+ trendingSearchPlaceholder: "Search in Trending...",
+ opinionsSearchPlaceholder: "Search in Opinions...",
+ votesSearchPlaceholder: "Search in Votations...",
+ gamesSearchPlaceholder: "Search in Games...",
+ schoolTitle: "School",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "A wiki page you follow has been edited.",
+ wikiBotRestoredTitle: "An earlier version of a wiki page you follow has been restored.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "A new student has enrolled in your course.",
+ schoolBotInvitedTitle: "You have been invited to a course.",
+ schoolBotAdmittedTitle: "You have been admitted to a course.",
+ schoolBotCertificateTitle: "You have received a certificate.",
+ schoolBotPassedTitle: "A student has passed your course.",
+ schoolBotLessonTitle: "A new lesson has been published.",
+ invitesSchoolTitle: "School",
+ schoolEnrollLabel: "Join Course",
+ schoolExamRetryLater: "You can retry after 24 hours.",
+ schoolApproved: "APPROVED",
+ schoolExamPassMark: "Pass mark (0-10)",
+ schoolExamPassed: "PASSED",
+ schoolExamPending: "Pending",
+ schoolExamFailed: "FAILED",
+ schoolExamAddQuestion: "Add question",
+ schoolExamCreateQuestion: "Create question",
+ schoolExamOption: "Option",
+ schoolExamCorrect: "Correct option",
+ schoolExamPoints: "Points",
+ schoolMaterialTextPlaceholder: "Notes for this lesson...",
+ schoolMaterials: "Materials",
+ schoolAddMaterial: "Add material",
+ schoolNoMaterials: "No materials yet.",
+ bankYourSchoolBalance: "Your School Earnings",
+ schoolProgress: "Progress",
+ schoolProgressMark: "Mark as completed",
+ schoolProgressDone: "Completed",
+ schoolExams: "Exams",
+ schoolExamCreate: "Create exam",
+ schoolExamTitlePlaceholder: "Exam title",
+ schoolExamHelp: "One question per line: Question? ; option ; correct option* ; option",
+ schoolExamQuestionsPlaceholder: "What is SSB? ; A database ; A P2P protocol* ; A browser",
+ schoolExamSubmit: "Submit answers",
+ schoolExamScore: "Your score",
+ schoolNoScoresYet: "No results yet.",
+ schoolLessonUnit: "Unit / phase",
+ schoolLessonUnitPlaceholder: "e.g. Phase 1",
+ schoolLessonOrder: "Order",
+ profileClearnetSchoolLabel: "School",
+ schoolStartDate: "Start date",
+ schoolSessionDate: "Session date",
+ schoolCourseChat: "Course Chat",
+ agendaFilterSchool: "SCHOOL",
+ agendaFilterCampaigns: "CAMPAIGNS",
+ agendaFilterLogistics: "LOGISTICS",
+ schoolCourseType: "Course type",
+ schoolTypeOpen: "OPEN",
+ schoolTypePaid: "PAID",
+ schoolTypeInvite: "INVITE-ONLY",
+ schoolLessonLocked: "Encrypted lesson — ask the teacher for the course key.",
+ schoolGrantAccess: "Send course key",
+ schoolKeySent: "Key sent",
+ schoolOngoing: "Ongoing",
+ schoolFilterApplied: "APPLIED",
+ schoolFilterOpen: "OPEN",
+ schoolFilterFavorites: "FAVORITES",
+ schoolPendingPayment: "Payment pending",
+ schoolPendingStudents: "Pending enrollments",
+ schoolViewBill: "View bill",
+ schoolPaymentNote: "Enrolling generates an ECO bill (a transfer). Your enrollment is confirmed once the transfer is signed.",
+ schoolCloseCourse: "Close course",
+ schoolReopenCourse: "Reopen course",
+ schoolDescription: "Teach and learn courses in your network.",
+ schoolFilterAll: "ALL",
+ schoolFilterMine: "MINE",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RECENT",
+ schoolCreateButton: "Create Course",
+ schoolCreateSectionTitle: "Create a course",
+ schoolUpdateSectionTitle: "Update course",
+ schoolCourseTitlePlaceholder: "Name of your course",
+ schoolCourseDescriptionPlaceholder: "What will you teach in this course?",
+ schoolCourseImage: "Course image (max-size: 75MB)",
+ schoolTags: "Tags",
+ schoolTagsPlaceholder: "Enter tags separated by commas",
+ schoolPrice: "Price (ECO)",
+ schoolVisibility: "Visibility",
+ schoolVisibilityPublic: "Public",
+ schoolVisibilityInvite: "By invitation",
+ schoolStatus: "Status",
+ schoolClosed: "Closed",
+ schoolFree: "Free",
+ schoolCreate: "Create course",
+ schoolUpdate: "Update course",
+ schoolSearchPlaceholder: "Search in School...",
+ schoolSortTitle: "Title",
+ schoolNoCourses: "No courses found.",
+ schoolStudents: "Students",
+ schoolTeacher: "Teacher",
+ schoolCreatedAt: "CREATED",
+ schoolLessons: "Lessons",
+ schoolNoLessons: "No lessons yet.",
+ schoolEnrollToSee: "Enroll to see the lessons of this course.",
+ schoolEnrollButton: "ENROLL",
+ schoolUnenrollButton: "Leave course",
+ schoolInviteRequired: "This course is by invitation.",
+ schoolTeacherPanel: "Teacher Panel",
+ schoolStudentPanel: "Student Panel",
+ schoolAddLesson: "Create lesson",
+ schoolLessonTitlePlaceholder: "Lesson title",
+ schoolLessonTextPlaceholder: "Describe the notions this lesson covers...",
+ schoolInviteStudents: "Invite students",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "INVITE",
+ schoolInvited: "Invited",
+ schoolIssueCertificate: "Create certificate",
+ schoolCertified: "Certified",
+ schoolCertificateTextPlaceholder: "Certificate note (optional)",
+ schoolLessonOpen: "Open lesson",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificates",
+ schoolNoCertificates: "No certificates issued yet.",
+ schoolEditButton: "Edit",
+ schoolDeleteButton: "Delete",
+ typeSchool: "SCHOOL",
+ schoolCourseLabel: "COURSE",
+ emergencyLabel: "EMERGENCY",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Courses",
+ statsSchoolLesson: "Lessons",
+ statsSchoolEnroll: "Enrollments",
+ statsSchoolCertificate: "School certificates",
+ modulesSchoolLabel: "School",
+ modulesSchoolDescription: "Module to exchange knowledge.",
+ welcomeStepUxAction: "Save View",
+ welcomeStepWorkflowTitle: "What's the use for OASIS you have in mind?",
+ welcomeStepWorkflowText: "Oasis has many modules. Pick the configuration that fits you and only the useful ones stay on. You can fine-tune it anytime in Modules.",
+ welcomeStepWorkflowAction: "Save Configuration",
+ welcomeWorkflow_full: "Default",
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.",
chatTitlePlaceholder: "Chat title",
chatDescriptionPlaceholder: "Chat description",
- chatTagsPlaceholder: "tag1, tag2, tag3",
+ chatTagsPlaceholder: "Enter tags separated by commas",
chatImageLabel: "Select an image file (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Author",
chatAddFavorite: "Add to Favorites",
chatRemoveFavorite: "Remove from Favorites",
chatPM: "PM",
chatStatusLabel: "Status",
+ chatTypeLabel: "Chat type",
chatCategoryLabel: "Category",
gamesTitle: "Games",
gamesDescription: "Discover and play some mini-games in your network.",
@@ -3476,7 +4488,11 @@ module.exports = {
gamesTetrisTitle: "Tetris",
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.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Mix live visuals on two decks: pick a pattern for each, tune speed, colour and zoom, crossfade between them and flash to the beat. Tap the tempo or let the microphone drive the pulse.",
gamesTetrisDesc: "Classic falling blocks. Clear lines to score. How long can you last?",
+ gamesMinesweeperTitle: "Minesweeper",
+ gamesMinesweeperDesc: "Classic mine hunting. Clear the board to level up — bigger grids, more mines, higher score.",
gamesFilterScoring: "SCORING",
gamesHallOfFame: "Hall of Fame",
gamesHallPlayer: "Player",
@@ -3488,9 +4504,55 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Select which UX navigation mode you want for your GUI.",
uxModeMenus: "Blocks",
+ uxModeChats: "Conversations",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Trending Tags",
+ feedActiveTitle: "Active Inhabitants",
+ cnBrandSub: "Libre · P2P · Federated",
+ cnSyncedPeers: "Synced-peers",
+ cnLicense: "License",
+ cnNotAccessible: "The content is not accessible at this moment.",
+ cnUntitled: "Untitled",
+ cnSearchPlaceholder: "Search…",
+ cnHubTitle: "Clearnet HUB",
+ cnHubDescription: "Public content shared by the inhabitants of this Oasis network.",
+ cnHubEmpty: "No public content has been shared to Clearnet yet.",
+ cnPublicContent: "Content",
+ cnTribesContent: "Tribes",
+ cnNetworkContent: "Network",
+ cnCategoryEmpty: "No content in this category.",
+ cnInhabitantEmpty: "This inhabitant has not published content to Clearnet yet.",
+ cnPrevPage: "← Previous",
+ cnNextPage: "Next →",
+ cnPageOf: "Page {page} of {pages}",
+ cnMoreInfo: "More info →",
+ cnOpenCourse: "Open course",
+ cnAuction: "AUCTION",
+ cnExchange: "EXCHANGE",
+ cnRssDescription: "published by the inhabitants of this HUB",
+ cnKindAudio: "Audio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Bookmark",
+ cnKindDocument: "Document",
+ cnKindEvent: "Event",
+ cnKindFeed: "Feed",
+ cnKindImage: "Image",
+ cnKindJob: "Job",
+ cnKindMarket: "Market",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Project",
+ cnKindCourse: "Course",
+ cnKindShop: "Shop",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "File",
+ cnKindVideo: "Video",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Room",
+ cnKindMap: "Map",
uxModeAINav: "AI",
statsChat: "Chats",
statsChatMessage: "Chat messages",
+ statsWiki: "Wiki pages",
statsPad: "Pads",
statsPadEntry: "Pad entries",
statsGameScore: "Gaming",
@@ -3501,6 +4563,146 @@ module.exports = {
tribeContentAccessDenied: "Access Denied",
tribeContentAccessDeniedMsg: "This content belongs to a tribe. You must be a member to access it.",
tribeViewTribes: "View Tribes",
+ tribeFilesEmpty: "No files, yet.",
+ filesLabel: "Files",
+ profileClearnetFilesLabel: "Files",
+ filesTitle: "Files",
+ filesDescription: "Explore and manage files in your network.",
+ fileAllSectionTitle: "Files",
+ fileMineSectionTitle: "Your Files",
+ fileRecentSectionTitle: "Recent Files",
+ fileTopSectionTitle: "Top Files",
+ fileFavoritesSectionTitle: "Favorites",
+ fileFilterAll: "ALL",
+ fileFilterMine: "MINE",
+ fileFilterRecent: "RECENT",
+ fileFilterTop: "TOP",
+ fileFilterFavorites: "FAVORITES",
+ fileCreateSectionTitle: "Upload File",
+ fileUpdateSectionTitle: "Update File",
+ fileCreateButton: "Upload File",
+ fileUpdateButton: "Update",
+ fileAddFavoriteButton: "Add Favorite",
+ fileRemoveFavoriteButton: "Remove Favorite",
+ fileFileLabel: "Select a file (max-size: 75MB)",
+ calendarFilterRecent: "RECENT",
+ calendarFilterAll: "ALL",
+ calendarFilterMine: "MINE",
+ calendarFilterFavorites: "FAVORITES",
+ calendarFilterOpen: "OPEN",
+ calendarFilterClosed: "CLOSED",
+ padFilterRecent: "RECENT",
+ padFilterAll: "ALL",
+ padFilterMine: "MINE",
+ padFilterOpen: "OPEN",
+ padFilterClosed: "CLOSED",
+ chatFilterRecent: "RECENT",
+ chatFilterAll: "ALL",
+ chatFilterMine: "MINE",
+ chatFilterFavorites: "FAVORITES",
+ chatFilterOpen: "OPEN",
+ chatFilterClosed: "CLOSED",
+ licenseLabel: "License",
+ phoneTitle: "Phone",
+ phoneDescription: "Manage your end-to-end encrypted videocalls.",
+ phoneUnavailable: "Calls are not available on this device.",
+ phoneCallButton: "Call",
+ profileVisibilityPhone: "Phone number",
+ phoneNumberUnknown: "No one in your network has the number {number}.",
+ phoneNumberChoose: "Check who you want to call at {number}:",
+ phoneAnswer: "Answer",
+ phoneSpeaker: "Speaker",
+ phoneEarpiece: "Earpiece",
+ phoneReject: "Reject",
+ phoneHangup: "Hang up",
+ phoneMute: "Mute",
+ phoneUnmute: "Unmute",
+ phoneCameraOn: "Camera on",
+ phoneCameraOff: "Camera off",
+ settingsPhoneVideo: "Video",
+ settingsPhoneVideoOn: "Allowed in calls and rooms",
+ settingsPhoneVideoOff: "Audio only",
+ phoneSilence: "Silence",
+ phoneUnsilence: "Hear again",
+ phoneCalling: "Calling",
+ phoneIsCalling: "is calling you",
+ notifyNewPmFrom: "New PM from",
+ notifyNewPamFrom: "New PaM from",
+ notifyUpdateLabel: "Update",
+ updateInstalledLabel: "Installed version",
+ updateAvailableLabel: "Available version",
+ updateChangesLabel: "Changes",
+ updateFilesLabel: "Files",
+ updateOriginLabel: "Source",
+ phoneRecording: "Recording PaM for",
+ phoneLeaveMessage: "Nobody answered: leave your message after the beep.",
+ phoneLeaveMessageBusy: "They are on another call: leave your message after the beep.",
+ phoneLeaveMessageUnreachable: "They could not be reached: leave your message after the beep.",
+ phoneConnecting: "Connecting to",
+ phoneSendPam: "Send PaM",
+ phoneCancel: "Cancel",
+ phoneSearchPlaceholder: "Search in Phone...",
+ phonePamTitle: "Audio Records",
+ phoneNew: "New",
+ phoneDelete: "Delete",
+ phoneNoPams: "You have no audio records.",
+ phoneHistoryTitle: "History",
+ phoneLatestTitle: "Latest Calls",
+ phoneCreateButton: "New call",
+ phoneLimitsHint: "Up to 7 inhabitants per call; more than one makes a joint call.",
+ phoneErrorPub: "Pubs cannot be called.",
+ phoneJointCall: "Joint call",
+ phoneWith: "With",
+ phoneResult: "Result",
+ phoneWhen: "When",
+ phoneDuration: "Duration",
+ phoneOutgoing: "Outgoing",
+ phoneIncoming: "Incoming",
+ phoneNoHistory: "No logs yet.",
+ phoneOutcomeEnded: "Answered",
+ phoneOutcomeMissed: "Missed",
+ phoneOutcomeRejected: "Rejected",
+ phoneOutcomeNoanswer: "No answer",
+ phoneOutcomeCancelled: "Cancelled",
+ phoneOutcomePam: "PaM sent",
+ phoneOutcomeFailed: "Failed",
+ phoneDialAdd: "Add",
+ phoneDialBack: "Delete",
+ phoneDialClear: "Clear",
+ phoneDialPlaceholder: "Number or Oasis ID",
+ phoneDialInhabitants: "Inhabitants",
+ phoneDialRemove: "Remove",
+ phoneOwnNumber: "That's your own number.",
+ phoneSettingsDesc: "Choose who can call you.",
+ phoneDnd: "Do not disturb",
+ phoneOpen: "Open",
+ phoneRecipientRefuses: "The recipient you are trying to call doesn't allow receiving phone calls.",
+ phoneRefusedNotice: "These inhabitants don't allow receiving phone calls and were not called:",
+ fileEmptyError: "The file is empty. Choose another file.",
+ fileTitleLabel: "Title",
+ fileTitlePlaceholder: "Title",
+ fileDescriptionLabel: "Description",
+ fileDescriptionPlaceholder: "Description",
+ fileTagsLabel: "Tags",
+ fileTagsPlaceholder: "Enter tags separated by commas",
+ fileSizeLabel: "Size",
+ fileDownloadButton: "DOWNLOAD",
+ fileDetailsButton: "DETAILS",
+ fileNoFile: "No file file",
+ fileSearchPlaceholder: "Search in Files...",
+ fileSearchButton: "Search",
+ fileSortRecent: "Most recent",
+ fileSortOldest: "Oldest",
+ fileSortTop: "Most voted",
+ fileNoMatch: "No matching files.",
+ fileUpdatedAt: "Updated",
+ typeFile: "FILES",
+ modulesFilesLabel: "Files",
+ modulesFilesDescription: "Module to discover and manage files.",
+ tribeSectionFiles: "FILES",
+ fileDescription: "Description",
+ fileDownload: "Download",
+ fileTypeLabel: "Type",
torrentsTitle: "Torrents",
torrentsDescription: "Explore and manage torrents in your network.",
torrentAllSectionTitle: "Torrents",
@@ -3528,10 +4730,33 @@ module.exports = {
torrentTagsLabel: "Tags",
torrentTagsPlaceholder: "Enter tags separated by commas",
torrentSizeLabel: "Size",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Generate torrent",
+ torrentFromContentMissing: "The file is not available on this node yet. Try again in a while.",
+ torrentDownloads: "Downloads",
+ torrentFetchOasis: "Download in Oasis",
+ torrentSaveFile: "Save file",
+ torrentSeeds: "seeds",
+ seedsLabel: "Seeds",
+ seedAction: "Support",
+ torrentSourceFile: "File",
+ torrentStateQueued: "Queued",
+ torrentStateProbing: "Looking for seeds",
+ torrentStateDownloading: "Downloading",
+ torrentStateDone: "Completed",
+ torrentStateFailed: "Failed",
+ torrentStateNoSource: "No seeds online yet, waiting",
+ torrentStateCancelled: "Cancelled",
+ torrentNoDownloads: "No downloads yet.",
+ torrentOriginalSection: "Original",
+ torrentCancel: "Cancel",
+ torrentDownloadButton: "DOWNLOAD",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETAILS",
torrentNoFile: "No torrent file",
noTorrents: "No torrents found.",
- torrentSearchPlaceholder: "Search title, tags, author...",
+ noFiles: "No files found.",
+ torrentSearchPlaceholder: "Search in Torrents...",
torrentSearchButton: "Search",
torrentSortRecent: "Most recent",
torrentSortOldest: "Oldest",
@@ -3539,10 +4764,12 @@ module.exports = {
torrentNoMatch: "No matching torrents.",
torrentUpdatedAt: "Updated",
statsTorrent: "Torrents",
+ statsFile: "Files",
typeTorrent: "TORRENTS",
modulesTorrentsLabel: "Torrents",
modulesTorrentsDescription: "Module to discover and manage torrents.",
favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "FILES",
favoritesFilterMarket: "MARKET",
favoritesFilterEvents: "EVENTS",
favoritesFilterForum: "FORUM",
@@ -3556,11 +4783,13 @@ module.exports = {
favoritesFilterShopProducts: "SHOP ITEMS",
tribeSectionTorrents: "TORRENTS",
tribeCreateTorrent: "Upload Torrent",
+ tribeCreateFile: "Upload File",
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.",
+ settingsWishDesc: "Determines how you access all the content and your experience in the Oasis network.",
settingsWishWhole: "Multiverse",
settingsWishMutuals: "Only mutual-support",
settingsWishOnlyLan: "Only LAN",
+ settingsWishLocal: "Local",
settingsPmVisibilityTitle: "Private Messages",
settingsPmVisibilityDesc: "Configure the level of exposition to private messages that you want to have in the network.",
settingsPmVisibilityWhole: "Multiverse",
@@ -3608,7 +4837,7 @@ module.exports = {
tribeGovNoRevocations: "Not any revocation, yet",
tribeGovNoHistorical: "Not any record, yet",
logsTitle: "Logs",
- logsDescription: "Record your experience in the network.",
+ logsDescription: "Keep a private diary of your experiences.",
logsViewTitle: "Log",
logsColumnType: "Type",
logsView: "View",
@@ -3636,12 +4865,13 @@ module.exports = {
logsExportOne: "Export Log",
logsViewDetails: "View Details",
logsGenerateButton: "Generate Text",
- logsSearchText: "Search in logs...",
+ logsSearchText: "Search in Logs...",
logsSearchAnyType: "Any type",
logsSearchButton: "Search",
logsEmpty: "No logs yet.",
+ logsNothingNew: "There are no new actions to record.",
modulesLogsLabel: "Logs",
- modulesLogsDescription: "Module to record (via AI assistant) your experiences.",
+ modulesLogsDescription: "Module to keep a private diary of your experiences.",
statsLogsTitle: "Logs",
typeLog: "LOGS",
diff --git a/src/client/assets/translations/oasis_es.js b/src/client/assets/translations/oasis_es.js
index b135331..1db3b16 100644
--- a/src/client/assets/translations/oasis_es.js
+++ b/src/client/assets/translations/oasis_es.js
@@ -9,8 +9,8 @@ module.exports = {
shopPurchasesButton: "Compras",
shopMyOrdersDescription: "Tus pedidos de compra.",
shopMyOrdersEmpty: "Aún no tienes compras.",
- shopOrderPmSeller: "PM Seller",
- shopOrderSeller: "Vendedor",
+ shopOrderPmSeller: "PM Vendedora",
+ shopOrderSeller: "Vendedora",
shopOrderInvoice: "Factura",
shopOrderInvoiceConcept: "Factura",
shopOrderStatusPending: "Pendiente",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Aceptar",
shopOrderReject: "Rechazar",
shopOrderMarkShipped: "Marcar enviado",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM Compradora",
shopOrderContractConcept: "Pedido de tienda",
shopOrdersPending: "Pedidos pendientes",
all: "Todos",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Recientes",
anonymous: "Anónimo",
unnamed: "Anónimo",
- authorLabel: "AUTOR",
+ authorLabel: "Autoría",
delete: "Eliminar",
save: "Guardar",
vote: "Votar",
@@ -36,7 +36,7 @@ module.exports = {
price: "Precio",
priority: "Prioridad",
severity: "Gravedad",
- organizer: "Organizador",
+ organizer: "Organizadora",
edited: "editado",
isPublic: "Público",
searchIsPublicLabel: "Público",
@@ -54,13 +54,13 @@ module.exports = {
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",
spreadContentUnavailable: "Contenido aún no disponible (replicación pendiente)",
filteredByTag: "Filtrado por etiqueta",
filteredByTagTitle: "Filtrado por etiqueta",
feedPublishedSuccess: "¡Publicación creada con éxito!",
+ feedMastodonFailed: "Publicado en Oasis, pero no se ha podido enviar a Mastodon.",
tribeFeedSent: "¡Mensaje enviado con éxito!",
tribeContentEncrypted: "Contenido cifrado",
tribeTorrentsEmpty: "Aún no hay torrents.",
@@ -77,18 +77,17 @@ module.exports = {
bookmarkLastVisit: "Última visita",
profileClearnetBookmarksLabel: "Marcadores",
invitesPort: "Puerto",
- currentlyUnrecheable: "¡ERROR!",
- peerHostValidation: "IPv4 válida (p. ej. 192.168.1.100) o nombre de host (p. ej. pub.example.com)",
+ peerHostValidation: "IPv4 válida (p. ej. 192.168.1.100) o nombre de host (p. ej. pub.solarnethub.com)",
peerPortValidation: "Puerto 1-65535",
peerKeyValidation: "Clave pública SSB ed25519 (@<44 caracteres base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Baja de tu oferta de empleo",
- inboxProjectFollowedTitle: "Nuevo seguidor de tu proyecto",
+ inboxProjectFollowedTitle: "Nueva seguidora de tu proyecto",
inboxProjectUnfollowedTitle: "Dejó de seguir tu proyecto",
pmHasFollowedYourProject: "ha seguido tu proyecto",
pmHasUnfollowedYourProject: "ha dejado de seguir tu proyecto",
pmHasUnsubscribedFromYourJobOffer: "se ha dado de baja de tu oferta de empleo",
marketDeleteButton: "Eliminar",
- marketNoBids: "No se han realizado pujas, aún.",
+ marketNoBids: "Aún no se han realizado pujas.",
marketAuctionBidAmount: "Importe de la puja",
marketAuctionBidTime: "Hora de la puja",
marketAuctionUser: "Pujador",
@@ -105,11 +104,11 @@ module.exports = {
taskDescriptionPlaceholder: "Descripción de la tarea",
exportPasswordLabel: "Contraseña de exportación",
importPasswordPlaceholder: "Introduce la contraseña",
- searchCasesPlaceholder: "Buscar casos…",
+ searchCasesPlaceholder: "Buscar en Tribunales...",
shopBuyDeliveryAddressPlaceholder: "Dirección de entrega",
shopBuyNotesPlaceholder: "Notas",
bankTaxesUserNoteBold: "reducir directamente el impuesto ECO",
- bankTaxesUserNoteIntro: "Tu impuesto ECO se deduce del excedente que la red genera por encima de tu RBU; el valor base de la RBU se fija como mínimo inamovible. El impuesto nunca se deduce de la cantidad fija que corresponde a cada habitante como RBU. Los fondos deducidos alimentan el algoritmo de redistribución de riqueza y se canalizan de vuelta a otros habitantes mediante sus reclamos de RBU. Esos otros habitantes que reciben más RBU para sus proyectos probablemente tendrán alguna tarea dedicada a ayudarte a reducir tu impuesto ECO. O pueden dedicarse a ",
+ bankTaxesUserNoteIntro: "Tu impuesto ECO se deduce del excedente que la red genera por encima de tu RBU; el valor base de la RBU se fija como mínimo inamovible. El impuesto nunca se deduce de la cantidad fija que corresponde a cada habitante como RBU. Los fondos deducidos alimentan el algoritmo de redistribución de riqueza y se canalizan de vuelta a otras habitantes mediante sus reclamos de RBU. Esas otras habitantes que reciben más RBU para sus proyectos probablemente tendrán alguna tarea dedicada a ayudarte a reducir tu impuesto ECO. O pueden dedicarse a ",
bankTaxesUserNoteOutro: ", y el consenso de la red puede requerir su contribución continua.",
courtsViewDetails: "Ver",
courtsViewDetailsShort: "Detalles",
@@ -121,16 +120,11 @@ module.exports = {
courtsDetailsNotPublic: "No público",
courtsEvidenceSideAccuser: "Pruebas del acusador",
courtsEvidenceSideRespondent: "Pruebas de la defensa",
- courtsEvidenceSideUnknown: "Desconocido",
+ courtsEvidenceSideUnknown: "Desconocida",
courtsJudgeNotAssigned: "-",
courtsSupportCase: "Apoyar el caso",
courtsSettlementAcceptBtn: "Aceptar acuerdo",
courtsSupportCount: "Apoyos",
- courtsVerdictVoteTitle: "Votar el veredicto",
- courtsVerdictVoteLabel: "Voto del veredicto",
- courtsVerdictVoteAccept: "Aceptar",
- courtsVerdictVoteReject: "Rechazar",
- courtsVerdictVoteSubmit: "Enviar voto",
reportsSetStatus: "Cambiar estado",
reportsStatusClosed: "CERRADO",
statsAvgPerInhabitant: "Media por habitante",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Avatar",
inhabitants: "Habitantes",
- peersReplicatedFeeds: "Feeds replicados",
+ peersReplicatedFeeds: "Replicados",
+ peersTorColumn: "TOR",
+ peersTorYes: "Accesible por Tor",
+ peersTorNo: "No accesible por Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Versión",
graphos: "Graphos",
graphosDescription: "Mapa interactivo de la red alrededor de ti.",
+ graphosFederation: "Federación",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Inalcanzables",
+ graphosFedLinks: "Enlaces mutuos",
+ graphosFedIsolated: "Aislados",
+ graphosFedNoData: "Sin datos",
+ graphosFedMutual: "Mutuo",
+ graphosFedOneWay: "En un sentido",
+ graphosFedTransport: "Red",
+ graphosFedWith: "Federado con",
+ graphosZoom: "Ampliar",
+ graphosFedInhabitants: "Habitantes",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "Tu nodo aún no conoce ningún PUB.",
graphosViewingGraphOf: "Viendo",
graphosBackToMine: "← Mi red",
graphosShowing: "Mostrando",
@@ -202,20 +216,37 @@ module.exports = {
strong("Todos los mensajes que te @mencionan"),
".",
],
- noMentions: "No has recibido @menciones, aún.",
- mentionsSearchPlaceholder: "Buscar menciones...",
+ noMentions: "Aún no has recibido @menciones.",
+ mentionsSearchPlaceholder: "Buscar en Menciones...",
privateReminders: "RECORDATORIOS",
+ inboxFilterPms: "MPs",
+ inboxFilterNotifications: "Notificaciones",
+ inboxMarkRead: "Marcar como leído",
+ inboxMarkUnread: "Marcar como no leído",
+ inboxUnreadChip: "No leído",
+ inboxMarkAllRead: "Marcar todo como leído",
+ inboxDeleteShown: "Borrar todo",
+ inboxArchive: "Archivar",
+ inboxUnarchive: "Desarchivar",
+ inboxFilterArchived: "Archivados",
+ inboxEarlierMessages: "mensajes anteriores",
+ inboxSortThread: "Por hilo",
+ inboxSortRecent: "Más recientes primero",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Notificaciones del Inbox",
+ settingsInboxBotsDesc: "Elige qué bots pueden avisarte en tu Inbox. Los bots desmarcados se ocultan y sus avisos no se cuentan.",
inboxFiltersLabel: "Filtros:",
- inboxToggleToMutuals: "Cambiar a mutuos",
+ inboxToggleToMutuals: "Cambiar a mutuas",
inboxToggleToWhole: "Cambiar a todos",
privateDate: "Fecha",
peers: "Nodos",
- searchDescription: "Descripición",
+ searchDescription: "Descripción",
searchFromLabel: "Desde",
searchToLabel: "Hasta",
searchQueryLabel: "Búsqueda",
- searchPerPageLabel: "Resultados por página",
+ searchPerPageLabel: "Resultados",
settings: "Configuración",
+ settingsDescription: "Configura el entorno de tu red.",
continueReading: "Continuar leyendo",
moreComments: "más comentarios",
readThread: "leer el resto del hilo",
@@ -234,16 +265,16 @@ module.exports = {
profileClearnetHelp: 'Módulos que pueden ser consultados desde fuera de Oasis.',
profileHubAll: 'Todo',
footerLicenseLabel: 'Licencia',
- profileSwitchToOasis: 'Volver a Oasis',
profileVisibilityFediverse: "Multiverso",
contributorsTitle: "Contribuciones",
colorLabel: 'Elige un color',
- paintButton: 'Dibujar!',
+ paintButton: "¡Dibujar!",
totalPixels: 'Total Pixeles',
modules: "Módulos",
modulesViewTitle: "Módulos",
modulesViewDescription: "Define tu entorno ideal activando y desactivando módulos.",
inbox: "Buzón",
+ inboxSearchPlaceholder: "Buscar en Buzón...",
multiverse: "Multiverso",
fediverse: "Multiverso",
fediverseDescription: "Gestiona tus otras cuentas del multiverso, incluyendo enviar y recibir contenido.",
@@ -252,9 +283,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Servidor",
+ nextcloudUserLabel: "Usuario",
+ nextcloudFolderLabel: "Carpeta",
+ nextcloudUploadButton: "Subir",
+ nextcloudFileLabel: "Elige un fichero",
+ fileExternalLink: "Enlace externo",
+ nextcloudErrConnect: "No se ha podido llegar a Nextcloud con estos datos.",
+ nextcloudErrUpload: "La subida a Nextcloud ha fallado.",
+ nextcloudErrShare: "Nextcloud no ha dado un enlace público para el fichero.",
fediverseDisconnect: "Desconectar",
fediverseEmptyLink: "tus ajustes",
fediverseComposePlaceholder: "¿Qué estás pensando?",
@@ -265,7 +304,7 @@ module.exports = {
fediverseBoosted: "ha impulsado",
fediverseNoPosts: "Tu timeline está vacío.",
fediverseTimeline: "Cronologías",
- fediverseFollowers: "Seguidores",
+ fediverseFollowers: "Seguidoras",
fediverseFollowing: "Siguiendo",
fediversePosts: "Publicaciones",
fediverseJoined: "Se unió",
@@ -283,6 +322,76 @@ module.exports = {
fediverseErrPost: "No se pudo publicar.",
fediverseErrMedia: "No se pudo subir el archivo.",
fediverseErrEmpty: "Escribe algo o adjunta un archivo.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Número de teléfono",
+ telegramSendCode: "Enviar código",
+ telegramCodeHelp: "Introduce el código que Telegram te acaba de enviar (app o SMS).",
+ telegramCodeLabel: "Código",
+ telegramPasswordHelp: "Esta cuenta tiene verificación en dos pasos. Introduce tu contraseña.",
+ telegramPasswordLabel: "Contraseña",
+ telegramVerify: "Verificar",
+ telegramCancel: "Cancelar",
+ telegramChats: "Chats",
+ telegramUnread: "Sin leer",
+ telegramOpen: "Abrir",
+ telegramSend: "Enviar",
+ telegramYou: "Tú",
+ telegramNoChats: "Todavía no hay chats.",
+ telegramNoMessages: "Todavía no hay mensajes.",
+ telegramComposePlaceholder: "Escribe un mensaje…",
+ telegramChannel: "Canal",
+ telegramGroup: "Grupo",
+ telegramPrivate: "Privado",
+ telegramErrConnect: "No se pudo contactar con Telegram.",
+ telegramErrTimeout: "Telegram tardó demasiado en responder.",
+ telegramErrAuth: "Sesión de Telegram inválida o caducada. Conéctala de nuevo.",
+ telegramErrFetch: "No se pudieron cargar los chats.",
+ telegramErrSend: "No se pudo enviar el mensaje.",
+ telegramErrMissing: "Hacen falta API ID, API hash y número de teléfono.",
+ telegramErrCode: "Código incorrecto. Inténtalo de nuevo.",
+ telegramErrCodeExpired: "El código ha caducado. Empieza de nuevo.",
+ telegramErrPassword: "Contraseña incorrecta.",
+ telegramErrPhone: "Número de teléfono inválido.",
+ telegramErrApi: "API ID o API hash inválidos.",
+ telegramErrFlood: "Demasiados intentos. Espera un rato e inténtalo de nuevo.",
+ telegramErrNoLogin: "No hay ningún inicio de sesión en curso. Empieza de nuevo.",
+ peertubeUsernameLabel: "Usuaria",
+ peertubePasswordLabel: "Contraseña",
+ peertubeSubscriptions: "Suscripciones",
+ peertubeMyVideos: "Mis vídeos",
+ peertubeVideos: "Vídeos",
+ peertubeFollowers: "Seguidoras",
+ peertubeViews: "visualizaciones",
+ peertubeLikes: "me gusta",
+ peertubeQuota: "Cuota",
+ peertubeUpload: "Subir vídeo",
+ peertubeUploadHelp: "Elige un fichero de vídeo. Se sube a tu canal y PeerTube lo procesa después.",
+ peertubeTitleLabel: "Título",
+ peertubeDescriptionLabel: "Descripción",
+ peertubePrivacyLabel: "Privacidad",
+ peertubePrivacyPublic: "Público",
+ peertubePrivacyUnlisted: "No listado",
+ peertubePrivacyPrivate: "Privado",
+ peertubeNoVideos: "Todavía no hay vídeos.",
+ peertubeComments: "Comentarios",
+ peertubeComment: "Comentar",
+ peertubeCommentPlaceholder: "Escribe un comentario…",
+ peertubeNoComments: "Todavía no hay comentarios.",
+ peertubeOpen: "Abrir en PeerTube",
+ peertubeWatch: "Ver",
+ peertubeChannel: "Canal",
+ peertubeNoStream: "Este vídeo aún no se puede reproducir aquí. Ábrelo en PeerTube.",
+ peertubeUploaded: "Vídeo subido. PeerTube lo está procesando.",
+ peertubeErrConnect: "No se pudo contactar con PeerTube.",
+ peertubeErrAuth: "Usuaria o contraseña incorrectas, o la sesión caducó. Conéctala de nuevo.",
+ peertubeErrInstance: "URL de instancia no válida.",
+ peertubeErrMissing: "Hacen falta instancia, usuaria y contraseña.",
+ peertubeErrFetch: "No se pudieron cargar los vídeos.",
+ peertubeErrUpload: "No se pudo subir el vídeo.",
+ peertubeErrTitle: "Hace falta un título.",
+ peertubeErrComment: "No se pudo publicar el comentario.",
+ peertubeErrNoFile: "Elige un fichero de vídeo.",
bookmarksLabel: "Marcadores",
videosLabel: "Vídeos",
torrentsLabel: "Torrents",
@@ -305,14 +414,13 @@ module.exports = {
comment: "Comentar",
subtopic: "Subtema",
json: "JSON",
- createdBy: "por",
unfollow: "Dejar de soportar",
follow: "Soportar",
block: "Bloquear",
unblock: "Desbloquear",
relationshipNotFollowing: "No te da soporte",
relationshipTheyFollow: "Te da soporte",
- relationshipMutuals: "Soporte mútuo",
+ relationshipMutuals: "Soporte mutuo",
relationshipFollowing: "Estás dando soporte",
relationshipYou: "Tú",
relationshipBlocking: "Estás bloqueando",
@@ -320,26 +428,29 @@ module.exports = {
relationshipMutualBlock: "Bloqueo mutuo",
relationshipNone: "No estás dando soporte",
relationshipBlockingPost: "Post bloqueado",
- viewLikes: "Ver replicas",
+ viewLikes: "Ver réplicas",
+ viewSupporters: "Ver soportes",
spreadedDescription: "Lista de contenidos replicados por habitante.",
preview: "Previsualizar",
publish: "Publicar",
contentWarningPlaceholder: "Añade un título a tu post (opcional)",
- publishWarningPlaceholder: "Cuerpo limitado a 7000 caracteres.",
+ publishWarningPlaceholder: "Escribe el cuerpo de tu entrada.",
publishTooLong: "Tu publicación es demasiado larga. Acórtala, por favor.",
+ keepTextRetry: "Enviar de nuevo",
+ dateInPastError: "La fecha no puede ser anterior a hoy",
publishCustomDescription: [
- "RECUERDA: Debido a la tecnología blockchain, una vez has publicado algo, no puede ser editado ni borrado. Piénsalo bien!.",
+ "RECUERDA: debido a la tecnología blockchain, una vez publicas algo, no se puede editar ni borrar. ¡Piénsalo bien!",
],
commentWarning: [
- "RECUERDA: Debido a la tecnología blockchain, una vez has publicado algo, no puede ser editado ni borrado. Piénsalo bien!.",
+ "RECUERDA: debido a la tecnología blockchain, una vez publicas algo, no se puede editar ni borrar. ¡Piénsalo bien!",
],
commentLabel: ({ publicOrPrivate, markdownUrl }) => [
],
publishLabel: ({ markdownUrl, linkTarget }) => [
- "RECUERDA: Debido a la tecnología blockchain, una vez has publicado algo, no puede ser editado ni borrado. Piénsalo bien!.",
+ "RECUERDA: debido a la tecnología blockchain, una vez publicas algo, no se puede editar ni borrar. ¡Piénsalo bien!",
],
replyLabel: ({ markdownUrl }) => [
- "RECUERDA: Debido a la tecnología blockchain, una vez has publicado algo, no puede ser editado ni borrado. Piénsalo bien!.",
+ "RECUERDA: debido a la tecnología blockchain, una vez publicas algo, no se puede editar ni borrar. ¡Piénsalo bien!",
],
publishCustomInfo: ({ href }) => [
"Si tienes experiencia, también puedes ",
@@ -356,9 +467,8 @@ module.exports = {
mentionsMatching: "Menciones",
mentionsName: "Nombre",
mentionsRelationship: "Relación",
- updateit: "OBTENER ACTUALIZACIONES!",
updateBannerText: "Hay una nueva versión de Oasis disponible.",
- updateBannerAction: "Actualizar ahora →",
+ updateBannerAction: "¡Actualizar ahora!",
info: "Info",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -366,17 +476,15 @@ module.exports = {
timeAgo: "hace",
sendTime: "escrito ",
theme: "Tema",
- legacy: "Llaves",
- legacyTitle: "Llaves",
- legacyDescription: "Maneja tu secreto (llave privada) de forma rápida y segura.",
- legacyExportButton: "Exportar",
- legacyImportButton: "Importar",
+ backupKeysExportButton: "Exportar",
+ backupKeysImportButton: "Importar",
ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Configura el límite de mensajes para los flujos de la blockchain.",
+ logWindowChip: "Últimos {n} streams de la blockchain",
saveSettings: "Guardar configuración",
- 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!)",
+ exportDescription: "Establece una contraseña (mín. 32 caracteres) para cifrar tu secreto",
+ exportDataTitle: "Copia instantánea",
+ exportDataDescription: "Descargar tu blockchain (¡llave privada excluida!)",
exportDataButton: "Descargar blockchain",
importDescription: "Importa tu secreto cifrado (llave privada) para activar tu avatar",
passwordImport: "Escribe tu contraseña para descifrar los datos que serán guardados en tu sistema (nombre: secret)",
@@ -384,38 +492,33 @@ module.exports = {
fileInfo: "Tu secreto cifrado se descargará en tu dispositivo (nombre: oasis.enc)",
developer: "Desarrollo",
devTitle: "Desarrollo",
- welcomeBannerText: "Te damos la bienvenida a OASIS. Sigue estos pasos rápidos para configurar tu avatar.",
+ welcomeBannerText: "Tu avatar aún no está configurado.",
aiSuggestionBanner: "Sugerencia:",
aiSuggestionsEnable: "Sugerencias de la IA",
- welcomeBannerAction: "¡Empezar!",
+ welcomeBannerAction: "Empezar",
welcomeTitle: "Bienvenida",
+ welcomeStepIdentity: "Identidad",
+ welcomeStepType: "Tipo",
+ welcomeStepUse: "Uso",
+ welcomeStepLook: "Apariencia",
+ welcomeStepCommunity: "Comunidad",
+ welcomeStepIntro: "Bienvenida",
+ welcomeHintIdentity: "Tu nombre y tu imagen.",
+ welcomeHintType: "Cómo se abre Oasis para ti.",
+ welcomeHintUse: "Qué módulos quedan activos.",
+ welcomeHintLook: "El tema que viste Oasis.",
+ welcomeHintCommunity: "Entra en un PUB para conocer a otros habitantes.",
+ welcomeHintIntro: "Envía un primer saludo a la comunidad.",
+ welcomeStepThemeAction: "Usar este tema",
+ welcomeJoinPubs: "Entrar en los PUBs",
+ welcomeNoFederation: "Sin federarse",
welcomeStepGreetingAction: "Enviar feed",
- welcomeJoinPubButton: "Unirse al pub",
- welcomeStepLarpAction: "Unirse a \"La Academia\"",
- welcomeStepLarpText: "Únete a nuestro juego de rol de acción real.",
- welcomeStepLarpTitle: "Únete al L.A.R.P.",
- welcomeStepGreetingTitle: "Envía un \"Hola mundo!\"",
- welcomeStepGreetingText: "Envía un mensaje para que otros habitantes puedan descubrirte.",
- welcomeJoinPub: "Unirse a",
welcomeDescription: "Unas pocas cosas que conviene hacer antes de empezar.",
- welcomeProgress: "Completado",
- welcomeStepDone: "hecho",
- welcomeStepPending: "pendiente",
welcomeSkip: "Ahora no",
- welcomeStepLanguageTitle: "Elige tu idioma",
- welcomeStepLanguageText: "Oasis habla varios idiomas. Puedes cambiarlo cuando quieras.",
- welcomeStepProfileTitle: "Edita tu perfil",
- welcomeStepProfileText: "Elige un nombre, añade una descripción y pon una imagen para que el resto de habitantes te reconozca.",
welcomeStepProfileAction: "Guardar perfil",
- welcomeStepFederationTitle: "Únete a la red principal",
- welcomeStepFederationText: "Conéctate a nuestro pub para encontrar a otros habitantes y empezar a replicar.",
- welcomeStepFederationAction: "Ir a invitaciones",
- welcomeStepBackupTitle: "Copia de seguridad de tu ID",
- welcomeStepBackupText: "Tu identidad es un fichero de claves en este dispositivo.",
- welcomeStepBackupWarning: "SI LO PIERDES, NADIE PUEDE RECUPERARLO POR TI.",
- welcomeStepBackupAction: "¡Copia de seguridad!",
+ welcomeBootstrapRunning: "Cargando la instantánea del pub. Al terminar se une al pub automáticamente; mientras tanto puedes seguir usando Oasis.",
welcomeCompleteTitle: "Todo listo.",
- welcomeCompleteText: "Tu nodo está preparado. A partir de aquí la red crece con la gente a la que sigues.",
+ welcomeCompleteText: "Tu nodo está preparado. A partir de aquí la red crece con los habitantes a los que apoyas.",
welcomeFindPeople: "Buscar habitantes",
devFilterFiles: "FICHEROS",
devFilterSearch: "BUSCAR",
@@ -425,7 +528,7 @@ module.exports = {
devFilterTests: "TESTS",
devVersion: "Versión",
devNodeVersion: "Node",
- devStatsTests: "Suites de tests",
+ devStatsTests: "Tests",
devParentFolder: "Carpeta superior",
devOpenFolder: "abrir",
devDescription: "Explora el código que se está ejecutando en este nodo.",
@@ -441,7 +544,7 @@ module.exports = {
devSize: "Tamaño",
devShowing: "Mostrando",
devLine: "línea",
- devReportBug: "Reportar Bug",
+ devReportBug: "Informar de un error",
devCreateTask: "Crear Tarea",
devRaw: "RAW",
devReportContext: "Encontrado leyendo el código de Oasis",
@@ -464,11 +567,32 @@ module.exports = {
themeIntro:
"Elige un tema.",
setTheme: "Establecer tema",
- language: "Lenguaje",
+ language: "Idioma",
languageDescription:
- "Si quieres utilizar otro idioma, seleccionalo aquí.",
- setLanguage: "Establecer lenguaje",
- peerConnectionsIntro: "Maneja todas tus conexiones con otros nodos.",
+ "Si quieres utilizar otro idioma, selecciónalo aquí.",
+ setLanguage: "Establecer idioma",
+ peerConnectionsIntro: "Gestiona todas tus conexiones con otros nodos.",
+ peersConnectFailed: "No se pudo conectar: {reason}.",
+ peerStateLabel: "Estado",
+ peerAddressLabel: "Dirección",
+ peerLastChangeLabel: "Último cambio",
+ peerStateConnected: "Conectado",
+ peerStateConnecting: "Conectando",
+ peerStateStaged: "Disponible",
+ peerErrSilent: "Sin actividad",
+ peerErrTimeout: "No responde",
+ peerErrRefused: "Rechaza la conexión",
+ peerErrNotFound: "Dirección desconocida",
+ peerErrUnreachable: "Red inaccesible",
+ peerErrKeys: "Usando llaves diferentes",
+ peerErrIdentity: "No acepta tu conexión",
+ peerErrTor: "Solo TOR",
+ peerErrDropped: "Conexión cortada",
+ peerErrPaused: "Red en pausa",
+ peerErrOther: "Error de conexión",
+ peerOutdated: "Desactualizado",
+ peerVersionUnannounced: "No anuncia su versión: un Oasis antiguo",
+ peersTorMissing: "Este PUB solamente permite conexiones desde TOR.",
peerConnectionsTitle: "Conexiones",
online: "Conectado",
offline: "Desconectado",
@@ -487,88 +611,76 @@ module.exports = {
noConnections: "No hay nodos conectados.",
noDiscovered: "No has descubierto nodos.",
noUnknownPeers: "Sin pares desconocidos en el grafo de amistades.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Aún no hay nodos registrados.",
+ peerConnect: "Conectar",
+ peerDisconnect: "Desconectar",
peerRefresh: "Refrescar",
peerPruneIdle: "Quitar inactivos",
+ peersPause: "Pausar",
+ peersResume: "Reanudar",
+ peersPausedNote: "En pausa: Oasis no se conecta con nadie y nadie puede conectarse a él.",
+ peersPauseHint: "Detiene todas las conexiones: Oasis no se conecta a otros nodos ni los acepta hasta que reanudes.",
peerExport: "Exportar",
peerImport: "Importar",
peerImportTitle: "Importar lista de peers",
peerImportPlaceholder: "Pega una dirección multiserver por línea, o sube un archivo .txt…",
connectionActionIntro:
"",
- startNetworking: "Iniciar red",
- stopNetworking: "Parar red",
- restartNetworking: "Reiniciar red",
- sync: "Sincronizar red",
indexes: "Índices",
+ indexesRebuilt: "Índices reconstruidos",
+ indexesRebuildFailed: "No se han podido reconstruir los índices",
+ indexesFiles: "Ficheros de índice",
indexesDescription:
"Reconstruir índices es seguro, y puede arreglar algunos errores en tu blockchain.",
homePageTitle: "Página de inicio",
homePageDescription: "Selecciona qué módulo quieres como tu página de inicio.",
saveHomePage: "Establecer página de inicio",
invites: "Invitaciones",
- invitesDescription: "Maneja y aplica códigos de invitación en tu red.",
+ invitesDescription: "Gestiona 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",
invitesChatsTitle: "Chats",
- invitesChatInviteCodePlaceholder: "Introduce el código del chat",
- invitesChatJoinButton: "Entrar en el chat",
invitesPadsTitle: "Pads",
- invitesPadInviteCodePlaceholder: "Introduce el código del pad",
- invitesPadJoinButton: "Entrar en el pad",
invitesCalendarsTitle: "Calendarios",
- invitesCalendarInviteCodePlaceholder: "Introduce el código del calendario",
- invitesCalendarJoinButton: "Entrar en el calendario",
invitesEventsTitle: "Eventos",
- invitesEventInviteCodePlaceholder: "Introduce el código del evento",
- invitesEventJoinButton: "Entrar en el evento",
invitesForumsTitle: "Foros",
- invitesForumInviteCodePlaceholder: "Introduce el código del foro",
- invitesForumJoinButton: "Entrar en el foro",
invitesMapsTitle: "Mapas",
- invitesMapInviteCodePlaceholder: "Introduce el código del mapa",
- invitesMapJoinButton: "Entrar en el mapa",
invitesShopsTitle: "Tiendas",
- invitesShopInviteCodePlaceholder: "Introduce el código de invitación de la tienda",
- invitesShopJoinButton: "Unirse a la tienda",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "PUBs Sugeridos",
+ invitesFilterOthers: "Otras",
+ invitesJoinTitle: "Invitaciones",
+ invitesJoinHint: "Pega cualquier código de invitación, sea de lo que sea, o el Oasis ID de un habitante.",
+ invitesJoinPlaceholder: "Código de invitación u Oasis ID",
+ invitesJoinButton: "Entrar",
+ invitesUsedTitle: "Últimas invitaciones",
+ invitesUsedEmpty: "Aún no has utilizado ninguna invitación.",
+ invitesUsedType: "Tipo",
+ invitesUsedName: "Nombre",
+ invitesUsedDate: "Fecha",
invitesPubInviteCodePlaceholder: "Introduce el código de invitación del PUB",
invitesAcceptInvite: "Entrar en el PUB",
+ invitesPubUses: "Invitaciones usadas",
+ invitesPubExhausted: "Este PUB no tiene invitaciones disponibles.",
invitesAlreadyFederated: "Ya estás federado con este pub.",
+ invitesJoinPubMode: "Este Oasis funciona como PUB, en modo de solo lectura. Para unirlo a otro PUB, usa en la terminal: ./oasis.sh join ",
+ invitesJoinLocalOnly: "Las invitaciones solo se aceptan desde el equipo donde funciona Oasis, o con el enlace de administración que muestra al arrancar.",
invitesFederationsTitle: "Federaciones",
invitesAcceptedInvites: "Federadas",
invitesNoFederatedPubs: "No hay pubs federados.",
- invitesUnreachablePubs: "Inalcanzables",
- invitesNoUnreachablePubs: "No hay pubs inalcanzables.",
invitesPubsRefresh: "Refrescar",
- invitesPubsClearUnreachable: "Quitar inalcanzables",
+ invitesPubsClearUnreachable: "Limpiar",
invitesPubsExport: "Exportar",
invitesPubsImport: "Importar",
invitesPubsImportTitle: "Importar pubs",
invitesPubsImportPlaceholder: "Pega una dirección multiserver o código de invitación por línea, o sube un archivo .txt…",
- currentlyUnreachable: "¡ERROR!",
- errorDetails: "Detalles del error",
- genericError: "A ocurrido un error.",
- panicMode: "Modo Pánico!",
- encryptData: "Establece una contraseña (min 32 caracteres de longitud) para cifrar tu blockchain",
+ genericError: "Ha ocurrido un error.",
+ panicMode: "¡Modo pánico!",
+ encryptData: "Establece una contraseña (mín. 32 caracteres) para cifrar tu blockchain",
decryptData: "Introduce contraseña para descifrar tu blockchain",
- removeDataDescription: "CUIDADO: Éste proceso no puede ser revocado.",
- removePanicButton: "BORRAR TODOS TUS DATOS!",
+ removeDataDescription: "CUIDADO: Este proceso no se puede deshacer.",
+ removePanicButton: "¡BORRAR TODOS TUS DATOS!",
searchTitle: "Buscar",
searchDescriptionLabel: "Buscar contenido en tu red.",
searchPlaceholder:"Buscar contenido...",
@@ -580,16 +692,15 @@ module.exports = {
statusLabel:"Estado",
noResultsFound:"No se han encontrado resultados.",
votesOption:"Opiniones Votadas",
- voteYesLabel:"Si",
+ voteYesLabel:"Sí",
voteNoLabel:"No",
allTypesLabel: "SIN LÍMITES",
- YESLabel:"SI",
+ YESLabel:"SÍ",
NOLabel:"NO",
- votesOptionYesLabel:"Si",
+ votesOptionYesLabel:"Sí",
votesOptionNoLabel:"No",
votesOptionAbstentionLabel:"Abstención",
votesQuestionLabel:"Pregunta",
- votesCreatedByLabel:"Creado el",
voteStatusOpen:"ABIERTO",
voteStatusClosed:"CERRADO",
commentDescription: ({ parentUrl }) => [
@@ -598,30 +709,30 @@ module.exports = {
],
commentTitle: ({ authorName }) => [`Ha comentado en el post de @${authorName}`],
subtopicDescription: ({ parentUrl }) => [
- " creado un subtopic desde ",
+ " ha creado un subtema desde ",
a({ href: parentUrl }, " un post"),
],
- subtopicTitle: ({ authorName }) => [`Ha creado un subtopic en el post de @${authorName}`],
+ subtopicTitle: ({ authorName }) => [`Ha creado un subtema en el post de @${authorName}`],
oasisDescription: "OASIS Red de Proyectos",
searchSubmit: "Buscar...",
votesLabel: "GOBIERNO",
pdfFallbackLabel: "Documento PDF",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "TIENDAS",
+ voteLabel: "VOTOS",
submit: "Aplicar",
editProfile: "Editar Avatar",
oasisIdLabel: "OasisID",
spreadContent: "Replicar",
welcomePmSubject: "Hello World!",
- 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.",
+ 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- [/avatar](/profile) — Edita tu avatar, nombre, descripción y qué módulos se muestran en tu avatar público.\n- /settings — Ajusta tu instancia local: idioma, tema, módulos, privacidad y sincronización.\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 otros habitantes.\n- /tribes — Crea o únete a grupos privados con cifrado de extremo a extremo.\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",
- profileDeviceLockedHint: "Este sensor está siempre activo: permite a otros ver desde qué dispositivo te conectas y no se puede desactivar.",
+ profileDeviceLockedHint: "Este sensor está siempre activo: permite a otros habitantes ver desde qué dispositivo te conectas y no se puede desactivar.",
profileVisibilityKarma: "Puntuación KARMA",
- profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "Cartera ECOIN",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "RBU",
+ profileVisibilityWallet: "Cartera ECOin",
+ profileVisibilityEcoTax: "Tasa ECO",
+ profileVisibilityLarpSign: "Sello L.A.R.P.",
profileVisibilityGpg: "Llave GPG",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Tiendas",
@@ -634,17 +745,21 @@ module.exports = {
profileClearnetImagesLabel: "Imágenes",
profileClearnetDocumentsLabel: "Documentos",
profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Mercado",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
editProfileDescription:
"",
profileName: "Nombre",
- profileImage: "Imágen Avatar",
+ profileImage: "Imagen del avatar",
profileGpgKey: "Clave Pública GPG (.asc)",
profileGpgChip: "GPG",
profileGpgDownload: "Descargar",
profileGpgRemove: "Eliminar",
profileDescription: "Descripción",
hashtagDescription:
- "Posts de habitantes de tu red que referencian éste #hashtag, ordenados por el más reciente.",
+ "Posts de habitantes de tu red que mencionan este #hashtag, ordenados por el más reciente.",
rebuildName: "Reconstruir blockchain",
wallet: "Cartera",
walletAddress: "Dirección",
@@ -659,7 +774,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Conf.",
walletConfirm: "Confirmar",
- walletDescription: "Administra tus activos digitales, incluido el envío y la recepción de ECOin, la visualización del saldo y el acceso al historial de transacciones.",
+ walletDescription: "Gestiona tu cartera ECOin.",
walletDate: "Fecha",
walletFee: "Tasa (Cuanto mayor sea la tasa, más rápido se procesará tu transacción)",
walletFeeLine: ({ fee }) => `Tasa: ECO ${fee}`,
@@ -667,6 +782,86 @@ module.exports = {
walletReceive: "Recibir",
walletReset: "Resetear",
walletSend: "Enviar",
+ walletPayingTransfer: "Pagando transfer",
+ walletCreateTransferLabel: "Generar contrato (transfer)",
+ walletTransferNotifiedNote: "Se ha avisado del pago a la otra parte",
+ walletTransferCreatedNote: "Se ha creado un transfer (recibo) de este pago",
+ walletTransferNoPayeeNote: "Ningún habitante ha publicado esta dirección, así que no se creó transfer",
+ walletTransferReceiptConcept: "Pago desde la cartera",
+ walletPaymentPmText: "te ha enviado un pago",
+ walletPayeeLabel: "Destinataria",
+ walletConceptLabel: "Concepto",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Has recibido tu RBU.",
+ bankingBotPaymentTitle: "Has recibido un pago.",
+ bankingBotUbiPaidText: "Tu Renta Básica Universal ha sido pagada",
+ bankUbiPubThisNode: "Este nodo paga la RBU",
+ bankUbiPubConnected: "PUB de la RBU",
+ bankUbiPubNone: "No hay PUBs anunciando una RBU, de momento.",
+ bankUbiAddressPublished: "Dirección ECOin publicada",
+ bankUbiAddressMissing: "Publica tu dirección ECOin para recibir la RBU",
+ bankUbiClaimedThisMonth: "Reclamada este mes",
+ bankUbiPubBalance: "Cartera del PUB disponible para la RBU",
+ bankNoPubAddress: "El PUB de la RBU aún no ha publicado una dirección ECOin.",
+ bankUbiTab: "RBU",
+ bankDonateEco: "¡DONAR!",
+ donateTooltip: "Donar ECOin",
+ bankNoUserAddress: "Este habitante no comparte una dirección ECOin.",
+ bankUbiPubDefault: "Por defecto",
+ bankUbiPool: "Asignación",
+ bankUbiLastSeen: "Visto por última vez",
+ bankUbiLastPayout: "Última acción",
+ bankUbiPaidOut: "Repartido",
+ bankRangeToday: "Hoy",
+ bankRangeWeek: "Semana",
+ bankRangeMonth: "Mes",
+ bankRangeYear: "Año",
+ bankRangeFiveYears: "5 años",
+ bankRangeAll: "Todo",
+ bankChartValueTitle: "Evolución del valor de ECOin",
+ bankChartValueHours: "Equivalencia en tiempo (h)",
+ bankChartWealthTitle: "Redistribución de riqueza ECOin",
+ bankChartDistributed: "RBU repartida (ECO)",
+ bankChartRebalanceTitle: "Redistribución de riqueza entre PUBs",
+ bankChartRebalanced: "ECO movidos entre PUBs",
+ bankChartTaxes: "Impuestos retenidos (ECO)",
+ bankChartNoDataRange: "Sin datos en este rango.",
+ bankChartNoDataYet: "Todavía no hay datos",
+ bankChartPerHour: "por hora",
+ bankChartPerDay: "por día",
+ bankChartPerMonth: "por mes",
+ bankTotalUbiDistributed: "RBU total redistribuida (red)",
+ bankTotalTaxesWithheld: "Impuestos totales retenidos (red)",
+ bankInflationIssuance: "Tasa de emisión (anual, por recompensa de bloque)",
+ bankRulesEligibilityTitle: "Quién puede recibir la RBU",
+ bankRulesEligibility1: "Una dirección ECOin publicada en tu perfil (Perfil → Sensores → Cartera ECOin).",
+ bankRulesEligibility2: "Un feed con más de 30 días y actividad en la red: karma por encima de cero.",
+ bankRulesEligibility3: "Un reclamo por mes (epoch), desde Banking con el botón Reclamar RBU. Se puede rechazar la del mes en curso con Rechazar RBU.",
+ bankRulesEligibility4: "El suelo de 1 ECO se paga siempre; los impuestos solo reducen la parte que lo supera y nunca se cobran aparte.",
+ bankRulesEligibility5: "El PUB paga en su siguiente ciclo y publica un transfer RBU que puedes confirmar.",
+ bankRulesEligibility6: "Si falta tu dirección, el feed es demasiado joven, rechazaste el mes o el PUB no tiene fondos, el reclamo se salta y queda registrado en el PUB.",
+ copyLinkTitle: "Copiar enlace",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Rechazar RBU",
+ bankUbiRefusedThisMonth: "Has rechazado la RBU de este mes.",
+ bankingBotUbiAvailableTitle: "Puedes reclamar tu RBU.",
+ bankingBotUbiAvailableText: "Tu RBU de este mes está disponible",
+ bankingBotConfirmTitle: "Tienes un contrato pendiente de confirmación",
+ bankingBotConfirmText: "Contratos pendientes de confirmación",
+ bankChartZoomHint: "Clic para ampliar",
+ bankChartPoolTitle: "Asignación de la RBU (en el tiempo)",
+ bankChartNetworkUbiTitle: "RBU total redistribuida (red)",
+ bankChartSupplyTitle: "Oferta circulante de ECOin (en el tiempo)",
+ bankChartInflationTitle: "Inflación de ECOin (en el tiempo)",
+ bankChartInflationSeries: "Tasa anualizada (%)",
+ bankChartPool: "Asignación total (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (en el tiempo)",
+ bankChartFundsTitle: "Tus fondos ECOin (en el tiempo)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin conectada",
+ bankWalletNotConfigured: "ECOin desconectada",
+ transfersPayWithWallet: "¡PAGAR!",
walletStatus: "Estado",
walletDisconnected: [
"Tienes la ",
@@ -676,8 +871,11 @@ module.exports = {
" o el estado de tu conexión.",
],
walletSentToLine: ({ destination, amount }) => `Enviar ECO ${amount} a ${destination}`,
+ walletNotConfigured: "Tu cartera de ECOin aún no está configurada.",
walletSettingsDescription: "Integrar Oasis con tu cartera de ECOin.",
- walletSettingsDocLink: "Guía de instalación de ECOin",
+ walletSettingsMobileDescription: "Vincula Oasis con la app ECOin Wallet de este dispositivo.",
+ walletDownloadEcoin: "¡Descargar ECOin!",
+ walletRpcUrl: "URL del RPC",
walletStatusMessages: {
invalid_amount: "Cantidad inválida",
invalid_dest: "Dirección de destino inválida",
@@ -693,22 +891,23 @@ module.exports = {
walletUser: "Usuario",
walletPass: "Contraseña",
walletConfiguration: "Configurar cartera",
+ walletDisconnectButton: "Desconectar cartera",
cipher: "Cifrador",
cipherTitle: "Cifrador",
- cipherDescription: "Encripta y desencripta tu texto de forma simétrica (usando una contraseña compartida).",
+ cipherDescription: "Cifra y descifra tu texto de forma simétrica (usando una contraseña compartida).",
randomPassword: "Contraseña Aleatoria",
- 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",
+ cipherTextPlaceholder: "Introduce el texto para cifrar...",
+ cipherPasswordLabel: "Establece una contraseña (mínimo 32 caracteres) para cifrar tu texto",
+ cipherPasswordDecryptLabel: "Establece una contraseña (mínimo 32 caracteres) para descifrar tu texto",
cipherPasswordPlaceholder: "Introduce una contraseña...",
- cipherEncryptButton: "Encriptar",
- cipherEncryptedMessageLabel: "Texto Encriptado",
- cipherDecryptedMessageLabel: "Texto Desencriptado",
- cipherEncryptedTextPlaceholder: "Introduce el texto encriptado...",
- cipherDecryptButton: "Desencriptar",
+ cipherEncryptButton: "Cifrar",
+ cipherEncryptedMessageLabel: "Texto cifrado",
+ cipherDecryptedMessageLabel: "Texto descifrado",
+ cipherEncryptedTextPlaceholder: "Introduce el texto cifrado...",
+ cipherDecryptButton: "Descifrar",
password: "Contraseña",
text: "Texto",
- encryptedText: "Texto Encriptado",
+ encryptedText: "Texto cifrado",
iv: "Vector de Inicialización (IV)",
bookmarkTitle: "Marcadores",
bookmarkDescription: "Descubre y gestiona marcadores en tu red.",
@@ -726,17 +925,16 @@ module.exports = {
bookmarkFilterRecent: "RECIENTES",
bookmarkCreateButton: "Crear marcador",
bookmarkUpdateButton: "Actualizar",
- bookmarkDeleteButton: "Eliminar",
bookmarkAddFavoriteButton: "Añadir favorito",
bookmarkRemoveFavoriteButton: "Quitar favorito",
bookmarkUrlLabel: "Enlace",
- bookmarkUrlPlaceholder: "https://ejemplo.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Descripción",
bookmarkDescriptionPlaceholder: "Opcional",
bookmarkTagsLabel: "Etiquetas",
- bookmarkTagsPlaceholder: "Introduce tags separadas por comas",
+ bookmarkTagsPlaceholder: "Introduce etiquetas separadas por comas",
bookmarkLastVisitLabel: "Última visita",
- bookmarkSearchPlaceholder: "Buscar URL, tags, categoría, autor...",
+ bookmarkSearchPlaceholder: "Buscar en Marcadores...",
bookmarkSortRecent: "Más recientes",
bookmarkSortOldest: "Más antiguos",
bookmarkSortTop: "Más votados",
@@ -775,7 +973,7 @@ module.exports = {
videoDescriptionPlaceholder: "Opcional",
videoNoFile: "No se ha proporcionado ningún archivo de vídeo",
noVideos: "No hay vídeos disponibles.",
- videoSearchPlaceholder: "Buscar por título, etiquetas, autor...",
+ videoSearchPlaceholder: "Buscar en Vídeos...",
videoSortRecent: "Más recientes",
videoSortOldest: "Más antiguos",
videoSortTop: "Más votados",
@@ -798,7 +996,6 @@ module.exports = {
documentFilterFavorites: "FAVORITOS",
documentCreateButton: "Subir documento",
documentUpdateButton: "Actualizar",
- documentDeleteButton: "Eliminar",
documentAddFavoriteButton: "Añadir a favoritos",
documentRemoveFavoriteButton: "Quitar de favoritos",
documentMessageAuthorButton: "MP",
@@ -811,7 +1008,7 @@ module.exports = {
documentDescriptionPlaceholder: "Opcional",
documentNoFile: "Sin archivo.",
noDocuments: "No hay documentos disponibles.",
- documentSearchPlaceholder: "Buscar título, etiquetas, descripción, autor...",
+ documentSearchPlaceholder: "Buscar en Documentos...",
documentSortRecent: "Más recientes",
documentSortOldest: "Más antiguos",
documentSortTop: "Más votados",
@@ -832,19 +1029,19 @@ module.exports = {
audioFilterTop: "TOP",
audioCreateButton: "Subir audio",
audioUpdateButton: "Actualizar",
- audioDeleteButton: "Eliminar",
audioAddFavoriteButton: "Añadir a favoritos",
audioRemoveFavoriteButton: "Quitar de favoritos",
audioFileLabel: "Selecciona un archivo de audio (.mp3, .wav, .ogg)",
audioTagsLabel: "Etiquetas",
audioTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ tagsPlaceholder: "Introduce etiquetas separadas por comas",
audioTitleLabel: "Título",
audioTitlePlaceholder: "Opcional",
audioDescriptionLabel: "Descripción",
audioDescriptionPlaceholder: "Opcional",
audioNoFile: "No se ha proporcionado ningún archivo de audio",
noAudios: "No hay audios disponibles.",
- audioSearchPlaceholder: "Buscar por título, etiquetas, autor...",
+ audioSearchPlaceholder: "Buscar en Audios...",
audioSortRecent: "Más recientes",
audioSortOldest: "Más antiguos",
audioSortTop: "Más votados",
@@ -856,7 +1053,7 @@ module.exports = {
audioFilterFavorites: "FAVORITOS",
favoritesTitle: "Favoritos",
favoritesDescription: "Todos tus elementos marcados como favoritos en un solo lugar.",
- favoritesSearchPlaceholder: "Buscar en favoritos...",
+ favoritesSearchPlaceholder: "Buscar en Favoritos...",
favoritesFilterAll: "TODOS",
favoritesFilterRecent: "RECIENTES",
favoritesFilterAudios: "AUDIOS",
@@ -868,13 +1065,12 @@ module.exports = {
favoritesFilterChats: "CHATS",
favoritesFilterCalendars: "CALENDARIOS",
favoritesFilterVideos: "VÍDEOS",
- favoritesRemoveButton: "Quitar de favoritos",
favoritesNoItems: "Todavía no hay favoritos.",
yourContacts: "Tus Contactos",
allInhabitants: "Habitantes",
allCVs: "CVs",
discoverPeople: "Descubre habitantes en tu red.",
- searchInhabitantsPlaceholder: "FILTRAR habitantes POR NOMBRE …",
+ searchInhabitantsPlaceholder: "Buscar en Habitantes...",
filterLocation: "FILTRAR habitantes POR UBICACIÓN …",
filterLanguage: "FILTRAR habitantes POR IDIOMA …",
filterSkills: "FILTRAR habitantes POR HABILIDADES …",
@@ -884,7 +1080,7 @@ module.exports = {
languagesLabel: "Idiomas",
skillsLabel: "Habilidades",
commonSkills: "Habilidades Comunes",
- mutualFollowers: "Seguidores Mutuos",
+ mutualFollowers: "Seguidoras Mutuas",
suggestedFollowsYou: "Te sigue",
latestInteractions: "Últimas Interacciones",
suggestedSectionTitle: "Sugeridos",
@@ -893,15 +1089,14 @@ module.exports = {
topactivitySectionTitle: "Top Actividad",
"TOP INACTIVITYButton": "MÁS INACTIVOS",
topinactivitySectionTitle: "Habitantes menos activos",
- blockedSectionTitle: "Bloqueados",
+ blockedSectionTitle: "Bloqueadas",
gallerySectionTitle: "GALERÍA",
topSectionTitle: "TOP",
- blockedLabel: "Usuario Bloqueado",
+ blockedLabel: "Habitante bloqueada",
inhabitantviewDetails: "Ver Detalles",
- cvVisitButton: "Visitar CV",
keepReading: "Seguir leyendo...",
oasisId: "ID",
- noInhabitantsFound: "No se encontraron habitantes, aún.",
+ noInhabitantsFound: "Aún no se han encontrado habitantes.",
inhabitantActivityLevel: "Nivel Actividad",
lifespanLabel: "Vigencia",
deviceLabel: "Dispositivo",
@@ -916,6 +1111,18 @@ module.exports = {
parliamentFilterLeaders: "LÍDERES",
parliamentFilterRules: "REGLAS",
parliamentGovernmentCard: "Gobierno actual",
+ parliamentSeatsGovernment: "Gobierno",
+ parliamentSeatsOpposition: "Oposición",
+ parliamentSeatsAbstention: "Abstención",
+ parliamentSeatsQuorum: "Cuórum de elección",
+ parliamentSeatsPass: "Umbral de aprobación",
+ parliamentSeatsByElection: "Por elección",
+ parliamentSeatsByHouses: "Por casa del LARP",
+ parliamentSeatsSeats: "escaños",
+ parliamentSeatsSeat: "escaño",
+ parliamentSeatsLeader: "Líder",
+ parliamentSeatsVotesFor: "votos a",
+ parliamentSeatsNoHouse: "Sin casa",
parliamentActorInPowerInhabitant: 'HABITANTE EN EL PODER',
parliamentActorInPowerTribe: 'TRIBU EN EL PODER',
parliamentHistoricalGovernmentsTitle: 'GOBIERNOS',
@@ -983,20 +1190,22 @@ module.exports = {
parliamentTimeRemaining: "Tiempo restante",
parliamentElectionsStatusTitle: "Próximo Gobierno",
parliamentProposalDeadlineLabel: "Fecha límite",
+ parliamentViewReport: "Ver informe",
parliamentProposalTimeLeft: "Tiempo restante",
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.",
+ parliamentRulesCandidates: "Cualquier habitante puede proponerse a sí misma, a otra 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.",
+ parliamentRulesTies: "Desempate: mayor karma de la habitante; si persiste, perfil más antiguo; si persiste, propuesta más temprana; después, orden lexicográfico por ID.",
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.",
- parliamentRulesProposals: "Si eres el habitante gobernante o miembro de la tribu gobernante, puedes publicar propuestas de ley. Los métodos no dictatoriales crean una votación pública.",
+ parliamentRulesProposals: "Si eres la habitante gobernante o miembro de la tribu gobernante, puedes publicar propuestas de ley. Los métodos no dictatoriales crean una votación pública.",
parliamentRulesLimit: "Cada habitante puede publicar como máximo 3 propuestas de ley por ciclo.",
parliamentRulesLaws: "Cuando una propuesta alcanza su umbral, se convierte en Ley y aparece en la pestaña Leyes con su fecha de entrada en vigor.",
parliamentRulesHistorical: "En Histórico se puede ver cada ciclo de gobierno que ha habido y datos sobre su gestión.",
parliamentRulesLeaders: "En Líderes se puede ver un ranking de habitantes/tribus que han gobernado (o se han presentado), ordenados por eficacia.",
+ parliamentRulesHemicycle: "El hemiciclo da un escaño por habitante: el bloque de gobierno (votantes de la candidatura ganadora y quien lidera), un bloque de oposición por cada otra candidatura del ciclo, y la abstención. Las marcas discontinuas señalan el cuórum de elección (25 % del censo) y el umbral de aprobación del método vigente. \"Por casa del LARP\" colorea los mismos escaños por casa.",
parliamentProposalVoteStatusLabel: "Estado de la votación",
parliamentProposalOnTrackYes: "Umbral alcanzado",
parliamentProposalOnTrackNo: "Por debajo del umbral",
@@ -1004,12 +1213,13 @@ module.exports = {
courtsDescription: "Explora formas de resolución de conflictos y de gestión colectiva de la justicia.",
courtsFilterCases: "CASOS",
courtsFilterMyCases: "MÍOS",
- courtsFilterJudges: "JUECES",
+ courtsFilterJudges: "JUEZAS",
courtsFilterHistory: "HISTORIAL",
courtsFilterRules: "REGLAS",
courtsCaseFormTitle: "Abrir caso",
- courtsCaseRespondent: "Acusado / Parte demandada",
+ courtsCaseRespondent: "Acusada / Parte demandada",
courtsCaseRespondentPh: "ID de Oasis (@...) o nombre de Tribu",
+ courtsCaseSubjectPlaceholder: "Asunto o descripción breve",
courtsCaseMethod: "Método de resolución",
courtsCaseSubmit: "Presentar caso",
courtsNominateJudge: "Nominar juez",
@@ -1041,18 +1251,33 @@ module.exports = {
courtsMediatorsSubmit: "Guardar mediadores",
courtsNoMyCases: "Aún no tienes conflictos.",
courtsNoHistory: "Todavía no hay juicios registrados.",
- courtsMethodDICTATOR: "Dictador",
+ courtsMethodDICTATOR: "Dictadora",
courtsMethodPOPULAR: "Popular",
courtsMethodKARMATOCRACY: "Karmatocracia",
+ courtsCaseType: "Tipo de caso",
+ courtsPresetMinorConflict: "Conflicto leve",
+ courtsPresetModerateConflict: "Conflicto moderado",
+ courtsPresetSevereConflict: "Conflicto grave",
+ courtsPresetHarassment: "Acoso o abuso",
+ courtsPresetContentModeration: "Moderación de contenido",
+ courtsPresetBanRestriction: "Expulsión o restricción",
+ courtsPresetGovernanceDispute: "Disputa de gobernanza",
+ courtsStatusOPEN: "Abierto",
+ courtsStatusIN_PROGRESS: "En curso",
+ courtsStatusDECIDED: "Decidido",
+ courtsStatusCLOSED: "Cerrado",
+ courtsStatusSOLVED: "Resuelto",
+ courtsStatusUNSOLVED: "Sin resolver",
+ courtsStatusDISCARDED: "Descartado",
courtsRulesTitle: "Cómo funcionan los Tribunales",
courtsRulesIntro: "Los Tribunales son un proceso gestionado por la comunidad para resolver conflictos y promover la justicia restaurativa. Se priorizan el diálogo, las pruebas claras y los remedios proporcionales.",
courtsRulesLifecycle: "Proceso: 1) Abrir caso 2) Seleccionar método 3) Presentar pruebas 4) Audiencia y deliberación 5) Veredicto y remedio 6) Cumplimiento y cierre 7) Apelación (si procede).",
- courtsRulesRoles: "Acusación: abre el caso. Defensa: persona o tribu acusada. Método: mecanismo elegido por la comunidad para facilitar, evaluar las pruebas y emitir veredicto. Testigo: aporta testimonio o pruebas. Mediadores: personas neutrales invitadas por la acusación y/o la defensa, con acceso a todos los detalles, que ayudan a desescalar el conflicto y co-crear acuerdos.",
+ courtsRulesRoles: "Acusación: abre el caso. Defensa: habitante o tribu acusada. Método: mecanismo elegido por la comunidad para facilitar, evaluar las pruebas y emitir veredicto. Testigo: aporta testimonio o pruebas. Mediadores: habitantes neutrales invitadas por la acusación y/o la defensa, con acceso a todos los detalles, que ayudan a desescalar el conflicto y co-crear acuerdos.",
courtsRulesEvidence: "Descripción de hasta 1000 caracteres. Adjunta imágenes, audio, vídeo y documentos PDF relevantes y legales. No compartas datos privados sensibles sin consentimiento.",
- courtsRulesDeliberation: "Las audiencias pueden ser públicas o privadas. Los jueces garantizan el respeto, piden aclaraciones y pueden descartar material irrelevante o ilegal.",
+ courtsRulesDeliberation: "Las audiencias pueden ser públicas o privadas. Las juezas garantizan el respeto, piden aclaraciones y pueden descartar material irrelevante o ilegal.",
courtsRulesVerdict: "Se prioriza la restauración: disculpas, acuerdos de mediación, moderación de contenido, restricciones temporales u otras medidas proporcionales. El razonamiento debe quedar registrado.",
courtsRulesAppeals: "Apelación: permitida cuando hay nuevas pruebas o un error procesal claro. Debe presentarse en un plazo de 7 días salvo que se indique lo contrario.",
- courtsRulesPrivacy: "Respeta la privacidad y la seguridad. El doxing, el odio o las amenazas se eliminan. Los jueces pueden editar o sellar partes del expediente para proteger a personas en riesgo.",
+ courtsRulesPrivacy: "Respeta la privacidad y la seguridad. El doxing, el odio o las amenazas se eliminan. Las juezas pueden editar o sellar partes del expediente para proteger a habitantes en riesgo.",
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",
@@ -1061,19 +1286,23 @@ module.exports = {
courtsRoleDefence: "Defensa",
courtsRoleMediator: "Mediador",
courtsRoleJudge: "Juez",
- courtsRoleDictator: "Dictador",
+ courtsRoleDictator: "Dictadora",
courtsAssignJudgeTitle: "Elegir juez",
courtsAssignJudgeBtn: "Elegir juez",
trendingTitle: "Tendencias",
exploreTrending: "Explora el contenido más popular en tu red.",
votesButton: "GOBIERNO",
shopProductButton: "TIENDA",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISODIO",
+ campaignButton: "CAMPAÑA",
+ logisticsRouteButton: "RUTA",
trendingTotalOpinions: "Total de Opiniones",
trendingNoContentMessage: "Todavía no hay tendencias.",
trendingTotalCount: "Total de Contadores",
tasksTitle: "Tareas",
tasksDescription: "Descubre y gestiona tareas en tu red.",
- taskSearchPlaceholder: "Buscar tareas...",
+ taskSearchPlaceholder: "Buscar en Tareas...",
taskTitleLabel: "Título",
taskDescriptionLabel: "Descripción",
taskStartTimeLabel: "Fecha de Inicio",
@@ -1092,7 +1321,7 @@ module.exports = {
taskStatusOpen: "Abierta",
taskStatusInProgress: "En Progreso",
taskStatusClosed: "Cerrada",
- taskAssignedTo: "Asignada a",
+ taskAssignedTo: "Asignada",
taskAssignedChip: "Asignada",
taskUnassignedChip: "Sin asignar",
taskAssignees: "Asignados",
@@ -1102,6 +1331,7 @@ module.exports = {
taskUpdateButton: "Actualizar",
taskDeleteButton: "Eliminar",
taskFilterAll: "TODOS",
+ taskFilterRecent: "RECIENTES",
taskFilterMine: "MÍAS",
taskFilterOpen: "ABIERTAS",
taskFilterInProgress: "EN-PROCESO",
@@ -1129,14 +1359,13 @@ module.exports = {
eventUpcomingDates: "Próximas fechas",
eventsTitle: "Eventos",
eventsDescription: "Descubre y gestiona eventos en tu red.",
- eventSearchPlaceholder: "Buscar eventos...",
+ eventSearchPlaceholder: "Buscar en Eventos...",
eventPrice: "Precio",
eventStatus: "Estado",
eventAllSectionTitle: "Eventos",
eventMineSectionTitle: "Tus Eventos",
eventCreateSectionTitle: "Crear Evento",
eventUpdateSectionTitle: "Actualizar Evento",
- eventDeleteButton: "Eliminar",
eventCreateButton: "Crear Evento",
eventAddToCalendar: "Añadir al Calendario",
eventVisitCalendar: "Visitar Calendario",
@@ -1145,7 +1374,7 @@ module.exports = {
viewPad: "Ver pad",
viewMap: "Ver mapa",
viewCalendar: "Ver calendario",
- viewReport: "Ver Reporte",
+ viewReport: "Ver informe",
viewTransfer: "Ver Transferencia",
viewItem: "Ver Item",
viewShop: "Ver Tienda",
@@ -1154,11 +1383,11 @@ module.exports = {
viewPlace: "Ver Lugar",
generatePdf: "Generar PDF",
sharePm: "Compartir por PM",
- galleryImages: "Imágenes (tamaño máx: 50MB cada una)",
+ galleryImages: "Imágenes (tamaño máx: 75MB cada una)",
galleryPhotos: "Imágenes",
galleryAddPhoto: "Añadir Imagen",
galleryRemovePhoto: "Quitar",
- galleryVideo: "Vídeo (tamaño máx: 50MB)",
+ galleryVideo: "Vídeo (tamaño máx: 75MB)",
galleryAddVideo: "Añadir Vídeo",
galleryRemoveVideo: "Quitar vídeo",
viewVotation: "Ver Votación",
@@ -1178,7 +1407,8 @@ module.exports = {
eventDate: "Fecha",
eventAttendButton: "Asistir al Evento",
eventFilterAll: "TODOS",
- eventFilterMine: "MIOS",
+ eventFilterRecent: "RECIENTES",
+ eventFilterMine: "MÍOS",
eventFilterToday: "HOY",
eventFilterWeek: "ESTA SEMANA",
eventFilterMonth: "ESTE MES",
@@ -1204,7 +1434,7 @@ module.exports = {
tagsFilterTop: "TOP",
tagsFilterCloud: "NUBE",
tagsNoItems: "No hay etiquetas disponibles.",
- tagsSearchPlaceholder: "Buscar etiquetas...",
+ tagsSearchPlaceholder: "Buscar en Etiquetas...",
tagsTableHeaderTag: "ETIQUETA/ENLACE:",
tagsTableHeaderCount: "CONTADOR:",
transfersTitle: "Transferencias",
@@ -1212,7 +1442,10 @@ module.exports = {
transfersFrom: "De",
transfersTo: "A",
transfersFilterAll: "TODOS",
+ transfersFilterRecent: "RECIENTES",
transfersFilterMine: "MÍAS",
+ transfersFilterMinePending: "PENDIENTES",
+ transfersFilterMineConfirmed: "FIRMADOS",
transfersFilterUBI: "RBU",
transfersFilterMarket: "MERCADO",
transfersFilterTop: "TOP",
@@ -1227,7 +1460,6 @@ module.exports = {
transfersCategoryEconomic: "Económica",
transfersCategoryTime: "Tiempo",
transfersCategoryTrust: "Confianza",
- transfersCategoryApply: "Aplicar",
transfersUnitEco: "ECO",
transfersUnitHours: "h",
transfersUnitTrust: "confianza",
@@ -1257,12 +1489,12 @@ module.exports = {
transfersDiscardedSectionTitle: "Transferencias Descartadas",
transfersCreateSectionTitle: "Crear transferencia",
transfersAllSectionTitle: "Transferencias",
- transfersSearchPlaceholder: "Buscar por concepto, tags, usuarios...",
+ transfersSearchPlaceholder: "Buscar en Transferencias...",
transfersMinAmountLabel: "Importe mín.",
transfersMaxAmountLabel: "Importe máx.",
transfersSortRecent: "Más recientes",
transfersSortAmount: "Mayor importe",
- transfersSortDeadline: "Deadline más próximo",
+ transfersSortDeadline: "Plazo más próximo",
transfersSearchButton: "Buscar",
transfersExpiredBadge: "CADUCADA",
transfersUpdatedAt: "Actualizado",
@@ -1279,6 +1511,7 @@ module.exports = {
voteErrorTitle: "Revisa el formulario",
voteErrorDeadlineMin: "La fecha límite debe ser de al menos {days} días desde ahora.",
voteErrorGeneric: "No se ha podido guardar la votación.",
+ voteLocked: "Esta votación ya ha recibido votos u opiniones, o pertenece al Parlamento o a los Tribunales: ya no se puede editar ni borrar.",
voteUpdateButton: "Actualizar",
voteDeleteButton: "Eliminar",
voteOptionYes: "SÍ",
@@ -1288,6 +1521,7 @@ module.exports = {
voteFollowMajority: "SEGUIR MAYORÍA",
voteNotInterested: "SIN INTERÉS",
voteFilterAll: "TODOS",
+ voteFilterRecent: "RECIENTES",
voteFilterMine: "MÍAS",
voteFilterOpen: "ABIERTAS",
voteFilterClosed: "CERRADAS",
@@ -1303,16 +1537,16 @@ module.exports = {
voteTags: "Etiquetas",
voteOpinions: "Opiniones",
novotes: "No hay propuestas de votación disponibles.",
- voteBy: "Por",
voteCreatedAt: "Creado el",
voteNoQuestion: "No se proporcionó pregunta",
- voteUnknownCreator: "Creador Desconocido",
+ voteUnknownCreator: "Creadora desconocida",
voteUnknownDate: "Fecha Desconocida",
voteDetailSectionTitle: 'Detalles de la votación',
voteCommentsLabel: 'Comentarios',
voteCommentsForumButton: 'Abrir conversación',
voteCommentsSectionTitle: 'Conversación abierta',
- voteNoCommentsYet: 'Todavía no hay comentarios. Sé la primera persona en opinar.',
+ voteNoCommentsYet: 'Todavía no hay comentarios. Sé el primer habitante en opinar.',
+ commentsGoToLast: "Ir al último comentario",
voteNewCommentPlaceholder: 'Escribe aquí tu comentario…',
voteNewCommentButton: 'Publicar comentario',
voteNewCommentLabel: 'Añade un comentario',
@@ -1323,6 +1557,8 @@ module.exports = {
cvNameLabel: "Nombre Completo",
cvDescriptionLabel: "Resumen",
cvPhotoLabel: "Foto",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Visitar CV",
cvPersonalExperiencesLabel: "Experiencias Personales",
cvPersonalSkillsLabel: "Habilidades Personales (separadas por comas)",
cvOasisExperiencesLabel: "Experiencias de Contribución en Oasis",
@@ -1352,9 +1588,9 @@ module.exports = {
cvNoCV: "No se encontró ningún CV.",
blogSubject: "Asunto",
blogMessage: "Mensaje",
- blogImage: "Subir contenido multimedia (max: 50MB)",
+ blogImage: "Subir contenido multimedia (máx.: 75MB)",
blogMedia: "Adjuntos (hasta 8 imágenes y un vídeo)",
- blogPublish: "Vista previa",
+ blogPublish: "Publicar",
pollsTitle: "Encuestas",
dataTitle: "Coincidencias",
dataDescription: "Explora y visualiza las coincidencias de tu red.",
@@ -1373,12 +1609,23 @@ module.exports = {
dataKindTasks: "TAREAS",
dataKindReports: "INFORMES",
dataKindVotes: "VOTACIONES",
- dataSearchPlaceholder: "Buscar en los datos cruzados...",
+ dataSearchPlaceholder: "Buscar en Coincidencias...",
dataCohesionTitle: "Coeficiente de Cohesión (CC)",
dataCcShort: "CC",
dataCohesionHint: "Afinidad media entre todo lo que la red ha publicado.",
dataAffinity: "Afinidad",
dataCommonTerms: "Palabra clave",
+ dataReasonFollowing: "Das soporte a este habitante",
+ dataReasonTribe: "Comparte tribu contigo",
+ dataReasonPinned: "Coincide con algo que has fijado",
+ dataReasonCv: "Coincide con las habilidades de tu CV",
+ dataReasonContent: "Relacionado con lo que publicas",
+ dataReasonRelated: "Relacionado con tus intereses",
+ dataReasonAlike: "Publicado por una habitante afín a ti",
+ dataReasonSupportsYou: "Te da soporte",
+ dataReasonMutual: "Soporte mutuo",
+ dataReasonRated: "Bien valorado por la red",
+ dataReasonNear: "Cerca de ti",
dataStatPeople: "CVs",
dataStatConnected: "Conectados",
dataStatSkills: "Habilidades",
@@ -1431,7 +1678,7 @@ module.exports = {
pollStatusLabel: "Estado",
pollStatusOpen: "ABIERTA",
pollStatusClosed: "CERRADA",
- pollSearchPlaceholder: "Buscar encuestas...",
+ pollSearchPlaceholder: "Buscar en Encuestas...",
pollsNoItems: "No se han encontrado encuestas.",
viewPoll: "Ver Encuesta",
pollChatCreate: "Crear Encuesta",
@@ -1444,10 +1691,10 @@ module.exports = {
blogFilterFavorites: "FAVORITOS",
blogFilterTop: "TOP",
blogCreateButton: "Crear Blog",
- blogSearchPlaceholder: "Buscar blogs...",
+ blogSearchPlaceholder: "Buscar en Blogs...",
blogComments: "Comentarios",
blogAllowComments: "Permitir comentarios",
- blogCommentsClosed: "El autor ha cerrado los comentarios de este blog.",
+ blogCommentsClosed: "La autora ha cerrado los comentarios de este blog.",
blogNoItems: "No se han encontrado blogs.",
viewBlog: "Ver Blog",
forumTitle: "Foros",
@@ -1457,18 +1704,17 @@ module.exports = {
forumCreateButton: "Crear foro",
forumCreateSectionTitle: "Crear foro",
forumDescription: "Habla abiertamente con habitantes de tu red.",
- forumSearchPlaceholder: "Buscar foros...",
+ forumSearchPlaceholder: "Buscar en Foros...",
forumFilterAll: "TODOS",
forumFilterMine: "MÍAS",
forumFilterRecent: "RECIENTES",
forumFilterTop: "TOP",
- forumDeleteButton: "Borrar",
forumParticipants: "participantes",
forumMessages: "mensajes",
forumMessageLabel: "Mensaje",
forumMessagePlaceholder: "Escribe tu mensaje...",
forumSendButton: "Enviar",
- noForums: "No hay foros disponibles, aún.",
+ noForums: "Aún no hay foros disponibles.",
forumVisitButton: "Visitar Foro",
forumTopicLabel: "Tema",
imageTitle: "Imágenes",
@@ -1489,7 +1735,6 @@ module.exports = {
imageFilterGallery: "GALERÍA",
imageCreateButton: "Subir imagen",
imageUpdateButton: "Actualizar",
- imageDeleteButton: "Eliminar",
imageAddFavoriteButton: "Añadir favorito",
imageRemoveFavoriteButton: "Quitar favorito",
imageFileLabel: "Selecciona un archivo de imagen (.jpeg, .jpg, .png, .gif)",
@@ -1501,20 +1746,21 @@ module.exports = {
imageDescriptionPlaceholder: "Opcional",
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...",
+ imageSearchPlaceholder: "Buscar en Imágenes...",
imageSortRecent: "Más recientes",
imageSortOldest: "Más antiguas",
imageSortTop: "Más votadas",
imageSearchButton: "Buscar",
imageUpdatedAt: "Actualizado",
imageNoMatch: "Ninguna imagen coincide con tu búsqueda.",
+ feedSearchPlaceholder: "Buscar en Feed...",
feedTitle: "Feed",
feedDetailTitle: "Feed",
feedOpenDiscussion: "Abrir discusión",
feedPostComment: "Publicar comentario",
noComments: "Aún no hay comentarios",
createFeedTitle: "Crear Feed",
- createFeedButton: "Enviar Feed!",
+ createFeedButton: "¡Enviar feed!",
feedPlaceholder: "¿Qué está pasando? (máximo 280 caracteres)",
TODAYButton: "HOY",
totalOpinions: "Total de Opiniones",
@@ -1522,11 +1768,11 @@ module.exports = {
noFeedsFound: "No se encontraron feeds.",
createdAtLabel: "Creado el",
FeedshareYourOpinions: "Descubre y comparte textos breves en tu red.",
- refeedButton: "Realimentar",
+ refeedButton: "Reenviar",
alreadyRefeeded: "Ya has realimentado esto.",
activityTitle: "Actividad",
yourActivity: "Tu actividad",
- globalActivity: "Actividad global",
+ globalActivity: "Actividad",
activityList: "Actividad",
activityDesc: "Consulta la actividad más reciente de tu red.",
allButton: "TODO",
@@ -1538,9 +1784,10 @@ module.exports = {
concept: "Concepto",
description: "Descripción",
meme: "Meme",
- typeRecent: "RECIENTE",
+ typeRecent: "RECIENTES",
typeTop: "TOP",
- typePost: "BLOGS",
+ typePost: "BLOG",
+ activityUpdateLabel: "ACTUALIZACIÓN",
typeTribe: "TRIBUS",
typeLarp: "L.A.R.P.",
typeInhabitants: "HABITANTES",
@@ -1561,14 +1808,14 @@ module.exports = {
typeTask: "TAREAS",
typePixelia: "PIXELIA",
typeForum: "FOROS",
- typeReport: "REPORTES",
+ typeReport: "INFORMES",
typeFeed: "FEEDS",
typeContact: "CONTACTO",
typePub: "PUB",
typeTombstone: "ELIMINADO",
typeBanking: "BANCA",
- typeBankWallet: "BANCA/MONEDERO",
- typeBankClaim: "BANCA/UBI",
+ typeBankWallet: "BANCA/CARTERA",
+ typeBankClaim: "BANCA/RBU",
typeKarmaScore: "KARMA",
typeParliament: "PARLAMENTO",
typeSpread: "RÉPLICAS",
@@ -1602,8 +1849,8 @@ module.exports = {
attendees: "Asistentes",
location: "Ubicación",
contentWarning: "Asunto",
- bankWalletConnected: "Monedero ECOin",
- bankUbiReceived: "UBI recibido",
+ bankWalletConnected: "Cartera ECOin",
+ bankUbiReceived: "RBU recibida",
bankTx: "Tx",
bankEpochShort: "Época",
viewDetails: "Ver detalles",
@@ -1638,7 +1885,7 @@ module.exports = {
courtsCaseTitle: "Caso",
courtsMethod: "Método",
courtsMethodJUDGE: "Juez",
- courtsMethodJUDGES: "Panel de jueces",
+ courtsMethodJUDGES: "Panel de juezas",
courtsMethodSINGLE_JUDGE: "Juez único",
courtsMethodJURY: "Jurado",
courtsMethodCOUNCIL: "Consejo",
@@ -1674,11 +1921,11 @@ module.exports = {
courtsNoCases: 'No hay casos.',
reportsTitle: "Informes",
reportsDescription: "Gestiona y sigue los reportes de tu red.",
- reportsSearchPlaceholder: "Buscar reportes...",
+ reportsSearchPlaceholder: "Buscar en Informes...",
reportsFilterAll: "TODOS",
reportsFilterRecent: "RECIENTES",
reportsFilterTop: "TOP",
- reportsFilterMine: "MIOS",
+ reportsFilterMine: "MÍOS",
reportsFilterFeatures: "FUNCIONES",
reportsFilterBugs: "ERRORES",
reportsFilterAbuse: "ABUSOS",
@@ -1687,7 +1934,7 @@ module.exports = {
reportsFilterResolved: "RESUELTOS",
reportsFilterOpen: "ABIERTOS",
reportsFilterUnderReview: "EN REVISIÓN",
- reportsFilterInvalid: "INVALIDOS",
+ reportsFilterInvalid: "INVÁLIDOS",
reportsCreateButton: "Crear Informe",
reportsTitleLabel: "Título",
reportsCategory: "Categoría",
@@ -1714,7 +1961,7 @@ module.exports = {
reportsStatusUnderReview: "En Revisión",
reportsStatusResolved: "Resuelto",
reportsStatusInvalid: "Inválido",
- reportsConfirmButton: "CONFIRMAR INFORME!",
+ reportsConfirmButton: "¡CONFIRMAR INFORME!",
reportsConfirmations: "Confirmaciones",
reportsConfirmedSectionTitle: "Informes Confirmados",
reportsCreateTaskButton: "Crear Tarea",
@@ -1722,7 +1969,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Informes en Revisión",
reportsResolvedSectionTitle: "Informes Resueltos",
reportsInvalidSectionTitle: "Informes Inválidos",
- reportsTemplateSectionTitle: 'Plantilla de reporte',
reportsBugTemplateTitle: 'Datos para reproducir (Bugs)',
reportsFeatureTemplateTitle: 'Detalles (Features)',
reportsAbuseTemplateTitle: 'Detalles (Abuso)',
@@ -1755,7 +2001,7 @@ module.exports = {
reportsEvidenceLinksLabel: 'Evidencia / enlaces',
reportsEvidenceLinksPlaceholder: 'Pega enlaces, IDs de mensajes, capturas (si aplica), etc.',
reportsContentLocationLabel: 'Dónde está el contenido',
- reportsContentLocationPlaceholder: 'Enlace, ID, canal, hilo, autor, etc.',
+ reportsContentLocationPlaceholder: 'Enlace, ID, canal, hilo, autoría, etc.',
reportsWhyInappropriatePlaceholder: 'Explica el motivo y el impacto.',
reportsRequestedActionLabel: 'Acción solicitada',
reportsRequestedActionPlaceholder: 'Eliminar, ocultar, marcar, advertir, etc.',
@@ -1781,17 +2027,15 @@ module.exports = {
tribeGallerySectionTitle: "Galería de Tribus",
tribeRecentSectionTitle: "Tribus Recientes",
tribeTopSectionTitle: "Tribus Populares",
- tribeviewTribeButton: "Visitar Tribu",
- tribeviewSubTribeButton: "Visitar Sub-Tribu",
tribeRootLabel: "RAÍZ",
tribeDescription: "Explora o crea tribus en tu red.",
tribeMainTribeLabel: "TRIBU PRINCIPAL",
tribeCreateButton: "Crear Tribu",
tribeUpdateButton: "Actualizar",
tribeDeleteButton: "Eliminar",
- tribeImageLabel: "Subir contenido multimedia (max: 50MB)",
+ tribeImageLabel: "Subir contenido multimedia (máx.: 75MB)",
tribeTitleLabel: "Título",
- searchTribesPlaceholder: "FILTRAR tribus POR NOMBRE …",
+ searchTribesPlaceholder: "Buscar en Tribus...",
tribeTitlePlaceholder: "Nombre de la tribu",
tribeDescriptionLabel: "Descripción",
tribeDescriptionPlaceholder: "Describe esta tribu",
@@ -1804,6 +2048,15 @@ module.exports = {
tribeIsAnonymousLabel: "ESTADO",
tribeMembersCount: "Miembros",
tribeEnterInvite: "INTRODUCIR INVITACIÓN",
+ subscriptionTitle: "Suscripciones",
+ subscriptionOn: "Suscrita",
+ subscriptionOff: "No suscrita",
+ subscriptionSubscribe: "Suscribirse",
+ subscriptionUnsubscribe: "Cancelar suscripción",
+ subscriptionSubscribers: "Suscriptoras",
+ pmListLabel: "Enviar a",
+ pmListNone: "— Sin lista —",
+ pmListNoSubscribers: "Sin suscriptoras",
tribeLeaveButton: "DEJAR",
tribePublic: "PÚBLICA",
tribePrivate: "PRIVADA",
@@ -1819,9 +2072,9 @@ module.exports = {
tribeFeedRefeed: "Redifundir",
tribeFeedMessagePlaceholder: "Escribe un feed…",
tribeFeedSend: "Enviar",
- tribeFeedEmpty: "No hay mensajes de feed disponibles, aún.",
- noTribes: "No se encontraron tribus, aún.",
- tribeNotFound: "Tribu no encontrada!",
+ tribeFeedEmpty: "Aún no hay mensajes de feed disponibles.",
+ noTribes: "Aún no se han encontrado tribus.",
+ tribeNotFound: "¡Tribu no encontrada!",
createTribeTitle: "Crear Tribu",
updateTribeTitle: "Actualizar Tribu",
tribeSectionInhabitants: "Habitantes",
@@ -1836,19 +2089,19 @@ module.exports = {
tribeSectionVideos: "VÍDEOS",
tribeSectionDocuments: "DOCUMENTOS",
tribeSectionBookmarks: "MARCADORES",
- tribeSectionMaps: "MAPS",
+ tribeSectionMaps: "MAPAS",
tribeSectionPads: "PADS",
tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
- tribeInhabitantsEmpty: "No hay habitantes en esta tribu, aún.",
+ tribeSectionCalendars: "CALENDARIOS",
+ tribePadCreate: "Crear pad",
+ tribeChatCreate: "Crear chat",
+ tribeCalendarCreate: "Crear calendario",
+ tribePadsEmpty: "Aún no hay pads.",
+ tribeChatsEmpty: "Aún no hay chats.",
+ tribeCalendarsEmpty: "Aún no hay calendarios.",
+ tribeInhabitantsEmpty: "Aún no hay habitantes en esta tribu.",
tribeEventCreate: "Crear Evento",
- tribeEventsEmpty: "No hay eventos, aún.",
+ tribeEventsEmpty: "Aún no hay eventos.",
tribeEventTitle: "Título",
tribeEventDescription: "Descripción",
tribeEventDate: "Fecha",
@@ -1857,7 +2110,7 @@ module.exports = {
tribeEventUnattend: "NO ASISTIR",
tribeEventAttendees: "Asistentes",
tribeTaskCreate: "Crear Tarea",
- tribeTasksEmpty: "No hay tareas, aún.",
+ tribeTasksEmpty: "Aún no hay tareas.",
tribeTaskTitle: "Título",
tribeTaskDescription: "Descripción",
tribeTaskPriority: "Prioridad",
@@ -1868,7 +2121,7 @@ module.exports = {
tribeTaskAssign: "ASIGNAR",
tribeTaskUnassign: "DESASIGNAR",
tribeVotationCreate: "Crear Votación",
- tribeVotationsEmpty: "No hay votaciones, aún.",
+ tribeVotationsEmpty: "Aún no hay votaciones.",
tribeVotationTitle: "Título",
tribeVotationDescription: "Descripción",
tribeVotationOptions: "Opciones",
@@ -1877,21 +2130,21 @@ module.exports = {
tribeVotationResults: "Votos",
tribeVotationClose: "CERRAR VOTACIÓN",
tribeVotationOptionPlaceholder: "Opción",
- tribeForumCreate: "Crear Forum",
- tribeForumEmpty: "No hay hilos, aún.",
+ tribeForumCreate: "Crear foro",
+ tribeForumEmpty: "Aún no hay hilos.",
tribeForumTitle: "Título",
tribeForumText: "Mensaje",
tribeForumCategory: "Categoría",
tribeForumReply: "Responder",
tribeForumReplies: "Respuestas",
- tribeMediaUpload: "Subir Media",
+ tribeMediaUpload: "Subir multimedia",
readDocument: "Leer Documento",
tribeCreateImage: "Crear Imagen",
tribeCreateAudio: "Crear Audio",
- tribeCreateVideo: "Crear Video",
+ tribeCreateVideo: "Crear vídeo",
tribeCreateDocument: "Crear Documento",
tribeCreateBookmark: "Crear Marcador",
- tribeMediaEmpty: "No hay media, aún.",
+ tribeMediaEmpty: "Aún no hay contenido multimedia.",
tribeMediaTitle: "Título",
tribeMediaDescription: "Descripción",
tribeMediaTypeImage: "Imagen",
@@ -1900,9 +2153,14 @@ module.exports = {
tribeMediaTypeDocument: "Documento",
tribeMediaTypeBookmark: "Marcador",
tribeContentDelete: "ELIMINAR",
+ tribeReachTribe: "TRIBU",
+ tribeReachNotice: "OASIS lo muestra a todos los habitantes y CLEARNET también en la web abierta. Abrirlo deja una copia legible fuera de la tribu: volver a TRIBU lo oculta, pero las copias ya compartidas no se pueden borrar.",
+ tribeReachPrivate: "El contenido de una tribu privada solo puede quedarse dentro de la tribu.",
+ tribeReachOpenedBy: "Abierto por",
+ tribeReachChange: "Dónde se publica",
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.",
+ tribeInviteCodeHint: "Comparte este código con quien quieras invitar. Puede unirse desde /invites.",
tribeStatusOpen: "ABIERTO",
tribeStatusClosed: "CERRADO",
tribeStatusInProgress: "EN PROGRESO",
@@ -1919,8 +2177,8 @@ module.exports = {
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.",
- tribeActivityRefeed: "REFEED",
+ tribeSubTribesStrictDenied: "El modo estricto de la tribu no te permite generar nuevas sub-tribus. Ponte en contacto con la administradora.",
+ tribeActivityRefeed: "REDIFUSIÓN",
tribeSectionActivity: "ACTIVIDAD",
tribeSectionTrending: "TENDENCIAS",
tribeSectionTags: "ETIQUETAS",
@@ -1942,7 +2200,7 @@ module.exports = {
tribeSearchMinChars: "Introduce al menos 2 caracteres para buscar.",
agendaTitle: "Agenda",
agendaDescription: "Aquí puedes encontrar todos tus elementos asignados.",
- agendaSearchPlaceholder: "Buscar en la agenda...",
+ agendaSearchPlaceholder: "Buscar en Agenda...",
agendaFilterAll: "TODOS",
agendaFilterToday: "HOY",
agendaFilterUpcoming: "PRÓXIMO",
@@ -1963,6 +2221,7 @@ module.exports = {
agendaNoItems: "No se encontraron asignaciones.",
agendaDiscardButton: "Descartar",
agendaRestoreButton: "Restaurar",
+ agendaRemoveButton: "Quitar",
agendaMembersCount: "Miembros",
agendaLocationLabel: "Ubicación",
agendaYes: "SÍ",
@@ -2014,23 +2273,23 @@ module.exports = {
voteScam: "Estafa",
voteTriggering: "Provocador",
voteInsightful: "Perspicaz",
- voteAccurate: "Conciso",
+ voteAccurate: "Preciso",
voteActionable: "Accionable",
voteCreative: "Creativo",
voteSpam: "Spam",
voteAdultOnly: "Solo adultos",
privateMessage: "MP",
pmSendTitle: "Mensajes Privados",
- pmSend: "Enviar!",
+ pmSend: "¡Enviar!",
pmCancel: "Cancelar",
pmReset: "Restablecer",
- pmSharedKeyHint: "Comparte esta clave con el destinatario por otro canal. Es necesaria para descifrar.",
- pmDescription: "Usa este formulario para enviar un mensaje/fichero cifrado a otros habitantes.",
+ pmSharedKeyHint: "Comparte esta clave con la destinataria por otro canal. Es necesaria para descifrar.",
+ pmDescription: "Usa este formulario para enviar un mensaje/fichero cifrado a otras habitantes.",
pmComposeTitle: "Enviar un mensaje",
- pmRecipients: "Destinatarios",
+ pmRecipients: "Destinatarias",
pmRecipientsHint: "Introduce los IDs de Oasis separados por comas",
- pmLimitsHint: "Hasta 7 destinatarios por mensaje.",
- pmTextPlaceholder: "Cuerpo limitado a 7000 caracteres.",
+ pmLimitsHint: "Hasta 7 habitantes por mensaje.",
+ pmTextPlaceholder: "Escribe tu mensaje.",
pmSubject: "Asunto",
pmSubjectHint: "Introduce el asunto del mensaje",
pmText: "Mensaje",
@@ -2052,8 +2311,8 @@ module.exports = {
pmCrypterCharsLabel: "caracteres",
pmInvalidRecipients: "Oasis ID no válido (debería ser como @…=.ed25519).",
pmEncryptionLabel: "Cifrado",
- private: "Privados",
- privateDescription: "Tus mensajes cifrados.",
+ private: "Buzón",
+ privateDescription: "Gestiona tus mensajes privados.",
privateInbox: "BUZÓN",
privateSent: "ENVIADOS",
privateDelete: "Borrar",
@@ -2062,6 +2321,7 @@ module.exports = {
pmReply: "Responder",
pmReplies: "respuestas",
inReplyTo: "EN RESPUESTA A",
+ forumInThread: "EN EL HILO",
pmPreview: "Previsualizar",
pmPreviewTitle: "Vista previa",
performed: "→",
@@ -2099,7 +2359,7 @@ module.exports = {
blockchainNoBlocks: 'No se encontraron bloques en la cadena.',
blockchainStatsTitle: 'Estadísticas',
blockchainStatsTypeBreakdown: 'Desglose por tipo',
- blockchainStatsTopAuthors: 'Autores principales',
+ blockchainStatsTopAuthors: 'Autoras principales',
blockchainStatsCount: 'Bloques',
blockchainBlockID: 'ID del Bloque',
blockchainBlockAuthor: 'Autoría',
@@ -2111,22 +2371,21 @@ module.exports = {
blockchainDetails: "Ver Detalles del Bloque",
blockchainViewBlockexplorer: "Vista en Blockexplorer",
blockchainBack: 'Volver al Blockexplorer',
- banking: 'Banking',
- bankingTitle: 'Banking',
- bankingDescription: "La economía de ECOin: balance, RBU, tasas y valor de industria.",
+ banking: "Banca",
+ bankingTitle: "Banca",
+ bankingDescription: "La economía colectiva de ECOin.",
bankOverview: 'Resumen',
bankEpochs: 'Épocas',
bankRules: 'Reglas',
pending: 'Pendientes',
closed: 'Cerradas',
- bankViewTx: 'Ver Tx',
bankClaimNow: 'Reclamar',
- bankClaimUBI: '¡Reclamar RBU!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: 'Reclamar RBU',
+ bankClaimAndPay: "Reclamar y pagar",
+ bankClaimedPending: "Reclamación pendiente...",
+ bankStatusClaimed: "Reclamado",
+ bankStatusExpired: "Caducado",
+ bankPubOnly: "Operación solo para PUBs",
bankEpoch: 'Época',
bankPool: 'Fondo (esta época)',
bankWeightsSum: 'Suma de pesos',
@@ -2145,8 +2404,8 @@ module.exports = {
bankViewEpoch: 'Ver época',
bankYourIndustryBalance: "Tu parte de la industria",
bankYourUbiMonth: "Tu RBU (este mes)",
- bankYourFundsMonth: "Tus fondos (este mes)",
- bankIndustryBalance: "Producción industrial (estimada)",
+ bankYourFundsMonth: "Fondos totales",
+ bankIndustryBalance: "Producción industrial",
bankUserBalance: 'Tu saldo',
bankAddresses: 'Direcciones',
bankNoAddresses: 'No se encontraron direcciones.',
@@ -2154,6 +2413,10 @@ module.exports = {
bankAddress: 'Dirección',
bankAddAddressTitle: 'Añadir dirección de ECOIN',
bankAddAddressUser: 'ID de Oasis',
+ bankAddAddressLabel: "Etiqueta (opcional)",
+ bankAddAddressLabelPlaceholder: "Cartera de Bob, tienda de Alice…",
+ bankAddAddressUserOptional: "Oasis ID (opcional)",
+ bankAddressUnnamed: "Dirección sin nombre",
bankAddAddressAddress: 'Dirección de ECOIN',
bankAddAddressSave: 'Guardar',
bankAddressAdded: 'Dirección añadida',
@@ -2169,22 +2432,22 @@ module.exports = {
bankAddressDelete: 'Eliminar',
bankAddressSource: 'Fuente',
bankAddressDeleteConfirm: 'Eliminar esta dirección?',
- search: 'Buscar!',
+ search: "¡Buscar!",
bankLocal: 'Local',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Red",
pubIdLabel: "PUB ID",
- bankUbiAvailableNo: "SIN FONDOS!",
+ bankUbiAvailableNo: "¡SIN FONDOS!",
bankUbiAvailableOk: "¡DISPONIBLE!",
- bankUbiAvailability: "RBU (red)",
+ bankUbiAvailability: "RBU",
bankAlreadyClaimedThisMonth: "Ya reclamado este mes",
- bankUbiThisMonth: "UBI (este mes)",
- bankUbiLastClaimed: "UBI (última reclamada)",
+ bankUbiThisMonth: "RBU (este mes)",
+ bankUbiLastClaimed: "RBU (última reclamada)",
bankUbiNeverClaimed: "Nunca reclamado",
- bankUbiTotalClaimed: "UBI (total reclamado)",
+ bankUbiTotalClaimed: "RBU (total reclamado)",
bankUbiPub: "PUB",
bankUbiInhabitant: "HABITANTE",
bankUbiClaimedAmount: "RECLAMADO (ECO)",
- typeBankUbiResult: "BANCARIO - UBI",
+ typeBankUbiResult: "BANCA - RBU",
bankNoPubConfigured: "Sin PUB configurado. Establece tu ID de PUB en Ajustes.",
shopsTitle: "Tiendas",
shopDescription: "Descubre y gestiona tiendas en la red.",
@@ -2205,6 +2468,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Cifrado en tránsito",
shopAddFavorite: "Añadir Favorito",
shopRemoveFavorite: "Quitar Favorito",
shopOpen: "ABIERTA",
@@ -2212,6 +2476,13 @@ module.exports = {
shopMakePrivate: "HACER PRIVADA (E2E)",
shopMakePublic: "HACER PÚBLICA",
shopProducts: "Productos",
+ shopFilterAll: "TODAS",
+ shopFilterRecent: "RECIENTES",
+ shopFilterMine: "MÍAS",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUCTOS",
+ shopFilterPrices: "PRECIOS",
+ shopFilterFavorites: "FAVORITOS",
shopProductAdd: "Añadir Producto",
shopProductTitle: "Producto",
shopProductUpdate: "Actualizar Producto",
@@ -2223,7 +2494,7 @@ module.exports = {
shopNoProducts: "Aún no hay productos.",
shopOutOfStock: "Agotado",
shopBuy: "Comprar",
- shopBuyEncryptedNote: "Tus datos de entrega se envían cifrados; solo el dueño de la tienda puede verlos.",
+ shopBuyEncryptedNote: "Tus datos de entrega se envían cifrados; solo la dueña de la tienda puede verlos.",
shopBuyDeliveryAddress: "Dirección de entrega",
shopBuyContact: "Contacto",
shopBuyContactPlaceholder: "correo, teléfono, etc.",
@@ -2234,30 +2505,32 @@ module.exports = {
shopOrdersEmpty: "Aún no hay pedidos.",
shopOrderProduct: "Producto",
shopOrderPrice: "Precio",
- shopOrderBuyer: "Comprador",
+ shopOrderBuyer: "Compradora",
shopBackToShop: "Volver a la Tienda",
marketVisitItem: "VER ARTÍCULO",
shopStatus: "ESTADO",
shopCreatedAt: "CREADO",
- shopSearchPlaceholder: "Buscar tiendas...",
+ shopSearchPlaceholder: "Buscar en Tiendas...",
shopUrl: "URL",
shopLocation: "Ubicación",
shopTags: "Etiquetas",
shopVisibility: "Visibilidad",
- shopShortDescription: "Descripcion Corta",
- shopShortDescriptionPlaceholder: "Descripcion breve para las tarjetas (max 160 caracteres)",
+ shopShortDescription: "Descripción corta",
+ shopShortDescriptionPlaceholder: "Descripción breve para las tarjetas (máx. 160 caracteres)",
shopTitlePlaceholder: "Nombre de tu tienda",
- shopDescriptionPlaceholder: "Descripcion detallada de tu tienda",
- shopLocationPlaceholder: "Ciudad, Pais",
- shopTagsPlaceholder: "etiqueta1, etiqueta2, etiqueta3",
- mapTitlePlaceholder: "Titulo del mapa",
+ shopDescriptionPlaceholder: "Descripción detallada de tu tienda",
+ shopLocationPlaceholder: "Ciudad, País",
+ shopTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ mapTitlePlaceholder: "Título del mapa",
shopProductFeatured: "Producto Destacado",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "Enviar al mercado",
typeShop: "TIENDAS",
typeShopProduct: "PRODUCTO DE TIENDA",
bankExchange: 'Intercambio',
bankExchangeCurrentValue: 'Valor de ECOin (1h)',
- bankTotalSupply: 'Suministro Total de ECOin',
+ bankTotalSupply: "Suministro ECOin total",
+ bankPubsSupply: "Suministro ECOin del pozo de los PUBs",
+ bankHoldingSupply: "Suministro ECOin fuera de la RBU",
bankHoursOfWork: 'horas',
bankUnitMs: "ms",
bankUnitSeconds: "segundos",
@@ -2271,14 +2544,15 @@ module.exports = {
bankExchangeChartSupply: 'Suministro',
bankExchangeChartInflation: 'Inflación %',
bankExchangeChartEmpty: 'Aún no hay muestras suficientes — vuelve más tarde',
- bankCurrentSupply: 'Suministro Actual de ECOin',
+ bankCurrentSupply: "Suministro ECOin actual",
bankingSyncStatus: 'Estado de ECOin',
bankingSyncStatusSynced: 'Sincronizado',
- bankingSyncStatusOutdated: 'Desactualizado',
+ bankingSyncStatusOutdated: "Sin sincronizar",
statsTitle: 'Estadísticas',
statistics: "Estadísticas",
statsDescription: "Descubre estadísticas sobre tu red.",
ALLButton: "TODO",
+ RECENTButton: "RECIENTES",
MINEButton: "MÍAS",
TOMBSTONEButton: "ELIMINADOS",
statsCreatedAt: "Creado el",
@@ -2286,7 +2560,8 @@ module.exports = {
statsYourOpinions: "Opiniones",
statsNetworkContent: "Contenido",
statsNetworkOpinions: "Opiniones",
- statsEcoWalletLabel: "Billetera ECOIN",
+ statsEcoWalletLabel: "Cartera ECOin",
+ walletAddressCopyHint: "Pulsa para seleccionar y copiar",
statsEcoWalletNotConfigured: "¡No configurada!",
statsBookmark: "Marcadores",
statsEvent: "Eventos",
@@ -2295,8 +2570,8 @@ module.exports = {
statsMarket: "Mercado",
statsForum: "Foros",
statsJob: "Empleos",
- statsReport: "Reportes",
- statsFeed: "Publicaciones",
+ statsReport: "Informes",
+ statsFeed: "Feed",
statsTribe: "Tribus",
statsImage: "Imágenes",
statsAudio: "Audios",
@@ -2308,6 +2583,8 @@ module.exports = {
statsTransfer: "Transferencias",
statsAiExchange: "IA",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "Nodos",
+ statsTotalLabel: "Total",
statsPost: "Publicaciones",
statsSize: "Total (tamaño)",
statsBlockchainSize: "Blockchain (tamaño)",
@@ -2348,20 +2625,26 @@ module.exports = {
statsCourtsSettlement: "Acuerdos judiciales",
statsCourtsSettlementProposal: "Propuestas de acuerdo",
statsCourtsSettlementAccepted: "Acuerdos aceptados",
- statsCourtsNomination: "Nominaciones de jueces",
+ statsCourtsNomination: "Nominaciones de juezas",
statsCourtsNominationVote: "Votos de nominación",
ai: "IA",
aiTitle: "IA",
aiDescription: "Una Inteligencia Artificial Colectiva (IAC) llamada '42' que aprende de tu red.",
aiUserQuestion: "Pregunta",
aiResponseTitle: "Respuesta",
- aiSubmitButton: "Enviar!",
+ aiSubmitButton: "¡Enviar!",
aiSettingsDescription: "Configura tu prompt (máx 128 caracteres) para el modelo de IA.",
aiPrompt: "Proporciona una respuesta informativa y precisa.",
aiConfiguration: "Configurar prompt",
aiPromptUsed: "Indicación",
- aiClearHistory: "Borrar historial de chat",
- aiServerError: "La IA no ha podido responder. Inténtalo de nuevo.",
+ aiClearHistory: "Borrar historial",
+ aiServerError: "No puedo responder bien. Inténtalo de nuevo.",
+ aiStatusLoading: "42 está cargando el modelo. Pregunta de nuevo en un momento.",
+ aiThinking: "Pensando",
+ aiWaiting: "Esperando",
+ aiStatusMissingModel: "El modelo de IA no está instalado: falta src/AI/oasis-42-1-chat.Q4_K_M.gguf.",
+ aiExportFineTuning: "Exportar Fine-Tuning",
+ aiFactsTitle: "Datos de tu red",
aiInputPlaceholder: "¿Qué es Oasis?",
typeAiExchange: "IA",
aiApproveTrain: "Añadir al entrenamiento colectivo",
@@ -2388,9 +2671,9 @@ module.exports = {
marketFilterForSale: "EN VENTA",
marketFilterSold: "VENDIDO",
marketFilterDiscarded: "DESCARTADO",
- marketFilterRecent: "RECIENTE",
+ marketFilterRecent: "RECIENTES",
marketFilterMyBids: "PUJAS",
- marketCreateButton: "Crear artículo",
+ marketCreateButton: "Vender algo",
marketItemType: "Tipo",
marketItemTitle: "Título",
marketItemAvailable: "Fecha límite",
@@ -2414,11 +2697,11 @@ module.exports = {
marketActionsBuy: "¡COMPRAR!",
marketAuctionBids: "Pujas actuales",
marketPlaceBidButton: "Pujar",
- marketItemSeller: "Vendedor",
+ marketItemSeller: "Vendedora",
marketNoItems: "Aún no hay artículos disponibles.",
marketYourBid: "Tu puja",
- marketCreateFormImageLabel: "Subir contenido multimedia (max: 50MB)",
- marketSearchPlaceholder: "Buscar por título o etiquetas",
+ marketCreateFormImageLabel: "Subir contenido multimedia (máx.: 75MB)",
+ marketSearchPlaceholder: "Buscar en Mercado...",
marketMinPriceLabel: "Precio mínimo",
marketMaxPriceLabel: "Precio máximo",
marketSortRecent: "Más recientes",
@@ -2484,8 +2767,7 @@ module.exports = {
housingSetClosed: "Marcar no disponible",
housingCreateButton: "Crear lugar",
housingUpdateButton: "Actualizar",
- housingDeleteButton: "Borrar",
- housingSearchPlaceholder: "Buscar lugares...",
+ housingSearchPlaceholder: "Buscar en Vivienda...",
housingSearchButton: "Buscar",
housingMinPrice: "Precio mín.",
housingMaxPrice: "Precio máx.",
@@ -2495,12 +2777,12 @@ module.exports = {
housingSortRating: "Mejor valorados",
housingNoItems: "No se han encontrado lugares.",
jobsTitle: "Laboral",
- jobsCandidatesTitle: "Candidatos sugeridos",
+ jobsCandidatesTitle: "Candidatas sugeridas",
jobsCandidatesDescription: "Habitantes cuyas competencias encajan con este empleo. Envíales un mensaje privado para invitarles.",
jobsCandidatesPmBody: "Hola, creo que tu perfil encaja con mi oferta laboral",
jobsDescription: "Descubre y gestiona ofertas de trabajo en tu red.",
jobsFilterRecent: "RECIENTES",
- jobsFilterMine: "MIOS",
+ jobsFilterMine: "MÍOS",
jobsFilterAll: "TODOS",
jobsFilterRemote: "REMOTOS",
jobsFilterOpen: "ABIERTOS",
@@ -2516,10 +2798,10 @@ module.exports = {
jobsCVTitle: "CVs",
jobsFilterPresencial: "PRESENCIAL",
jobsFilterFreelancer: "FREELANCE",
- jobsFilterEmployee: "EMPLEADO",
+ jobsFilterEmployee: "EMPLEADA",
jobsPresencialTitle: "Trabajos Presenciales",
jobsFreelancerTitle: "Trabajos Freelance",
- jobsEmployeeTitle: "Trabajos de Empleado",
+ jobsEmployeeTitle: "Trabajos por cuenta ajena",
jobTitle: "Título",
jobLocation: "Ubicación",
jobSalary: "Salario (ECO/1h)",
@@ -2531,8 +2813,8 @@ module.exports = {
jobStatusOPEN: "ABIERTA",
jobStatusCLOSED: "CERRADA",
jobSetClosed: "Marcar como CERRADA",
- jobSubscribeButton: "Unirse a esta oferta!",
- jobUnsubscribeButton: "Salir de esta oferta!",
+ jobSubscribeButton: "¡Unirse a esta oferta!",
+ jobUnsubscribeButton: "¡Salir de esta oferta!",
jobTitlePlaceholder: "Introduce el título del trabajo",
jobDescriptionPlaceholder: "Describe el puesto",
jobRequirementsPlaceholder: "Introduce los requisitos",
@@ -2541,19 +2823,19 @@ module.exports = {
jobLocationPresencial: "Presencial",
jobLocationRemote: "Remoto",
jobVacantsPlaceholder: "Número de vacantes",
- jobImage: "Subir contenido multimedia (max: 50MB)",
+ jobImage: "Subir contenido multimedia (máx.: 75MB)",
jobTasks: "Tareas",
jobType: "Tipo de Trabajo",
jobTime: "Tiempo de Trabajo",
- jobSubscribers: "Suscriptores",
- noSubscribers: "Sin suscriptores",
+ jobSubscribers: "Suscriptoras",
+ noSubscribers: "Sin suscriptoras",
jobsFilterTop: "TOP",
jobsTopTitle: "Trabajos Mejor Pagados",
createJobButton: "Publicar Trabajo",
noJobsFound: "No se encontraron ofertas de trabajo.",
jobAuthor: "Por",
jobTypeFreelance: "Autónomo",
- jobTypeSalary: "Empleado",
+ jobTypeSalary: "Empleada",
jobTypeExchange: "Intercambio de horas",
jobTypeEXCHANGE: "INTERCAMBIO DE HORAS",
jobsFilterExchange: "INTERCAMBIO",
@@ -2563,32 +2845,31 @@ module.exports = {
jobsExchangeSkill: "Habilidad solicitada a cambio",
jobTimePartial: "Parcial",
jobTimeComplete: "Completo",
- jobsDeleteButton: "ELIMINAR",
jobsUpdateButton: "ACTUALIZAR",
jobsFilterApplied: "CANDIDATURA",
jobsAppliedTitle: "Mis candidaturas",
- jobsAppliedBadge: "Inscrito",
- jobsSearchPlaceholder: "Buscar por título, tags, descripción...",
+ jobsAppliedBadge: "Inscrita",
+ jobsSearchPlaceholder: "Buscar en Laboral...",
jobsMinSalaryLabel: "Salario mín.",
jobsMaxSalaryLabel: "Salario máx.",
jobsSortRecent: "Más recientes",
jobsSortSalary: "Mayor salario",
- jobsSortSubscribers: "Más candidatos",
+ jobsSortSubscribers: "Más candidatas",
jobsSearchButton: "Buscar",
- jobsApplicants: "Candidatos",
+ jobsApplicants: "Candidatas",
jobsUpdatedAt: "Actualizado",
jobSetOpen: "Marcar abierto",
jobsTagsLabel: "Etiquetas",
noJobsMatch: "No hay ofertas que coincidan con tu búsqueda.",
- industrySearchPlaceholder: "Buscar fábricas…",
+ industrySearchPlaceholder: "Buscar en Industria...",
industryAllSectors: "Todos los sectores",
industryVisitButton: "Visitar Industria",
industryAdvanceTo: "Cambiar a",
industryAmount: "Cantidad",
industryApproveBuild: "Aprobar",
- industryBlueprint: "Blueprint",
- industryBlueprints: "Blueprints",
- industryBuild: "Build",
+ industryBlueprint: "Plano",
+ industryBlueprints: "Planos",
+ industryBuild: "Producción",
industryBuildNotes: "Notas",
industryBuildStart: "Fecha de inicio",
industryVoteUpdateButton: "Votar actualización",
@@ -2596,7 +2877,7 @@ module.exports = {
industryRevokeVote: "Revocar",
industryTimeLeft: "Tiempo restante",
industryBuildEnd: "Fecha de fin",
- industryBuilds: "Builds",
+ industryBuilds: "Producciones",
industryBuildTitle: "Título",
industryContribute: "Contribuir",
industryContributeButton: "Contribuir",
@@ -2638,7 +2919,7 @@ module.exports = {
industryPot: "Bote",
industryProposeBuildButton: "Proponer build",
industryProposer: "Proponente",
- industryAuthor: "Autor",
+ industryAuthor: "Autora",
industrySellOnMarket: "Enviar al Mercado",
industrySendToProjects: "Crear Proyecto",
industrySkills: "Habilidades",
@@ -2654,7 +2935,6 @@ 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",
@@ -2678,19 +2958,19 @@ module.exports = {
industryBotDistributedTitle: "Se ha distribuido la salida de un build.",
industryFilterRules: "REGLAS",
industryRulesTitle: "Reglas",
- industryRulesIntro: "Industry permite a los habitantes poseer colectivamente los medios de producción: una Fábrica es un taller de la red que nadie posee de forma privada.",
- industryRulesSteward: "El fundador es el mayordomo — un custodio, no un dueño: no puede vender, privatizar ni disolver la Fábrica en solitario.",
- industryRulesMembership: "La política de membresía define cómo se une la gente: Abierta (entras al instante), Por voto (te admite el voto de los miembros) o Solo invitación (un miembro debe invitarte antes).",
- industryRulesQuorum: "El quórum es el número mínimo de miembros que deben votar para que una decisión cuente, para que una Fábrica pequeña no la decida una sola persona.",
+ industryRulesIntro: "Industry permite a las habitantes poseer colectivamente los medios de producción: una Fábrica es un taller de la red que nadie posee de forma privada.",
+ industryRulesSteward: "La fundadora es la mayordoma — una custodia, no una dueña: no puede vender, privatizar ni disolver la Fábrica en solitario.",
+ industryRulesMembership: "La política de membresía define cómo se unen los habitantes: Abierta (entras al instante), Por voto (te admite el voto de los miembros) o Solo invitación (un miembro debe invitarte antes).",
+ industryRulesQuorum: "El quórum es el número mínimo de miembros que deben votar para que una decisión cuente, para que una Fábrica pequeña no la decida un solo habitante.",
industryRulesMajority: "La mayoría es la fracción de votos necesaria para aprobar (0,5 = mitad, 1 = unanimidad); una decisión pasa cuando los SÍ alcanzan al menos max(quórum, miembros × mayoría).",
- industryRulesDecisions: "Los miembros votan para admitir nuevos, aprobar builds y disolver la Fábrica; el mayordomo no puede saltarse estas decisiones colectivas.",
+ industryRulesDecisions: "Los miembros votan para admitir nuevas integrantes, aprobar builds y disolver la Fábrica; la mayordoma no puede saltarse estas decisiones colectivas.",
industryRulesBlueprints: "Los Blueprints son recetas libres (COPYLEFT) — las entradas (materiales, horas de trabajo, skills) y la salida (un bien físico o digital) — y cualquiera puede forkearlas.",
industryRulesBuilds: "Un Build es una orden de producción: PROPUESTO → APROBADO (por voto) → ABASTECIENDO → EN PRODUCCIÓN → COMPLETADO, y solo acepta contribuciones una vez aprobado.",
industryRulesContributions: "Los miembros aportan trabajo (horas), materiales (valor declarado en ECO) o ECO a un build; cada aporte gana karma.",
industryRulesLaborRate: "La tarifa de trabajo es el valor en ECO de una hora de trabajo en esta Fábrica; convierte horas en karma para comparar esfuerzo y capital de forma justa: karma = horas × tarifa + valor material + ECO.",
industryRulesShares: "Tu cuota en un build es tu karma ÷ karma total, y determina cuánto del valor de salida recibes.",
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.",
+ industryRulesTreasury: "Las aportaciones en ECO las custodia la mayordoma 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",
industryReportButton: "Reportar",
industryCreateTask: "Crear Tarea",
@@ -2700,13 +2980,14 @@ module.exports = {
industryPauseVotes: "Votos de estado",
industryTitle: "Industria",
industryDescription: "Módulo para gestionar los medios de producción de forma colectiva.",
- typeIndustryBuild: "BUILD",
- typeIndustryBlueprint: "BLUEPRINT",
+ typeIndustryBuild: "PRODUCCIÓN",
+ typeIndustryBlueprint: "PLANO",
typeIndustryAllocation: "DISTRIBUCIÓN",
typeIndustry: "INDUSTRIA",
modulesIndustryLabel: "Industria",
modulesIndustryDescription: "Módulo para gestionar los medios de producción de forma colectiva.",
industryFilterAll: "TODAS",
+ industryFilterRecent: "RECIENTES",
industryFilterMember: "MIEMBRO",
industryFilterBlueprints: "PLANOS",
industryFilterBuilds: "PRODUCCIONES",
@@ -2715,6 +2996,7 @@ module.exports = {
industryFilterPaused: "PAUSADAS",
industryFilterDissolved: "DISUELTAS",
industryAllTitle: "Industria",
+ industryRecentTitle: "Fábricas recientes",
industryMemberTitle: "Fábricas en las que estoy",
industryMineTitle: "Mis fábricas",
industryActiveTitle: "En marcha",
@@ -2735,7 +3017,7 @@ module.exports = {
industryLaborRate: "Tarifa de trabajo",
industryCreateButton: "Crear fábrica",
industryUpdateButton: "Actualizar",
- industrySteward: "Mayordomo",
+ industrySteward: "Mayordoma",
industryStatusActive: "EN MARCHA",
industryStatusPaused: "PAUSADA",
industryStatusDissolved: "DISUELTA",
@@ -2762,7 +3044,7 @@ module.exports = {
industryPolicy_invite: "Solo invitación",
projectsTitle: "Proyectos",
projectsDescription: "Crea, financia y sigue proyectos impulsados por la comunidad en tu red.",
- projectSearchPlaceholder: "Buscar proyectos...",
+ projectSearchPlaceholder: "Buscar en Proyectos...",
projectCreateProject: "Crear Proyecto",
projectCreateButton: "Crear Proyecto",
projectUpdateButton: "ACTUALIZAR",
@@ -2771,7 +3053,7 @@ module.exports = {
projectFilterAll: "TODOS",
projectFilterMine: "MIS PROYECTOS",
projectFilterActive: "ACTIVOS",
- projectFilterPaused: "PONDERADOS",
+ projectFilterPaused: "PAUSADOS",
projectFilterCompleted: "COMPLETADOS",
projectFilterFollowing: "SEGUIDOS",
projectFilterRecent: "RECIENTES",
@@ -2785,7 +3067,7 @@ module.exports = {
projectRecentTitle: "Proyectos Recientes",
projectTopTitle: "Mejor Financiados",
projectTitlePlaceholder: "Nombre del proyecto",
- projectImage: "Subir contenido multimedia (max: 50MB)",
+ projectImage: "Subir contenido multimedia (máx.: 75MB)",
projectDescription: "Descripción",
projectDescriptionPlaceholder: "Cuenta la historia y los objetivos…",
projectGoal: "Meta (ECO)",
@@ -2832,9 +3114,9 @@ module.exports = {
projectMilestoneDescription: "Descripción del hito",
projectBudgetAssigned: "Asignado a recompensas",
projectBudgetOver: "⚠ Presupuesto excedido: lo asignado supera el objetivo",
- projectFollowers: "Seguidores",
- projectFollowersTitle: "Seguidores",
- projectFollowersNone: "Aún no hay seguidores.",
+ projectFollowers: "Seguidoras",
+ projectFollowersTitle: "Seguidoras",
+ projectFollowersNone: "Aún no hay seguidoras.",
projectMore: "más",
projectYouFollowHint: "Sigues este proyecto",
projectBackers: "Patrocinadores",
@@ -2857,20 +3139,18 @@ module.exports = {
modulesModuleName: "Nombre",
modulesModuleDescription: "Descripción",
modulesModuleStatus: "Estado",
- modulesTotalModulesLabel: "Módulos Cargados",
+ modulesTotalModulesLabel: "Total",
modulesEnabledModulesLabel: "Habilitados",
modulesDisabledModulesLabel: "Deshabilitados",
modulesInvitesLabel: "Invitaciones",
modulesInvitesDescription: "Módulo para gestionar y aplicar códigos de invitación.",
modulesWalletLabel: "Cartera",
modulesWalletDescription: "Módulo para gestionar tus activos digitales (ECOin).",
- modulesLegacyLabel: "Legado",
- modulesLegacyDescription: "Módulo para gestionar tu secreto (clave privada) de forma rápida y segura.",
modulesCipherLabel: "Cifrado",
- modulesCipherDescription: "Módulo para encriptar y desencriptar tu texto de forma simétrica (usando una contraseña compartida).",
+ modulesCipherDescription: "Módulo para cifrar y descifrar tu texto de forma simétrica (usando una contraseña compartida).",
modulesBookmarksLabel: "Marcadores",
modulesBookmarksDescription: "Módulo para descubrir y gestionar marcadores.",
- modulesVideosLabel: "Videos",
+ modulesVideosLabel: "Vídeos",
modulesVideosDescription: "Módulo para descubrir y gestionar videos.",
modulesDocsLabel: "Documentos",
modulesDocsDescription: "Módulo para descubrir y gestionar documentos.",
@@ -2896,7 +3176,7 @@ module.exports = {
modulesVotationsDescription: "Módulo para descubrir y gestionar votaciones.",
modulesParliamentLabel: "Parlamento",
modulesParliamentDescription: "Módulo para elegir gobiernos y votar leyes.",
- modulesCourtsLabel: "Juzgados",
+ modulesCourtsLabel: "Tribunales",
modulesCourtsDescription: "Módulo para resolver conflictos y emitir veredictos.",
modulesReportsLabel: "Informes",
modulesReportsDescription: "Módulo para gestionar y hacer un seguimiento de informes relacionados con problemas, errores, abusos y advertencias de contenido.",
@@ -2918,29 +3198,32 @@ module.exports = {
modulesMelodyDescription: "Módulo para generar y compartir el \"sonido\" de tu blockchain.",
modulesAgendaLabel: "Agenda",
modulesAgendaDescription: "Módulo para gestionar todos tus elementos asignados.",
- modulesAILabel: "AI",
+ modulesAILabel: "IA",
modulesAIDescription: "Módulo para hablar con un LLM llamado '42'.",
modulesForumLabel: "Foros",
modulesForumDescription: "Módulo para descubrir y gestionar foros.",
modulesJobsLabel: "Trabajos",
- modulesJobsDescription: "Modulo para descubrir y gestionar ofertas de trabajo.",
+ modulesJobsDescription: "Módulo para descubrir y gestionar ofertas de trabajo.",
modulesProjectsLabel: "Proyectos",
modulesProjectsDescription: "Módulo para explorar, financiar y gestionar proyectos.",
modulesBankingLabel: "Banca",
- modulesBankingDescription: "Módulo para conocer el valor real de ECOIN y distribuir una RBU utilizando la tesorería común.",
+ modulesBankingDescription: "Módulo para gestionar el tesoro común: valor de ECOIN, impuestos y RBU.",
modulesFavoritesLabel: "Favoritos",
modulesFavoritesDescription: "Módulo para gestionar tu contenido favorito.",
fileTooLargeTitle: "Archivo demasiado grande",
- fileTooLargeMessage: "El archivo supera el tamaño máximo permitido (50 MB). Por favor, selecciona un archivo más pequeño.",
+ fileTooLargeMessage: "El archivo supera el tamaño máximo permitido (75 MB). Por favor, selecciona un archivo más pequeño.",
goBack: "Volver",
+ errorDismiss: "OK",
errorPageTitle: "Ha ocurrido un error",
+ errorNoAllocation: "No se ha encontrado ninguna asignación para esta reclamación.",
+ errorInvalidClaim: "Esta asignación no se puede reclamar.",
visibilityLabel: "Visibilidad",
+ clearnetPrivateConflict: "Un contenido privado, oculto, cerrado, solo por invitación o de pago no se puede publicar en la CLEARNET. Elige OASIS o hazlo público.",
visibilityPublic: "Pública",
visibilityHidden: "Oculta",
visibilityMakePublic: "Hacer pública",
visibilityMakeHidden: "Hacer oculta",
invitesInhabitantsTitle: "Habitantes",
- invitesInhabitantsFollow: "Seguir",
aiNavPlaceholder: "Describe qué necesitas...",
aiNavDisabled: "La navegación con IA está desactivada.",
aiNavResultsTitle: "Sugerencias AINav",
@@ -2951,24 +3234,24 @@ module.exports = {
modulesAINavDescription: "Módulo para realizar peticiones en lenguaje natural sobre el contenido de la red.",
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)",
+ peerPort: "Puerto",
peerPublicKey: "Clave Pública (@...ed25519)",
connectAndFollow: "Conectar",
modulesPresetTitle: "Configuraciones Comunes",
- workflowsTitle: "Workflows",
+ workflowsTitle: "Flujos de trabajo",
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_kids: "Niños",
+ workflow_activists: "Activismo",
workflow_mobile: "Móvil",
statsCarbonFootprintTitle: "Huella de Carbono",
- statsCarbonTombstone: "Huella del tombstoning",
- uploadMedia: "Subir contenido multimedia (max: 50MB)",
+ statsCarbonTombstone: "Huella de los elementos eliminados (tombstoning)",
+ uploadMedia: "Subir contenido multimedia (máx.: 75MB)",
invitesUnfollow: "Dejar de seguir",
invitesFollow: "Seguir",
invitesUnfollowedInvites: "No federadas",
@@ -2978,12 +3261,13 @@ module.exports = {
visitContent: "Visitar Contenido",
favoriteAdd: "Fijar en Favoritos",
pmContentTooltip: "Enviar un Mensaje Privado",
+ phoneCallTooltip: "Hacer una Llamada",
favoriteRemove: "Quitar de Favoritos",
reportContent: "Reportar Contenido",
- bankEcoinHours: "Equivalencia ECOin en tiempo",
+ bankEcoinHours: "Equivalencia ECOin en tiempo (1 ECO)",
mapsLabel: "Mapas",
mapTitle: "Mapas",
- mapDescription: "Explora y gestiona mapas offline en tu red.",
+ mapDescription: "Gestiona y comparte mapas offline en tu red.",
mapMineSectionTitle: "Tus Mapas",
mapCreateSectionTitle: "Crear Mapa",
mapUpdateSectionTitle: "Actualizar Mapa",
@@ -3020,12 +3304,25 @@ module.exports = {
mapMarkerLngLabel: "Longitud del marcador",
mapMarkerLabelField: "Etiqueta del marcador",
mapMarkerLabelPlaceholder: "Describe este marcador...",
- markerImageLabel: "Imagen del Marker",
+ markerImageLabel: "Imagen del marcador",
mapAddMarkerTitle: "Añadir Marcador",
mapAddMarkerButton: "Añadir Marcador",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Limpiar marcador",
mapApplyZoom: "Aplicar Zoom",
- mapSearchPlaceholder: "Buscar descripción, etiquetas, autor...",
+ mapPlaceSearchPlaceholder: "Buscar un lugar o país...",
+ mapNoPlaces: "No se encontraron lugares.",
+ mapClusterTitle: "marcadores aquí, pulsa para acercar",
+ mapDeleteMarker: "Eliminar marcador",
+ mapZoomIn: "Acercar",
+ mapZoomOut: "Alejar",
+ mapFitMarkers: "Ajustar a todos los marcadores",
+ mapPanLabel: "Mover el mapa",
+ mapCenterHere: "Centrar aquí",
+ mapNear: "cerca de",
+ mapPickedSpot: "Punto elegido",
+ mapPickHint: "Pulsa en el mapa para elegir un punto.",
+ mapClearPick: "Limpiar",
+ mapSearchPlaceholder: "Buscar en Mapas...",
mapSearchButton: "Buscar",
mapUpdatedAt: "Actualizado",
mapNoMatch: "Ningún mapa coincide con tu búsqueda.",
@@ -3036,6 +3333,465 @@ module.exports = {
typeMapMarker: "MARCADOR DE MAPA",
modulesMapLabel: "Mapas",
modulesMapDescription: "Módulo para gestionar y compartir mapas offline.",
+ emergenciesTitle: "Emergencias",
+ modulesEmergenciesLabel: "Emergencias",
+ modulesEmergenciesDescription: "Módulo para lanzar, confirmar y seguir emergencias en la red.",
+ emergenciesDescription: "Módulo para lanzar, confirmar y seguir emergencias en la red.",
+ emergencyCreate: "Crear emergencia",
+ emergencyUpdate: "Actualizar",
+ emergencyDelete: "Borrar",
+ emergencyTitleLabel: "Título",
+ emergencyTitlePlaceholder: "¿Qué está pasando?",
+ emergencyTextLabel: "Detalles",
+ emergencyTextPlaceholder: "Dónde, desde cuándo, qué hacer...",
+ emergencyCategoryLabel: "Categoría",
+ emergencyCategoryWeather: "METEOROLOGÍA",
+ emergencyCategoryInfrastructure: "INFRAESTRUCTURA",
+ emergencyCategoryHealth: "SALUD",
+ emergencyCategorySecurity: "SEGURIDAD",
+ emergencyCategoryLost: "PERDIDOS",
+ emergencyCategoryNeighborhood: "VECINDARIO",
+ emergencyExpiresLabel: "Caduca en",
+ emergencyExpires1d: "1 día",
+ emergencyExpires3d: "3 días",
+ emergencyExpires7d: "1 semana",
+ emergencyExpires30d: "1 mes",
+ emergencyExpiresNone: "Indefinido",
+ emergencyExpiresKeep: "Mantener la fecha actual",
+ emergencyTagsLabel: "Etiquetas",
+ emergencyTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ emergencyFilterAll: "TODAS",
+ emergencyFilterMine: "MÍAS",
+ emergencyFilterRecent: "RECIENTES",
+ emergencySeverityUnverified: "SIN VERIFICAR",
+ emergencySeverityLow: "BAJA",
+ emergencySeverityMedium: "MEDIA",
+ emergencySeverityHigh: "ALTA",
+ emergencyStatusActive: "ACTIVA",
+ emergencyStatusResolved: "RESUELTA",
+ emergencyStatusExpired: "CADUCADA",
+ emergencyConfirmations: "Confirmaciones",
+ emergencyConfirmButton: "Confirmar",
+ emergencyConfirmed: "Has confirmado esta emergencia",
+ emergencyResolveButton: "Resolver",
+ emergencyReopenButton: "Reabrir",
+ emergencyGenerateReport: "Generar informe",
+ emergencyUpdateEdited: "Editada",
+ emergencyLastUpdate: "ÚLTIMA ACTUALIZACIÓN",
+ emergencyUpdatesTitle: "Últimas actualizaciones:",
+ emergencyNoUpdates: "Aún no hay actualizaciones.",
+ emergencyAddUpdate: "Publicar actualización",
+ emergencyUpdatePlaceholder: "¿Qué ha cambiado?",
+ emergencyNoItems: "No se han encontrado emergencias.",
+ emergencyExpiresAt: "Caduca",
+ emergencyBannerLabel: "Emergencia activa",
+ emergencyCreateSectionTitle: "Crear emergencia",
+ emergencyUpdateSectionTitle: "Actualizar emergencia",
+ emergencySearchPlaceholder: "Buscar en emergencias...",
+ typeEmergency: "EMERGENCIAS",
+ typeEmergencyConfirm: "CONFIRMACIÓN DE EMERGENCIA",
+ typeEmergencyUpdate: "ACTUALIZACIÓN DE EMERGENCIA",
+ statsEmergency: "Emergencias",
+ statsEmergencyConfirm: "Confirmaciones de emergencias",
+ statsEmergencyUpdate: "Actualizaciones de emergencias",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Una emergencia que sigues tiene una actualización.",
+ emergencyBotResolvedTitle: "Una emergencia que sigues se ha resuelto.",
+ dataKindEmergencies: "EMERGENCIAS",
+ mailingTitle: "Listas de correo",
+ modulesMailingLabel: "Listas de correo",
+ modulesMailingDescription: "Descubre y gestiona listas de correo en tu red.",
+ modulesPhoneLabel: "Teléfono",
+ modulesPhoneDescription: "Módulo para llamar a otros habitantes con videollamadas cifradas de extremo a extremo.",
+ mailingDescription: "Descubre y gestiona listas de correo en tu red.",
+ mailingCreate: "Crear lista de correo",
+ mailingUpdate: "Actualizar",
+ mailingArchive: "Archivar",
+ mailingActivate: "Activar",
+ mailingCreateSectionTitle: "Crear lista de correo",
+ mailingUpdateSectionTitle: "Actualizar lista de correo",
+ mailingTitleLabel: "Título",
+ mailingTitlePlaceholder: "Nombre de la lista de correo",
+ mailingDescriptionLabel: "Descripción",
+ mailingDescriptionPlaceholder: "¿De qué trata esta lista?",
+ mailingTypeLabel: "Tipo de lista de correo",
+ mailingTypeOpen: "ABIERTA",
+ mailingTypeClosed: "CERRADA",
+ mailingStatusLabel: "Estado",
+ mailingStatusActive: "ACTIVA",
+ mailingStatusArchived: "ARCHIVADA",
+ mailingMembersLabel: "Invitar habitantes",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Suscriptoras",
+ mailingTagsLabel: "Etiquetas",
+ mailingTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ mailingFilterAll: "TODAS",
+ mailingFilterMine: "MÍAS",
+ mailingFilterSubscribed: "SUSCRITAS",
+ mailingFilterRecent: "RECIENTES",
+ mailingHistoryDate: "FECHA",
+ mailingHistoryThreads: "HILOS",
+ mailingHistoryInhabitants: "HABITANTES",
+ mailingHistorySearchPlaceholder: "Buscar en el historial...",
+ mailingNoMessages: "Aún no hay mensajes.",
+ mailingNoItems: "No se han encontrado listas de correo.",
+ mailingSearchPlaceholder: "Buscar en listas de correo...",
+ mailingWriteButton: "Escribir mensaje",
+ mailingWriteTitle: "Escribir a la lista",
+ mailingReplyTitle: "Responder a la lista",
+ mailingSend: "Enviar",
+ mailingTextPlaceholder: "Tu mensaje llega a todas las participantes de la lista.",
+ mailingParticipants: "Participantes",
+ inboxFilterMailing: "Listas de correo",
+ mailingReplyPlaceholder: "Responder a la lista...",
+ mailingReplyToList: "Responder a la lista",
+ typeMailingList: "LISTA DE CORREO",
+ statsMailingList: "Listas de correo",
+ mailingListLabel: "LISTA DE CORREO",
+ logisticsTitle: "Logística",
+ modulesLogisticsLabel: "Logística",
+ modulesLogisticsDescription: "Descubre y gestiona planes logísticos en tu red.",
+ logisticsDescription: "Descubre y gestiona planes logísticos en tu red.",
+ logisticsCreate: "Crear ruta",
+ logisticsUpdate: "Actualizar",
+ logisticsClose: "Cerrar",
+ logisticsReopen: "Reabrir",
+ logisticsCreateSectionTitle: "Crear ruta",
+ logisticsUpdateSectionTitle: "Actualizar ruta",
+ logisticsTitleLabel: "Título",
+ logisticsTitlePlaceholder: "Viaje al mercado, furgoneta disponible...",
+ logisticsKindLabel: "Tipo de logística",
+ logisticsKindTrip: "VIAJE",
+ logisticsKindShipment: "ENVÍO",
+ logisticsKindTrips: "VIAJES",
+ logisticsKindShipments: "ENVÍOS",
+ logisticsModeLabel: "Modo",
+ logisticsModeOffer: "OFREZCO",
+ logisticsModeRequest: "BUSCO",
+ logisticsModeOffers: "OFERTAS",
+ logisticsModeRequests: "PETICIONES",
+ logisticsDescriptionLabel: "Descripción",
+ logisticsDescriptionPlaceholder: "Punto de encuentro, qué llevas, condiciones...",
+ logisticsOriginLabel: "Origen",
+ logisticsOriginPlaceholder: "Dónde empieza",
+ logisticsDestinationLabel: "Destino",
+ logisticsDestinationPlaceholder: "Dónde termina",
+ logisticsDateLabel: "Fecha y hora",
+ logisticsRecurrenceLabel: "Recurrencia",
+ logisticsFrequencyLabel: "Frecuencia",
+ logisticsRecurrenceNone: "ÚNICO",
+ logisticsRecurrenceDaily: "DIARIO",
+ logisticsRecurrenceWeekly: "SEMANAL",
+ logisticsRecurrenceMonthly: "MENSUAL",
+ logisticsSeatsLabel: "Plazas",
+ logisticsSizeLabel: "Tamaño",
+ logisticsSizePlaceholder: "p. ej. 2m x 1m",
+ logisticsWeightLabel: "Peso",
+ logisticsWeightPlaceholder: "p. ej. 40kg",
+ logisticsPriceFree: "GRATIS",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TIEMPO",
+ logisticsPriceLabel: "Precio",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Enlace al pedido",
+ logisticsOrderRefPlaceholder: "/shops/... o /market/... del pedido a entregar",
+ logisticsOrderLink: "Pedido enlazado",
+ logisticsTagsLabel: "Etiquetas",
+ logisticsTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ logisticsFilterAll: "TODAS",
+ logisticsFilterMine: "MÍAS",
+ logisticsFilterBooked: "RESERVADAS",
+ logisticsFilterRecent: "RECIENTES",
+ logisticsFilterHistory: "HISTORIAL",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "ABIERTA",
+ logisticsStatusUpcoming: "PRÓXIMAS",
+ logisticsStatusPast: "PASADAS",
+ logisticsStatusClosed: "CERRADAS",
+ logisticsZoneLabel: "Zona",
+ logisticsSearchPlaceholder: "Buscar en logística...",
+ logisticsNoItems: "No se han encontrado rutas.",
+ logisticsBookingPending: "PENDIENTE",
+ logisticsBookingConfirmed: "CONFIRMADA",
+ logisticsBookingRejected: "RECHAZADA",
+ logisticsBookingCancelled: "CANCELADA",
+ logisticsBookingDelivered: "ENTREGADA",
+ logisticsConfirm: "Confirmar",
+ logisticsReject: "Rechazar",
+ logisticsDeliver: "Entregar",
+ logisticsReceiptLabel: "Recibo",
+ logisticsReceiptPlaceholder: "Nota de entrega (opcional)",
+ logisticsCancelBooking: "Cancelar reserva",
+ logisticsBookTitle: "Reservar esta ruta",
+ logisticsNotesLabel: "Notas",
+ logisticsNotesPlaceholder: "Lo que el responsable deba saber",
+ logisticsBook: "Reservar",
+ logisticsBookingsTitle: "Reservas",
+ logisticsMyBookingTitle: "Tu reserva",
+ logisticsRatingsTitle: "Valoraciones",
+ logisticsNoRatings: "Aún no hay valoraciones.",
+ logisticsRatingsWhenClosed: "Las valoraciones se abren al cerrar la ruta.",
+ logisticsScoreLabel: "Puntuación",
+ logisticsRatingPlaceholder: "¿Qué tal fue?",
+ logisticsRate: "Valorar",
+ typeLogisticsRoute: "RUTA",
+ typeLogisticsRating: "VALORACIÓN DE RUTA",
+ statsLogisticsRoute: "Rutas",
+ statsLogisticsRating: "Valoraciones de rutas",
+ logisticsRouteLabel: "RUTA",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Módulo para publicar canales de podcast.",
+ podcastsDescription: "Módulo para publicar canales de podcast.",
+ podcastCreate: "Crear podcast",
+ podcastUpdate: "Actualizar",
+ podcastDelete: "Borrar",
+ podcastCreateSectionTitle: "Crear podcast",
+ podcastUpdateSectionTitle: "Actualizar podcast",
+ podcastTitleLabel: "Título",
+ podcastTitlePlaceholder: "Nombre del canal",
+ podcastDescriptionLabel: "Descripción",
+ podcastDescriptionPlaceholder: "¿De qué trata este podcast?",
+ podcastCategoryLabel: "Categoría",
+ podcastCategoryNews: "NOTICIAS",
+ podcastCategoryMusic: "MÚSICA",
+ podcastCategoryTalk: "CHARLA",
+ podcastCategoryEducation: "EDUCACIÓN",
+ podcastCategoryTech: "TECNOLOGÍA",
+ podcastCategoryCulture: "CULTURA",
+ podcastCategoryCommunity: "COMUNIDAD",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "OTRAS",
+ podcastTagsLabel: "Etiquetas",
+ podcastCoverLabel: "Portada (imagen o vídeo)",
+ podcastEpisodeAudioLabel: "Archivo de audio o vídeo (máx: 75MB)",
+ podcastTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ podcastFilterAll: "TODOS",
+ podcastFilterMine: "MÍOS",
+ podcastFilterRecent: "RECIENTES",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "OYENTES",
+ podcastSearchPlaceholder: "Buscar en podcasts...",
+ podcastNoItems: "No se han encontrado podcasts.",
+ podcastEpisodesLabel: "Episodios",
+ podcastPlaysLabel: "Visualizaciones",
+ podcastLastEpisode: "Último episodio",
+ podcastEpisodesTitle: "Episodios",
+ podcastNoEpisodes: "Aún no hay episodios.",
+ podcastEpisodeAdd: "Añadir episodio",
+ podcastEpisodeCreateTitle: "Publicar episodio",
+ podcastEpisodeUpdateTitle: "Actualizar episodio",
+ podcastEpisodeTitleLabel: "Título del episodio",
+ podcastEpisodeTitlePlaceholder: "Título del episodio",
+ podcastEpisodeDescriptionLabel: "Notas",
+ podcastEpisodeDescriptionPlaceholder: "Qué pasa en este episodio, enlaces, créditos...",
+ podcastEpisodePublish: "Publicar",
+ podcastPlayed: "Reproducido",
+ podcastMarkPlayed: "Marcar como reproducido",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISODIO",
+ typePodcastOpinion: "OPINIÓN DE EPISODIO",
+ typePodcastPlay: "REPRODUCCIÓN",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Episodios",
+ statsPodcastPlay: "Reproducciones",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Un blog que sigues tiene una nueva entrada.",
+ podcastBotEpisodeTitle: "Un podcast que sigues tiene un episodio nuevo.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISODIO",
+ campaignsTitle: "Campañas",
+ modulesCampaignsLabel: "Campañas",
+ modulesCampaignsDescription: "Descubre y gestiona campañas en tu red.",
+ campaignsDescription: "Descubre y gestiona campañas en tu red.",
+ campaignCreate: "Crear campaña",
+ campaignUpdate: "Actualizar",
+ campaignDelete: "Borrar",
+ campaignClose: "Cerrar",
+ campaignReopen: "Reabrir",
+ campaignCreateSectionTitle: "Crear campaña",
+ campaignUpdateSectionTitle: "Actualizar campaña",
+ campaignTitleLabel: "Título",
+ campaignTitlePlaceholder: "¿Qué quieres conseguir?",
+ campaignTextLabel: "Texto",
+ campaignTextPlaceholder: "Explica la causa, quién decide y qué pides...",
+ campaignCategoryLabel: "Categoría",
+ campaignCategoryEnvironment: "MEDIO AMBIENTE",
+ campaignCategoryRights: "DERECHOS",
+ campaignCategoryHealth: "SALUD",
+ campaignCategoryEducation: "EDUCACIÓN",
+ campaignCategoryInfrastructure: "INFRAESTRUCTURA",
+ campaignCategoryCulture: "CULTURA",
+ campaignCategoryEconomy: "ECONOMÍA",
+ campaignCategoryOther: "OTRAS",
+ campaignGoalLabel: "Objetivo de firmas",
+ campaignDeadlineLabel: "Plazo",
+ campaignTagsLabel: "Etiquetas",
+ campaignTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ campaignFilterAll: "TODAS",
+ campaignFilterMine: "MÍAS",
+ campaignFilterSigned: "FIRMADAS",
+ campaignFilterRecent: "RECIENTES",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "ABIERTA",
+ campaignStatusAchieved: "LOGRADA",
+ campaignStatusUnachieved: "NO LOGRADA",
+ campaignStatusClosed: "CERRADA",
+ campaignSearchPlaceholder: "Buscar en campañas...",
+ campaignNoItems: "No se han encontrado campañas.",
+ campaignSignaturesLabel: "Firmas",
+ campaignSignaturesTitle: "Apoyos",
+ campaignNoSignatures: "Aún no hay firmas.",
+ campaignSignTitle: "Firmar esta campaña",
+ campaignSignPlaceholder: "¿Por qué la apoyas? (opcional)",
+ campaignSign: "Firmar",
+ campaignSigned: "¡Ya has firmado!",
+ campaignNotSigned: "Aún falta tu firma",
+ campaignElevate: "Elevar al Parlamento",
+ campaignElevated: "Elevada al Parlamento",
+ campaignUpdatesTitle: "Actualizaciones",
+ campaignNoUpdates: "Aún no hay actualizaciones.",
+ campaignUpdatePlaceholder: "¿Qué ha pasado?",
+ campaignAddUpdate: "Publicar actualización",
+ campaignQrAlt: "QR para firmar esta campaña",
+ campaignQrCaption: "Escanea para firmar",
+ typeCampaign: "CAMPAÑA",
+ typeCampaignSignature: "FIRMA",
+ typeCampaignUpdate: "ACTUALIZACIÓN DE CAMPAÑA",
+ statsCampaign: "Campañas",
+ statsCampaignSignature: "Firmas de campañas",
+ statsCampaignUpdate: "Actualizaciones de campañas",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Una campaña que sigues tiene una actualización.",
+ campaignBotAchievedTitle: "Una campaña que sigues ha alcanzado su objetivo.",
+ campaignBotRaisedTitle: "Una campaña que has firmado se ha elevado al Parlamento.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Una ruta que reservaste ha cambiado.",
+ logisticsBotClosedTitle: "Una ruta que reservaste se ha cerrado.",
+ logisticsBotBookedTitle: "Alguien ha reservado tu ruta.",
+ logisticsBotCancelledTitle: "Se ha cancelado una reserva de tu ruta.",
+ logisticsBotConfirmedTitle: "Tu reserva se ha confirmado: el paquete está en camino.",
+ logisticsBotRejectedTitle: "Tu reserva se ha rechazado.",
+ logisticsBotDeliveredTitle: "Tu paquete ha llegado.",
+ campaignLabel: "CAMPAÑA",
+ campaignGenerateReport: "Generar informe",
+ logisticsGenerateReport: "Generar informe",
+ mailingGenerateReport: "Generar informe",
+ campaignUpdateEdited: "Editada",
+ mailingMessagesLabel: "Mensajes",
+ logisticsBookingsLabel: "Reservas",
+ backupTitle: "Copia de seguridad",
+ modulesBackupLabel: "Copia de seguridad",
+ modulesBackupDescription: "Módulo para exportar e importar tus llaves y hacer copias de seguridad cifradas.",
+ backupDescription: "Módulo para exportar e importar tus llaves y hacer copias de seguridad cifradas.",
+ backupTypeRecovery: "RECUPERACIÓN",
+ backupTypeKeys: "EXPORTAR CLAVES",
+ backupTypeFull: "COPIA COMPLETA",
+ backupTypeRestore: "RESTAURAR COPIA",
+ backupTypeInstant: "INSTANTÁNEA",
+ backupInstantDescription: "Un .zip llano con todo tu registro y tus ficheros, sin tu clave secreta y sin contraseña. Rápido, pero ",
+ backupInstantRisk: "quien tenga el fichero lo lee todo.",
+ backupKitPageDescription: "El kit de recuperación solo puede abrirse desde este dispositivo.",
+ backupKitId: "ID de Oasis",
+ backupKitDate: "Generado",
+ backupKitQrAlt: "Código QR de tu llave secreta",
+ backupKitStep1: "Imprímelo o cópialo a mano y guárdalo en un lugar seguro y sin conexión.",
+ backupKitStep2: "Para recuperar, instala Oasis en un dispositivo nuevo e importa este secreto desde Copia de seguridad › Llaves.",
+ backupKitStep3: "Destruye esta página si alguna vez queda expuesta.",
+ backupKitPdfButton: "Generar PDF",
+ backupScopeLabel: "Alcance",
+ backupScopeAll: "TODO",
+ backupScopeMine: "SOLO MI CONTENIDO",
+ backupSinceLabel: "Desde",
+ backupEstimateTitle: "Estimación",
+ backupFileInfo: "Tu copia cifrada se descargará en tu dispositivo (nombre: oasis-backup-FECHA.oasisbk)",
+ backupExportButton: "Descargar copia",
+ backupRestorePassword: "Escribe la contraseña usada al hacer la copia",
+ backupRestoreButton: "Restaurar copia",
+ backupRestoredLine: "Copia restaurada.",
+ backupRestoredMessages: "Mensajes añadidos",
+ backupRestoredSkipped: "Ya existentes",
+ backupRestoredBlobs: "Archivos añadidos",
+ backupRestoredState: "Configuración restaurada",
+ backupRestoredFailed: "Fallidos",
+ backupRestoredForked: "Divergentes",
+ backupRestoreRunning: "Restaurando la copia. Esta página se actualiza sola; mientras tanto puedes seguir usando Oasis.",
+ backupRestoreElapsed: "Transcurrido",
+ backupRestoreFailedLine: "No se pudo restaurar la copia.",
+ backupRestoreForkMine: "Este dispositivo ya publicó mensajes con tu identidad que no están en la copia, así que no se pudo aplicar encima de ellos. Restaura en una instalación limpia justo después de importar tus llaves, antes de hacer nada más.",
+ verificationTitle: "Verificación",
+ verificationDescription: "Comprueba la cadena de tu feed, detecta bifurcaciones y revisa archivos huérfanos o ausentes.",
+ verificationRun: "Ejecutar verificación",
+ verificationTotalMessages: "mensajes en el registro",
+ verificationFeed: "Tu feed",
+ verificationMessages: "mensajes",
+ verificationLastSequence: "última secuencia",
+ verificationGaps: "Huecos",
+ verificationBrokenLinks: "Enlaces rotos",
+ verificationBadHashes: "Hashes incorrectos",
+ verificationBadSignatures: "Firmas incorrectas",
+ verificationDuplicates: "Secuencias duplicadas",
+ verificationForks: "Bifurcaciones",
+ verificationBlobs: "Archivos",
+ verificationBlobsPresent: "presentes",
+ verificationBlobsReferenced: "referenciados",
+ verificationBlobsOrphan: "huérfanos",
+ verificationBlobsMissing: "ausentes",
+ verificationBlobsMissingOwn: "Ficheros tuyos que faltan en este dispositivo",
+ verificationBlobsMissingOthers: "Ficheros de otras habitantes aún sin descargar",
+ verificationBlobsUnavailable: "No se han podido listar los archivos en este dispositivo.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Módulo para descubrir y gestionar wikis.",
+ wikiDescription: "Módulo para descubrir y gestionar wikis.",
+ wikiCreate: "Crear wiki",
+ wikiUpdate: "Actualizar",
+ wikiDelete: "Borrar",
+ wikiEdit: "Editar",
+ wikiTitleLabel: "Título",
+ wikiTitlePlaceholder: "Título de la wiki...",
+ wikiBodyLabel: "Contenido",
+ wikiBodyPlaceholder: "Enlaza otras wikis con [[Título de la wiki]] o [[Título de la wiki|un texto propio]].\n\nMenciona a una habitante con @id.\n\nEtiqueta con #oasis.\n\nPega enlaces como https://solarnethub.com\n\nUna línea en blanco abre un párrafo nuevo; los saltos de línea simples se conservan.\n\nAdjunta cualquier media soportado y se incrustará aquí.",
+ formatBarLabel: "Formato",
+ wikiStatusLabel: "Tipo de wiki",
+ wikiStatusOpen: "ABIERTA",
+ wikiStatusClosed: "CERRADA",
+ wikiTagsLabel: "Etiquetas",
+ wikiTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ wikiSummaryLabel: "Resumen del cambio",
+ wikiSummaryPlaceholder: "¿Qué ha cambiado?",
+ wikiFilterAll: "TODAS",
+ wikiFilterMine: "MÍAS",
+ wikiFilterRecent: "RECIENTES",
+ wikiFilterLinked: "ENLAZADAS",
+ wikiChanges: "Cambios recientes",
+ wikiNoPages: "No se han encontrado wikis.",
+ wikiNoChanges: "Aún no hay cambios.",
+ wikiHistory: "Historial",
+ wikiVersion: "Versión",
+ wikiVersions: "versiones",
+ wikiRestore: "Restaurar",
+ wikiDiff: "Cambios",
+ wikiViewVersion: "Ver",
+ wikiLinkedPages: "Páginas enlazadas",
+ wikiNoLinkedPages: "Esta página aún no se enlaza con ninguna otra.",
+ wikiMissingLink: "La página aún no existe",
+ wikiDuplicateTitle: "Ya existe una página con este título. Cambia el título para crear una página distinta.",
+ wikiCreateSectionTitle: "Crear wiki",
+ wikiUpdateSectionTitle: "Actualizar wiki",
+ wikiSearchPlaceholder: "Buscar en la Wiki...",
+ wikiCurrentVersion: "Versión actual",
+ wikiViewingVersion: "Estás viendo una versión antigua",
+ wikiBackToPage: "Volver a la página",
+ wikiLinkedChip: "Enlazada",
+ wikiRestoredSummary: "Versión restaurada",
+ wikiExportPdf: "Generar página",
+ wikiPreview: "Vista previa",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Crear wiki",
+ tribeWikiEmpty: "Aún no hay wikis.",
+ typeWiki: "WIKI",
padsTitle: "Pads",
padTitle: "Pad",
modulesPadsLabel: "Pads",
@@ -3046,21 +3802,133 @@ module.exports = {
padTitleLabel: "Título",
padTitlePlaceholder: "Escribe el título del pad...",
padStatusLabel: "Estado",
+ padTypeLabel: "Tipo de pad",
padStatusOpen: "ABIERTO",
- padStatusInviteOnly: "SOLO INVITADOS",
+ padStatusInviteOnly: "SOLO CON INVITACIÓN",
padStatusClosed: "CERRADO",
padDeadlineLabel: "Fecha límite",
padTagsLabel: "Etiquetas",
- padTagsPlaceholder: "etiqueta1, etiqueta2, ...",
+ padTagsPlaceholder: "Introduce etiquetas separadas por comas",
padMembersLabel: "Miembros",
padCreated: "Creado",
- padStartEditing: "¡EMPEZAR A EDITAR!",
+ padStartEditing: "Editar",
padEditorPlaceholder: "Empieza a escribir...",
padSubmitEntry: "Enviar",
padNoEntries: "Sin entradas aún.",
padAllSectionTitle: "Todos los Pads",
padMineSectionTitle: "Mis Pads",
padsDescription: "Gestiona editores de texto cifrados colaborativos en tu red.",
+ roomsTitle: "Salas",
+ roomsDescription: "Descubre y únete a salas de videoconferencia cifradas en tu red.",
+ modulesRoomsLabel: "Salas",
+ modulesRoomsDescription: "Módulo para descubrir y unirse a salas de videoconferencia cifradas.",
+ roomFilterRecent: "RECIENTES",
+ roomFilterMine: "MÍAS",
+ roomFilterAll: "TODAS",
+ roomFilterLive: "EN DIRECTO",
+ roomFilterOpen: "ABIERTAS",
+ roomFilterInvite: "SOLO CON INVITACIÓN",
+ roomFilterClosed: "CERRADAS",
+ roomCreate: "Crear sala",
+ roomUpdate: "Actualizar",
+ roomDelete: "Eliminar",
+ roomClose: "Cerrar",
+ roomCreateSectionTitle: "Crear sala",
+ roomUpdateSectionTitle: "Actualizar sala",
+ roomTitlePlaceholder: "Título de la sala",
+ roomDescriptionLabel: "Descripción",
+ roomDescriptionPlaceholder: "¿De qué vais a hablar?",
+ roomTypeLabel: "Tipo de sala",
+ roomTagsLabel: "Etiquetas",
+ roomStatusOpen: "ABIERTA",
+ roomStatusInviteOnly: "SOLO CON INVITACIÓN",
+ roomStatusClosed: "CERRADA",
+ roomParticipants: "Participantes",
+ roomJoin: "Entrar",
+ roomLeave: "Salir",
+ roomFull: "Sala llena",
+ roomLiveChip: "EN DIRECTO",
+ roomMuted: "silenciado",
+ roomRec: "Grabar audio",
+ roomRecStop: "Parar grabación",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} ha entrado en la sala",
+ roomEventLeft: "{name} ha salido de la sala",
+ roomEventRecStart: "{name} ha empezado a grabar",
+ roomEventRecStop: "{name} ha dejado de grabar",
+ roomEventMuted: "{name} se ha silenciado",
+ roomEventUnmuted: "{name} ha quitado el silencio",
+ roomEventHand: "{name} ha levantado la mano",
+ roomRaiseHand: "Levantar mano",
+ roomLowerHand: "Bajar mano",
+ confirmActionTitle: "Confirma esta acción",
+ confirmActionButton: "Confirmar",
+ confirmJoinText: "Vas a unirte usando esta invitación.",
+ confirmFollowText: "Vas a apoyar a este habitante.",
+ confirmSignText: "Vas a firmar esta campaña.",
+ confirmDownloadText: "Vas a descargar este archivo a tu dispositivo.",
+ roomRecordings: "Grabaciones",
+ roomClearNotices: "Limpiar",
+ roomLineSwitchboard: "Centralita",
+ roomLineDndError: "El número de esta sala no acepta llamadas.",
+ roomNumberHint: "Marca este número desde Teléfono para entrar en la sala.",
+ liveRefresh: "Refrescar",
+ roomNobody: "Ahora mismo no hay nadie en la sala.",
+ roomSomeone: "{n} en la sala ahora mismo.",
+ roomYou: "tú",
+ roomYouAreIn: "Estás dentro",
+ roomNobodyInside: "Ahora mismo no hay nadie en esta sala.",
+ roomErrorFull: "La sala está llena. Podrás entrar cuando alguien salga.",
+ roomErrorUnreachable: "Ahora mismo no se puede llegar a la sala. Inténtalo más tarde.",
+ roomErrorBusy: "Ya estás en una llamada o en otra sala.",
+ roomErrorClosed: "Esta sala está cerrada.",
+ roomAccessDenied: "Esta sala es solo con invitación. Necesitas una invitación para entrar.",
+ roomsNoItems: "No se han encontrado salas.",
+ roomSearchPlaceholder: "Buscar salas...",
+ roomInviteMode: "Invitación",
+ tribeSectionRooms: "SALAS",
+ tribeRoomCreate: "Crear sala",
+ tribeRoomsEmpty: "Aún no hay salas.",
+ typeRoom: "SALAS",
+ typeRoomMember: "PARTICIPANTE DE SALA",
+ statsRoom: "Salas",
+ statsRoomMember: "Participantes de salas",
+ favoritesFilterRooms: "SALAS",
+ invitesRoomsTitle: "Salas",
+ inviteCodeInvalid: "Este código de invitación no es válido o ya se ha usado.",
+ inviteAlreadyMember: "Ya formas parte. Puedes abrirlo desde su módulo.",
+ actionFailed: "No se ha podido hacer. Inténtalo de nuevo.",
+ publishTooShort: "Tu publicación es demasiado corta.",
+ walletSendFailed: "No se ha podido enviar el pago: {reason}",
+ pixeliaCoordsError: "Esas coordenadas están fuera de la cuadrícula.",
+ courtsErrTitle: "Hace falta un título.",
+ courtsErrRespondent: "Indica contra quién es el caso.",
+ courtsErrRespondentId: "Ese no es un Oasis ID válido.",
+ courtsErrMethod: "Elige cómo se resolverá el caso.",
+ courtsErrCaseNotFound: "No se ha encontrado ese caso.",
+ courtsErrBrief: "Escribe tu respuesta.",
+ courtsErrStance: "Elige tu postura.",
+ courtsErrResult: "Escribe el resultado.",
+ courtsErrTerms: "Escribe los términos del acuerdo.",
+ courtsErrMediator: "Añade al menos un mediador.",
+ courtsErrSelfMediator: "No puedes ser mediador en tu propio caso.",
+ courtsErrJudge: "Elige un juez.",
+ courtsErrSelfJudge: "No puedes ser juez de tu propio caso.",
+ courtsErrVisibility: "Elige quién puede ver el caso.",
+ courtsErrNomination: "No se ha encontrado esa nominación.",
+ opinionAlreadyGiven: "Ya has dado tu opinión.",
+ cipherPasswordShort: "La contraseña debe tener al menos 32 caracteres.",
+ errorForbidden: "No tienes acceso a esto.",
+ errorNotFound: "No se ha encontrado.",
+ errorClosed: "Está cerrado.",
+ errorInviteOnly: "Esto es solo con invitación. Necesitas una invitación.",
+ errorTooLong: "Ese texto es demasiado largo.",
+ errorRequired: "Falta información obligatoria.",
+ errorInvalid: "Parte de la información no es válida.",
+ errorNotAuthor: "Solo quien lo creó puede hacer esto.",
+ panicRemoved: "Tu blockchain se ha eliminado.",
padRecentSectionTitle: "Pads Recientes",
padOpenSectionTitle: "Pads Abiertos",
padClosedSectionTitle: "Pads Cerrados",
@@ -3072,7 +3940,7 @@ module.exports = {
padRemoveFavorite: "Quitar de Favoritos",
padClose: "Cerrar",
padBackToEditor: "Volver al editor",
- padSearchPlaceholder: "Buscar pads...",
+ padSearchPlaceholder: "Buscar en Pads...",
calendarsTitle: "Calendarios",
calendarTitle: "Calendario",
@@ -3081,15 +3949,15 @@ module.exports = {
typeCalendar: "CALENDARIOS",
calendarCreate: "Crear Calendario",
calendarUpdate: "Actualizar",
- calendarDelete: "Eliminar",
calendarTitleLabel: "Título",
calendarTitlePlaceholder: "Título del calendario...",
calendarStatusLabel: "Estado",
+ calendarTypeLabel: "Tipo de calendario",
calendarStatusOpen: "ABIERTO",
calendarStatusClosed: "CERRADO",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Fecha límite",
calendarTagsLabel: "Etiquetas",
- calendarTagsPlaceholder: "etiqueta1, etiqueta2...",
+ calendarTagsPlaceholder: "Introduce etiquetas separadas por comas",
calendarParticipantsLabel: "Participantes",
calendarCreated: "Creado",
calendarJoin: "Unirse al Calendario",
@@ -3100,11 +3968,11 @@ module.exports = {
calendarNotePlaceholder: "Añadir una nota...",
calendarFirstDateLabel: "Fecha",
calendarFirstNoteLabel: "Notas",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Intervalo",
calendarIntervalNone: "Sin repetición",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Semanal",
+ calendarIntervalMonthly: "Mensual",
+ calendarIntervalYearly: "Anual",
calendarFormDescription: "Descripción",
calendarNoDates: "No hay fechas añadidas.",
calendarNoNotes: "Sin notas.",
@@ -3112,6 +3980,8 @@ module.exports = {
calendarsDescription: "Descubre y gestiona calendarios en tu red.",
calendarMonthPrev: "\u2190 Anterior",
calendarMonthNext: "Siguiente \u2192",
+ calendarMonthNames: "Enero,Febrero,Marzo,Abril,Mayo,Junio,Julio,Agosto,Septiembre,Octubre,Noviembre,Diciembre",
+ calendarDayInitials: "L,M,X,J,V,S,D",
calendarAllSectionTitle: "Calendarios",
calendarRecentSectionTitle: "Calendarios Recientes",
calendarFavoritesSectionTitle: "Favoritos",
@@ -3121,24 +3991,24 @@ module.exports = {
calendarCreateSectionTitle: "Crear Nuevo Calendario",
calendarUpdateSectionTitle: "Actualizar Calendario",
calendarAddFavorite: "Añadir a Favoritos",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Eliminar",
calendarRemoveFavorite: "Quitar de Favoritos",
- calendarSearchPlaceholder: "Buscar calendarios...",
+ calendarSearchPlaceholder: "Buscar en Calendario...",
calendarAddEntry: "Añadir Entrada",
statsCalendar: "Calendarios",
statsCalendarDate: "Fechas de Calendario",
statsCalendarNote: "Notas de Calendario",
modulesChatsLabel: "Chats",
- modulesChatsDescription: "Módulo para descubrir y gestionar chats cifrados.",
+ modulesChatsDescription: "Módulo para descubrir y gestionar chats.",
typeChat: "CHATS",
typeChatMessage: "MENSAJE DE CHAT",
chatsTitle: "Chats",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "Tus chats",
+ chatRecentTitle: "Chats recientes",
chatFavoritesTitle: "Favoritos",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "Chats abiertos",
+ chatClosedTitle: "Chats cerrados",
chatDescription: "Descripción",
chatCategory: "Categoría",
chatStatus: "ESTADO",
@@ -3153,34 +4023,172 @@ module.exports = {
chatMessagesLabel: "Mensajes",
chatThreadsLabel: "Hilos",
chatCreatedAt: "CREADO",
- chatSearchPlaceholder: "Buscar chats...",
+ chatSearchPlaceholder: "Buscar en Chats...",
chatStatusOpen: "ABIERTO",
- chatStatusInviteOnly: "SOLO INVITADOS",
+ chatStatusInviteOnly: "SOLO CON INVITACIÓN",
chatStatusClosed: "CERRADO",
chatSendMessage: "Enviar",
chatJumpLatest: "Último Mensaje",
+ chatReply: "Responder",
+ chatReplyCancel: "Cancelar respuesta",
+ chatPin: "Fijar",
+ chatUnpin: "Desfijar",
+ chatPinned: "Fijados",
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",
+ activitySearchPlaceholder: "Buscar en Actividad...",
+ trendingSearchPlaceholder: "Buscar en Tendencias...",
+ opinionsSearchPlaceholder: "Buscar en Opiniones...",
+ votesSearchPlaceholder: "Buscar en Votaciones...",
+ gamesSearchPlaceholder: "Buscar en Juegos...",
+ schoolTitle: "Escuela",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Se ha editado una página wiki que sigues.",
+ wikiBotRestoredTitle: "Se ha restaurado una versión anterior de una página wiki que sigues.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Un nuevo estudiante se ha apuntado a tu curso.",
+ schoolBotInvitedTitle: "Te han invitado a un curso.",
+ schoolBotAdmittedTitle: "Te han admitido en un curso.",
+ schoolBotCertificateTitle: "Has recibido un certificado.",
+ schoolBotPassedTitle: "Un estudiante ha aprobado tu curso.",
+ schoolBotLessonTitle: "Se ha publicado una nueva lección.",
+ invitesSchoolTitle: "Escuela",
+ schoolEnrollLabel: "Unirse al curso",
+ schoolExamRetryLater: "Podrás reintentarlo pasadas 24 horas.",
+ schoolApproved: "APROBADO",
+ schoolExamPassMark: "Nota de aprobado (0-10)",
+ schoolExamPassed: "APROBADO",
+ schoolExamPending: "Pendiente",
+ schoolExamFailed: "SUSPENDIDO",
+ schoolExamAddQuestion: "Añadir pregunta",
+ schoolExamCreateQuestion: "Crear pregunta",
+ schoolExamOption: "Opción",
+ schoolExamCorrect: "Opción correcta",
+ schoolExamPoints: "Puntos",
+ schoolMaterialTextPlaceholder: "Notas para esta lección...",
+ schoolMaterials: "Materiales",
+ schoolAddMaterial: "Añadir material",
+ schoolNoMaterials: "Aún no hay materiales.",
+ bankYourSchoolBalance: "Tus ingresos de la escuela",
+ schoolProgress: "Progreso",
+ schoolProgressMark: "Marcar como completada",
+ schoolProgressDone: "Completada",
+ schoolExams: "Exámenes",
+ schoolExamCreate: "Crear examen",
+ schoolExamTitlePlaceholder: "Título del examen",
+ schoolExamHelp: "Una pregunta por línea: ¿Pregunta? ; opción ; opción correcta* ; opción",
+ schoolExamQuestionsPlaceholder: "¿Qué es SSB? ; Una base de datos ; Un protocolo P2P* ; Un navegador",
+ schoolExamSubmit: "Enviar respuestas",
+ schoolExamScore: "Tu nota",
+ schoolNoScoresYet: "Aún no hay resultados.",
+ schoolLessonUnit: "Unidad / fase",
+ schoolLessonUnitPlaceholder: "p. ej. Fase 1",
+ schoolLessonOrder: "Orden",
+ profileClearnetSchoolLabel: "Escuela",
+ schoolStartDate: "Fecha de inicio",
+ schoolSessionDate: "Fecha de la sesión",
+ schoolCourseChat: "Chat del curso",
+ agendaFilterSchool: "ESCUELA",
+ agendaFilterCampaigns: "CAMPAÑAS",
+ agendaFilterLogistics: "LOGÍSTICA",
+ schoolCourseType: "Tipo de curso",
+ schoolTypeOpen: "ABIERTO",
+ schoolTypePaid: "DE PAGO",
+ schoolTypeInvite: "SOLO INVITACIÓN",
+ schoolLessonLocked: "Lección cifrada — pide la clave a quien imparte del curso.",
+ schoolGrantAccess: "Enviar clave del curso",
+ schoolKeySent: "Clave enviada",
+ schoolOngoing: "En curso",
+ schoolFilterApplied: "APUNTADO",
+ schoolFilterOpen: "ABIERTOS",
+ schoolFilterFavorites: "FAVORITOS",
+ schoolPendingPayment: "Pago pendiente",
+ schoolPendingStudents: "Inscripciones pendientes",
+ schoolViewBill: "Ver factura",
+ schoolPaymentNote: "Al inscribirte se genera una factura en ECO (una transferencia). Tu inscripción se confirma cuando la transferencia queda firmada.",
+ schoolCloseCourse: "Cerrar curso",
+ schoolReopenCourse: "Reabrir curso",
+ schoolDescription: "Enseña y aprende cursos en tu red.",
+ schoolFilterAll: "TODOS",
+ schoolFilterMine: "MÍOS",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RECIENTES",
+ schoolCreateButton: "Crear Curso",
+ schoolCreateSectionTitle: "Crear un curso",
+ schoolUpdateSectionTitle: "Actualizar curso",
+ schoolCourseTitlePlaceholder: "Nombre de tu curso",
+ schoolCourseDescriptionPlaceholder: "¿Qué vas a enseñar en este curso?",
+ schoolCourseImage: "Imagen del curso (tamaño máx: 75MB)",
+ schoolTags: "Etiquetas",
+ schoolTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ schoolPrice: "Precio (ECO)",
+ schoolVisibility: "Visibilidad",
+ schoolVisibilityPublic: "Público",
+ schoolVisibilityInvite: "Por invitación",
+ schoolStatus: "Estado",
+ schoolClosed: "Cerrado",
+ schoolFree: "Gratis",
+ schoolCreate: "Crear curso",
+ schoolUpdate: "Actualizar curso",
+ schoolSearchPlaceholder: "Buscar en Escuela...",
+ schoolSortTitle: "Título",
+ schoolNoCourses: "No se han encontrado cursos.",
+ schoolStudents: "Estudiantes",
+ schoolTeacher: "Docente",
+ schoolCreatedAt: "CREADO",
+ schoolLessons: "Lecciones",
+ schoolNoLessons: "Aún no hay lecciones.",
+ schoolEnrollToSee: "Inscríbete para ver las lecciones de este curso.",
+ schoolEnrollButton: "INSCRIBIRSE",
+ schoolUnenrollButton: "Abandonar curso",
+ schoolInviteRequired: "Este curso es por invitación.",
+ schoolTeacherPanel: "Panel docente",
+ schoolStudentPanel: "Panel del estudiante",
+ schoolAddLesson: "Crear lección",
+ schoolLessonTitlePlaceholder: "Título de la lección",
+ schoolLessonTextPlaceholder: "Describe las nociones que cubre esta lección...",
+ schoolInviteStudents: "Invitar estudiantes",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "INVITAR",
+ schoolInvited: "Invitadas",
+ schoolIssueCertificate: "Crear certificado",
+ schoolCertified: "Certificado",
+ schoolCertificateTextPlaceholder: "Nota del certificado (opcional)",
+ schoolLessonOpen: "Abrir lección",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificados",
+ schoolNoCertificates: "Aún no se han emitido certificados.",
+ schoolEditButton: "Editar",
+ schoolDeleteButton: "Borrar",
+ typeSchool: "ESCUELA",
+ schoolCourseLabel: "CURSO",
+ emergencyLabel: "EMERGENCIA",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Cursos",
+ statsSchoolLesson: "Lecciones",
+ statsSchoolEnroll: "Inscripciones",
+ statsSchoolCertificate: "Certificados de la escuela",
+ modulesSchoolLabel: "Escuela",
+ modulesSchoolDescription: "Módulo para intercambiar conocimiento.",
+ welcomeStepUxAction: "Guardar vista",
+ welcomeStepWorkflowTitle: "¿Qué uso de OASIS tienes en mente?",
+ welcomeStepWorkflowText: "Oasis tiene muchos módulos. Elige la configuración que encaje contigo y solo quedarán activados los útiles. Puedes ajustarlo cuando quieras en Módulos.",
+ welcomeStepWorkflowAction: "Guardar configuración",
+ welcomeWorkflow_full: "Por defecto",
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.",
chatTitlePlaceholder: "Título del chat",
chatDescriptionPlaceholder: "Descripción del chat",
- chatTagsPlaceholder: "etiqueta1, etiqueta2",
+ chatTagsPlaceholder: "Introduce etiquetas separadas por comas",
chatImageLabel: "Selecciona un archivo de imagen (.jpeg, .jpg, .png, .gif)",
- chatAuthor: "Autor",
+ chatAuthor: "Autora",
chatAddFavorite: "Añadir a Favoritos",
chatRemoveFavorite: "Quitar de Favoritos",
chatPM: "MP",
chatStatusLabel: "Estado",
+ chatTypeLabel: "Tipo de chat",
chatCategoryLabel: "Categoría",
gamesTitle: "Juegos",
gamesDescription: "Descubre y juega algunos juegos.",
@@ -3195,7 +4203,7 @@ module.exports = {
gamesTheFlowTitle: "ECOinflow",
gamesTheFlowDesc: "Conecta PUBs a habitantes mediante validadores, tiendas y acumuladores. ¡Sobrevive a la amenaza CBDC!",
gamesNeonInfiltratorTitle: "Neon Infiltrator",
- gamesNeonInfiltratorDesc: "Infiltra la cuadricula, recolecta datos confidenciales, evade los drones de seguridad y escapa. ¿Cuantos niveles puedes superar?",
+ gamesNeonInfiltratorDesc: "Infíltrate en la cuadrícula, recolecta datos confidenciales, evade los drones de seguridad y escapa. ¿Cuántos niveles puedes superar?",
gamesSpaceInvadersTitle: "Space Invaders",
gamesSpaceInvadersDesc: "¡Detén la invasión alienígena! Destruye oleadas de invasores antes de que lleguen al suelo.",
gamesArkanoidTitle: "Arkanoid",
@@ -3211,22 +4219,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Lanza una moneda y apuesta cara o cruz. ¿Cuánta suerte tienes?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "Billar visto desde arriba. Haz clic para apuntar y mantén pulsado para cargar la potencia. Mete todas las bolas con el menor número de tiros.",
+ gamesArtilleryTitle: "Artillería",
+ gamesArtilleryDesc: "Apunta tu cañón, ten en cuenta el viento y da en el blanco. 5 rondas: gana quien use menos disparos.",
+ gamesLabyrinthTitle: "Laberinto",
+ gamesLabyrinthDesc: "Escapa del laberinto antes de que se te acaben los movimientos. Cada nivel es más grande y más difícil.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Cómete todos los puntos y esquiva a los fantasmas. Los fantasmas se mueven en tiempo real: ¡no te detengas!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "Péndulo sonoro",
+ gamesAudioPendulumDesc: "Simulador de física caótica con síntesis de audio en tiempo real. Las velocidades angulares se convierten en frecuencias y los picos en golpes de percusión. No hay dos simulaciones que suenen igual.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Pincha visuales en directo con dos platos: elige un patrón para cada uno, ajusta velocidad, color y zoom, mezcla entre ambos y lanza destellos al ritmo. Marca el tempo o deja que el micrófono lleve el pulso.",
+ gamesTetrisDesc: "Los clásicos bloques que caen. Completa líneas para puntuar. ¿Cuánto aguantarás?",
+ gamesMinesweeperTitle: "Buscaminas",
+ gamesMinesweeperDesc: "La clásica caza de minas. Despeja el tablero para subir de nivel: cuadrículas más grandes, más minas, más puntuación.",
+ gamesFilterScoring: "PUNTUACIONES",
+ gamesHallOfFame: "Salón de la fama",
+ gamesHallPlayer: "Jugadora",
+ gamesHallScore: "Puntuación",
+ gamesNoScores: "Aún no hay puntuaciones.",
chatAccessDenied: "No tienes acceso a este chat. Solicita una invitación para acceder al contenido.",
padAccessDenied: "No tienes acceso a este pad. Solicita una invitación para acceder al contenido.",
contentAccessDenied: "No tienes acceso a este contenido.",
@@ -3234,6 +4246,146 @@ module.exports = {
tribeContentAccessDenied: "Acceso Denegado",
tribeContentAccessDeniedMsg: "Este contenido pertenece a una tribu. Debes ser miembro para acceder.",
tribeViewTribes: "Ver Tribus",
+ tribeFilesEmpty: "Aún no hay ficheros.",
+ filesLabel: "Ficheros",
+ profileClearnetFilesLabel: "Ficheros",
+ filesTitle: "Ficheros",
+ filesDescription: "Explora y gestiona ficheros en tu red.",
+ fileAllSectionTitle: "Ficheros",
+ fileMineSectionTitle: "Tus Ficheros",
+ fileRecentSectionTitle: "Ficheros Recientes",
+ fileTopSectionTitle: "Ficheros Destacados",
+ fileFavoritesSectionTitle: "Favoritos",
+ fileFilterAll: "TODOS",
+ fileFilterMine: "MÍOS",
+ fileFilterRecent: "RECIENTES",
+ fileFilterTop: "DESTACADOS",
+ fileFilterFavorites: "FAVORITOS",
+ fileCreateSectionTitle: "Subir Fichero",
+ fileUpdateSectionTitle: "Actualizar Fichero",
+ fileCreateButton: "Subir Fichero",
+ fileUpdateButton: "Actualizar",
+ fileAddFavoriteButton: "Añadir Favorito",
+ fileRemoveFavoriteButton: "Quitar Favorito",
+ fileFileLabel: "Selecciona un archivo (máx.: 75MB)",
+ calendarFilterRecent: "RECIENTES",
+ calendarFilterAll: "TODOS",
+ calendarFilterMine: "MÍOS",
+ calendarFilterFavorites: "FAVORITOS",
+ calendarFilterOpen: "ABIERTOS",
+ calendarFilterClosed: "CERRADOS",
+ padFilterRecent: "RECIENTES",
+ padFilterAll: "TODOS",
+ padFilterMine: "MÍOS",
+ padFilterOpen: "ABIERTOS",
+ padFilterClosed: "CERRADOS",
+ chatFilterRecent: "RECIENTES",
+ chatFilterAll: "TODOS",
+ chatFilterMine: "MÍOS",
+ chatFilterFavorites: "FAVORITOS",
+ chatFilterOpen: "ABIERTOS",
+ chatFilterClosed: "CERRADOS",
+ licenseLabel: "Licencia",
+ phoneTitle: "Teléfono",
+ phoneDescription: "Gestiona tus videollamadas cifradas de extremo a extremo.",
+ phoneUnavailable: "Las llamadas no están disponibles en este dispositivo.",
+ phoneCallButton: "Llamar",
+ profileVisibilityPhone: "Número de teléfono",
+ phoneNumberUnknown: "Nadie en tu red tiene el número {number}.",
+ phoneNumberChoose: "Comprueba a quién quieres llamar al {number}:",
+ phoneAnswer: "Contestar",
+ phoneSpeaker: "Altavoz",
+ phoneEarpiece: "Auricular",
+ phoneReject: "Rechazar",
+ phoneHangup: "Colgar",
+ phoneMute: "Silenciar",
+ phoneUnmute: "Activar micrófono",
+ phoneCameraOn: "Cámara on",
+ phoneCameraOff: "Cámara off",
+ settingsPhoneVideo: "Vídeo",
+ settingsPhoneVideoOn: "Permitido en llamadas y salas",
+ settingsPhoneVideoOff: "Solo audio",
+ phoneSilence: "No oír",
+ phoneUnsilence: "Volver a oír",
+ phoneCalling: "Llamando a",
+ phoneIsCalling: "te está llamando",
+ notifyNewPmFrom: "Nuevo MP de",
+ notifyNewPamFrom: "Nuevo PaM de",
+ notifyUpdateLabel: "Actualización",
+ updateInstalledLabel: "Versión instalada",
+ updateAvailableLabel: "Versión disponible",
+ updateChangesLabel: "Cambios",
+ updateFilesLabel: "Archivos",
+ updateOriginLabel: "Origen",
+ phoneRecording: "Grabando PaM para",
+ phoneLeaveMessage: "Nadie contesta: deja tu mensaje después de la señal.",
+ phoneLeaveMessageBusy: "Está en otra llamada: deja tu mensaje después de la señal.",
+ phoneLeaveMessageUnreachable: "No se ha podido contactar: deja tu mensaje después de la señal.",
+ phoneConnecting: "Conectando con",
+ phoneSendPam: "Enviar PaM",
+ phoneCancel: "Cancelar",
+ phoneSearchPlaceholder: "Buscar en Teléfono...",
+ phonePamTitle: "Grabaciones de audio",
+ phoneNew: "Nuevo",
+ phoneDelete: "Borrar",
+ phoneNoPams: "No tienes grabaciones de audio.",
+ phoneHistoryTitle: "Historial",
+ phoneLatestTitle: "Últimas llamadas",
+ phoneCreateButton: "Nueva llamada",
+ phoneLimitsHint: "Hasta 7 habitantes por llamada; con más de uno es una llamada conjunta.",
+ phoneErrorPub: "No se puede llamar a un pub.",
+ phoneJointCall: "Llamada conjunta",
+ phoneWith: "Con",
+ phoneResult: "Resultado",
+ phoneWhen: "Cuándo",
+ phoneDuration: "Duración",
+ phoneOutgoing: "Saliente",
+ phoneIncoming: "Entrante",
+ phoneNoHistory: "Aún no hay registros.",
+ phoneOutcomeEnded: "Atendida",
+ phoneOutcomeMissed: "Perdida",
+ phoneOutcomeRejected: "Rechazada",
+ phoneOutcomeNoanswer: "Sin respuesta",
+ phoneOutcomeCancelled: "Cancelada",
+ phoneOutcomePam: "PaM enviado",
+ phoneOutcomeFailed: "Fallida",
+ phoneDialAdd: "Añadir",
+ phoneDialBack: "Borrar",
+ phoneDialClear: "Limpiar",
+ phoneDialPlaceholder: "Número u Oasis ID",
+ phoneDialInhabitants: "Habitantes",
+ phoneDialRemove: "Quitar",
+ phoneOwnNumber: "Ese es tu propio número.",
+ phoneSettingsDesc: "Elige quién puede llamarte.",
+ phoneDnd: "No molestar",
+ phoneOpen: "Abierto",
+ phoneRecipientRefuses: "El habitante al que intentas llamar no permite recibir llamadas.",
+ phoneRefusedNotice: "Estos habitantes no permiten recibir llamadas y no se les ha llamado:",
+ fileEmptyError: "El archivo está vacío. Elige otro archivo.",
+ fileTitleLabel: "Título",
+ fileTitlePlaceholder: "Título",
+ fileDescriptionLabel: "Descripción",
+ fileDescriptionPlaceholder: "Descripción",
+ fileTagsLabel: "Etiquetas",
+ fileTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ fileSizeLabel: "Tamaño",
+ fileDownloadButton: "DESCARGA",
+ fileDetailsButton: "DETALLES",
+ fileNoFile: "Sin archivo fichero",
+ fileSearchPlaceholder: "Buscar en Ficheros...",
+ fileSearchButton: "Buscar",
+ fileSortRecent: "Más recientes",
+ fileSortOldest: "Más antiguos",
+ fileSortTop: "Más votados",
+ fileNoMatch: "No se encontraron ficheros coincidentes.",
+ fileUpdatedAt: "Actualizado",
+ typeFile: "FICHEROS",
+ modulesFilesLabel: "Ficheros",
+ modulesFilesDescription: "Módulo para descubrir y gestionar ficheros.",
+ tribeSectionFiles: "FICHEROS",
+ fileDescription: "Descripción",
+ fileDownload: "Descargar",
+ fileTypeLabel: "Tipo",
torrentsTitle: "Torrents",
torrentsDescription: "Explora y gestiona torrents en tu red.",
torrentAllSectionTitle: "Torrents",
@@ -3261,10 +4413,33 @@ module.exports = {
torrentTagsLabel: "Etiquetas",
torrentTagsPlaceholder: "Introduce etiquetas separadas por comas",
torrentSizeLabel: "Tamaño",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Generar torrent",
+ torrentFromContentMissing: "El fichero aún no está disponible en este nodo. Inténtalo en un rato.",
+ torrentDownloads: "Descargas",
+ torrentFetchOasis: "Descargar en Oasis",
+ torrentSaveFile: "Guardar fichero",
+ torrentSeeds: "semillas",
+ seedsLabel: "Semillas",
+ seedAction: "Soportar",
+ torrentSourceFile: "Fichero",
+ torrentStateQueued: "En cola",
+ torrentStateProbing: "Buscando semillas",
+ torrentStateDownloading: "Descargando",
+ torrentStateDone: "Completada",
+ torrentStateFailed: "Fallida",
+ torrentStateNoSource: "Sin semillas conectadas, esperando",
+ torrentStateCancelled: "Cancelada",
+ torrentNoDownloads: "Todavía no hay descargas.",
+ torrentOriginalSection: "Original",
+ torrentCancel: "Cancelar",
+ torrentDownloadButton: "DESCARGA",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETALLES",
torrentNoFile: "Sin archivo torrent",
noTorrents: "No se encontraron torrents.",
- torrentSearchPlaceholder: "Buscar título, etiquetas, autor...",
+ noFiles: "No se encontraron ficheros.",
+ torrentSearchPlaceholder: "Buscar en Torrents...",
torrentSearchButton: "Buscar",
torrentSortRecent: "Más recientes",
torrentSortOldest: "Más antiguos",
@@ -3272,10 +4447,12 @@ module.exports = {
torrentNoMatch: "No se encontraron torrents coincidentes.",
torrentUpdatedAt: "Actualizado",
statsTorrent: "Torrents",
+ statsFile: "Ficheros",
typeTorrent: "TORRENTS",
modulesTorrentsLabel: "Torrents",
modulesTorrentsDescription: "Módulo para descubrir y gestionar torrents.",
favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "FICHEROS",
favoritesFilterMarket: "MERCADO",
favoritesFilterEvents: "EVENTOS",
favoritesFilterForum: "FORO",
@@ -3289,15 +4466,17 @@ module.exports = {
favoritesFilterShopProducts: "ARTÍCULOS DE TIENDA",
tribeSectionTorrents: "TORRENTS",
tribeCreateTorrent: "Subir Torrent",
+ tribeCreateFile: "Subir fichero",
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",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Determina cómo accedes a todo el contenido y tu experiencia en la red Oasis.",
+ settingsWishWhole: "Multiverso",
+ settingsWishMutuals: "Solo soporte mutuo",
+ settingsWishOnlyLan: "Solo LAN",
+ settingsWishLocal: "Local",
settingsPmVisibilityTitle: "Mensajes Privados",
settingsPmVisibilityDesc: "Configura el nivel de exposición a mensajes privados que deseas tener en la red.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Multiverso",
+ settingsPmVisibilityMutuals: "Solo soporte mutuo",
pmMutualNotice: "El envío es una barrera de UX. La recepción es un filtro de atención (el cifrado ya está replicado).",
inhabitantsPendingFollowsTitle: "Solicitudes de apoyo pendientes",
inhabitantsPendingAccept: "Aceptar",
@@ -3334,14 +4513,14 @@ module.exports = {
tribeGovernanceNoCandidatures: "Sin candidaturas abiertas.",
tribeGovernanceAddRule: "Añadir regla",
tribeGovernanceNoRules: "Sin reglas todavía.",
- tribeGovernanceNoLeaders: "Sin líderes elegidos todavía.",
+ tribeGovernanceNoLeaders: "Sin liderazgo elegido todavía.",
tribeGovernanceComingSoon: "Próximamente en el módulo de gobierno de esta tribu.",
tribeGovNoProposals: "Aún no hay ninguna propuesta",
tribeGovNoLaws: "Aún no hay ninguna ley",
tribeGovNoRevocations: "Aún no hay ninguna revocación",
tribeGovNoHistorical: "Aún no hay ningún registro",
logsTitle: "Bitácora",
- logsDescription: "Registra tu experiencia en la red.",
+ logsDescription: "Lleva un diario privado de tus experiencias.",
logsViewTitle: "Bitácora",
logsColumnType: "Tipo",
logsView: "Ver",
@@ -3350,7 +4529,7 @@ module.exports = {
logsCreateTitle: "Crear entrada",
logsWriteButton: "Escribir",
logsTextPlaceholder: "Describe tus experiencias...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "Asistente IA",
logsModeManual: "Manual",
logsModeAI: "IA",
logsColumnLog: "Bitácora",
@@ -3369,19 +4548,20 @@ module.exports = {
logsExportOne: "Exportar registro",
logsViewDetails: "Ver detalles",
logsGenerateButton: "Generar texto",
- logsSearchText: "Buscar en bitácoras...",
+ logsSearchText: "Buscar en Bitácora...",
logsSearchAnyType: "Cualquier tipo",
logsSearchButton: "Buscar",
logsEmpty: "Aún no hay entradas.",
+ logsNothingNew: "No hay acciones nuevas que registrar.",
modulesLogsLabel: "Bitácora",
- modulesLogsDescription: "Módulo para registrar (vía asistente de IA) tus experiencias.",
+ modulesLogsDescription: "Módulo para llevar un diario privado de tus experiencias.",
statsLogsTitle: "Bitácora",
typeLog: "BITÁCORA",
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...",
+ larpSearchPlaceholder: "Buscar en L.A.R.P....",
larpAllHouses: "Casas:",
larpFilterRuling: "RIGE",
larpFilterHouses: "CASAS",
@@ -3390,42 +4570,43 @@ module.exports = {
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.",
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.",
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.",
+ larpRulesSignText: "Las 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 autora y de habitante. El sello enlaza a la página de la casa.",
larpPostsTitle: "Muro",
larpPostsEmpty: "Aún no hay publicaciones.",
larpPostPlaceholder: "¿Qué tiene que decir esta casa?",
larpPostSubmit: "Publicar",
larpCycleLabel: "Ciclo:",
- bankRulesArchTaxFormula: "ARCH Tax(usuario) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory",
+ bankRulesArchTaxFormula: "ARCH Tax(habitante) = 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.",
bankRulesChipFormula: "band = ratio / reducer, donde ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). alto ≥ 0.66, medio ≥ 0.33, en otro caso bajo.",
bankRulesChipNote: "El chip de cada elemento se colorea respecto al mensaje más grande visto en la red y se suaviza por el número de habitantes activos — una red más grande distribuye la carga y empuja más elementos a la banda verde.",
- bankRulesEcoTaxFormula: "ECO Tax(usuario) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "El impuesto ECO se deduce del UBI bruto cuando se calcula la asignación del epoch. Los ECO deducidos no se redistribuyen en este epoch — permanecen en el saldo del pub y alimentan el pool del próximo epoch a través de los topes reserveMin / alpha.",
+ bankRulesEcoTaxFormula: "ECO Tax(habitante) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
+ bankRulesEcoTaxNote: "El impuesto ECO se deduce de la RBU bruta cuando se calcula la asignación de la época. Los ECO deducidos no se redistribuyen en esta época — permanecen en el saldo del pub y alimentan el fondo de la próxima época a través de los topes reserveMin / alpha.",
bankRulesKarmaFormula: "karma = log10(1 + actions) + reputation",
- bankRulesKarmaNote: "El karma pondera tu participación en la red de cara a la asignación de UBI.",
+ bankRulesKarmaNote: "El karma se deriva de tus acciones (publicaciones, votos, participación en el parlamento/tribunales, etc.) con un factor de decaimiento temporal, menos los gramos de carbono que genera tu feed.",
bankRulesNetFormula: "net_UBI = floor + max(0, gross_UBI − floor) − ECO Tax − ARCH Tax",
bankRulesPoolFormula: "pool = min(pubBal − reserveMin, capPerEpoch, alpha · pubBal)",
bankRulesShareFormula: "share = clamp(1 + karma/100, w_min, w_max) / sum(weights)",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
bankTaxesArchTaxFootprintNote: "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.",
bankTaxesArchTaxNoteBold: "reducir el impuesto ARCH directamente",
- bankTaxesArchTaxNoteIntro: "Tu impuesto ARCH 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. Los habitantes más nuevos y los que se dediquen específicamente a tareas de archivo, replicación y mantenimiento probablemente tengan alguna tarea dedicada a mantener sano el archivo de la red en tu nombre. O pueden dedicarse a ",
+ bankTaxesArchTaxNoteIntro: "Tu impuesto ARCH se deduce del excedente que la red genera sobre tu RBU; el valor base de la RBU es un mínimo inamovible. El impuesto nunca se deduce del importe fijo que corresponde a cada habitante como RBU. Los fondos deducidos alimentan el algoritmo de redistribución de la riqueza y se canalizan a otras habitantes a través de sus reclamaciones de RBU. Los habitantes más nuevos y los que se dediquen específicamente a tareas de archivo, replicación y mantenimiento probablemente tengan alguna tarea dedicada a mantener sano el archivo de la red en tu nombre. O pueden dedicarse a ",
bankTaxesArchTaxNoteOutro: " mediante acuerdos de poda, deduplicación de datos redundantes e infraestructura de mantenimiento compartida, y su contribución continua puede ser requerida por consenso de la red.",
bankTaxesUserNoteChips: "El chip de impuesto ECO mostrado junto a cada elemento cambia de color (verde / amarillo / rojo) según el tamaño del elemento en relación con el bloque más grande visto en la red, suavizado por el número de habitantes activos — una red solar-punk más grande distribuye la carga y empuja más elementos a la banda verde.",
bankTaxesUserNoteOtherParams: "El impuesto ECO se deriva actualmente de la huella de carbono de cada bloque, pero puede incorporar otros parámetros con el tiempo — energía gastada en replicación, almacenamiento redundante entre peers, ancho de banda de blobs, coste computacional de descifrado, huella de minería de transacciones asociadas, o cualquier otra carga medible que la red acuerde valorar.",
gamesHallDate: "Fecha",
gamesNewRecord: "¡Nuevo récord!",
- indexingEditProfileLink: "Editar perfil",
- indexingMessage: "El servidor SSB está indexando. Vuelve en un momento.",
- indexingRefreshNote: "Esta página se recargará automáticamente.",
- indexingTitle: "Indexando",
+ indexingRefreshNote: "Esta página se recarga cada 10 segundos.",
+ indexingMessage: "Oasis está sincronizando la red de nodos distribuida. Por favor, espera.",
+ indexingTitle: "Sincronizando",
padsNoItems: "Aún no hay pads.",
padVersionHistory: "Historial",
+ padAttributionView: "Por autora",
padVersionView: "Ver versión",
statsChat: "Chats",
statsChatMessage: "Mensajes de chat",
- statsGameScore: "Gaming",
+ statsGameScore: "Juegos",
+ statsWiki: "Páginas wiki",
statsPad: "Pads",
statsPadEntry: "Entradas de pad",
typeGameScore: "PUNTUACIONES",
@@ -3443,6 +4624,14 @@ module.exports = {
settingsReplicationTitle: "Replicación",
settingsReplicationDesc: "Configura el número de saltos que tu nodo sigue desde tu propio feed al replicar contenido.",
settingsReplicationHopsLabel: "Saltos",
+ settingsBlobCacheTitle: "Caché de medios",
+ settingsBlobCacheDesc: "El contenido de otros habitantes se guarda en este dispositivo. Elige cuánto espacio puede ocupar.",
+ settingsBlobCacheUsage: "Uso actual",
+ settingsBlobCacheFiles: "ficheros",
+ settingsBlobCacheLimit: "Límite",
+ settingsBlobCacheUnlimited: "Sin límite",
+ settingsBlobCacheCleanNow: "Limpiar ahora",
+ settingsBlobCacheCleaned: "{n} ficheros eliminados, {size} liberados.",
aiApproveTagsLabel: "Etiquetas (separadas por comas)",
aiApproveTagsPlaceholder: "p.ej. oasis, gobernanza, ecología",
aiApproveRatingLabel: "Valoración",
@@ -3470,13 +4659,11 @@ module.exports = {
larpInviteBannerHint: "Comparte este código con alguien que esté en ACADEMIA. Expira en 30 ciclos o tras un uso.",
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",
+ ecoTaxLabel: "Tasa ECO",
bankTaxes: "Impuestos",
- bankOverviewYourTaxes: "Tus impuestos",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesArchTaxTitle: "ARCH Tax",
+ bankOverviewYourTaxes: "Impuestos totales",
+ bankTaxesEcoTaxTitle: "Tasa ECO",
+ bankTaxesArchTaxTitle: "Tasa ARCH",
bankTaxesUserAmount: "Tu ECO tax (precio a devolver)",
bankTaxesArchTaxUserAmount: "Tu ARCH tax (precio a devolver)",
bankTaxesArchTaxFirstBlock: "Edad de tu primer bloque",
@@ -3500,30 +4687,30 @@ module.exports = {
bankTaxesLookupPlaceholder: "ID del bloque (p. ej. %abc...=.sha256)",
bankTaxesLookupButton: "Inspeccionar",
bankTaxesLookupNotFound: "No se ha encontrado en tu feed local ningún bloque con ese ID.",
- bankTaxesLookupAuthor: "Autor",
+ bankTaxesLookupAuthor: "Autora",
bankTaxesLookupType: "Tipo",
bankTaxesLookupSize: "Tamaño",
bankTaxesLookupCarbon: "Huella de carbono",
- bankTaxesLookupEcoin: "ECO Tax",
+ bankTaxesLookupEcoin: "Tasa ECO",
bankExchangeEcoTaxAnnual: "ECOin Taxes (anual)",
bankExchangeEcoTaxMonthly: "ECOin Taxes (mensual)",
bankTaxesTypesLabel: "Selecciona qué impuestos quieres pagar",
bankTaxesTypesApply: "Establecer mis impuestos",
bankRulesPoolTitle: "Bolsa mensual",
- bankRulesShareTitle: "Reparto por usuario",
+ bankRulesShareTitle: "Reparto por habitante",
bankRulesKarmaTitle: "Karma (puntuación de implicación)",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesArchTaxTitle: "ARCH Tax",
+ bankRulesEcoTaxTitle: "Tasa ECO",
+ bankRulesArchTaxTitle: "Tasa ARCH",
bankRulesChipTitle: "Banda de color del chip ECO Tax",
bankRulesEpochKind: "Granularidad de epoch",
bankRulesAlpha: "Alpha (cuota máx. del balance del pub por epoch)",
bankRulesReserveMin: "Reserva mínima (se mantiene en el balance del pub)",
bankRulesCapPerEpoch: "Tope por epoch (absoluto)",
- bankRulesGraceDays: "Periodo de gracia del claim",
+ bankRulesGraceDays: "Periodo de gracia de la reclamación",
bankRulesWMin: "Peso mínimo (w_min)",
bankRulesWMax: "Peso máximo (w_max)",
- bankRulesFloor: "Suelo por usuario (bruto)",
- bankRulesCapUser: "Tope por usuario por epoch",
+ bankRulesFloor: "Suelo por habitante (bruto)",
+ bankRulesCapUser: "Tope por habitante por epoch",
bankRulesEcoTaxRate: "Tasa",
bankRulesArchTaxRate: "Tasa",
bankRulesCarbonFactor: "Factor de carbono",
@@ -3531,21 +4718,19 @@ module.exports = {
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",
+ audioTranscodeButton: "TRANSCODIFICAR",
audioTranscodeDetailTitle: "Transcodificar",
audioTranscodeDetailDescription: "Decodifica la carga útil incrustada y el mapa de composición original de la blockchain.",
- audioTranscodeStegoOasisId: "By",
audioTranscodeStegoTimestamp: "Generado el",
- audioTranscodeStegoMessage: "TEXT",
+ audioTranscodeStegoMessage: "TEXTO",
audioTranscodeStegoEmpty: "(ninguno)",
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.",
audioBackToBcs: "Volver a BCS",
melodyCompositionTitle: "Mapa de composición de la blockchain",
- melodyFilterMine: "MINE",
- melodyByLabel: "Por",
- melodyAllEmpty: "Todavía no hay composiciones BCS de otros habitantes.",
+ melodyFilterMine: "MÍAS",
+ melodyAllEmpty: "Todavía no hay composiciones BCS de otras habitantes.",
melodyNoteUnavailable: "el bloque no está en tu feed local",
melodyUploadBcsTitle: "Publicar",
melodyUploadBcsButton: "Publicar",
@@ -3570,18 +4755,18 @@ module.exports = {
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).",
+ modulesLarpDescription: "Módulo para la capa de juego de rol en vivo.",
larpProfileQ1: "Cuando te enfrentas a un problema complejo, ¿qué haces primero?",
- larpProfileQ1O1: "Hablar con otras personas para buscar consenso",
+ larpProfileQ1O1: "Hablar con otros habitantes para buscar consenso",
larpProfileQ1O2: "Construir un prototipo para probarlo",
larpProfileQ1O3: "Investigar la literatura",
larpProfileQ1O4: "Sabotear el sistema que lo provoca",
larpProfileQ2: "¿Qué da sentido a tu trabajo diario?",
- larpProfileQ2O1: "Defender a las personas que quiero",
+ larpProfileQ2O1: "Defender a los habitantes que quiero",
larpProfileQ2O2: "Crear algo tangible",
larpProfileQ2O3: "Sanar o cuidar la vida",
larpProfileQ2O4: "Trabajar con palabras e ideas",
- larpProfileQ2O5: "Hacer reír a los demás",
+ larpProfileQ2O5: "Hacer reír a las demás",
larpProfileQ3: "Cuando surge un conflicto en tu grupo, tú…",
larpProfileQ3O1: "Lideras el diálogo",
larpProfileQ3O2: "Tomas partido y te mantienes firme",
@@ -3644,7 +4829,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Selecciona qué modo de navegación UX quieres para tu interfaz.",
uxModeMenus: "Bloques",
- uxModeAINav: "AI",
+ uxModeChats: "Conversaciones",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Etiquetas en tendencia",
+ feedActiveTitle: "Habitantes Activos",
+ cnBrandSub: "Libre · P2P · Federada",
+ cnSyncedPeers: "Nodos sincronizados",
+ cnLicense: "Licencia",
+ cnNotAccessible: "El contenido no está accesible en este momento.",
+ cnUntitled: "Sin título",
+ cnSearchPlaceholder: "Buscar…",
+ cnHubTitle: "HUB Clearnet",
+ cnHubDescription: "Contenido público compartido por las habitantes de esta red Oasis.",
+ cnHubEmpty: "Aún no se ha compartido contenido público en la Clearnet.",
+ cnPublicContent: "Contenido",
+ cnTribesContent: "Tribus",
+ cnNetworkContent: "Red",
+ cnCategoryEmpty: "No hay contenido en esta categoría.",
+ cnInhabitantEmpty: "Este habitante aún no ha publicado contenido en la Clearnet.",
+ cnPrevPage: "← Anterior",
+ cnNextPage: "Siguiente →",
+ cnPageOf: "Página {page} de {pages}",
+ cnMoreInfo: "Más información →",
+ cnOpenCourse: "Curso abierto",
+ cnAuction: "SUBASTA",
+ cnExchange: "INTERCAMBIO",
+ cnRssDescription: "publicados por las habitantes de este HUB",
+ cnKindAudio: "Audio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Marcador",
+ cnKindDocument: "Documento",
+ cnKindEvent: "Evento",
+ cnKindFeed: "Feed",
+ cnKindImage: "Imagen",
+ cnKindJob: "Empleo",
+ cnKindMarket: "Mercado",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Proyecto",
+ cnKindCourse: "Curso",
+ cnKindShop: "Tienda",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "Fichero",
+ cnKindVideo: "Vídeo",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Sala",
+ cnKindMap: "Mapa",
+ uxModeAINav: "IA",
}
};
diff --git a/src/client/assets/translations/oasis_eu.js b/src/client/assets/translations/oasis_eu.js
index 30b7521..31e64c4 100644
--- a/src/client/assets/translations/oasis_eu.js
+++ b/src/client/assets/translations/oasis_eu.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "Erosketak",
shopMyOrdersDescription: "Zure erosketa-eskaerak.",
shopMyOrdersEmpty: "Oraindik ez duzu erosketarik.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM Saltzailea",
shopOrderSeller: "Saltzailea",
shopOrderInvoice: "Faktura",
shopOrderInvoiceConcept: "Faktura",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Onartu",
shopOrderReject: "Baztertu",
shopOrderMarkShipped: "Markatu bidalia",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM Eroslea",
shopOrderContractConcept: "Dendako eskaera",
shopOrdersPending: "Eskaera zain",
all: "Guztiak",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Azkenak",
anonymous: "Anonimoa",
unnamed: "Anonimoa",
- authorLabel: "EGILEA",
+ authorLabel: "Egilea",
delete: "Ezabatu",
save: "Gorde",
vote: "Bozkatu",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "Eduki abisua",
invalidPost: "Eduki baliogabea",
invalidPostHint: "Mezu honek testu baliogabea/hutsa du.",
- spreadBy: "Honek",
spreadChron: "Hedapena",
spreaded: "Hedatua",
spreadContentUnavailable: "Edukia oraindik ez dago eskuragarri (erreplikazioa zain)",
filteredByTag: "Etiketaz iragazia",
filteredByTagTitle: "Etiketaz iragazia",
feedPublishedSuccess: "Jarioa ondo argitaratu da!",
+ feedMastodonFailed: "Oasisen argitaratu da, baina ezin izan da Mastodonera bidali.",
tribeFeedSent: "Mezua ondo bidali da!",
tribeContentEncrypted: "Eduki zifratua",
tribeTorrentsEmpty: "Oraindik ez dago torrentik.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Azken bisita",
profileClearnetBookmarksLabel: "Laster-markak",
invitesPort: "Ataka",
- currentlyUnrecheable: "ERROREA!",
- peerHostValidation: "IPv4 baliozkoa (adib. 192.168.1.100) edo ostalari-izena (adib. pub.example.com)",
+ peerHostValidation: "IPv4 baliozkoa (adib. 192.168.1.100) edo ostalari-izena (adib. pub.solarnethub.com)",
peerPortValidation: "Ataka 1-65535",
peerKeyValidation: "SSB ed25519 gako publikoa (@<44 karaktere base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Zure lan-eskaintzatik baja",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Zereginaren deskribapena",
exportPasswordLabel: "Esportazio pasahitza",
importPasswordPlaceholder: "Sartu pasahitza",
- searchCasesPlaceholder: "Bilatu kasuak…",
+ searchCasesPlaceholder: "Bilatu hemen: Auzitegiak...",
shopBuyDeliveryAddressPlaceholder: "Bidalketa-helbidea",
shopBuyNotesPlaceholder: "Oharrak",
bankTaxesUserNoteBold: "ECO zerga zuzenean murriztea",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Lagundu kasua",
courtsSettlementAcceptBtn: "Onartu akordioa",
courtsSupportCount: "Babesak",
- courtsVerdictVoteTitle: "Bozkatu epaia",
- courtsVerdictVoteLabel: "Epaiaren botoa",
- courtsVerdictVoteAccept: "Onartu",
- courtsVerdictVoteReject: "Baztertu",
- courtsVerdictVoteSubmit: "Bidali botoa",
reportsSetStatus: "Ezarri egoera",
reportsStatusClosed: "ITXITA",
statsAvgPerInhabitant: "Batez bestekoa biztanleko",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Abatarra",
inhabitants: "Bizilagunak",
- peersReplicatedFeeds: "Errepikatutako jarioak",
+ peersReplicatedFeeds: "Erreplikatuak",
+ peersTorColumn: "TOR",
+ peersTorYes: "Tor bidez irisgarria",
+ peersTorNo: "Ez da Tor bidez irisgarria",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Bertsioa",
graphos: "Graphos",
graphosDescription: "Sarearen mapa interaktiboa zure inguruan.",
+ graphosFederation: "Federazioa",
+ graphosFedPubs: "PUBak",
+ graphosFedUnreachable: "Iritsiezinak",
+ graphosFedLinks: "Elkarrekiko loturak",
+ graphosFedIsolated: "Isolatuak",
+ graphosFedNoData: "Daturik gabe",
+ graphosFedMutual: "Elkarrekikoa",
+ graphosFedOneWay: "Norabide bakarrean",
+ graphosFedTransport: "Sarea",
+ graphosFedWith: "Honekin federatua",
+ graphosZoom: "Handitu",
+ graphosFedInhabitants: "Biztanleak",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "Zure nodoak oraindik ez du PUBik ezagutzen.",
graphosViewingGraphOf: "Ikusten",
graphosBackToMine: "← Nire sarea",
graphosShowing: "Erakusten",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "Ez duzu aipamenik jaso, oraindik.",
- mentionsSearchPlaceholder: "Bilatu aipamenak...",
+ mentionsSearchPlaceholder: "Bilatu hemen: Aipamenak...",
privateReminders: "OROIGARRIAK",
+ inboxFilterPms: "MPak",
+ inboxFilterNotifications: "Jakinarazpenak",
+ inboxMarkRead: "Irakurritako gisa markatu",
+ inboxMarkUnread: "Irakurri gabeko gisa markatu",
+ inboxUnreadChip: "Irakurri gabe",
+ inboxMarkAllRead: "Dena irakurritzat markatu",
+ inboxDeleteShown: "Dena ezabatu",
+ inboxArchive: "Artxibatu",
+ inboxUnarchive: "Desartxibatu",
+ inboxFilterArchived: "Artxibatuak",
+ inboxEarlierMessages: "aurreko mezu",
+ inboxSortThread: "Harien arabera",
+ inboxSortRecent: "Berrienak lehenik",
+ inboxAllBots: "Botak",
+ settingsInboxBotsTitle: "Inbox jakinarazpenak",
+ settingsInboxBotsDesc: "Aukeratu zein botek jakinaraz diezazuketen Inboxean. Markatu gabeko botak ezkutatu egiten dira eta haien abisuak ez dira zenbatzen.",
inboxFiltersLabel: "Iragazkiak:",
inboxToggleToMutuals: "Mutuora aldatu",
inboxToggleToWhole: "Guztiora aldatu",
@@ -214,8 +244,9 @@ module.exports = {
searchFromLabel: "Hasiera",
searchToLabel: "Bukaera",
searchQueryLabel: "Bilaketa",
- searchPerPageLabel: "Emaitzak orriko",
+ searchPerPageLabel: "Emaitzak",
settings: "Ezarpenak",
+ settingsDescription: "Konfiguratu zure sarearen ingurunea.",
continueReading: "Irakurtzen jarraitu",
moreComments: "iruzkin gehiago",
readThread: "irakurri hari osoa",
@@ -236,7 +267,6 @@ module.exports = {
profileClearnetHelp: 'Oasis kanpotik atzitu daitezkeen moduluak.',
profileHubAll: 'Guztiak',
footerLicenseLabel: 'Lizentzia',
- profileSwitchToOasis: 'Itzuli Oasisera',
profileVisibilityFediverse: "Multibertsoa",
contributorsTitle: "Ekarpenak",
colorLabel: 'Hautatu kolorea',
@@ -246,6 +276,7 @@ module.exports = {
modulesViewTitle: "Moduluak",
modulesViewDescription: "Konfiguratu zure ingurunea moduluak gaitu edo desgaituz.",
inbox: "Sarrera-ontzia",
+ inboxSearchPlaceholder: "Bilatu hemen: Sarrera-ontzia...",
multiverse: "Multibertsoa",
fediverse: "Multibertsoa",
fediverseDescription: "Kudeatu zure beste multibertso kontuak, edukia bidaltzea eta jasotzea barne.",
@@ -254,9 +285,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Zerbitzaria",
+ nextcloudUserLabel: "Erabiltzailea",
+ nextcloudFolderLabel: "Karpeta",
+ nextcloudUploadButton: "Igo",
+ nextcloudFileLabel: "Aukeratu fitxategi bat",
+ fileExternalLink: "Kanpoko esteka",
+ nextcloudErrConnect: "Ezin izan da Nextcloud-era iritsi datu hauekin.",
+ nextcloudErrUpload: "Nextcloud-era igotzeak huts egin du.",
+ nextcloudErrShare: "Nextcloud-ek ez du esteka publikorik eman fitxategiarentzat.",
fediverseDisconnect: "Deskonektatu",
fediverseEmptyLink: "ezarpenetatik",
fediverseComposePlaceholder: "Zer duzu buruan?",
@@ -285,6 +324,76 @@ module.exports = {
fediverseErrPost: "Ezin izan da argitaratu.",
fediverseErrMedia: "Ezin izan da fitxategia igo.",
fediverseErrEmpty: "Idatzi zerbait edo erantsi fitxategi bat.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Telefono zenbakia",
+ telegramSendCode: "Bidali kodea",
+ telegramCodeHelp: "Sartu Telegramek bidali dizun kodea (aplikazioa edo SMS).",
+ telegramCodeLabel: "Kodea",
+ telegramPasswordHelp: "Kontu honek bi urratseko egiaztapena du. Sartu pasahitza.",
+ telegramPasswordLabel: "Pasahitza",
+ telegramVerify: "Egiaztatu",
+ telegramCancel: "Utzi",
+ telegramChats: "Txatak",
+ telegramUnread: "Irakurri gabe",
+ telegramOpen: "Ireki",
+ telegramSend: "Bidali",
+ telegramYou: "Zu",
+ telegramNoChats: "Oraindik ez dago txatik.",
+ telegramNoMessages: "Oraindik ez dago mezurik.",
+ telegramComposePlaceholder: "Idatzi mezu bat…",
+ telegramChannel: "Kanala",
+ telegramGroup: "Taldea",
+ telegramPrivate: "Pribatua",
+ telegramErrConnect: "Ezin izan da Telegramekin konektatu.",
+ telegramErrTimeout: "Telegramek gehiegi tardatu du erantzuten.",
+ telegramErrAuth: "Telegram saioa baliogabea edo iraungita. Konektatu berriro.",
+ telegramErrFetch: "Ezin izan dira txatak kargatu.",
+ telegramErrSend: "Ezin izan da mezua bidali.",
+ telegramErrMissing: "API ID, API hash eta telefono zenbakia behar dira.",
+ telegramErrCode: "Kode okerra. Saiatu berriro.",
+ telegramErrCodeExpired: "Kodea iraungi da. Hasi berriro.",
+ telegramErrPassword: "Pasahitz okerra.",
+ telegramErrPhone: "Telefono zenbaki baliogabea.",
+ telegramErrApi: "API ID edo API hash baliogabea.",
+ telegramErrFlood: "Saiakera gehiegi. Itxaron pixka bat eta saiatu berriro.",
+ telegramErrNoLogin: "Ez dago saio-hasierarik abian. Hasi berriro.",
+ peertubeUsernameLabel: "Erabiltzailea",
+ peertubePasswordLabel: "Pasahitza",
+ peertubeSubscriptions: "Harpidetzak",
+ peertubeMyVideos: "Nire bideoak",
+ peertubeVideos: "Bideoak",
+ peertubeFollowers: "Jarraitzaileak",
+ peertubeViews: "ikustaldi",
+ peertubeLikes: "atsegin",
+ peertubeQuota: "Kuota",
+ peertubeUpload: "Bideoa igo",
+ peertubeUploadHelp: "Aukeratu bideo fitxategi bat. Zure kanalera igotzen da eta PeerTubek gero prozesatzen du.",
+ peertubeTitleLabel: "Izenburua",
+ peertubeDescriptionLabel: "Deskribapena",
+ peertubePrivacyLabel: "Pribatutasuna",
+ peertubePrivacyPublic: "Publikoa",
+ peertubePrivacyUnlisted: "Zerrendatu gabea",
+ peertubePrivacyPrivate: "Pribatua",
+ peertubeNoVideos: "Oraindik ez dago bideorik.",
+ peertubeComments: "Iruzkinak",
+ peertubeComment: "Iruzkindu",
+ peertubeCommentPlaceholder: "Idatzi iruzkin bat…",
+ peertubeNoComments: "Oraindik ez dago iruzkinik.",
+ peertubeOpen: "PeerTuben ireki",
+ peertubeWatch: "Ikusi",
+ peertubeChannel: "Kanala",
+ peertubeNoStream: "Bideo hau oraindik ezin da hemen erreproduzitu. Ireki PeerTuben.",
+ peertubeUploaded: "Bideoa igo da. PeerTube prozesatzen ari da.",
+ peertubeErrConnect: "Ezin izan da PeerTuberekin kontaktatu.",
+ peertubeErrAuth: "Erabiltzaile edo pasahitz okerra, edo saioa iraungi da. Konektatu berriro.",
+ peertubeErrInstance: "Instantziaren URL baliogabea.",
+ peertubeErrMissing: "Instantzia, erabiltzailea eta pasahitza behar dira.",
+ peertubeErrFetch: "Ezin izan dira bideoak kargatu.",
+ peertubeErrUpload: "Ezin izan da bideoa igo.",
+ peertubeErrTitle: "Izenburua behar da.",
+ peertubeErrComment: "Ezin izan da iruzkina argitaratu.",
+ peertubeErrNoFile: "Aukeratu bideo fitxategi bat.",
bookmarksLabel: "Markagailuak",
videosLabel: "Bideoak",
torrentsLabel: "Torrentak",
@@ -307,7 +416,6 @@ module.exports = {
comment: "Iruzkindu",
subtopic: "Azpi-gaia",
json: "JSON",
- createdBy: "Sortzailea",
unfollow: "Laguntza eten",
follow: "Lagundu",
block: "Blokeatu",
@@ -323,12 +431,15 @@ module.exports = {
relationshipNone: "Ez duzu laguntzen",
relationshipBlockingPost: "Blokeatutako bidalketa",
viewLikes: "Ikusi zabalpenak",
+ viewSupporters: "Ikusi laguntzaileak",
spreadedDescription: "Bizilagunak zabaldutako bidalketen zerrenda.",
preview: "Aurrebista",
publish: "Idatzi",
contentWarningPlaceholder: "Gehitu gaia bidalketari (hautazkoa)",
- publishWarningPlaceholder: "Gorputza 7000 karakteretara mugatua.",
+ publishWarningPlaceholder: "Idatzi zure sarreraren gorputza.",
publishTooLong: "Zure argitalpena luzeegia da. Laburtu ezazu, mesedez.",
+ keepTextRetry: "Berriro bidali",
+ dateInPastError: "Data ezin da gaur baino lehenagokoa izan",
publishCustomDescription: [
"GOGORATU: Blockchain teknologia dela eta, bidalketa argitaratu ezkero, ezin izango da aldatu ezta ezabatu.",
],
@@ -358,9 +469,8 @@ module.exports = {
mentionsMatching: "Bat datozen aipamenak",
mentionsName: "Izena",
mentionsRelationship: "Erlazioa",
- updateit: "LORTU EGUNERAKETAK!",
updateBannerText: "Oasis-en bertsio berri bat eskuragarri dago.",
- updateBannerAction: "Eguneratu orain →",
+ updateBannerAction: "Eguneratu orain!",
info: "Infoa",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -368,16 +478,14 @@ module.exports = {
timeAgo: "dela",
sendTime: "honi buruz ",
theme: "Gaia",
- legacy: "Gakoak",
- legacyTitle: "Gakoak",
- legacyDescription: "Kudeatu zure sekretua (gako pribatua) bizkor eta segurtasunez.",
- legacyExportButton: "Esportatu",
- legacyImportButton: "Inportatu",
+ backupKeysExportButton: "Esportatu",
+ backupKeysImportButton: "Inportatu",
ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Konfiguratu blockchain fluxuetarako mezu-muga.",
+ logWindowChip: "Azken {n} blockchain stream",
saveSettings: "Ezarpenak gorde",
exportDescription: "Ezarri pasahitza (gutxienez 32 karaktere) zure gakoa zifratzeko",
- exportDataTitle: "Babeskopia",
+ exportDataTitle: "Bat-bateko babeskopia",
exportDataDescription: "Deskargatu zure datuak (gako sekretua izan ezik!)",
exportDataButton: "Deskargatu datu-basea",
importDescription: "Inportatu zifratutako sekretua (gako pribatua) zure abatarra gaitzeko",
@@ -386,38 +494,33 @@ module.exports = {
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.",
+ welcomeBannerText: "Zure avatarra oraindik ez dago konfiguratuta.",
aiSuggestionBanner: "Iradokizuna:",
aiSuggestionsEnable: "AAren iradokizunak",
- welcomeBannerAction: "Hasi!",
+ welcomeBannerAction: "Hasi",
welcomeTitle: "Ongi etorri",
+ welcomeStepIdentity: "Nortasuna",
+ welcomeStepType: "Mota",
+ welcomeStepUse: "Erabilera",
+ welcomeStepLook: "Itxura",
+ welcomeStepCommunity: "Komunitatea",
+ welcomeStepIntro: "Ongi etorria",
+ welcomeHintIdentity: "Zure izena eta irudia.",
+ welcomeHintType: "Nola irekitzen den Oasis zuretzat.",
+ welcomeHintUse: "Zein modulu geratzen diren aktibo.",
+ welcomeHintLook: "Oasisek janzten duen gaia.",
+ welcomeHintCommunity: "Sartu PUB batean beste biztanle batzuk ezagutzeko.",
+ welcomeHintIntro: "Bidali lehen agur bat komunitateari.",
+ welcomeStepThemeAction: "Erabili gai hau",
+ welcomeJoinPubs: "Sartu PUBetan",
+ welcomeNoFederation: "Federatu gabe",
welcomeStepGreetingAction: "Bidali",
- welcomeJoinPubButton: "Batu pubera",
- welcomeStepLarpAction: "Batu \"Akademiara\"",
- welcomeStepLarpText: "Batu gure zuzeneko rol jokora.",
- welcomeStepLarpTitle: "Batu L.A.R.P.era",
- welcomeStepGreetingTitle: "Bidali \"Kaixo mundua!\" bat",
- welcomeStepGreetingText: "Bidali mezu bat beste biztanleek aurki zaitzaten.",
- welcomeJoinPub: "Batu:",
welcomeDescription: "Hasi aurretik komeni diren gauza batzuk.",
- welcomeProgress: "Osatuta",
- welcomeStepDone: "eginda",
- welcomeStepPending: "egiteke",
welcomeSkip: "Orain ez",
- welcomeStepLanguageTitle: "Aukeratu zure hizkuntza",
- welcomeStepLanguageText: "Oasisek hainbat hizkuntza hitz egiten ditu. Nahi duzunean alda dezakezu.",
- welcomeStepProfileTitle: "Editatu zure profila",
- welcomeStepProfileText: "Aukeratu izena, gehitu deskribapena eta jarri irudi bat beste biztanleek ezagut zaitzaten.",
welcomeStepProfileAction: "Gorde profila",
- welcomeStepFederationTitle: "Batu sare nagusira",
- welcomeStepFederationText: "Konektatu gure pubera beste biztanleak ezagutu eta erreplikatzen hasteko.",
- welcomeStepFederationAction: "Joan gonbidapenetara",
- welcomeStepBackupTitle: "Egin zure IDaren babeskopia",
- welcomeStepBackupText: "Zure identitatea gailu honetako gako-fitxategi bat da.",
- welcomeStepBackupWarning: "GALTZEN BADUZU, INORK EZIN DIZU BERRESKURATU.",
- welcomeStepBackupAction: "Babeskopia!",
+ welcomeBootstrapRunning: "Pub-aren argazkia kargatzen. Amaitzean pub-era batuko da automatikoki; bitartean Oasis erabiltzen jarrai dezakezu.",
welcomeCompleteTitle: "Dena prest.",
- welcomeCompleteText: "Zure nodoa prest dago. Hemendik aurrera sarea jarraitzen duzun jendearekin hazten da.",
+ welcomeCompleteText: "Zure nodoa prest dago. Hemendik aurrera sarea babesten dituzun bizilagunekin hazten da.",
welcomeFindPeople: "Bilatu biztanleak",
devFilterFiles: "FITXATEGIAK",
devFilterSearch: "BILATU",
@@ -427,7 +530,7 @@ module.exports = {
devFilterTests: "TESTAK",
devVersion: "Bertsioa",
devNodeVersion: "Node",
- devStatsTests: "Test multzoak",
+ devStatsTests: "Testak",
devParentFolder: "Goiko karpeta",
devOpenFolder: "ireki",
devDescription: "Arakatu nodo honetan exekutatzen ari den kodea.",
@@ -471,6 +574,27 @@ module.exports = {
"Beste hizkuntza bat erabili nahi baduzu, hautatu hemen.",
setLanguage: "Ezarri hizkuntza",
peerConnectionsIntro: "Kudeatu beste parekoekin dituzun konexio guztiak.",
+ peersConnectFailed: "Ezin izan da konektatu: {reason}.",
+ peerStateLabel: "Egoera",
+ peerAddressLabel: "Helbidea",
+ peerLastChangeLabel: "Azken aldaketa",
+ peerStateConnected: "Konektatuta",
+ peerStateConnecting: "Konektatzen",
+ peerStateStaged: "Erabilgarri",
+ peerErrSilent: "Jarduerarik gabe",
+ peerErrTimeout: "Ez du erantzuten",
+ peerErrRefused: "Konexioa baztertzen du",
+ peerErrNotFound: "Helbide ezezaguna",
+ peerErrUnreachable: "Sarea eskuraezin",
+ peerErrKeys: "Gako desberdinak erabiltzen",
+ peerErrIdentity: "Ez du zure konexioa onartzen",
+ peerErrTor: "TOR soilik",
+ peerErrDropped: "Konexioa etenda",
+ peerErrPaused: "Sarea pausan",
+ peerErrOther: "Konexio-errorea",
+ peerOutdated: "Zaharkituta",
+ peerVersionUnannounced: "Ez du bere bertsioa iragartzen: Oasis zahar bat",
+ peersTorMissing: "PUB honek TOR bidezko konexioak soilik onartzen ditu.",
peerConnectionsTitle: "Konexioak",
online: "Linean",
offline: "Lineaz kanpo",
@@ -489,22 +613,25 @@ module.exports = {
noConnections: "Konektatutako parekorik ez.",
noDiscovered: "Ez duzu nodorik aurkitu.",
noUnknownPeers: "Ez dago kide ezezagunik adiskidetza-grafoan.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Oraindik ez dago nodorik erregistratuta.",
+ peerConnect: "Konektatu",
+ peerDisconnect: "Deskonektatu",
peerRefresh: "Berritu",
peerPruneIdle: "Inaktiboak kendu",
+ peersPause: "Pausatu",
+ peersResume: "Jarraitu",
+ peersPausedNote: "Pausan: Oasis ez da inorekin konektatzen eta inor ezin da harekin konektatu.",
+ peersPauseHint: "Konexio guztiak gelditzen ditu: Oasis ez da beste nodoetara konektatzen eta ez ditu onartzen berriro hasi arte.",
peerExport: "Esportatu",
peerImport: "Inportatu",
peerImportTitle: "Peer-zerrenda inportatu",
peerImportPlaceholder: "Itsatsi multiserver-helbide bat lerro bakoitzeko, edo igo .txt fitxategi bat…",
connectionActionIntro:
"",
- startNetworking: "Abiarazi sarea",
- stopNetworking: "Gelditu sarea",
- restartNetworking: "Berrabiarazi sarea",
- sync: "Sinkronizatu sarea",
indexes: "Indizeak",
+ indexesRebuilt: "Indizeak berreraiki dira",
+ indexesRebuildFailed: "Ezin izan dira indizeak berreraiki",
+ indexesFiles: "Indize fitxategiak",
indexesDescription:
"Indizeak birsortzea segurua da eta hutsegite mota batzuk konpon ditzake.",
homePageTitle: "Hasierako orria",
@@ -514,44 +641,33 @@ module.exports = {
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",
invitesChatsTitle: "Txatak",
- invitesChatInviteCodePlaceholder: "Sartu txataren gonbidapen kodea",
- invitesChatJoinButton: "Sartu txatean",
invitesPadsTitle: "Padak",
- invitesPadInviteCodePlaceholder: "Sartu padaren gonbidapen kodea",
- invitesPadJoinButton: "Sartu padean",
invitesCalendarsTitle: "Egutegia",
- invitesCalendarInviteCodePlaceholder: "Sartu egutegiaren gonbidapen kodea",
- invitesCalendarJoinButton: "Sartu egutegian",
invitesEventsTitle: "Ekitaldiak",
- invitesEventInviteCodePlaceholder: "Sartu ekitaldiaren gonbidapen kodea",
- invitesEventJoinButton: "Sartu ekitaldian",
invitesForumsTitle: "Foroak",
- invitesForumInviteCodePlaceholder: "Sartu foroaren gonbidapen kodea",
- invitesForumJoinButton: "Sartu foroan",
invitesMapsTitle: "Mapak",
- invitesMapInviteCodePlaceholder: "Sartu maparen gonbidapen kodea",
- invitesMapJoinButton: "Sartu mapan",
invitesShopsTitle: "Dendak",
- invitesShopInviteCodePlaceholder: "Sartu dendaren gonbidapen-kodea",
- invitesShopJoinButton: "Bat egin dendarekin",
invitesPubsTitle: "PUBak",
+ invitesSuggestedPubs: "Iradokitako PUBak",
+ invitesFilterOthers: "Besteak",
+ invitesJoinTitle: "Gonbidapenak",
+ invitesJoinHint: "Itsatsi edozein gonbidapen-kode, edozertarako dela ere, edo biztanle baten Oasis IDa.",
+ invitesJoinPlaceholder: "Gonbidapen-kodea edo Oasis IDa",
+ invitesJoinButton: "Sartu",
+ invitesUsedTitle: "Azken gonbidapenak",
+ invitesUsedEmpty: "Oraindik ez duzu gonbidapenik erabili.",
+ invitesUsedType: "Mota",
+ invitesUsedName: "Izena",
+ invitesUsedDate: "Data",
invitesPubInviteCodePlaceholder: "Sartu PUB-aren gonbidapen kodea",
invitesAcceptInvite: "Sartu PUBean",
+ invitesPubUses: "Erabilitako gonbidapenak",
+ invitesPubExhausted: "PUB honek ez du gonbidapen erabilgarririk.",
invitesAlreadyFederated: "Dagoeneko pub honekin federatuta zaude.",
+ invitesJoinPubMode: "Oasis hau PUB gisa dabil, irakurtzeko moduan soilik. Beste PUB batekin batzeko, erabili terminalean: ./oasis.sh join ",
+ invitesJoinLocalOnly: "Gonbidapenak Oasis dabilen gailutik bakarrik onar daitezke, edo abiaraztean erakusten duen administrazio-estekarekin.",
invitesFederationsTitle: "Federazioak",
invitesAcceptedInvites: "Federatuak",
invitesUnfollow: "Utzi jarraitzea",
@@ -559,16 +675,12 @@ module.exports = {
invitesUnfollowedInvites: "Ez federatuak",
invitesNoUnfollowed: "Ez dago pub ez-federaturik.",
invitesNoFederatedPubs: "Ez dago pub federaturik.",
- invitesUnreachablePubs: "Iristezinak",
- invitesNoUnreachablePubs: "Ez dago pub iristezinik.",
invitesPubsRefresh: "Berritu",
- invitesPubsClearUnreachable: "Kendu iristezinak",
+ invitesPubsClearUnreachable: "Garbitu",
invitesPubsExport: "Esportatu",
invitesPubsImport: "Inportatu",
invitesPubsImportTitle: "Inportatu pubak",
invitesPubsImportPlaceholder: "Itsatsi multiserver-helbide bat edo gonbidapen-kode bat lerro bakoitzeko, edo igo .txt fitxategi bat…",
- currentlyUnreachable: "ERROR!",
- errorDetails: "Errore Xehetasunak",
genericError: "Errore bat gertatu da.",
panicMode: "Izu Modua!",
encryptData: "Idatzi pasahitza (gutxienez 32 karaketere) zure blockchain-a zifratzeko.",
@@ -595,7 +707,6 @@ module.exports = {
votesOptionNoLabel:"Ez",
votesOptionAbstentionLabel:"Abstentzioa",
votesQuestionLabel:"Galdera",
- votesCreatedByLabel:"Noiz",
voteStatusOpen:"IREKITA",
voteStatusClosed:"ITXITA",
commentDescription: ({ parentUrl }) => [
@@ -612,22 +723,22 @@ module.exports = {
searchSubmit: "Bilatu...",
votesLabel: "GOBERNUA",
pdfFallbackLabel: "PDF Dokumentua",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "DENDAK",
+ voteLabel: "BOTOAK",
submit: "Bidali",
editProfile: "Editatu Abatarra",
oasisIdLabel: "OasisID",
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- /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.",
+ 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- [/avatar](/profile) — Editatu zure avatarra, izena, deskribapena eta zein modulu agertuko diren zure alde publikoan.\n- /settings — Doitu zure instantzia lokala: hizkuntza, gaia, moduluak, pribatutasuna eta sinkronizazioa.\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 bizilagunen avatarrak.\n- /tribes — Sortu edo elkartu muturretik muturrera zifratutako talde pribatuetan.\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",
profileDeviceLockedHint: "Sentsore hau beti dago aktibo: besteei zein gailutatik konektatzen zaren erakusten die eta ezin da desgaitu.",
profileVisibilityKarma: "KARMA puntuazioa",
- profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "ECOIN zorroa",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "OBU",
+ profileVisibilityWallet: "ECOin zorroa",
+ profileVisibilityEcoTax: "ECO tasa",
+ profileVisibilityLarpSign: "L.A.R.P. zigilua",
profileVisibilityGpg: "GPG Gakoa",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Dendak",
@@ -640,6 +751,10 @@ module.exports = {
profileClearnetImagesLabel: "Irudiak",
profileClearnetDocumentsLabel: "Dokumentuak",
profileClearnetTorrentsLabel: "Torrentak",
+ profileClearnetPodcastsLabel: "Podcastak",
+ profileClearnetMarketLabel: "Merkatua",
+ profileClearnetFeedLabel: "Jarioa",
+ profileClearnetWikiLabel: "Wikiak",
editProfileDescription:
"",
profileName: "Izena",
@@ -665,7 +780,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Berr.",
walletConfirm: "Berretsi",
- walletDescription: "Kudeatu zure ondasun digitalak. Hala nola, ECOin-ak bidali eta jaso, zure balantzea ikusi eta zure transakzio historia kontsultatu.",
+ walletDescription: "Kudeatu zure ECOin zorroa.",
walletDate: "Data",
walletFee: "Tasa (Zenbat eta tasa altuagoa, orduan eta bizkorrago prozesatuko da trantsakzioa.)",
walletFeeLine: ({ fee }) => `Tasa: ECO ${fee}`,
@@ -673,6 +788,86 @@ module.exports = {
walletReceive: "Jaso",
walletReset: "Berrezarri",
walletSend: "Bidali",
+ walletPayingTransfer: "Transferra ordaintzen",
+ walletCreateTransferLabel: "Kontratua sortu (transferentzia)",
+ walletTransferNotifiedNote: "Beste aldeari ordainketa honen berri eman zaio",
+ walletTransferCreatedNote: "Ordainketa honen transfer bat (ordainagiria) sortu da",
+ walletTransferNoPayeeNote: "Biztanle batek ere ez du helbide hau argitaratu, beraz ez da transferrik sortu",
+ walletTransferReceiptConcept: "Zorrotik egindako ordainketa",
+ walletPaymentPmText: "ordainketa bat bidali dizu",
+ walletPayeeLabel: "Hartzailea",
+ walletConceptLabel: "Kontzeptua",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Zure OBUa jaso duzu.",
+ bankingBotPaymentTitle: "Ordainketa bat jaso duzu.",
+ bankingBotUbiPaidText: "Zure Oinarrizko Errenta Unibertsala ordaindu da",
+ bankUbiPubThisNode: "Nodo honek OBUa ordaintzen du",
+ bankUbiPubConnected: "OBUko PUBa",
+ bankUbiPubNone: "Oraindik ez dago OBUa iragartzen duen PUBik zure sarean",
+ bankUbiAddressPublished: "ECOin helbidea argitaratuta",
+ bankUbiAddressMissing: "Argitaratu zure ECOin helbidea OBUa jasotzeko",
+ bankUbiClaimedThisMonth: "Hilabete honetan eskatuta",
+ bankUbiPubBalance: "PUBaren zorroa OBUrako erabilgarri",
+ bankNoPubAddress: "OBUko PUBak ez du oraindik ECOin helbiderik argitaratu.",
+ bankUbiTab: "OBU",
+ bankDonateEco: "EMAN!",
+ donateTooltip: "Eman ECOin",
+ bankNoUserAddress: "Biztanle honek ez du ECOin helbiderik partekatzen.",
+ bankUbiPubDefault: "Lehenetsia",
+ bankUbiPool: "Funtsa",
+ bankUbiLastSeen: "Azkenekoz ikusia",
+ bankUbiLastPayout: "Azken ekintza",
+ bankUbiPaidOut: "Banatua",
+ bankRangeToday: "Gaur",
+ bankRangeWeek: "Astea",
+ bankRangeMonth: "Hilabetea",
+ bankRangeYear: "Urtea",
+ bankRangeFiveYears: "5 urte",
+ bankRangeAll: "Guztia",
+ bankChartValueTitle: "ECOin balioaren bilakaera",
+ bankChartValueHours: "Denbora baliokidetza (h)",
+ bankChartWealthTitle: "ECOin aberastasunaren birbanaketa",
+ bankChartDistributed: "Banatutako OBUa (ECO)",
+ bankChartRebalanceTitle: "Aberastasunaren birbanaketa PUBen artean",
+ bankChartRebalanced: "PUBen artean mugitutako ECO",
+ bankChartTaxes: "Atxikitako zergak (ECO)",
+ bankChartNoDataRange: "Ez dago daturik tarte honetan.",
+ bankChartNoDataYet: "Oraindik ez dago daturik",
+ bankChartPerHour: "orduko",
+ bankChartPerDay: "eguneko",
+ bankChartPerMonth: "hileko",
+ bankTotalUbiDistributed: "Birbanatutako OBU guztira (sarea)",
+ bankTotalTaxesWithheld: "Atxikitako zerga guztira (sarea)",
+ bankInflationIssuance: "Jaulkipen-tasa (urtekoa, bloke-sariaren arabera)",
+ bankRulesEligibilityTitle: "Nork jaso dezake OBUa",
+ bankRulesEligibility1: "Profilean argitaratutako ECOin helbide bat (Profila → Sentsoreak → ECOin zorroa).",
+ bankRulesEligibility2: "30 egun baino gehiagoko feed bat sarean jarduerarekin: karma zerotik gora.",
+ bankRulesEligibility3: "Eskaera bat hilean (epoch), Banking-etik OBUa eskatu botoiarekin. Uneko hilabetea uka daiteke OBUari uko egin botoiarekin.",
+ bankRulesEligibility4: "1 ECO-ko oinarria beti ordaintzen da; zergek gainetik dagoen zatia bakarrik murrizten dute eta ez dira inoiz aparte kobratzen.",
+ bankRulesEligibility5: "PUBak hurrengo zikloan ordaintzen du eta berretsi dezakezun OBU transferentzia bat argitaratzen du.",
+ bankRulesEligibility6: "Helbidea falta bada, feeda gazteegia bada, hilabeteari uko egin badiozu edo PUBak fondorik ez badu, eskaera saltatu eta PUBean erregistratzen da.",
+ copyLinkTitle: "Kopiatu esteka",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "OBUari uko egin",
+ bankUbiRefusedThisMonth: "Hilabete honetako OBUari uko egin diozu.",
+ bankingBotUbiAvailableTitle: "Zure OBUa eska dezakezu.",
+ bankingBotUbiAvailableText: "Hilabete honetako zure OBUa eskuragarri dago",
+ bankingBotConfirmTitle: "Baieztatzeko zain dagoen smart-contract bat duzu",
+ bankingBotConfirmText: "Zure berrespenaren zain dauden smart-contract-ak",
+ bankChartZoomHint: "Klikatu handitzeko",
+ bankChartPoolTitle: "OBUaren funtsa (denboran)",
+ bankChartNetworkUbiTitle: "Birbanatutako OBU guztira (sarea)",
+ bankChartSupplyTitle: "ECOin zirkulazioko eskaintza (denboran)",
+ bankChartInflationTitle: "ECOin inflazioa (denboran)",
+ bankChartInflationSeries: "Urteko tasa (%)",
+ bankChartPool: "Funts osoa (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (denboran)",
+ bankChartFundsTitle: "Zure ECOin funtsak (denboran)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin konektatuta",
+ bankWalletNotConfigured: "ECOin deskonektatuta",
+ transfersPayWithWallet: "ORDAINDU!",
walletStatus: "Egoera",
walletDisconnected: [
"ECOin ",
@@ -682,8 +877,11 @@ module.exports = {
" edo konexioaren egoera.",
],
walletSentToLine: ({ destination, amount }) => `${amount} ECO bidali dira ${destination} helbidera`,
+ walletNotConfigured: "Zure ECOin zorroa ez dago oraindik konfiguratuta.",
walletSettingsDescription: "Integratu Oasis zure ECOin zorroarekin.",
- walletSettingsDocLink: "ECOin instalazio gida",
+ walletSettingsMobileDescription: "Lotu Oasis gailu honetako ECOin Wallet aplikazioarekin.",
+ walletDownloadEcoin: "Deskargatu ECOin!",
+ walletRpcUrl: "RPC URLa",
walletStatusMessages: {
invalid_amount: "Zenbatekoa oker",
invalid_dest: "Hartzailearen helbidea oker",
@@ -699,6 +897,7 @@ module.exports = {
walletUser: "Erabiltzaile izena",
walletPass: "Pasahitza",
walletConfiguration: "Ezarri zorroa",
+ walletDisconnectButton: "Zorroa deskonektatu",
cipher: "Zifratzailea",
cipherTitle: "Zifratzailea",
cipherDescription: "Zifratu eta deszifratu testua simetrikoki (Pasahitza erabiliz).",
@@ -732,17 +931,16 @@ module.exports = {
bookmarkFilterRecent: "AZKENAK",
bookmarkCreateButton: "Laster-marka sortu",
bookmarkUpdateButton: "Eguneratu",
- bookmarkDeleteButton: "Ezabatu",
bookmarkAddFavoriteButton: "Gogokoetara gehitu",
bookmarkRemoveFavoriteButton: "Gogokoetatik kendu",
bookmarkUrlLabel: "Esteka",
- bookmarkUrlPlaceholder: "https://adibidea.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Deskribapena",
bookmarkDescriptionPlaceholder: "Aukerakoa",
bookmarkTagsLabel: "Tagak",
- bookmarkTagsPlaceholder: "Sartu tagak komaz banatuta",
+ bookmarkTagsPlaceholder: "Idatzi etiketak komaz bereizita",
bookmarkLastVisitLabel: "Azken bisita",
- bookmarkSearchPlaceholder: "Bilatu URLa, tagak, kategoria, egilea...",
+ bookmarkSearchPlaceholder: "Bilatu hemen: Laster-markak...",
bookmarkSortRecent: "Berrienak",
bookmarkSortOldest: "Zaharrenak",
bookmarkSortTop: "Bozkatuenak",
@@ -781,7 +979,7 @@ module.exports = {
videoDescriptionPlaceholder: "Aukerakoa",
videoNoFile: "Ez da bideo-fitxategirik eman",
noVideos: "Ez dago bideorik erabilgarri.",
- videoSearchPlaceholder: "Bilatu izenburua, etiketak, egilea...",
+ videoSearchPlaceholder: "Bilatu hemen: Bideoak...",
videoSortRecent: "Berrienak",
videoSortOldest: "Zaharrenak",
videoSortTop: "Bozkatuenak",
@@ -804,20 +1002,19 @@ module.exports = {
documentFilterFavorites: "GOGOKOAK",
documentCreateButton: "Dokumentua igo",
documentUpdateButton: "Eguneratu",
- documentDeleteButton: "Ezabatu",
documentAddFavoriteButton: "Gehitu gogokoetara",
documentRemoveFavoriteButton: "Gogokoetatik kendu",
documentMessageAuthorButton: "MP",
documentFileLabel: "Dokumentua igo (.pdf)",
documentTagsLabel: "Etiketak",
- documentTagsPlaceholder: "Sartu komaz bereizitako etiketak",
+ documentTagsPlaceholder: "Idatzi etiketak komaz bereizita",
documentTitleLabel: "Izenburua",
documentTitlePlaceholder: "Aukerakoa",
documentDescriptionLabel: "Deskribapena",
documentDescriptionPlaceholder: "Aukerakoa",
documentNoFile: "Fitxategirik ez.",
noDocuments: "Ez dago dokumenturik.",
- documentSearchPlaceholder: "Bilatu izenburua, etiketak, deskribapena, egilea...",
+ documentSearchPlaceholder: "Bilatu hemen: Dokumentuak...",
documentSortRecent: "Berrienak",
documentSortOldest: "Zaharrenak",
documentSortTop: "Bozkatuenak",
@@ -838,19 +1035,19 @@ module.exports = {
audioFilterTop: "TOP",
audioCreateButton: "Audioa igo",
audioUpdateButton: "Eguneratu",
- audioDeleteButton: "Ezabatu",
audioAddFavoriteButton: "Gehitu gogokoetara",
audioRemoveFavoriteButton: "Kendu gogokoetatik",
audioFileLabel: "Aukeratu audio-fitxategi bat (.mp3, .wav, .ogg)",
audioTagsLabel: "Etiketak",
audioTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ tagsPlaceholder: "Idatzi etiketak komaz bereizita",
audioTitleLabel: "Izenburua",
audioTitlePlaceholder: "Aukerakoa",
audioDescriptionLabel: "Deskribapena",
audioDescriptionPlaceholder: "Aukerakoa",
audioNoFile: "Ez da audio-fitxategirik eman",
noAudios: "Ez dago audiorik erabilgarri.",
- audioSearchPlaceholder: "Bilatu izenburua, etiketak, egilea...",
+ audioSearchPlaceholder: "Bilatu hemen: Audioak...",
audioSortRecent: "Berrienak",
audioSortOldest: "Zaharrenak",
audioSortTop: "Bozkatuenak",
@@ -862,7 +1059,7 @@ module.exports = {
audioFilterFavorites: "GOGOKOAK",
favoritesTitle: "Gogokoak",
favoritesDescription: "Zure gogoko guztiak leku berean.",
- favoritesSearchPlaceholder: "Bilatu gogokoetan...",
+ favoritesSearchPlaceholder: "Bilatu hemen: Gogokoak...",
favoritesFilterAll: "GUZTIAK",
favoritesFilterRecent: "AZKENAK",
favoritesFilterAudios: "AUDIOAK",
@@ -874,13 +1071,12 @@ module.exports = {
favoritesFilterChats: "TXATAK",
favoritesFilterCalendars: "EGUTEGIAK",
favoritesFilterVideos: "BIDEOAK",
- favoritesRemoveButton: "Gogokoetatik kendu",
favoritesNoItems: "Oraindik ez dago gogokorik.",
yourContacts: "Zure Kontaktuak",
allInhabitants: "Bizilagunak",
allCVs: "CVak",
discoverPeople: "Aurkitu bizilagunak zure sarean.",
- searchInhabitantsPlaceholder: "IRAGAZI bizilagunak IZENAREN ARABERA …",
+ searchInhabitantsPlaceholder: "Bilatu hemen: Bizilagunak...",
filterLocation: "IRAGAZI bizilagunak KOKAPENAREN ARABERA …",
filterLanguage: "IRAGAZI bizilagunak BY HIZKUNTZAREN ARABERA …",
filterSkills: "IRAGAZI bizilagunak BY TREBETASUNEN ARABERA …",
@@ -904,7 +1100,6 @@ module.exports = {
topSectionTitle: "TOP",
blockedLabel: "Blokeatutako Erabiltzailea",
inhabitantviewDetails: "Ikusi Xehetasunak",
- cvVisitButton: "Bisitatu CVa",
keepReading: "Irakurtzen jarraitu...",
oasisId: "ID-a",
noInhabitantsFound: "Bizilagunik ez, oraindik.",
@@ -922,6 +1117,18 @@ module.exports = {
parliamentFilterLeaders: "BURUAK",
parliamentFilterRules: "ARAUAK",
parliamentGovernmentCard: "Uneko gobernua",
+ parliamentSeatsGovernment: "Gobernua",
+ parliamentSeatsOpposition: "Oposizioa",
+ parliamentSeatsAbstention: "Abstentzioa",
+ parliamentSeatsQuorum: "Hauteskunde-quoruma",
+ parliamentSeatsPass: "Onarpen-atalasea",
+ parliamentSeatsByElection: "Hauteskundeen arabera",
+ parliamentSeatsByHouses: "LARP etxearen arabera",
+ parliamentSeatsSeats: "eserleku",
+ parliamentSeatsSeat: "eserleku",
+ parliamentSeatsLeader: "Buruzagia",
+ parliamentSeatsVotesFor: "botoak honi:",
+ parliamentSeatsNoHouse: "Etxerik gabe",
parliamentActorInPowerInhabitant: 'BIZTANLEA AGINTEAN',
parliamentActorInPowerTribe: 'TRIBUA AGINTEAN',
parliamentHistoricalGovernmentsTitle: 'GOBERNUAK',
@@ -949,7 +1156,7 @@ module.exports = {
parliamentCurrentRevocationsTitle: 'Uneko Indargabetzeak',
parliamentFutureRevocationsTitle: 'Etorkizuneko Indargabetzeak',
parliamentPoliciesRevocated: 'HISTORIKOA',
- parliamentPoliciesTitle: 'HISTORICAL',
+ parliamentPoliciesTitle: "HISTORIKOA",
parliamentLawsTitle: 'ONARTUTAKO LEGEAK',
parliamentRulesRevocations: 'Onartutako edozein lege indargabetu daiteke indarrean dagoen gobernu metodoa erabiliz.',
parliamentNoStableGov: "Oraindik ez da gobernurik hautatu.",
@@ -988,6 +1195,7 @@ module.exports = {
parliamentTimeRemaining: "Geratzen den denbora",
parliamentElectionsStatusTitle: "Hurrengo Gobernua",
parliamentProposalDeadlineLabel: "Epemuga",
+ parliamentViewReport: "Txostena ikusi",
parliamentProposalTimeLeft: "Geratzen den denbora",
parliamentRulesTitle: "Legebiltzarrak nola funtzionatzen duen",
parliamentRulesIntro: "Hauteskundeak 2 hilean behin ebazten dira; hautagaitzak etengabeak dira eta gobernua aukeratzean berrabiarazten dira.",
@@ -1002,6 +1210,7 @@ module.exports = {
parliamentRulesLaws: "Proposamenak bere atalasea gainditzen duenean, Lege bihurtzen da eta Legeak fitxan agertzen da indarrean sartzeko datarekin.",
parliamentRulesHistorical: "Historia fitxan egondako gobernu ziklo bakoitza eta haren kudeaketari buruzko datuak ikus daitezke.",
parliamentRulesLeaders: "Liderak fitxan, gobernatu duten (edo aurkeztu diren) biztanle/tribuen sailkapena ikus daiteke, eraginkortasunaren arabera ordenatuta.",
+ parliamentRulesHemicycle: "Hemizikloak eserleku bat ematen dio biztanle bakoitzari: gobernu-blokea (hautagaitza irabazlearen hautesleak eta buruzagia), oposizio-bloke bat zikloko beste hautagaitza bakoitzeko, eta abstentzioa. Marka etenek hauteskunde-quoruma (erroldaren % 25) eta indarrean dagoen metodoaren onarpen-atalasea erakusten dituzte. \"LARP etxearen arabera\" eserleku berak etxeka koloreztatzen ditu.",
parliamentProposalVoteStatusLabel: "Bozketa egoera",
parliamentProposalOnTrackYes: "Atalasea lortuta",
parliamentProposalOnTrackNo: "Atalasearen azpitik",
@@ -1017,6 +1226,7 @@ module.exports = {
courtsCaseTitle: "Izenburua",
courtsCaseRespondent: "Akusatua / Erantzulea",
courtsCaseRespondentPh: "Oasis ID (@...) edo Tribu izena",
+ courtsCaseSubjectPlaceholder: "Gaia edo deskribapen laburra",
courtsCaseMediatorsPh: "Oasis IDak, komaz bereizita",
courtsCaseMethod: "Ebazpen metodoa",
courtsCaseSubmit: "Kasu bidali",
@@ -1077,6 +1287,21 @@ module.exports = {
courtsMethodPOPULAR: "Herritarren bozketa",
courtsMethodMEDIATION: "Bitartekaritza",
courtsMethodKARMATOCRACY: "Karmatokrazia",
+ courtsCaseType: "Kasu mota",
+ courtsPresetMinorConflict: "Gatazka arina",
+ courtsPresetModerateConflict: "Gatazka ertaina",
+ courtsPresetSevereConflict: "Gatazka larria",
+ courtsPresetHarassment: "Jazarpena edo abusua",
+ courtsPresetContentModeration: "Edukien moderazioa",
+ courtsPresetBanRestriction: "Kanporaketa edo murrizketa",
+ courtsPresetGovernanceDispute: "Gobernantza-gatazka",
+ courtsStatusOPEN: "Irekita",
+ courtsStatusIN_PROGRESS: "Abian",
+ courtsStatusDECIDED: "Erabakita",
+ courtsStatusCLOSED: "Itxita",
+ courtsStatusSOLVED: "Konponduta",
+ courtsStatusUNSOLVED: "Konpondu gabe",
+ courtsStatusDISCARDED: "Baztertuta",
courtsMethodJUDGES: "Epaile-mahaia",
courtsMethodSINGLE_JUDGE: "Epaile bakarra",
courtsMethodJURY: "Epaimahaia",
@@ -1088,12 +1313,12 @@ module.exports = {
courtsRulesTitle: "Nola funtzionatzen duten Auzitegiek",
courtsRulesIntro: "Auzitegiak komunitateak kudeatutako prozesuak dira, gatazkak konpontzeko eta justizia zuzentzailea sustatzeko. Elkarrizketa, froga argiak eta neurri proportzionalak lehenesten dira.",
courtsRulesLifecycle: "Prozesua: 1) Kasua ireki 2) Metodoa aukeratu 3) Frogak aurkeztu 4) Entzunaldia eta eztabaida 5) Epai eta neurriak 6) Betetze eta itxiera 7) Helegitea (badagokio).",
- courtsRulesRoles: "Akusatzailea: kasua irekitzen du. Defentsa: akusatutako pertsona edo tribua. Metodoa: komunitateak aukeratutako mekanismoa, froga baloratu eta ebazpena emateko. Lekukoa: testigantza edo frogak ematen dituen pertsona. Bitartekariak: akusatzaileak eta/edo defentsak gonbidatutako pertsona neutralak, xehetasun guztietara sarbidea dutenak, gatazka deseskalatzen eta akordioak lankidetzan eraikitzen laguntzen dutenak.",
+ courtsRulesRoles: "Akusatzailea: kasua irekitzen du. Defentsa: akusatutako biztanlea edo tribua. Metodoa: komunitateak aukeratutako mekanismoa, froga baloratu eta ebazpena emateko. Lekukoa: testigantza edo frogak ematen dituen biztanlea. Bitartekariak: akusatzaileak eta/edo defentsak gonbidatutako biztanle neutralak, xehetasun guztietara sarbidea dutenak, gatazka deseskalatzen eta akordioak lankidetzan eraikitzen laguntzen dutenak.",
courtsRulesEvidence: "Gehienez 1000 karaktereko azalpena. Erantsi irudi, audio, bideo eta PDF dokumentu garrantzitsu eta legezkoak. Ez partekatu datu pribatu sentikorrak baimenik gabe.",
courtsRulesDeliberation: "Entzunaldiak publikoak edo pribatuak izan daitezke. Epaileek errespetua bermatzen dute, argipenak eskatzen dituzte eta material ez-legala edo esanguragabea baztertu dezakete.",
courtsRulesVerdict: "Lehentasuna da konponketa: barkamenak, bitartekaritza-akordioak, edukiaren moderazioa, behin-behineko murrizketak edo beste neurri proportzional batzuk. Arrazoibidea erregistratuta geratu behar da.",
courtsRulesAppeals: "Helegitea: onartzen da frogak berriak direnean edo akats prozesal argia dagoenean. Gehienez 7 eguneko epean aurkeztu behar da, bestela adierazi ezean.",
- courtsRulesPrivacy: "Errespetatu pribatutasuna eta segurtasuna. Doxing-a, gorrotoa edo mehatxuak ezabatzen dira. Epaileek erregistroaren zatiak editatu edo ezkutatu ditzakete arriskuan dauden pertsonak babesteko.",
+ courtsRulesPrivacy: "Errespetatu pribatutasuna eta segurtasuna. Doxing-a, gorrotoa edo mehatxuak ezabatzen dira. Epaileek erregistroaren zatiak editatu edo ezkutatu ditzakete arriskuan dauden bizilagunak babesteko.",
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",
@@ -1109,12 +1334,16 @@ module.exports = {
exploreTrending: "Aurkitu pil-pileko edukia zure sarean.",
votesButton: "GOBERNUA",
shopProductButton: "DENDA",
+ podcastButton: "PODCASTA",
+ podcastEpisodeButton: "ATALA",
+ campaignButton: "KANPAINA",
+ logisticsRouteButton: "IBILBIDEA",
trendingTotalOpinions: "Iritzial Guztira",
trendingNoContentMessage: "Oraindik ez dago joerarik.",
trendingTotalCount: "Kopurua Guztira",
tasksTitle: "Atazak",
tasksDescription: "Aurkitu eta kudeatu atazak",
- taskSearchPlaceholder: "Bilatu zereginak...",
+ taskSearchPlaceholder: "Bilatu hemen: Atazak...",
taskTitleLabel: "Izenburua",
taskDescriptionLabel: "Deskribapena",
taskStartTimeLabel: "Hasiera Data",
@@ -1133,7 +1362,7 @@ module.exports = {
taskStatusOpen: "Irekita",
taskStatusInProgress: "Ekinean",
taskStatusClosed: "Itxita",
- taskAssignedTo: "Honi esleituta",
+ taskAssignedTo: "Esleituta",
taskAssignedChip: "Esleituta",
taskUnassignedChip: "Esleitu gabe",
taskAssignees: "Hauei esleituta",
@@ -1143,6 +1372,7 @@ module.exports = {
taskUpdateButton: "Eguneratu",
taskDeleteButton: "Ezabatu",
taskFilterAll: "GUZTIAK",
+ taskFilterRecent: "AZKENAK",
taskFilterMine: "NEUREAK",
taskFilterOpen: "IREKITA",
taskFilterInProgress: "EKINEAN",
@@ -1170,14 +1400,13 @@ module.exports = {
eventUpcomingDates: "Hurrengo datak",
eventsTitle: "Ekitaldiak",
eventsDescription: "Aurkitu eta kudeatu ekitaldiak zure sarean.",
- eventSearchPlaceholder: "Bilatu ekitaldiak...",
+ eventSearchPlaceholder: "Bilatu hemen: Ekitaldiak...",
eventPrice: "Prezioa",
eventStatus: "Egoera",
eventAllSectionTitle: "Ekitaldiak",
eventMineSectionTitle: "Zeure Ekitaldiak",
eventCreateSectionTitle: "Sortu Ekitaldia",
eventUpdateSectionTitle: "Eguneratu Ekitaldia",
- eventDeleteButton: "Ezabatu",
eventCreateButton: "Sortu Ekitaldia",
eventAddToCalendar: "Egutegira gehitu",
eventVisitCalendar: "Egutegia ikusi",
@@ -1195,11 +1424,11 @@ module.exports = {
viewPlace: "Ikusi Lekua",
generatePdf: "Sortu PDFa",
sharePm: "Partekatu PMz",
- galleryImages: "Irudiak (geh. 50MB bakoitza)",
+ galleryImages: "Irudiak (geh. 75MB bakoitza)",
galleryPhotos: "Irudiak",
galleryAddPhoto: "Gehitu Irudia",
galleryRemovePhoto: "Kendu",
- galleryVideo: "Bideoa (geh. 50MB)",
+ galleryVideo: "Bideoa (geh. 75MB)",
galleryAddVideo: "Gehitu Bideoa",
galleryRemoveVideo: "Kendu bideoa",
viewVotation: "Ikusi bozketa",
@@ -1219,6 +1448,7 @@ module.exports = {
eventDate: "Data",
eventAttendButton: "Joan Ekitaldira",
eventFilterAll: "GUZTIAK",
+ eventFilterRecent: "AZKENAK",
eventFilterMine: "NEUREAK",
eventFilterToday: "GAUR",
eventFilterWeek: "ASTEON",
@@ -1245,7 +1475,7 @@ module.exports = {
tagsFilterTop: "GORENAK",
tagsFilterCloud: "HODEIA",
tagsNoItems: "Etiketarik ez.",
- tagsSearchPlaceholder: "Bilatu etiketak...",
+ tagsSearchPlaceholder: "Bilatu hemen: Etiketak...",
tagsTableHeaderTag: "ETIKETA/LOTURA:",
tagsTableHeaderCount: "KONTAGAILUA:",
transfersTitle: "Transferentziak",
@@ -1253,8 +1483,11 @@ module.exports = {
transfersFrom: "Nork",
transfersTo: "Nori",
transfersFilterAll: "GUZTIAK",
+ transfersFilterRecent: "AZKENAK",
transfersFilterMine: "NEUREAK",
- transfersFilterUBI: "RBU",
+ transfersFilterMinePending: "ZAIN",
+ transfersFilterMineConfirmed: "SINATUAK",
+ transfersFilterUBI: "OBU",
transfersFilterMarket: "MERKATUA",
transfersFilterTop: "GORENAK",
transfersFilterPending: "ZAIN",
@@ -1268,7 +1501,6 @@ module.exports = {
transfersCategoryEconomic: "Ekonomikoa",
transfersCategoryTime: "Denbora",
transfersCategoryTrust: "Konfiantza",
- transfersCategoryApply: "Aplikatu",
transfersUnitEco: "ECO",
transfersUnitHours: "h",
transfersUnitTrust: "konfiantza",
@@ -1290,7 +1522,7 @@ module.exports = {
transfersConfirmButton: "Berretsi Transferentzia",
transfersNoItems: "Transferentziarik ez.",
transfersMineSectionTitle: "Zeure Transferentziak",
- transfersUBISectionTitle: "RBU Transferentziak",
+ transfersUBISectionTitle: "OBU transferentziak",
transfersTopSectionTitle: "Transferentzia Gorenak",
transfersPendingSectionTitle: "Transferentziak Zain",
transfersUnconfirmedSectionTitle: "Transferentziak Berretsi Gabe",
@@ -1298,7 +1530,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Transferentziak Baztertuta",
transfersCreateSectionTitle: "Sortu transferentzia",
transfersAllSectionTitle: "Transferentziak",
- transfersSearchPlaceholder: "Bilatu kontzeptua, etiketak, erabiltzaileak...",
+ transfersSearchPlaceholder: "Bilatu hemen: Transferentziak...",
transfersMinAmountLabel: "Gutx. zenbatekoa",
transfersMaxAmountLabel: "Geh. zenbatekoa",
transfersSortRecent: "Berrienak",
@@ -1320,6 +1552,7 @@ module.exports = {
voteErrorTitle: "Egiaztatu inprimakia",
voteErrorDeadlineMin: "Epemuga gutxienez {days} egunetara egon behar da.",
voteErrorGeneric: "Ezin izan da bozketa gorde.",
+ voteLocked: "Bozketa honek botoak edo iritziak jaso ditu dagoeneko, edo Parlamentuarena edo Auzitegiena da: ezin da editatu ez ezabatu.",
voteUpdateButton: "Eguneratu",
voteDeleteButton: "Ezabatu",
voteOptionYes: "BAI",
@@ -1329,6 +1562,7 @@ module.exports = {
voteFollowMajority: "GEHIENGOAREN HAUTUA",
voteNotInterested: "INTERESIK EZ",
voteFilterAll: "GUZTIAK",
+ voteFilterRecent: "AZKENAK",
voteFilterMine: "NEUREAK",
voteFilterOpen: "IREKITA",
voteFilterClosed: "ITXITA",
@@ -1344,7 +1578,6 @@ module.exports = {
voteTags: "Etiketak",
voteOpinions: "Iritziak",
novotes: "Bozkatzeko proposamenik ez.",
- voteBy: "Nork",
voteCreatedAt: "Noiz",
voteNoQuestion: "Galderarik ez",
voteUnknownCreator: "Sortzaile Ezezaguna",
@@ -1354,6 +1587,7 @@ module.exports = {
voteCommentsForumButton: 'Eztabaida ireki',
voteCommentsSectionTitle: 'Eztabaida irekia',
voteNoCommentsYet: 'Oraindik ez dago iruzkinik. Izan zaitez lehen erantzuten.',
+ commentsGoToLast: "Joan azken iruzkinera",
voteNewCommentPlaceholder: 'Idatzi hemen zure iruzkina…',
voteNewCommentButton: 'Bidali iruzkina',
voteNewCommentLabel: 'Gehitu iruzkina',
@@ -1364,6 +1598,8 @@ module.exports = {
cvNameLabel: "Izen Osoa",
cvDescriptionLabel: "Laburpena",
cvPhotoLabel: "Argazkia",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Bisitatu CVa",
cvPersonalExperiencesLabel: "Esperientzia Pertsonalak",
cvPersonalSkillsLabel: "Trebetasun Pertsonalak (komaz bereizita)",
cvOasisExperiencesLabel: "Esperientzia Oasis-i Ekarpenak egiten",
@@ -1393,9 +1629,9 @@ module.exports = {
cvNoCV: "CV-rik ez.",
blogSubject: "Gaia",
blogMessage: "Mezua",
- blogImage: "Multimedia igo (max: 50MB)",
+ blogImage: "Multimedia igo (max: 75MB)",
blogMedia: "Eranskinak (8 irudi eta bideo bat gehienez)",
- blogPublish: "Aurrebista",
+ blogPublish: "Argitaratu",
pollsTitle: "Inkestak",
dataTitle: "Bat etortzeak",
dataDescription: "Arakatu eta ikusi zure sareko bat etortzeak.",
@@ -1414,12 +1650,23 @@ module.exports = {
dataKindTasks: "ZEREGINAK",
dataKindReports: "TXOSTENAK",
dataKindVotes: "BOZKETAK",
- dataSearchPlaceholder: "Bilatu datu gurutzatuetan...",
+ dataSearchPlaceholder: "Bilatu hemen: Bat etortzeak...",
dataCohesionTitle: "Kohesio Koefizientea (CC)",
dataCcShort: "CC",
dataCohesionHint: "Sareak argitaratutako guztiaren arteko batez besteko afinitatea.",
dataAffinity: "Afinitatea",
dataCommonTerms: "Gako-hitza",
+ dataReasonFollowing: "Bizilagun honi laguntzen diozu",
+ dataReasonTribe: "Tribu bat partekatzen du zurekin",
+ dataReasonPinned: "Finkatu duzun zerbaitekin bat dator",
+ dataReasonCv: "Zure CVko gaitasunekin bat dator",
+ dataReasonContent: "Argitaratzen duzunarekin lotuta",
+ dataReasonRelated: "Zure interesekin lotuta",
+ dataReasonAlike: "Zu bezalako bizilagun batek argitaratua",
+ dataReasonSupportsYou: "Laguntzen dizu",
+ dataReasonMutual: "Elkarren laguntza",
+ dataReasonRated: "Sareak ondo baloratua",
+ dataReasonNear: "Zure ondoan",
dataStatPeople: "CVak",
dataStatConnected: "Konektatuta",
dataStatSkills: "Trebetasunak",
@@ -1472,7 +1719,7 @@ module.exports = {
pollStatusLabel: "Egoera",
pollStatusOpen: "IREKIA",
pollStatusClosed: "ITXIA",
- pollSearchPlaceholder: "Bilatu inkestak...",
+ pollSearchPlaceholder: "Bilatu hemen: Inkestak...",
pollsNoItems: "Ez da inkestarik aurkitu.",
viewPoll: "Ikusi Inkesta",
pollChatCreate: "Sortu Inkesta",
@@ -1485,7 +1732,7 @@ module.exports = {
blogFilterFavorites: "GOGOKOAK",
blogFilterTop: "TOP",
blogCreateButton: "Sortu Bloga",
- blogSearchPlaceholder: "Bilatu blogak...",
+ blogSearchPlaceholder: "Bilatu hemen: Blogak...",
blogComments: "Iruzkinak",
blogAllowComments: "Baimendu iruzkinak",
blogCommentsClosed: "Egileak blog honen iruzkinak itxi ditu.",
@@ -1498,12 +1745,11 @@ module.exports = {
forumCreateButton: "Sortu foroa",
forumCreateSectionTitle: "Sortu foroa",
forumDescription: "Hitz egin sareko beste erabiltzaileekin libreki.",
- forumSearchPlaceholder: "Bilatu foroak...",
+ forumSearchPlaceholder: "Bilatu hemen: Foroak...",
forumFilterAll: "GUZTIAK",
forumFilterMine: "NIREAK",
forumFilterRecent: "BERRIENAK",
forumFilterTop: "GORENAK",
- forumDeleteButton: "Ezabatu",
forumParticipants: "parte-hartzaileak",
forumMessages: "mezuak",
forumMessageLabel: "Mezua",
@@ -1530,7 +1776,6 @@ module.exports = {
imageFilterGallery: "GALERIA",
imageCreateButton: "Irudia igo",
imageUpdateButton: "Eguneratu",
- imageDeleteButton: "Ezabatu",
imageAddFavoriteButton: "Gehitu gogokoetara",
imageRemoveFavoriteButton: "Kendu gogokoetatik",
imageFileLabel: "Aukeratu irudi-fitxategi bat (.jpeg, .jpg, .png, .gif)",
@@ -1542,13 +1787,14 @@ module.exports = {
imageDescriptionPlaceholder: "Aukerakoa",
imageNoFile: "Ez da irudi-fitxategirik eman",
noImages: "Ez dago irudirik erabilgarri.",
- imageSearchPlaceholder: "Bilatu izenburua, etiketak, deskribapena, egilea...",
+ imageSearchPlaceholder: "Bilatu hemen: Irudiak...",
imageSortRecent: "Berrienak",
imageSortOldest: "Zaharrenak",
imageSortTop: "Bozkatuenak",
imageSearchButton: "Bilatu",
imageUpdatedAt: "Eguneratua",
imageNoMatch: "Ez dago zure bilaketarekin bat datorren irudirik.",
+ feedSearchPlaceholder: "Bilatu hemen: Jarioa...",
feedTitle: "Jarioa",
feedDetailTitle: "Feed",
feedOpenDiscussion: "Eztabaida ireki",
@@ -1563,11 +1809,11 @@ module.exports = {
noFeedsFound: "Ez da jariorik aurkitu.",
createdAtLabel: "Noiz",
FeedshareYourOpinions: "Aurkitu eta partekatu testu laburrak zure sarean.",
- refeedButton: "Realimentatu",
+ refeedButton: "Birbidali",
alreadyRefeeded: "Berjaiotu duzu jada.",
activityTitle: "Jarduera",
yourActivity: "Zure jarduera",
- globalActivity: "Jarduera globala",
+ globalActivity: "Jarduera",
activityList: "Jarduera",
activityDesc: "Ikusi zure sareko azken jarduera.",
allButton: "GUZTIA",
@@ -1579,9 +1825,10 @@ module.exports = {
concept: "Kontzeptua",
description: "Deskribapena",
meme: "Meme",
- typeRecent: "AZKENA",
+ typeRecent: "AZKENAK",
typeTop: "TOP",
- typePost: "BLOGAK",
+ typePost: "BLOGA",
+ activityUpdateLabel: "EGUNERAKETA",
typeTribe: "TRIBUAK",
typeLarp: "L.A.R.P.",
typeInhabitants: "BIZTANLEAK",
@@ -1606,10 +1853,10 @@ module.exports = {
typeFeed: "FEEDAK",
typeContact: "KONTAKTUA",
typePub: "PUB",
- typeTombstone: "TOMBSTONE",
+ typeTombstone: "EZABATUA",
typeBanking: "BANKUA",
typeBankWallet: "BANKUA/ZORROA",
- typeBankClaim: "BANKUA/UBI",
+ typeBankClaim: "BANKUA/OBU",
typeKarmaScore: "KARMA",
typeParliament: "PARLAMENTUA",
typeSpread: "ERREPLIKAK",
@@ -1644,7 +1891,7 @@ module.exports = {
location: "Kokalekua",
contentWarning: "Gaia",
bankWalletConnected: "ECOin zorroa",
- bankUbiReceived: "Jasotako UBI",
+ bankUbiReceived: "Jasotako OBU",
bankTx: "Tx",
bankEpochShort: "Epoka",
viewDetails: "Xehetasunak ikusi",
@@ -1678,7 +1925,7 @@ module.exports = {
createdAt: "Sortze-data",
reportsTitle: "Txostenak",
reportsDescription: "Kudeatu eta jarraitu zure sareko txostenak.",
- reportsSearchPlaceholder: "Bilatu txostenak...",
+ reportsSearchPlaceholder: "Bilatu hemen: Txostenak...",
reportsFilterAll: "GUZTIAK",
reportsFilterRecent: "BERRIAK",
reportsFilterTop: "TOP",
@@ -1726,7 +1973,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Txostenak Berrikuspenean",
reportsResolvedSectionTitle: "Zuzendutako Txostenak",
reportsInvalidSectionTitle: "Txosten Okerrak",
- reportsTemplateSectionTitle: 'Txosten-eredua',
reportsBugTemplateTitle: 'Erreprodukzio xehetasunak (Bug-ak)',
reportsFeatureTemplateTitle: 'Xehetasunak (Ezaugarriak)',
reportsAbuseTemplateTitle: 'Xehetasunak (Abusua)',
@@ -1785,29 +2031,36 @@ module.exports = {
tribeGallerySectionTitle: "Tribuen Galeria",
tribeRecentSectionTitle: "Tribu Berriak",
tribeTopSectionTitle: "Tribu Gorenak",
- tribeviewTribeButton: "Tribua Bisitatu",
- tribeviewSubTribeButton: "Azpi-Tribua Bisitatu",
tribeRootLabel: "ERROA",
tribeDescription: "Aurkitu edo sortu tribuak zure sarean.",
tribeMainTribeLabel: "TRIBU NAGUSIA",
tribeCreateButton: "Sortu Tribua",
tribeUpdateButton: "Egutneratu",
tribeDeleteButton: "Ezabatu",
- tribeImageLabel: "Multimedia igo (max: 50MB)",
+ tribeImageLabel: "Multimedia igo (max: 75MB)",
tribeTitleLabel: "Izenburua",
- searchTribesPlaceholder: "IRAGAZI tribuak IZENAREN ARABERA …",
+ searchTribesPlaceholder: "Bilatu hemen: Tribuak...",
tribeTitlePlaceholder: "Tribuaren izena",
tribeDescriptionLabel: "Deskribapena",
tribeDescriptionPlaceholder: "Deskribatu tribua",
tribeLocationLabel: "Kokapena",
tribeLocationPlaceholder: "Non kokatzen da tribua?",
tribeTagsLabel: "Etiketak",
- tribeTagsPlaceholder: "Sartu etiketak, erabili komak bereizteko.",
+ tribeTagsPlaceholder: "Idatzi etiketak komaz bereizita",
tribeInviteMode: "Gonbidapen modua",
tribeModeLabel: "Gonbidapen MODUA",
tribeIsAnonymousLabel: "Publikoa?",
tribeMembersCount: "Partaideak",
tribeEnterInvite: "SARTU GONBIDAPENA",
+ subscriptionTitle: "Harpidetzak",
+ subscriptionOn: "Harpidetuta",
+ subscriptionOff: "Harpidetu gabe",
+ subscriptionSubscribe: "Harpidetu",
+ subscriptionUnsubscribe: "Harpidetza utzi",
+ subscriptionSubscribers: "Harpidedunak",
+ pmListLabel: "Nori bidali",
+ pmListNone: "— Zerrendarik ez —",
+ pmListNoSubscribers: "Harpidedunik ez",
tribeLeaveButton: "ATERA",
tribePublic: "PULIKOA",
tribePrivate: "PRIBATUA",
@@ -1834,22 +2087,22 @@ module.exports = {
tribeSectionTasks: "ATAZAK",
tribeSectionFeed: "JARIOA",
tribeSectionForum: "FOROA",
- tribeSectionMedia: "Media",
+ tribeSectionMedia: "Multimedia",
tribeSectionImages: "IRUDIAK",
tribeSectionAudios: "AUDIOAK",
tribeSectionVideos: "BIDEOAK",
tribeSectionDocuments: "DOKUMENTUAK",
tribeSectionBookmarks: "LASTER-MARKAK",
- tribeSectionMaps: "MAPS",
- tribeSectionPads: "PADS",
- tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionMaps: "MAPAK",
+ tribeSectionPads: "PADAK",
+ tribeSectionChats: "TXATAK",
+ tribeSectionCalendars: "EGUTEGIAK",
+ tribePadCreate: "Sortu pad bat",
+ tribeChatCreate: "Sortu txat bat",
+ tribeCalendarCreate: "Sortu egutegi bat",
+ tribePadsEmpty: "Oraindik ez dago padik.",
+ tribeChatsEmpty: "Oraindik ez dago txatik.",
+ tribeCalendarsEmpty: "Oraindik ez dago egutegirik.",
tribeInhabitantsEmpty: "Tribu honetan biztanlerik ez, oraindik.",
tribeEventCreate: "Sortu Ekitaldia",
tribeEventsEmpty: "Ekitaldirik ez, oraindik.",
@@ -1904,9 +2157,14 @@ module.exports = {
tribeMediaTypeDocument: "Dokumentua",
tribeMediaTypeBookmark: "Laster-marka",
tribeContentDelete: "EZABATU",
+ tribeReachTribe: "TRIBUA",
+ tribeReachNotice: "OASISek biztanle guztiei erakusten die eta CLEARNETek web irekian ere bai. Irekitzeak kopia irakurgarri bat uzten du tributik kanpo: TRIBUAra itzultzeak ezkutatu egiten du, baina dagoeneko partekatutako kopiak ezin dira ezabatu.",
+ tribeReachPrivate: "Tribu pribatu baten edukia tribuaren barruan bakarrik gera daiteke.",
+ tribeReachOpenedBy: "Ireki duena",
+ tribeReachChange: "Non argitaratzen den",
tribeInviteCodeText: "Gonbidapen kodea: ",
oasisVersionLabel: "Oasis Bertsioa",
- tribeInviteCodeHint: "Partekatu kode hau gonbidatu nahi duzun pertsonarekin. /invites → Tribes bidez sar daiteke.",
+ tribeInviteCodeHint: "Partekatu kode hau gonbidatu nahi duzun pertsonarekin. /invites bidez sar daiteke.",
tribeStatusOpen: "IREKITA",
tribeStatusClosed: "ITXITA",
tribeStatusInProgress: "ABIAN",
@@ -1924,7 +2182,7 @@ module.exports = {
tribeSubTribes: "AZPI-TRIBUAK",
tribeSubTribesCreate: "Azpi-Tribua Sortu",
tribeSubTribesStrictDenied: "Tribuaren modu zorrotzak ez dizu azpi-tribu berriak sortzen uzten. Jarri harremanetan administratzailearekin.",
- tribeActivityRefeed: "REFEED",
+ tribeActivityRefeed: "BERJARIOA",
tribeSectionActivity: "JARDUERA",
tribeSectionTrending: "JOERAK",
tribeSectionTags: "ETIKETAK",
@@ -1946,7 +2204,7 @@ module.exports = {
tribeSearchMinChars: "Idatzi gutxienez 2 karaktere bilatzeko.",
agendaTitle: "Agenda",
agendaDescription: "Eskeituta dauzkazun elementu guztiak aurki ditzakezu hemen.",
- agendaSearchPlaceholder: "Bilatu agendan...",
+ agendaSearchPlaceholder: "Bilatu hemen: Agenda...",
agendaFilterAll: "GUZTIAK",
agendaFilterToday: "GAUR",
agendaFilterUpcoming: "DATOZENAK",
@@ -1968,6 +2226,7 @@ module.exports = {
agendaNoItems: "Esleipenik ez.",
agendaDiscardButton: "Baztertu",
agendaRestoreButton: "Berrezarri",
+ agendaRemoveButton: "Kendu",
agendaMembersCount: "Partaideak",
agendaLocationLabel: "Kokapena",
agendaYes: "BAI",
@@ -2033,8 +2292,8 @@ module.exports = {
pmComposeTitle: "Bidali mezu bat",
pmRecipients: "Hartzaileak",
pmRecipientsHint: "Idatzi Oasis IDak, komaz bereizita",
- pmLimitsHint: "Mezu bakoitzeko 7 hartzaile gehienez.",
- pmTextPlaceholder: "Gorputza 7000 karakteretara mugatua.",
+ pmLimitsHint: "Mezu bakoitzeko 7 bizilagun gehienez.",
+ pmTextPlaceholder: "Idatzi zure mezua.",
pmSubject: "Gaia",
pmSubjectHint: "Idatzi mezuaren gaia",
pmText: "Mezua",
@@ -2056,8 +2315,8 @@ module.exports = {
pmCrypterCharsLabel: "karaktere",
pmInvalidRecipients: "Oasis ID baliogabea (@…=.ed25519 itxurakoa izan behar du).",
pmEncryptionLabel: "Zifratzea",
- private: "Pribatuak",
- privateDescription: "Zure mezu zifratuak.",
+ private: "Sarrera-ontzia",
+ privateDescription: "Kudeatu zure mezu pribatuak.",
privateInbox: "SARRERA-ONTZIA",
privateSent: "BIDALITAKOAK",
privateDelete: "Ezabatu",
@@ -2066,6 +2325,7 @@ module.exports = {
pmReply: "Erantzun",
pmReplies: "erantzunak",
inReplyTo: "HONI ERANTZUNEZ",
+ forumInThread: "HARIAN",
pmPreview: "Aurrebista",
pmPreviewTitle: "Mezuaren aurrebista",
performed: "→",
@@ -2115,22 +2375,21 @@ module.exports = {
blockchainViewBlockexplorer: "Ikusi Blockexplorer-en",
blockchainBack: 'Itzuli blokearen azterkira',
blockchainContentDeleted: "Edukia ezabatu egin da",
- banking: 'Banking',
- bankingTitle: 'Banking',
- bankingDescription: "ECOin ekonomia: saldoa, oinarrizko errenta, zergak eta industria balioa.",
+ banking: "Bankua",
+ bankingTitle: "Bankua",
+ bankingDescription: "ECOin ekonomia kolektiboa.",
bankOverview: 'Laburpena',
bankEpochs: 'Epeak',
bankRules: 'Arauak',
pending: 'Zain',
closed: 'Itxita',
- bankViewTx: 'Tx ikusi',
bankClaimNow: 'Esleitu',
- bankClaimUBI: 'RBU eskatu!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: "OBU eskatu",
+ bankClaimAndPay: "Eskatu eta ordaindu",
+ bankClaimedPending: "Eskaera zain...",
+ bankStatusClaimed: "Eskatuta",
+ bankStatusExpired: "Iraungita",
+ bankPubOnly: "PUBentzako soilik den eragiketa",
bankEpoch: 'Epea',
bankPool: 'Funtsa (epe honetan)',
bankWeightsSum: 'Pisuen batura',
@@ -2149,8 +2408,8 @@ module.exports = {
bankViewEpoch: 'Epea ikusi',
bankYourIndustryBalance: "Zure industria zatia",
bankYourUbiMonth: "Zure OBU (hilabete honetan)",
- bankYourFundsMonth: "Zure funtsak (hilabete honetan)",
- bankIndustryBalance: "Industria ekoizpena (estimatua)",
+ bankYourFundsMonth: "Funtsak guztira",
+ bankIndustryBalance: "Industria ekoizpena",
bankUserBalance: 'Zure saldoa',
bankAddresses: 'Helbideak',
bankNoAddresses: 'Ez da helbiderik aurkitu.',
@@ -2158,6 +2417,10 @@ module.exports = {
bankAddress: 'Helbidea',
bankAddAddressTitle: 'ECOIN helbidea gehitu',
bankAddAddressUser: 'Oasis ID',
+ bankAddAddressLabel: "Etiketa (aukerakoa)",
+ bankAddAddressLabelPlaceholder: "Boben zorroa, Aliceren denda…",
+ bankAddAddressUserOptional: "Oasis ID (aukerakoa)",
+ bankAddressUnnamed: "Izenik gabeko helbidea",
bankAddAddressAddress: 'ECOIN helbidea',
bankAddAddressSave: 'Gorde',
bankAddressAdded: 'Helbidea gehituta',
@@ -2175,21 +2438,21 @@ module.exports = {
bankAddressDeleteConfirm: 'Helbide hau ezabatu?',
search: 'Bilatu!',
bankLocal: 'Lokala',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Sarea",
bankingUserEngagementScore: "KARMA puntuazioa",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "FUNTSIK EZ!",
bankUbiAvailableOk: "ESKURAGARRI!",
- bankUbiAvailability: "OBU (sarea)",
+ bankUbiAvailability: "OBU",
bankAlreadyClaimedThisMonth: "Hilabete honetan jada aldarrikatu da",
- bankUbiThisMonth: "UBI (hilabete honetan)",
- bankUbiLastClaimed: "UBI (azken aldarrikapena)",
+ bankUbiThisMonth: "OBU (hilabete honetan)",
+ bankUbiLastClaimed: "OBU (azken aldarrikapena)",
bankUbiNeverClaimed: "Inoiz aldarrikatu ez",
- bankUbiTotalClaimed: "UBI (guztira aldarrikatua)",
+ bankUbiTotalClaimed: "OBU (guztira aldarrikatua)",
bankUbiPub: "PUB",
bankUbiInhabitant: "BIZTANLEA",
bankUbiClaimedAmount: "ALDARRIKATUA (ECO)",
- typeBankUbiResult: "BANKUA - UBI",
+ typeBankUbiResult: "BANKUA - OBU",
bankNoPubConfigured: "PUBik ez dago konfiguratuta. Ezarri zure PUB IDa Ezarpenetan.",
shopsTitle: "Dendak",
shopDescription: "Sareko dendak aurkitu eta kudeatu.",
@@ -2210,6 +2473,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Garraioan zifratua",
shopAddFavorite: "Gogoko gehitu",
shopRemoveFavorite: "Gogoko kendu",
shopOpen: "IREKIA",
@@ -2217,11 +2481,18 @@ module.exports = {
shopMakePrivate: "PRIBATU BIHURTU (E2E)",
shopMakePublic: "PUBLIKO BIHURTU",
shopProducts: "Produktuak",
+ shopFilterAll: "GUZTIAK",
+ shopFilterRecent: "AZKENAK",
+ shopFilterMine: "NIREAK",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUKTUAK",
+ shopFilterPrices: "PREZIOAK",
+ shopFilterFavorites: "GOGOKOAK",
shopProductAdd: "Produktua gehitu",
shopProductTitle: "Produktua",
shopProductUpdate: "Produktua eguneratu",
shopProductPrice: "Prezioa (ECO)",
- shopProductStock: "Stock",
+ shopProductStock: "Izakinak",
shopProductUntitled: "Izengabeko produktua",
shopUntitled: "Izengabeko denda",
shopNoItems: "Ez da dendarik aurkitu.",
@@ -2244,7 +2515,7 @@ module.exports = {
marketVisitItem: "ITEMA BISITATU",
shopStatus: "EGOERA",
shopCreatedAt: "SORTUA",
- shopSearchPlaceholder: "Dendak bilatu...",
+ shopSearchPlaceholder: "Bilatu hemen: Dendak...",
shopUrl: "URL",
shopLocation: "Kokapena",
shopTags: "Etiketak",
@@ -2254,36 +2525,39 @@ module.exports = {
shopTitlePlaceholder: "Zure dendaren izena",
shopDescriptionPlaceholder: "Zure dendaren deskribapen zehatza",
shopLocationPlaceholder: "Hiria, Herrialdea",
- shopTagsPlaceholder: "tag1, tag2, tag3",
+ shopTagsPlaceholder: "Idatzi etiketak komaz bereizita",
mapTitlePlaceholder: "Maparen titulua",
shopProductFeatured: "Produktu Nabarmendua",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "Bidali merkatura",
typeShop: "DENDAK",
typeShopProduct: "DENDA PRODUKTUA",
bankExchange: 'Trukea',
bankExchangeCurrentValue: 'ECOin Balioa (1h)',
- bankTotalSupply: 'ECOin Hornidura Guztizkoa',
+ bankTotalSupply: "ECOin hornidura guztizkoa",
+ bankPubsSupply: "PUBen poltsako ECOin hornidura",
+ bankHoldingSupply: "UBItik kanpoko ECOin hornidura",
bankHoursOfWork: 'lan orduak',
bankUnitMs: "ms",
bankUnitSeconds: "segundo",
bankUnitMinutes: "minutu",
bankUnitDays: "egun",
bankExchangeNoData: 'Ez dago daturik eskuragarri',
- bankInflation: 'ECOin Inflazioa (anual)',
- bankInflationMonthly: 'ECOin Inflazioa (mensual)',
+ bankInflation: "ECOin Inflazioa (urtekoa)",
+ bankInflationMonthly: "ECOin Inflazioa (hilekoa)",
bankExchangeChartTitle: 'ECOin balioaren bilakaera denboran zehar',
bankExchangeChartValue: 'Balioa (ECO/h)',
bankExchangeChartSupply: 'Eskaintza',
bankExchangeChartInflation: 'Inflazioa %',
bankExchangeChartEmpty: 'Ez dago lagin nahikorik oraindik — itzuli geroago',
- bankCurrentSupply: 'ECOin Oraingo Hornidura',
+ bankCurrentSupply: "Uneko ECOin hornidura",
bankingSyncStatus: 'ECOin Egoera',
bankingSyncStatusSynced: 'Sinkronizatuta',
- bankingSyncStatusOutdated: 'Desegonetik',
+ bankingSyncStatusOutdated: "Sinkronizatu gabe",
statsTitle: 'Estatistikak',
statistics: "Estatistikak",
statsDescription: "Ezagutu zure sareari buruzko estatistikak.",
ALLButton: "GUZTIAK",
+ RECENTButton: "AZKENAK",
MINEButton: "NIREAK",
TOMBSTONEButton: "EZABAKETAK",
statsCreatedAt: "Sortze data",
@@ -2291,7 +2565,8 @@ module.exports = {
statsYourOpinions: "Iritziak",
statsNetworkContent: "Edukia",
statsNetworkOpinions: "Iritziak",
- statsEcoWalletLabel: "ECOIN zorroa",
+ statsEcoWalletLabel: "ECOin zorroa",
+ walletAddressCopyHint: "Sakatu hautatzeko, gero kopiatu",
statsEcoWalletNotConfigured: "Konfiguratu gabe!",
statsBookmark: "Laster-markak",
statsEvent: "Ekitaldiak",
@@ -2313,6 +2588,8 @@ module.exports = {
statsTransfer: "Transferentziak",
statsAiExchange: "IA",
statsPUBs: 'PUBack',
+ statsSyncedPeers: "Parekoak",
+ statsTotalLabel: "Guztira",
statsPost: "Mezuak",
statsSize: "Guztira (tamaina)",
statsBlockchainSize: "Blockchain (tamaina)",
@@ -2364,9 +2641,15 @@ module.exports = {
aiPrompt: "Eman erantzun informatibo eta zehatza.",
aiConfiguration: "Konfiguratu prompt-a",
aiPromptUsed: "Prompt-a",
- aiClearHistory: "Txataren historia garbitu",
- aiServerError: "Ezin izan da IAren erantzuna lortu. Saiatu berriro.",
- aiInputPlaceholder: "What is Oasis?",
+ aiClearHistory: "Garbitu historia",
+ aiServerError: "Ezin dut ondo erantzun. Saiatu berriro.",
+ aiStatusLoading: "42 eredua kargatzen ari da. Galdetu berriro une batean.",
+ aiThinking: "Pentsatzen",
+ aiWaiting: "Zain",
+ aiStatusMissingModel: "IA eredua ez dago instalatuta: src/AI/oasis-42-1-chat.Q4_K_M.gguf falta da.",
+ aiExportFineTuning: "Fine-Tuning esportatu",
+ aiFactsTitle: "Zure sareko datuak",
+ aiInputPlaceholder: "Zer da Oasis?",
typeAiExchange: "IA",
aiApproveTrain: "Prestakuntza kolektibora gehitu",
aiRejectTrain: "Ez entrenatu",
@@ -2392,9 +2675,9 @@ module.exports = {
marketFilterForSale: "SALGAI",
marketFilterSold: "SALDUTA",
marketFilterDiscarded: "BAZTERTUTA",
- marketFilterRecent: "AZKENA",
+ marketFilterRecent: "AZKENAK",
marketFilterMyBids: "PUJAK",
- marketCreateButton: "Artikulua sortu",
+ marketCreateButton: "Saldu zerbait",
marketItemType: "Mota",
marketItemTitle: "Izenburua",
marketItemAvailable: "Epemuga",
@@ -2405,7 +2688,7 @@ module.exports = {
marketItemCondition: "Egoera (kalitatea)",
marketItemPrice: "Prezioa",
marketItemTags: "Etiketak",
- marketItemTagsPlaceholder: "Sartu etiketak komaz bereizita",
+ marketItemTagsPlaceholder: "Idatzi etiketak komaz bereizita",
marketItemDeadline: "Epemuga",
marketItemIncludesShipping: "Bidalketa barne?",
marketItemHighestBid: "Puja altuena",
@@ -2421,8 +2704,8 @@ module.exports = {
marketItemSeller: "Saltzailea",
marketNoItems: "Oraindik ez dago artikulurik eskuragarri.",
marketYourBid: "Zure puja",
- marketCreateFormImageLabel: "Multimedia igo (max: 50MB)",
- marketSearchPlaceholder: "Izenburuan edo etiketetan bilatu",
+ marketCreateFormImageLabel: "Multimedia igo (max: 75MB)",
+ marketSearchPlaceholder: "Bilatu hemen: Merkatua...",
marketMinPriceLabel: "Gutxieneko prezioa",
marketMaxPriceLabel: "Gehieneko prezioa",
marketSortRecent: "Berrienak",
@@ -2488,8 +2771,7 @@ module.exports = {
housingSetClosed: "Ez eskuragarri jarri",
housingCreateButton: "Sortu lekua",
housingUpdateButton: "Eguneratu",
- housingDeleteButton: "Ezabatu",
- housingSearchPlaceholder: "Bilatu lekuak...",
+ housingSearchPlaceholder: "Bilatu hemen: Etxebizitza...",
housingSearchButton: "Bilatu",
housingMinPrice: "Gutxieneko prezioa",
housingMaxPrice: "Gehieneko prezioa",
@@ -2556,7 +2838,7 @@ module.exports = {
jobLocationPresencial: "Aurrez aurrekoa",
jobLocationRemote: "Urrunekoa",
jobVacantsPlaceholder: "Postu kopurua",
- jobImage: "Multimedia igo (max: 50MB)",
+ jobImage: "Multimedia igo (max: 75MB)",
jobTasks: "Eginkizunak",
jobType: "Lanen Motak",
jobTime: "Lanen Denbora",
@@ -2567,12 +2849,11 @@ module.exports = {
jobAuthor: "Egilea",
jobTimePartial: "Partziala",
jobTimeComplete: "Osotua",
- jobsDeleteButton: "EZABATU",
jobsUpdateButton: "EGUNERATU",
jobsFilterApplied: "ESKATUTA",
jobsAppliedTitle: "Nire eskaerak",
jobsAppliedBadge: "Izena emanda",
- jobsSearchPlaceholder: "Bilatu izenburua, etiketak, deskribapena...",
+ jobsSearchPlaceholder: "Bilatu hemen: Lanak...",
jobsMinSalaryLabel: "Gutx. soldata",
jobsMaxSalaryLabel: "Geh. soldata",
jobsSortRecent: "Berrienak",
@@ -2584,15 +2865,15 @@ module.exports = {
jobSetOpen: "Ireki gisa markatu",
jobsTagsLabel: "Etiketak",
noJobsMatch: "Ez dago bilaketarekin bat datorren lan-eskaintzarik.",
- industrySearchPlaceholder: "Bilatu fabrikak…",
+ industrySearchPlaceholder: "Bilatu hemen: Industria...",
industryAllSectors: "Sektore guztiak",
industryVisitButton: "Bisitatu industria",
industryAdvanceTo: "Ezarri",
industryAmount: "Kopurua",
industryApproveBuild: "Onartu",
- industryBlueprint: "Blueprint",
+ industryBlueprint: "Planoa",
industryBlueprints: "Blueprint-ak",
- industryBuild: "Build",
+ industryBuild: "Ekoizpena",
industryBuildNotes: "Oharrak",
industryBuildStart: "Hasiera data",
industryVoteUpdateButton: "Bozkatu eguneraketa",
@@ -2658,7 +2939,6 @@ 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",
@@ -2685,7 +2965,7 @@ module.exports = {
industryRulesIntro: "Industry-k biztanleei ekoizpen bideak modu kolektiboan izatea ahalbidetzen die: Fabrika bat sareko lantegia da, inork pribatuki ez duena.",
industryRulesSteward: "Sortzailea arduraduna da — zaindaria, ez jabea: ezin du Fabrika bakarrik saldu, pribatizatu edo desegin.",
industryRulesMembership: "Kidetza politikak nola sartu erabakitzen du: Irekia (berehala), Botoz (kideen botoak onartuta) edo Gonbidapenez soilik (kide batek lehenik gonbidatu behar zaitu).",
- industryRulesQuorum: "Quoruma erabaki batek balio izateko bozkatu behar duten gutxieneko kide kopurua da, Fabrika txiki bat pertsona bakar batek erabaki ez dezan.",
+ industryRulesQuorum: "Quoruma erabaki batek balio izateko bozkatu behar duten gutxieneko kide kopurua da, Fabrika txiki bat biztanle bakar batek erabaki ez dezan.",
industryRulesMajority: "Gehiengoa onartzeko behar den boto frakzioa da (0,5 = erdia, 1 = aho batez); erabaki bat onartzen da BAI botoek gutxienez max(quoruma, kideak × gehiengoa) lortzen dutenean.",
industryRulesDecisions: "Kideek bozkatzen dute berriak onartzeko, build-ak onartzeko eta Fabrika desegiteko; arduradunak ezin ditu erabaki kolektibo hauek baztertu.",
industryRulesBlueprints: "Blueprint-ak errezeta libreak dira (COPYLEFT) — sarrerak (materialak, lan orduak, trebetasunak) eta irteera (ondasun fisiko edo digital bat) — eta edonork forka ditzake.",
@@ -2704,13 +2984,14 @@ module.exports = {
industryPauseVotes: "Egoera botoak",
industryTitle: "Industria",
industryDescription: "Ekoizpen bideak modu kolektiboan kudeatzeko modulua.",
- typeIndustryBuild: "BUILD",
- typeIndustryBlueprint: "BLUEPRINT",
+ typeIndustryBuild: "EKOIZPENA",
+ typeIndustryBlueprint: "PLANOA",
typeIndustryAllocation: "BANAKETA",
typeIndustry: "INDUSTRIA",
modulesIndustryLabel: "Industria",
modulesIndustryDescription: "Ekoizpen bideak modu kolektiboan kudeatzeko modulua.",
industryFilterAll: "GUZTIAK",
+ industryFilterRecent: "AZKENAK",
industryFilterMember: "KIDEA",
industryFilterBlueprints: "PLANOAK",
industryFilterBuilds: "EKOIZPENAK",
@@ -2719,6 +3000,7 @@ module.exports = {
industryFilterPaused: "ETENDA",
industryFilterDissolved: "DESEGINDA",
industryAllTitle: "Industria",
+ industryRecentTitle: "Azken fabrikak",
industryMemberTitle: "Kide naizen fabrikak",
industryMineTitle: "Nire fabrikak",
industryActiveTitle: "Martxan",
@@ -2766,7 +3048,7 @@ module.exports = {
industryPolicy_invite: "Gonbidapenez soilik",
projectsTitle: "Proiektuak",
projectsDescription: "Sortu, finantzatu eta jarraitu komunitateak gidatutako proiektuak zure sarean.",
- projectSearchPlaceholder: "Bilatu proiektuak...",
+ projectSearchPlaceholder: "Bilatu hemen: Proiektuak...",
projectCreateProject: "Proiektu Bat Sortu",
projectCreateButton: "Proiektu Bat Sortu",
projectUpdateButton: "EGUNERATU",
@@ -2789,7 +3071,7 @@ module.exports = {
projectRecentTitle: "Proiektu Azkenak",
projectTopTitle: "Finantzatuenak",
projectTitlePlaceholder: "Proiektuaren izena",
- projectImage: "Multimedia igo (max: 50MB)",
+ projectImage: "Multimedia igo (max: 75MB)",
projectDescription: "Deskribapena",
projectDescriptionPlaceholder: "Kontatu istorioa eta helburuak...",
projectGoal: "Helburu (ECO)",
@@ -2861,15 +3143,13 @@ module.exports = {
modulesModuleName: "Izena",
modulesModuleDescription: "Deskribapena",
modulesModuleStatus: "Egoera",
- modulesTotalModulesLabel: "Kargatutako Moduluak",
+ modulesTotalModulesLabel: "Guztira",
modulesEnabledModulesLabel: "Gaituta",
modulesDisabledModulesLabel: "Desgaituta",
modulesInvitesLabel: "Gonbidapenak",
modulesInvitesDescription: "Gonbidapen-kodeak kudeatu eta aplikatzeko modulua.",
modulesWalletLabel: "Zorroa",
modulesWalletDescription: "Zure aktibo digitalak (ECOin) kudeatzeko modulua.",
- modulesLegacyLabel: "Gakoak",
- modulesLegacyDescription: "Zure sekretua (gako pribatua) modu azkar eta seguruan kudeatzeko modulua.",
modulesCipherLabel: "Zifratzailea",
modulesCipherDescription: "Zure testua simetrikoki zifratu eta deszifratzeko modulua (pasahitz partekatu baten bidez).",
modulesBookmarksLabel: "Markagailuak",
@@ -2900,7 +3180,7 @@ module.exports = {
modulesVotationsDescription: "Bozketak aurkitu eta kudeatzeko modulua.",
modulesParliamentLabel: "Legebiltzarra",
modulesParliamentDescription: "Gobernuak hautatu eta legeak bozkatzeko modulua.",
- modulesCourtsLabel: "Epaitegiak",
+ modulesCourtsLabel: "Auzitegiak",
modulesCourtsDescription: "Gatazkak konpontzeko eta epaia emateko modulua.",
modulesReportsLabel: "Txostenak",
modulesReportsDescription: "Arazo, akats, abusu eta eduki-abisuetan erlazionatutako txostenak kudeatzeko modulua.",
@@ -2922,7 +3202,7 @@ module.exports = {
modulesMelodyDescription: "Zure blockchain-aren \"soinua\" sortzeko eta partekatzeko modulua.",
modulesAgendaLabel: "Agenda",
modulesAgendaDescription: "Esleitu zaizkizun elementu guztiak kudeatzeko modulua.",
- modulesAILabel: "AI",
+ modulesAILabel: "IA",
modulesAIDescription: "'42' izeneko LLM batekin hitz egiteko modulua.",
modulesForumLabel: "Foroak",
modulesForumDescription: "Foroak deskubritu eta kudeatzeko modulua.",
@@ -2931,20 +3211,23 @@ module.exports = {
modulesProjectsLabel: "Proiektuak",
modulesProjectsDescription: "Proiektuak esploratzeko, finantzatzeko eta kudeatzeko modulu.",
modulesBankingLabel: "Bankua",
- modulesBankingDescription: "ECOINen benetako balioa zehazteko eta UBI bat altxortegi komuna erabiliz banatzeko modulua.",
+ modulesBankingDescription: "Altxor komuna kudeatzeko modulua: ECOINen balioa, zergak eta oinarrizko errenta.",
modulesFavoritesLabel: "Gogokoak",
modulesFavoritesDescription: "Zure gogoko edukia kudeatzeko modulua.",
fileTooLargeTitle: "Fitxategia handiegia",
- fileTooLargeMessage: "Fitxategiak onartutako gehienezko tamaina gainditzen du (50 MB). Mesedez, hautatu fitxategi txikiago bat.",
+ fileTooLargeMessage: "Fitxategiak onartutako gehienezko tamaina gainditzen du (75 MB). Mesedez, hautatu fitxategi txikiago bat.",
goBack: "Itzuli",
+ errorDismiss: "Ados",
errorPageTitle: "Zerbait gaizki joan da",
+ errorNoAllocation: "Ez da esleipenik aurkitu erreklamazio honetarako.",
+ errorInvalidClaim: "Esleipen hau ezin da erreklamatu.",
visibilityLabel: "Ikusgaitasuna",
+ clearnetPrivateConflict: "Eduki pribatua, ezkutua, itxia, gonbidapen bidezkoa edo ordainpekoa ezin da CLEARNETen argitaratu. Aukeratu OASIS edo egin ezazu publiko.",
visibilityPublic: "Publikoa",
visibilityHidden: "Ezkutua",
visibilityMakePublic: "Publiko egin",
visibilityMakeHidden: "Ezkutatu",
invitesInhabitantsTitle: "Biztanleak",
- invitesInhabitantsFollow: "Jarraitu",
aiNavPlaceholder: "Deskribatu zer behar duzun...",
aiNavDisabled: "AI nabigazioa desgaituta dago.",
aiNavResultsTitle: "AINav iradokizunak",
@@ -2955,7 +3238,7 @@ module.exports = {
modulesAINavDescription: "Sareko edukiari buruzko hizkuntza naturalezko galderak egiteko modulua.",
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)",
+ peerPort: "Ataka",
peerPublicKey: "Gako Publikoa (@...ed25519)",
connectAndFollow: "Konektatu",
modulesPresetTitle: "Konfigurazio Arruntak",
@@ -2964,26 +3247,27 @@ module.exports = {
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_kids: "Haurrak",
+ workflow_activists: "Aktibismoa",
workflow_mobile: "Mugikorra",
statsCarbonFootprintTitle: "Karbono Aztarna",
statsCarbonTombstone: "Tombstoning-aren aztarna",
- uploadMedia: "Multimedia igo (max: 50MB)",
+ uploadMedia: "Multimedia igo (max: 75MB)",
reportsWhyInappropriateLabel: "Zergatik da desegokia?",
visitContent: "Bisitatu Edukia",
favoriteAdd: "Ainguratu Gogokoetan",
pmContentTooltip: "Bidali Mezu Pribatua",
+ phoneCallTooltip: "Egin Dei bat",
favoriteRemove: "Kendu Gogokoetatik",
reportContent: "Salatu Edukia",
- bankEcoinHours: "ECOin Orduak",
+ bankEcoinHours: "ECOin Orduak (1 ECO)",
mapsLabel: "Mapak",
mapTitle: "Mapak",
- mapDescription: "Esploratu eta kudeatu lineaz kanpoko mapak zure sarean.",
+ mapDescription: "Kudeatu eta partekatu lineaz kanpoko mapak zure sarean.",
mapMineSectionTitle: "Zure Mapak",
mapCreateSectionTitle: "Mapa Sortu",
mapUpdateSectionTitle: "Mapa Eguneratu",
@@ -3012,7 +3296,7 @@ module.exports = {
mapTypeOpen: "IREKIA",
mapTypeClosed: "ITXIA",
mapTagsLabel: "Etiketak",
- mapTagsPlaceholder: "Sartu etiketak komaz bereizita",
+ mapTagsPlaceholder: "Idatzi etiketak komaz bereizita",
mapUrlLabel: "Maparen URLa",
mapMarkersTitle: "Markatzaileak",
mapMarkerDefault: "Markatzailea",
@@ -3023,9 +3307,22 @@ module.exports = {
markerImageLabel: "Markatzailearen Irudia",
mapAddMarkerTitle: "Markatzailea Gehitu",
mapAddMarkerButton: "Markatzailea Gehitu",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Garbitu markatzailea",
mapApplyZoom: "Zoom aplikatu",
- mapSearchPlaceholder: "Bilatu deskribapena, etiketak, egilea...",
+ mapPlaceSearchPlaceholder: "Bilatu leku edo herrialde bat...",
+ mapNoPlaces: "Ez da lekurik aurkitu.",
+ mapClusterTitle: "markatzaile hemen, sakatu hurbiltzeko",
+ mapDeleteMarker: "Ezabatu markatzailea",
+ mapZoomIn: "Hurbildu",
+ mapZoomOut: "Urrundu",
+ mapFitMarkers: "Doitu markatzaile guztietara",
+ mapPanLabel: "Mugitu mapa",
+ mapCenterHere: "Zentratu hemen",
+ mapNear: "hemendik gertu:",
+ mapPickedSpot: "Aukeratutako puntua",
+ mapPickHint: "Sakatu mapan puntu bat aukeratzeko.",
+ mapClearPick: "Garbitu",
+ mapSearchPlaceholder: "Bilatu hemen: Mapak...",
mapSearchButton: "Bilatu",
mapUpdatedAt: "Eguneratua",
mapNoMatch: "Ez da maparik aurkitu zure bilaketarekin.",
@@ -3036,31 +3333,602 @@ module.exports = {
typeMapMarker: "MAPA MARKATZAILEA",
modulesMapLabel: "Mapak",
modulesMapDescription: "Lineaz kanpoko mapak kudeatzeko eta partekatzeko modulua.",
+ emergenciesTitle: "Larrialdiak",
+ modulesEmergenciesLabel: "Larrialdiak",
+ modulesEmergenciesDescription: "Sarean larrialdiak jaurti, berretsi eta jarraitzeko modulua.",
+ emergenciesDescription: "Sarean larrialdiak jaurti, berretsi eta jarraitzeko modulua.",
+ emergencyCreate: "Larrialdia sortu",
+ emergencyUpdate: "Eguneratu",
+ emergencyDelete: "Ezabatu",
+ emergencyTitleLabel: "Izenburua",
+ emergencyTitlePlaceholder: "Zer gertatzen ari da?",
+ emergencyTextLabel: "Xehetasunak",
+ emergencyTextPlaceholder: "Non, noiztik, zer egin...",
+ emergencyCategoryLabel: "Kategoria",
+ emergencyCategoryWeather: "EGURALDIA",
+ emergencyCategoryInfrastructure: "AZPIEGITURA",
+ emergencyCategoryHealth: "OSASUNA",
+ emergencyCategorySecurity: "SEGURTASUNA",
+ emergencyCategoryLost: "GALDUTAKOAK",
+ emergencyCategoryNeighborhood: "AUZOA",
+ emergencyExpiresLabel: "Iraungitzen da",
+ emergencyExpires1d: "Egun 1",
+ emergencyExpires3d: "3 egun",
+ emergencyExpires7d: "Astebete",
+ emergencyExpires30d: "Hilabete 1",
+ emergencyExpiresNone: "Zehaztugabea",
+ emergencyExpiresKeep: "Mantendu uneko data",
+ emergencyTagsLabel: "Etiketak",
+ emergencyTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ emergencyFilterAll: "GUZTIAK",
+ emergencyFilterMine: "NIREAK",
+ emergencyFilterRecent: "AZKENAK",
+ emergencySeverityUnverified: "EGIAZTATU GABE",
+ emergencySeverityLow: "BAXUA",
+ emergencySeverityMedium: "ERTAINA",
+ emergencySeverityHigh: "ALTUA",
+ emergencyStatusActive: "AKTIBOA",
+ emergencyStatusResolved: "KONPONDUA",
+ emergencyStatusExpired: "IRAUNGITUA",
+ emergencyConfirmations: "Berrespenak",
+ emergencyConfirmButton: "Berretsi",
+ emergencyConfirmed: "Larrialdi hau berretsi duzu",
+ emergencyResolveButton: "Konpondu",
+ emergencyReopenButton: "Berriro ireki",
+ emergencyGenerateReport: "Txostena sortu",
+ emergencyUpdateEdited: "Editatua",
+ emergencyLastUpdate: "AZKEN EGUNERAKETA",
+ emergencyUpdatesTitle: "Azken eguneraketak:",
+ emergencyNoUpdates: "Oraindik ez dago eguneraketarik.",
+ emergencyAddUpdate: "Eguneraketa argitaratu",
+ emergencyUpdatePlaceholder: "Zer aldatu da?",
+ emergencyNoItems: "Ez da larrialdirik aurkitu.",
+ emergencyExpiresAt: "Iraungitzen da",
+ emergencyBannerLabel: "Larrialdi aktiboa",
+ emergencyCreateSectionTitle: "Larrialdia sortu",
+ emergencyUpdateSectionTitle: "Larrialdia eguneratu",
+ emergencySearchPlaceholder: "Bilatu larrialdietan...",
+ typeEmergency: "LARRIALDIAK",
+ typeEmergencyConfirm: "LARRIALDI BERRESPENA",
+ typeEmergencyUpdate: "LARRIALDI EGUNERAKETA",
+ statsEmergency: "Larrialdiak",
+ statsEmergencyConfirm: "Larrialdi berrespenak",
+ statsEmergencyUpdate: "Larrialdi eguneraketak",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Jarraitzen duzun larrialdi batek eguneraketa bat du.",
+ emergencyBotResolvedTitle: "Jarraitzen duzun larrialdi bat konpondu da.",
+ dataKindEmergencies: "LARRIALDIAK",
+ mailingTitle: "Posta-zerrendak",
+ modulesMailingLabel: "Posta-zerrendak",
+ modulesMailingDescription: "Aurkitu eta kudeatu posta-zerrendak zure sarean.",
+ modulesPhoneLabel: "Telefonoa",
+ modulesPhoneDescription: "Beste biztanleei muturretik muturrera zifratutako bideodeiak egiteko modulua.",
+ mailingDescription: "Aurkitu eta kudeatu posta-zerrendak zure sarean.",
+ mailingCreate: "Posta-zerrenda sortu",
+ mailingUpdate: "Eguneratu",
+ mailingArchive: "Artxibatu",
+ mailingActivate: "Aktibatu",
+ mailingCreateSectionTitle: "Posta-zerrenda sortu",
+ mailingUpdateSectionTitle: "Posta-zerrenda eguneratu",
+ mailingTitleLabel: "Izenburua",
+ mailingTitlePlaceholder: "Posta-zerrendaren izena",
+ mailingDescriptionLabel: "Deskribapena",
+ mailingDescriptionPlaceholder: "Zeri buruz da zerrenda hau?",
+ mailingTypeLabel: "Posta-zerrenda mota",
+ mailingTypeOpen: "IREKIA",
+ mailingTypeClosed: "ITXIA",
+ mailingStatusLabel: "Egoera",
+ mailingStatusActive: "AKTIBOA",
+ mailingStatusArchived: "ARTXIBATUA",
+ mailingMembersLabel: "Biztanleak gonbidatu",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Harpidedunak",
+ mailingTagsLabel: "Etiketak",
+ mailingTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ mailingFilterAll: "GUZTIAK",
+ mailingFilterMine: "NIREAK",
+ mailingFilterSubscribed: "HARPIDETUAK",
+ mailingFilterRecent: "AZKENAK",
+ mailingHistoryDate: "DATA",
+ mailingHistoryThreads: "HARIAK",
+ mailingHistoryInhabitants: "BIZTANLEAK",
+ mailingHistorySearchPlaceholder: "Bilatu historian...",
+ mailingNoMessages: "Oraindik ez dago mezurik.",
+ mailingNoItems: "Ez da posta-zerrendarik aurkitu.",
+ mailingSearchPlaceholder: "Bilatu posta-zerrendetan...",
+ mailingWriteButton: "Mezua idatzi",
+ mailingWriteTitle: "Zerrendari idatzi",
+ mailingReplyTitle: "Zerrendari erantzun",
+ mailingSend: "Bidali",
+ mailingTextPlaceholder: "Zure mezua zerrendako partaide guztiei iristen zaie.",
+ mailingParticipants: "Partaideak",
+ inboxFilterMailing: "Posta-zerrendak",
+ mailingReplyPlaceholder: "Zerrendari erantzun...",
+ mailingReplyToList: "Zerrendari erantzun",
+ typeMailingList: "POSTA-ZERRENDA",
+ statsMailingList: "Posta-zerrendak",
+ mailingListLabel: "POSTA-ZERRENDA",
+ logisticsTitle: "Logistika",
+ modulesLogisticsLabel: "Logistika",
+ modulesLogisticsDescription: "Aurkitu eta kudeatu plan logistikoak zure sarean.",
+ logisticsDescription: "Aurkitu eta kudeatu plan logistikoak zure sarean.",
+ logisticsCreate: "Ibilbidea sortu",
+ logisticsUpdate: "Eguneratu",
+ logisticsClose: "Itxi",
+ logisticsReopen: "Berriro ireki",
+ logisticsCreateSectionTitle: "Ibilbidea sortu",
+ logisticsUpdateSectionTitle: "Ibilbidea eguneratu",
+ logisticsTitleLabel: "Izenburua",
+ logisticsTitlePlaceholder: "Bidaia merkatura, furgoneta eskuragarri...",
+ logisticsKindLabel: "Logistika mota",
+ logisticsKindTrip: "BIDAIA",
+ logisticsKindShipment: "BIDALKETA",
+ logisticsKindTrips: "BIDAIAK",
+ logisticsKindShipments: "BIDALKETAK",
+ logisticsModeLabel: "Modua",
+ logisticsModeOffer: "ESKAINTZEN DUT",
+ logisticsModeRequest: "BILA NABIL",
+ logisticsModeOffers: "ESKAINTZAK",
+ logisticsModeRequests: "ESKAERAK",
+ logisticsDescriptionLabel: "Deskribapena",
+ logisticsDescriptionPlaceholder: "Elkargunea, zer daramazun, baldintzak...",
+ logisticsOriginLabel: "Jatorria",
+ logisticsOriginPlaceholder: "Non hasten den",
+ logisticsDestinationLabel: "Helmuga",
+ logisticsDestinationPlaceholder: "Non amaitzen den",
+ logisticsDateLabel: "Data eta ordua",
+ logisticsRecurrenceLabel: "Errepikapena",
+ logisticsFrequencyLabel: "Maiztasuna",
+ logisticsRecurrenceNone: "BAKARRA",
+ logisticsRecurrenceDaily: "EGUNEROKOA",
+ logisticsRecurrenceWeekly: "ASTEKOA",
+ logisticsRecurrenceMonthly: "HILEKOA",
+ logisticsSeatsLabel: "Plazak",
+ logisticsSizeLabel: "Tamaina",
+ logisticsSizePlaceholder: "adib. 2m x 1m",
+ logisticsWeightLabel: "Pisua",
+ logisticsWeightPlaceholder: "adib. 40kg",
+ logisticsPriceFree: "DOAN",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "DENBORA",
+ logisticsPriceLabel: "Prezioa",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Eskaeraren esteka",
+ logisticsOrderRefPlaceholder: "entregatu beharreko eskaeraren /shops/... edo /market/...",
+ logisticsOrderLink: "Lotutako eskaera",
+ logisticsTagsLabel: "Etiketak",
+ logisticsTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ logisticsFilterAll: "GUZTIAK",
+ logisticsFilterMine: "NIREAK",
+ logisticsFilterBooked: "ERRESERBATUAK",
+ logisticsFilterRecent: "AZKENAK",
+ logisticsFilterHistory: "HISTORIA",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "IREKIA",
+ logisticsStatusUpcoming: "HURRENGOAK",
+ logisticsStatusPast: "IGAROTAKOAK",
+ logisticsStatusClosed: "ITXIAK",
+ logisticsZoneLabel: "Eremua",
+ logisticsSearchPlaceholder: "Bilatu logistikan...",
+ logisticsNoItems: "Ez da ibilbiderik aurkitu.",
+ logisticsBookingPending: "ZAIN",
+ logisticsBookingConfirmed: "BAIEZTATUA",
+ logisticsBookingRejected: "BAZTERTUA",
+ logisticsBookingCancelled: "BERTAN BEHERA",
+ logisticsBookingDelivered: "ENTREGATUA",
+ logisticsConfirm: "Baieztatu",
+ logisticsReject: "Baztertu",
+ logisticsDeliver: "Entregatu",
+ logisticsReceiptLabel: "Ordainagiria",
+ logisticsReceiptPlaceholder: "Entrega-oharra (aukerakoa)",
+ logisticsCancelBooking: "Erreserba bertan behera utzi",
+ logisticsBookTitle: "Ibilbide hau erreserbatu",
+ logisticsNotesLabel: "Oharrak",
+ logisticsNotesPlaceholder: "Arduradunak jakin beharrekoa",
+ logisticsBook: "Erreserbatu",
+ logisticsBookingsTitle: "Erreserbak",
+ logisticsMyBookingTitle: "Zure erreserba",
+ logisticsRatingsTitle: "Balorazioak",
+ logisticsNoRatings: "Oraindik ez dago baloraziorik.",
+ logisticsRatingsWhenClosed: "Balorazioak ibilbidea ixtean irekitzen dira.",
+ logisticsScoreLabel: "Puntuazioa",
+ logisticsRatingPlaceholder: "Nola joan da?",
+ logisticsRate: "Baloratu",
+ typeLogisticsRoute: "IBILBIDEA",
+ typeLogisticsRating: "IBILBIDEAREN BALORAZIOA",
+ statsLogisticsRoute: "Ibilbideak",
+ statsLogisticsRating: "Ibilbideen balorazioak",
+ logisticsRouteLabel: "IBILBIDEA",
+ podcastsTitle: "Podcastak",
+ modulesPodcastsLabel: "Podcastak",
+ modulesPodcastsDescription: "Podcast kanalak argitaratzeko modulua.",
+ podcastsDescription: "Podcast kanalak argitaratzeko modulua.",
+ podcastCreate: "Podcasta sortu",
+ podcastUpdate: "Eguneratu",
+ podcastDelete: "Ezabatu",
+ podcastCreateSectionTitle: "Podcasta sortu",
+ podcastUpdateSectionTitle: "Podcasta eguneratu",
+ podcastTitleLabel: "Izenburua",
+ podcastTitlePlaceholder: "Kanalaren izena",
+ podcastDescriptionLabel: "Deskribapena",
+ podcastDescriptionPlaceholder: "Zeri buruz da podcast hau?",
+ podcastCategoryLabel: "Kategoria",
+ podcastCategoryNews: "ALBISTEAK",
+ podcastCategoryMusic: "MUSIKA",
+ podcastCategoryTalk: "SOLASALDIA",
+ podcastCategoryEducation: "HEZKUNTZA",
+ podcastCategoryTech: "TEKNOLOGIA",
+ podcastCategoryCulture: "KULTURA",
+ podcastCategoryCommunity: "KOMUNITATEA",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "BESTELAKOAK",
+ podcastTagsLabel: "Etiketak",
+ podcastCoverLabel: "Azala (irudia edo bideoa)",
+ podcastEpisodeAudioLabel: "Audio edo bideo fitxategia (gehienez: 75MB)",
+ podcastTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ podcastFilterAll: "GUZTIAK",
+ podcastFilterMine: "NIREAK",
+ podcastFilterRecent: "AZKENAK",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "ENTZULEAK",
+ podcastSearchPlaceholder: "Bilatu podcastetan...",
+ podcastNoItems: "Ez da podcastik aurkitu.",
+ podcastEpisodesLabel: "Atalak",
+ podcastPlaysLabel: "Ikustaldiak",
+ podcastLastEpisode: "Azken atala",
+ podcastEpisodesTitle: "Atalak",
+ podcastNoEpisodes: "Oraindik ez dago atalik.",
+ podcastEpisodeAdd: "Atala gehitu",
+ podcastEpisodeCreateTitle: "Atala argitaratu",
+ podcastEpisodeUpdateTitle: "Atala eguneratu",
+ podcastEpisodeTitleLabel: "Atalaren izenburua",
+ podcastEpisodeTitlePlaceholder: "Atalaren izenburua",
+ podcastEpisodeDescriptionLabel: "Oharrak",
+ podcastEpisodeDescriptionPlaceholder: "Zer gertatzen den atal honetan, estekak, kredituak...",
+ podcastEpisodePublish: "Argitaratu",
+ podcastPlayed: "Entzunda",
+ podcastMarkPlayed: "Entzundako gisa markatu",
+ typePodcast: "PODCASTA",
+ typePodcastEpisode: "ATALA",
+ typePodcastOpinion: "ATALAREN IRITZIA",
+ typePodcastPlay: "ERREPRODUKZIOA",
+ statsPodcast: "Podcastak",
+ statsPodcastEpisode: "Atalak",
+ statsPodcastPlay: "Erreprodukzioak",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Jarraitzen duzun blog batek sarrera berria du.",
+ podcastBotEpisodeTitle: "Jarraitzen duzun podcast batek atal berria du.",
+ podcastLabel: "PODCASTA",
+ podcastEpisodeLabel: "ATALA",
+ campaignsTitle: "Kanpainak",
+ modulesCampaignsLabel: "Kanpainak",
+ modulesCampaignsDescription: "Aurkitu eta kudeatu kanpainak zure sarean.",
+ campaignsDescription: "Aurkitu eta kudeatu kanpainak zure sarean.",
+ campaignCreate: "Kanpaina sortu",
+ campaignUpdate: "Eguneratu",
+ campaignDelete: "Ezabatu",
+ campaignClose: "Itxi",
+ campaignReopen: "Berriro ireki",
+ campaignCreateSectionTitle: "Kanpaina sortu",
+ campaignUpdateSectionTitle: "Kanpaina eguneratu",
+ campaignTitleLabel: "Izenburua",
+ campaignTitlePlaceholder: "Zer lortu nahi duzu?",
+ campaignTextLabel: "Testua",
+ campaignTextPlaceholder: "Azaldu kausa, nork erabakitzen duen eta zer eskatzen duzun...",
+ campaignCategoryLabel: "Kategoria",
+ campaignCategoryEnvironment: "INGURUMENA",
+ campaignCategoryRights: "ESKUBIDEAK",
+ campaignCategoryHealth: "OSASUNA",
+ campaignCategoryEducation: "HEZKUNTZA",
+ campaignCategoryInfrastructure: "AZPIEGITURA",
+ campaignCategoryCulture: "KULTURA",
+ campaignCategoryEconomy: "EKONOMIA",
+ campaignCategoryOther: "BESTELAKOAK",
+ campaignGoalLabel: "Sinadura helburua",
+ campaignDeadlineLabel: "Epea",
+ campaignTagsLabel: "Etiketak",
+ campaignTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ campaignFilterAll: "GUZTIAK",
+ campaignFilterMine: "NIREAK",
+ campaignFilterSigned: "SINATUAK",
+ campaignFilterRecent: "AZKENAK",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "IREKIA",
+ campaignStatusAchieved: "LORTUA",
+ campaignStatusUnachieved: "LORTU GABE",
+ campaignStatusClosed: "ITXIA",
+ campaignSearchPlaceholder: "Bilatu kanpainetan...",
+ campaignNoItems: "Ez da kanpainarik aurkitu.",
+ campaignSignaturesLabel: "Sinadurak",
+ campaignSignaturesTitle: "Babesleak",
+ campaignNoSignatures: "Oraindik ez dago sinadurarik.",
+ campaignSignTitle: "Kanpaina hau sinatu",
+ campaignSignPlaceholder: "Zergatik babesten duzu? (aukerakoa)",
+ campaignSign: "Sinatu",
+ campaignSigned: "Dagoeneko sinatu duzu!",
+ campaignNotSigned: "Zure sinadura falta da oraindik",
+ campaignElevate: "Parlamentura eraman",
+ campaignElevated: "Parlamentura eramana",
+ campaignUpdatesTitle: "Eguneraketak",
+ campaignNoUpdates: "Oraindik ez dago eguneraketarik.",
+ campaignUpdatePlaceholder: "Zer gertatu da?",
+ campaignAddUpdate: "Eguneraketa argitaratu",
+ campaignQrAlt: "Kanpaina hau sinatzeko QRa",
+ campaignQrCaption: "Eskaneatu sinatzeko",
+ typeCampaign: "KANPAINA",
+ typeCampaignSignature: "SINADURA",
+ typeCampaignUpdate: "KANPAINAREN EGUNERAKETA",
+ statsCampaign: "Kanpainak",
+ statsCampaignSignature: "Kanpainen sinadurak",
+ statsCampaignUpdate: "Kanpainen eguneraketak",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Jarraitzen duzun kanpaina batek eguneraketa bat du.",
+ campaignBotAchievedTitle: "Jarraitzen duzun kanpaina batek helburua lortu du.",
+ campaignBotRaisedTitle: "Sinatu duzun kanpaina bat Parlamentura eraman da.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Erreserbatu duzun ibilbide bat aldatu da.",
+ logisticsBotClosedTitle: "Erreserbatu duzun ibilbide bat itxi da.",
+ logisticsBotBookedTitle: "Norbaitek zure ibilbidea erreserbatu du.",
+ logisticsBotCancelledTitle: "Zure ibilbideko erreserba bat bertan behera utzi da.",
+ logisticsBotConfirmedTitle: "Zure erreserba berretsi da: paketea bidean da.",
+ logisticsBotRejectedTitle: "Zure erreserba baztertu da.",
+ logisticsBotDeliveredTitle: "Zure paketea iritsi da.",
+ campaignLabel: "KANPAINA",
+ campaignGenerateReport: "Txostena sortu",
+ logisticsGenerateReport: "Txostena sortu",
+ mailingGenerateReport: "Txostena sortu",
+ campaignUpdateEdited: "Editatua",
+ mailingMessagesLabel: "Mezuak",
+ logisticsBookingsLabel: "Erreserbak",
+ backupTitle: "Segurtasun-kopia",
+ modulesBackupLabel: "Segurtasun-kopia",
+ modulesBackupDescription: "Zure gakoak esportatu eta inportatzeko eta segurtasun-kopia zifratuak egiteko modulua.",
+ backupDescription: "Zure gakoak esportatu eta inportatzeko eta segurtasun-kopia zifratuak egiteko modulua.",
+ backupTypeRecovery: "BERRESKURATZEA",
+ backupTypeKeys: "GAKOAK ESPORTATU",
+ backupTypeFull: "KOPIA OSOA",
+ backupTypeRestore: "KOPIA LEHENERATU",
+ backupTypeInstant: "BAT-BATEAN",
+ backupInstantDescription: "Zure erregistro eta fitxategi guztien .zip soil bat, gako sekreturik gabe eta pasahitzik gabe. Azkarra, baina ",
+ backupInstantRisk: "fitxategia duenak dena irakurtzen du.",
+ backupKitPageDescription: "Berreskuratze-kita gailu honetatik bakarrik ireki daiteke.",
+ backupKitId: "Oasis IDa",
+ backupKitDate: "Sortua",
+ backupKitQrAlt: "Zure gako sekretuaren QR kodea",
+ backupKitStep1: "Inprimatu edo eskuz kopiatu eta gorde leku seguru batean, konexiorik gabe.",
+ backupKitStep2: "Berreskuratzeko, instalatu Oasis gailu berri batean eta inportatu sekretu hau Segurtasun-kopia › Gakoak ataletik.",
+ backupKitStep3: "Suntsitu orri hau inoiz agerian geratzen bada.",
+ backupKitPdfButton: "PDFa sortu",
+ backupScopeLabel: "Irismena",
+ backupScopeAll: "DENA",
+ backupScopeMine: "NIRE EDUKIA BAKARRIK",
+ backupSinceLabel: "Noiztik",
+ backupEstimateTitle: "Estimazioa",
+ backupFileInfo: "Zure kopia zifratua gailuan deskargatuko da (izena: oasis-backup-DATA.oasisbk)",
+ backupExportButton: "Kopia deskargatu",
+ backupRestorePassword: "Idatzi kopia egitean erabilitako pasahitza",
+ backupRestoreButton: "Kopia berreskuratu",
+ backupRestoredLine: "Kopia berreskuratuta.",
+ backupRestoredMessages: "Gehitutako mezuak",
+ backupRestoredSkipped: "Lehendik zeudenak",
+ backupRestoredBlobs: "Gehitutako fitxategiak",
+ backupRestoredState: "Ezarpenak berrezarrita",
+ backupRestoredFailed: "Huts egindakoak",
+ backupRestoredForked: "Dibergenteak",
+ backupRestoreRunning: "Kopia leheneratzen. Orri hau bere kabuz eguneratzen da; bitartean Oasis erabiltzen jarrai dezakezu.",
+ backupRestoreElapsed: "Igarotako denbora",
+ backupRestoreFailedLine: "Ezin izan da kopia leheneratu.",
+ backupRestoreForkMine: "Gailu honek dagoeneko zure identitatearekin kopian ez dauden mezuak argitaratu ditu, beraz ezin izan da haien gainean aplikatu. Leheneratu instalazio garbi batean, giltzak inportatu eta berehala, beste ezer egin aurretik.",
+ verificationTitle: "Egiaztapena",
+ verificationDescription: "Egiaztatu zure jarioaren katea, hauteman adarkatzeak eta berrikusi fitxategi umezurtzak edo falta direnak.",
+ verificationRun: "Egiaztapena exekutatu",
+ verificationTotalMessages: "mezu erregistroan",
+ verificationFeed: "Zure jarioa",
+ verificationMessages: "mezu",
+ verificationLastSequence: "azken sekuentzia",
+ verificationGaps: "Hutsuneak",
+ verificationBrokenLinks: "Lotura hautsiak",
+ verificationBadHashes: "Hash okerrak",
+ verificationBadSignatures: "Sinadura okerrak",
+ verificationDuplicates: "Sekuentzia bikoiztuak",
+ verificationForks: "Adarkatzeak",
+ verificationBlobs: "Fitxategiak",
+ verificationBlobsPresent: "daude",
+ verificationBlobsReferenced: "erreferentziatuak",
+ verificationBlobsOrphan: "umezurtzak",
+ verificationBlobsMissing: "falta dira",
+ verificationBlobsMissingOwn: "Gailu honetan falta diren zure fitxategiak",
+ verificationBlobsMissingOthers: "Beste biztanleen fitxategiak oraindik deskargatu gabe",
+ verificationBlobsUnavailable: "Ezin izan dira fitxategiak zerrendatu gailu honetan.",
+ wikiTitle: "Wikiak",
+ modulesWikiLabel: "Wikiak",
+ modulesWikiDescription: "Wikiak aurkitu eta kudeatzeko modulua.",
+ wikiDescription: "Wikiak aurkitu eta kudeatzeko modulua.",
+ wikiCreate: "Wikia sortu",
+ wikiUpdate: "Eguneratu",
+ wikiDelete: "Ezabatu",
+ wikiEdit: "Editatu",
+ wikiTitleLabel: "Izenburua",
+ wikiTitlePlaceholder: "Wikiaren izenburua...",
+ wikiBodyLabel: "Edukia",
+ wikiBodyPlaceholder: "Lotu beste wiki batzuk [[Wikiaren izenburua]] edo [[Wikiaren izenburua|testu propioa]] erabiliz.\n\nAipatu bizilagun bat @id bidez.\n\nEtiketatu #oasis erabiliz.\n\nItsatsi estekak, adibidez https://solarnethub.com\n\nLerro huts batek paragrafo berria hasten du; lerro-jauzi bakunak mantentzen dira.\n\nErantsi onartutako edozein media eta hemen txertatuko da.",
+ formatBarLabel: "Formatua",
+ wikiStatusLabel: "Wiki mota",
+ wikiStatusOpen: "IREKIA",
+ wikiStatusClosed: "ITXIA",
+ wikiTagsLabel: "Etiketak",
+ wikiTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ wikiSummaryLabel: "Aldaketaren laburpena",
+ wikiSummaryPlaceholder: "Zer aldatu da?",
+ wikiFilterAll: "GUZTIAK",
+ wikiFilterMine: "NIREAK",
+ wikiFilterRecent: "AZKENAK",
+ wikiFilterLinked: "LOTUTAK",
+ wikiChanges: "Azken aldaketak",
+ wikiNoPages: "Ez da wikirik aurkitu.",
+ wikiNoChanges: "Oraindik ez dago aldaketarik.",
+ wikiHistory: "Historia",
+ wikiVersion: "Bertsioa",
+ wikiVersions: "bertsio",
+ wikiRestore: "Berreskuratu",
+ wikiDiff: "Aldaketak",
+ wikiViewVersion: "Ikusi",
+ wikiLinkedPages: "Lotutako orriak",
+ wikiNoLinkedPages: "Orri hau ez dago oraindik beste inorekin lotuta.",
+ wikiMissingLink: "Orria ez da existitzen oraindik",
+ wikiDuplicateTitle: "Izenburu hori duen orri bat badago dagoeneko. Aldatu izenburua beste orri bat sortzeko.",
+ wikiCreateSectionTitle: "Wikia sortu",
+ wikiUpdateSectionTitle: "Wikia eguneratu",
+ wikiSearchPlaceholder: "Bilatu Wikian...",
+ wikiCurrentVersion: "Uneko bertsioa",
+ wikiViewingVersion: "Bertsio zahar bat ikusten ari zara",
+ wikiBackToPage: "Itzuli orrira",
+ wikiLinkedChip: "Lotuta",
+ wikiRestoredSummary: "Berreskuratutako bertsioa",
+ wikiExportPdf: "Orria sortu",
+ wikiPreview: "Aurrebista",
+ tribeSectionWiki: "WIKIA",
+ tribeWikiCreate: "Wikia sortu",
+ tribeWikiEmpty: "Oraindik ez dago wikirik.",
+ typeWiki: "WIKIA",
padsTitle: "Padak",
padTitle: "Pad",
modulesPadsLabel: "Padak",
- modulesPadsDescription: "Testu editoreak lankidetzan kudeatzeko modulua.",
+ modulesPadsDescription: "Testu-editore kolaboratiboak kudeatzeko modulua.",
padCreate: "Pad Sortu",
padUpdate: "Eguneratu",
padDelete: "Ezabatu",
padTitleLabel: "Izenburua",
padTitlePlaceholder: "Idatzi pad-aren izenburua...",
padStatusLabel: "Egoera",
+ padTypeLabel: "Pad mota",
padStatusOpen: "IREKIA",
padStatusInviteOnly: "GONBIDATUAK SOILIK",
padStatusClosed: "ITXIA",
padDeadlineLabel: "Epemuga",
padTagsLabel: "Etiketak",
- padTagsPlaceholder: "etiketa1, etiketa2, ...",
+ padTagsPlaceholder: "Idatzi etiketak komaz bereizita",
padMembersLabel: "Kideak",
padCreated: "Sortua",
- padStartEditing: "EDITZEN HASI!",
+ padStartEditing: "Editatu",
padEditorPlaceholder: "Idazten hasi...",
padSubmitEntry: "Bidali",
padNoEntries: "Oraindik sarrerarik ez.",
padAllSectionTitle: "Pad Guztiak",
padMineSectionTitle: "Nire Padak",
padsDescription: "Kudeatu zure sareko enkriptatutako testu-editore kolaboratiboak.",
+ roomsTitle: "Gelak",
+ roomsDescription: "Aurkitu zure sareko bideokonferentzia-gela zifratuak eta sartu haietan.",
+ modulesRoomsLabel: "Gelak",
+ modulesRoomsDescription: "Bideokonferentzia-gela zifratuak aurkitu eta haietan sartzeko modulua.",
+ roomFilterRecent: "AZKENAK",
+ roomFilterMine: "NIREAK",
+ roomFilterAll: "GUZTIAK",
+ roomFilterLive: "ZUZENEAN",
+ roomFilterOpen: "IREKIAK",
+ roomFilterInvite: "GONBIDATUAK SOILIK",
+ roomFilterClosed: "ITXIAK",
+ roomCreate: "Sortu gela",
+ roomUpdate: "Eguneratu",
+ roomDelete: "Ezabatu",
+ roomClose: "Itxi",
+ roomCreateSectionTitle: "Sortu gela",
+ roomUpdateSectionTitle: "Eguneratu gela",
+ roomTitlePlaceholder: "Gelaren izenburua",
+ roomDescriptionLabel: "Deskribapena",
+ roomDescriptionPlaceholder: "Zertaz hitz egingo duzue?",
+ roomTypeLabel: "Gela mota",
+ roomTagsLabel: "Etiketak",
+ roomStatusOpen: "IREKIA",
+ roomStatusInviteOnly: "GONBIDATUAK SOILIK",
+ roomStatusClosed: "ITXIA",
+ roomParticipants: "Parte-hartzaileak",
+ roomJoin: "Sartu",
+ roomLeave: "Irten",
+ roomFull: "Gela beteta",
+ roomLiveChip: "ZUZENEAN",
+ roomMuted: "isilduta",
+ roomRec: "Audioa grabatu",
+ roomRecStop: "Grabazioa gelditu",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} gelan sartu da",
+ roomEventLeft: "{name} gelatik irten da",
+ roomEventRecStart: "{name} grabatzen hasi da",
+ roomEventRecStop: "{name} grabatzeari utzi dio",
+ roomEventMuted: "{name} isilarazi da",
+ roomEventUnmuted: "{name}(e)k isilunea kendu du",
+ roomEventHand: "{name}(e)k eskua altxatu du",
+ roomRaiseHand: "Eskua altxatu",
+ roomLowerHand: "Eskua jaitsi",
+ confirmActionTitle: "Berretsi ekintza hau",
+ confirmActionButton: "Berretsi",
+ confirmJoinText: "Gonbidapen honekin batzera zoaz.",
+ confirmFollowText: "Bizilagun hau babestera zoaz.",
+ confirmSignText: "Kanpaina hau sinatzera zoaz.",
+ confirmDownloadText: "Fitxategi hau zure gailura deskargatzera zoaz.",
+ roomRecordings: "Grabazioak",
+ roomClearNotices: "Garbitu",
+ roomLineSwitchboard: "Zentralita",
+ roomLineDndError: "Gela honen zenbakiak ez du deirik onartzen.",
+ roomNumberHint: "Markatu zenbaki hau Telefonotik gelan sartzeko.",
+ liveRefresh: "Berritu",
+ roomNobody: "Une honetan ez dago inor gelan.",
+ roomSomeone: "{n} gelan une honetan.",
+ roomYou: "zu",
+ roomYouAreIn: "Barruan zaude",
+ roomNobodyInside: "Une honetan ez dago inor gela honetan.",
+ roomErrorFull: "Gela beteta dago. Norbait irteten denean sartu ahal izango zara.",
+ roomErrorUnreachable: "Une honetan ezin da gelara iritsi. Saiatu berriro geroago.",
+ roomErrorBusy: "Dagoeneko dei batean edo beste gela batean zaude.",
+ roomErrorClosed: "Gela hau itxita dago.",
+ roomAccessDenied: "Gela hau gonbidatuentzat soilik da. Gonbidapen bat behar duzu sartzeko.",
+ roomsNoItems: "Ez da gelarik aurkitu.",
+ roomSearchPlaceholder: "Bilatu gelak...",
+ roomInviteMode: "Gonbidapena",
+ tribeSectionRooms: "GELAK",
+ tribeRoomCreate: "Sortu gela",
+ tribeRoomsEmpty: "Oraindik ez dago gelarik.",
+ typeRoom: "GELAK",
+ typeRoomMember: "GELAKO PARTE-HARTZAILEA",
+ statsRoom: "Gelak",
+ statsRoomMember: "Geletako parte-hartzaileak",
+ favoritesFilterRooms: "GELAK",
+ invitesRoomsTitle: "Gelak",
+ inviteCodeInvalid: "Gonbidapen-kode hau ez da baliozkoa edo dagoeneko erabili da.",
+ inviteAlreadyMember: "Dagoeneko bertan zaude. Bere modulutik ireki dezakezu.",
+ actionFailed: "Ezin izan da egin. Saiatu berriro.",
+ publishTooShort: "Zure argitalpena laburregia da.",
+ walletSendFailed: "Ezin izan da ordainketa bidali: {reason}",
+ pixeliaCoordsError: "Koordenatu horiek saretik kanpo daude.",
+ courtsErrTitle: "Izenburu bat behar da.",
+ courtsErrRespondent: "Adierazi kasua noren aurka den.",
+ courtsErrRespondentId: "Hori ez da baliozko Oasis ID bat.",
+ courtsErrMethod: "Aukeratu kasua nola ebatziko den.",
+ courtsErrCaseNotFound: "Ez da kasu hori aurkitu.",
+ courtsErrBrief: "Idatzi zure erantzuna.",
+ courtsErrStance: "Aukeratu zure jarrera.",
+ courtsErrResult: "Idatzi emaitza.",
+ courtsErrTerms: "Idatzi akordioaren baldintzak.",
+ courtsErrMediator: "Gehitu bitartekari bat gutxienez.",
+ courtsErrSelfMediator: "Ezin zara zure kasuko bitartekari izan.",
+ courtsErrJudge: "Aukeratu epaile bat.",
+ courtsErrSelfJudge: "Ezin zara zure kasuko epaile izan.",
+ courtsErrVisibility: "Aukeratu nork ikus dezakeen kasua.",
+ courtsErrNomination: "Ez da izendapen hori aurkitu.",
+ opinionAlreadyGiven: "Dagoeneko eman duzu zure iritzia.",
+ cipherPasswordShort: "Pasahitzak gutxienez 32 karaktere izan behar ditu.",
+ errorForbidden: "Ez duzu honetarako sarbiderik.",
+ errorNotFound: "Ez da aurkitu.",
+ errorClosed: "Itxita dago.",
+ errorInviteOnly: "Hau gonbidatuentzat soilik da. Gonbidapen bat behar duzu.",
+ errorTooLong: "Testu hori luzeegia da.",
+ errorRequired: "Derrigorrezko informazioa falta da.",
+ errorInvalid: "Informazioaren zati bat ez da baliozkoa.",
+ errorNotAuthor: "Sortzaileak bakarrik egin dezake hau.",
+ panicRemoved: "Zure blockchaina ezabatu da.",
padRecentSectionTitle: "Azken Padak",
padOpenSectionTitle: "Pad Irekiak",
padClosedSectionTitle: "Pad Itxiak",
@@ -3072,18 +3940,18 @@ module.exports = {
padRemoveFavorite: "Gogokoetatik Kendu",
padClose: "Itxi",
padBackToEditor: "Editorera itzuli",
- padSearchPlaceholder: "Bilatu padak...",
+ padSearchPlaceholder: "Bilatu hemen: Padak...",
modulesChatsLabel: "Txatak",
- modulesChatsDescription: "Txat zifratu publikoak aurkitu eta kudeatzeko modulua.",
+ modulesChatsDescription: "Txatak aurkitu eta kudeatzeko modulua.",
typeChat: "TXATAK",
typeChatMessage: "TXAT MEZUA",
chatsTitle: "Txatak",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "Zure txatak",
+ chatRecentTitle: "Azken txatak",
chatFavoritesTitle: "Gogokoak",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "Txat irekiak",
+ chatClosedTitle: "Txat itxiak",
chatDescription: "Deskribapena",
chatCategory: "Kategoria",
chatStatus: "EGOERA",
@@ -3098,34 +3966,172 @@ module.exports = {
chatMessagesLabel: "Mezuak",
chatThreadsLabel: "Hariak",
chatCreatedAt: "SORTUA",
- chatSearchPlaceholder: "Txatak bilatu...",
+ chatSearchPlaceholder: "Bilatu hemen: Txatak...",
chatStatusOpen: "IREKIA",
chatStatusInviteOnly: "GONBIDAPENEZ BAKARRIK",
chatStatusClosed: "ITXIA",
chatSendMessage: "Bidali",
chatJumpLatest: "Azken Mezua",
+ chatReply: "Erantzun",
+ chatReplyCancel: "Erantzuna utzi",
+ chatPin: "Finkatu",
+ chatUnpin: "Askatu",
+ chatPinned: "Finkatuak",
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",
+ activitySearchPlaceholder: "Bilatu hemen: Jarduera...",
+ trendingSearchPlaceholder: "Bilatu hemen: Pil-pilean...",
+ opinionsSearchPlaceholder: "Bilatu hemen: Iritziak...",
+ votesSearchPlaceholder: "Bilatu hemen: Bozkatzeak...",
+ gamesSearchPlaceholder: "Bilatu hemen: Jokoak...",
+ schoolTitle: "Eskola",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Jarraitzen duzun wiki orri bat editatu da.",
+ wikiBotRestoredTitle: "Jarraitzen duzun wiki orri baten aurreko bertsio bat berreskuratu da.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Ikasle berri batek zure ikastaroan izena eman du.",
+ schoolBotInvitedTitle: "Ikastaro batera gonbidatu zaituzte.",
+ schoolBotAdmittedTitle: "Ikastaro batean onartu zaituzte.",
+ schoolBotCertificateTitle: "Ziurtagiri bat jaso duzu.",
+ schoolBotPassedTitle: "Ikasle batek zure ikastaroa gainditu du.",
+ schoolBotLessonTitle: "Ikasgai berri bat argitaratu da.",
+ invitesSchoolTitle: "Eskola",
+ schoolEnrollLabel: "Batu ikastarora",
+ schoolExamRetryLater: "24 ordu igarota berriro saia zaitezke.",
+ schoolApproved: "GAINDITUTA",
+ schoolExamPassMark: "Gainditzeko nota (0-10)",
+ schoolExamPassed: "GAINDITUTA",
+ schoolExamPending: "Zain",
+ schoolExamFailed: "EZ GAINDITUA",
+ schoolExamAddQuestion: "Gehitu galdera",
+ schoolExamCreateQuestion: "Galdera sortu",
+ schoolExamOption: "Aukera",
+ schoolExamCorrect: "Aukera zuzena",
+ schoolExamPoints: "Puntuak",
+ schoolMaterialTextPlaceholder: "Ikasgai honetarako oharrak...",
+ schoolMaterials: "Materialak",
+ schoolAddMaterial: "Gehitu materiala",
+ schoolNoMaterials: "Oraindik ez dago materialik.",
+ bankYourSchoolBalance: "Zure eskolako irabaziak",
+ schoolProgress: "Aurrerapena",
+ schoolProgressMark: "Markatu osatutzat",
+ schoolProgressDone: "Osatuta",
+ schoolExams: "Azterketak",
+ schoolExamCreate: "Sortu azterketa",
+ schoolExamTitlePlaceholder: "Azterketaren izenburua",
+ schoolExamHelp: "Galdera bat lerroko: Galdera? ; aukera ; aukera zuzena* ; aukera",
+ schoolExamQuestionsPlaceholder: "Zer da SSB? ; Datu-base bat ; P2P protokolo bat* ; Nabigatzaile bat",
+ schoolExamSubmit: "Bidali erantzunak",
+ schoolExamScore: "Zure nota",
+ schoolNoScoresYet: "Oraindik ez dago emaitzarik.",
+ schoolLessonUnit: "Unitatea / fasea",
+ schoolLessonUnitPlaceholder: "adib. 1. fasea",
+ schoolLessonOrder: "Ordena",
+ profileClearnetSchoolLabel: "Eskola",
+ schoolStartDate: "Hasiera data",
+ schoolSessionDate: "Saioaren data",
+ schoolCourseChat: "Ikastaroaren txata",
+ agendaFilterSchool: "ESKOLA",
+ agendaFilterCampaigns: "KANPAINAK",
+ agendaFilterLogistics: "LOGISTIKA",
+ schoolCourseType: "Ikastaro mota",
+ schoolTypeOpen: "IREKIA",
+ schoolTypePaid: "ORDAINPEKOA",
+ schoolTypeInvite: "GONBIDAPENEZ SOILIK",
+ schoolLessonLocked: "Ikasgai zifratua — eskatu irakasleari ikastaroaren gakoa.",
+ schoolGrantAccess: "Bidali ikastaroaren gakoa",
+ schoolKeySent: "Gakoa bidalita",
+ schoolOngoing: "Abian",
+ schoolFilterApplied: "IZENA EMANDA",
+ schoolFilterOpen: "IREKIAK",
+ schoolFilterFavorites: "GOGOKOAK",
+ schoolPendingPayment: "Ordainketa zain",
+ schoolPendingStudents: "Izen-emateak zain",
+ schoolViewBill: "Ikusi faktura",
+ schoolPaymentNote: "Izena emateak ECO faktura bat (transferentzia bat) sortzen du. Zure izen-ematea transferentzia sinatzean berresten da.",
+ schoolCloseCourse: "Itxi ikastaroa",
+ schoolReopenCourse: "Ireki berriro ikastaroa",
+ schoolDescription: "Irakatsi eta ikasi ikastaroak zure sarean.",
+ schoolFilterAll: "GUZTIAK",
+ schoolFilterMine: "NIREAK",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "AZKENAK",
+ schoolCreateButton: "Sortu Ikastaroa",
+ schoolCreateSectionTitle: "Sortu ikastaro bat",
+ schoolUpdateSectionTitle: "Eguneratu ikastaroa",
+ schoolCourseTitlePlaceholder: "Zure ikastaroaren izena",
+ schoolCourseDescriptionPlaceholder: "Zer irakatsiko duzu ikastaro honetan?",
+ schoolCourseImage: "Ikastaroaren irudia (gehienezko tamaina: 75MB)",
+ schoolTags: "Etiketak",
+ schoolTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ schoolPrice: "Prezioa (ECO)",
+ schoolVisibility: "Ikusgaitasuna",
+ schoolVisibilityPublic: "Publikoa",
+ schoolVisibilityInvite: "Gonbidapenez",
+ schoolStatus: "Egoera",
+ schoolClosed: "Itxita",
+ schoolFree: "Doan",
+ schoolCreate: "Sortu ikastaroa",
+ schoolUpdate: "Eguneratu ikastaroa",
+ schoolSearchPlaceholder: "Bilatu hemen: Eskola...",
+ schoolSortTitle: "Izenburua",
+ schoolNoCourses: "Ez da ikastarorik aurkitu.",
+ schoolStudents: "Ikasleak",
+ schoolTeacher: "Irakaslea",
+ schoolCreatedAt: "SORTUA",
+ schoolLessons: "Ikasgaiak",
+ schoolNoLessons: "Oraindik ez dago ikasgairik.",
+ schoolEnrollToSee: "Eman izena ikastaro honetako ikasgaiak ikusteko.",
+ schoolEnrollButton: "IZENA EMAN",
+ schoolUnenrollButton: "Utzi ikastaroa",
+ schoolInviteRequired: "Ikastaro hau gonbidapenez da.",
+ schoolTeacherPanel: "Irakaslearen panela",
+ schoolStudentPanel: "Ikaslearen panela",
+ schoolAddLesson: "Ikasgaia sortu",
+ schoolLessonTitlePlaceholder: "Ikasgaiaren izenburua",
+ schoolLessonTextPlaceholder: "Deskribatu ikasgai honek lantzen dituen nozioak...",
+ schoolInviteStudents: "Gonbidatu ikasleak",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "GONBIDATU",
+ schoolInvited: "Gonbidatuak",
+ schoolIssueCertificate: "Ziurtagiria sortu",
+ schoolCertified: "Ziurtatua",
+ schoolCertificateTextPlaceholder: "Ziurtagiriaren oharra (aukerakoa)",
+ schoolLessonOpen: "Ikasgaia ireki",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Ziurtagiriak",
+ schoolNoCertificates: "Oraindik ez da ziurtagiririk eman.",
+ schoolEditButton: "Editatu",
+ schoolDeleteButton: "Ezabatu",
+ typeSchool: "ESKOLA",
+ schoolCourseLabel: "IKASTAROA",
+ emergencyLabel: "LARRIALDIA",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Ikastaroak",
+ statsSchoolLesson: "Ikasgaiak",
+ statsSchoolEnroll: "Izen-emateak",
+ statsSchoolCertificate: "Eskolako ziurtagiriak",
+ modulesSchoolLabel: "Eskola",
+ modulesSchoolDescription: "Ezagutza trukatzeko modulua.",
+ welcomeStepUxAction: "Gorde ikuspegia",
+ welcomeStepWorkflowTitle: "Zer erabilera duzu buruan OASISerako?",
+ welcomeStepWorkflowText: "Oasisek modulu asko ditu. Aukeratu zuri egokitzen zaizun konfigurazioa eta erabilgarriak bakarrik geratuko dira aktibatuta. Nahi duzunean doi dezakezu Moduluak atalean.",
+ welcomeStepWorkflowAction: "Gorde konfigurazioa",
+ welcomeWorkflow_full: "Lehenetsia",
chatRateLimitTitle: "Mezu gehiegi",
chatRateLimitMessage: "Gela honek ordu batean onartzen duen mezu mugara iritsi zara. Saiatu geroago.",
chatMessagePlaceholder: "Idatzi zure mezua...",
chatNoMessages: "Oraindik mezurik ez.",
chatTitlePlaceholder: "Txataren izenburua",
chatDescriptionPlaceholder: "Txataren deskribapena",
- chatTagsPlaceholder: "etiketa1, etiketa2",
+ chatTagsPlaceholder: "Idatzi etiketak komaz bereizita",
chatImageLabel: "Aukeratu irudi-fitxategi bat (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Egilea",
chatAddFavorite: "Gogokoen artean gehitu",
chatRemoveFavorite: "Gogokoenetatik kendu",
chatPM: "MP",
chatStatusLabel: "Egoera",
+ chatTypeLabel: "Txat mota",
chatCategoryLabel: "Kategoria",
gamesTitle: "Jokoak",
gamesDescription: "Aurkitu eta jokatu joko batzuk.",
@@ -3156,22 +4162,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Bota txanpon bat eta apostatu aurpegian edo buztanean. Zenbat zorte duzu?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "Goitik ikusitako billarra. Egin klik zuzentzeko eta eutsi sakatuta indarra kargatzeko. Sartu bola guztiak ahalik eta jaurtiketa gutxienekin.",
+ gamesArtilleryTitle: "Artilleria",
+ gamesArtilleryDesc: "Zuzendu zure kanoia, kontuan hartu haizea eta jo jomuga. 5 txanda: jaurtiketa gutxien egiten duenak irabazten du.",
+ gamesLabyrinthTitle: "Labirintoa",
+ gamesLabyrinthDesc: "Ihes egin labirintotik mugimenduak agortu baino lehen. Maila bakoitza handiagoa eta zailagoa da.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Jan puntu guztiak eta saihestu mamuak. Mamuak denbora errealean mugitzen dira — ez gelditu!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "Pendulu soinuduna",
+ gamesAudioPendulumDesc: "Fisika kaotikoaren simulagailua, denbora errealeko audio-sintesiarekin. Abiadura angeluarrak maiztasun bihurtzen dira, eta gailurrak perkusio-kolpe. Ez dago berdin soinatzen duten bi simulaziorik.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Nahastu bisualak zuzenean bi platerekin: aukeratu eredu bat bakoitzarentzat, doitu abiadura, kolorea eta zooma, nahastu biak eta jaurti distirak erritmora. Markatu tempoa edo utzi mikrofonoak pultsua eramaten.",
+ gamesTetrisDesc: "Erortzen diren bloke klasikoak. Osatu lerroak puntuak lortzeko. Zenbat iraungo duzu?",
+ gamesMinesweeperTitle: "Minak",
+ gamesMinesweeperDesc: "Minen ehiza klasikoa. Garbitu taula mailaz igotzeko — sareta handiagoak, mina gehiago, puntuazio handiagoa.",
+ gamesFilterScoring: "PUNTUAZIOAK",
+ gamesHallOfFame: "Ospearen aretoa",
+ gamesHallPlayer: "Jokalaria",
+ gamesHallScore: "Puntuazioa",
+ gamesNoScores: "Oraindik ez dago puntuaziorik.",
calendarsTitle: "Egutegia",
calendarTitle: "Egutegia",
modulesCalendarsLabel: "Egutegiak",
@@ -3179,15 +4189,15 @@ module.exports = {
typeCalendar: "EGUTEGIAK",
calendarCreate: "Egutegia sortu",
calendarUpdate: "Eguneratu",
- calendarDelete: "Ezabatu",
calendarTitleLabel: "Izenburua",
calendarTitlePlaceholder: "Egutegiko izenburua...",
calendarStatusLabel: "Egoera",
+ calendarTypeLabel: "Egutegi mota",
calendarStatusOpen: "IREKIA",
calendarStatusClosed: "ITXIA",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Epemuga",
calendarTagsLabel: "Etiketak",
- calendarTagsPlaceholder: "etiketa1, etiketa2...",
+ calendarTagsPlaceholder: "Idatzi etiketak komaz bereizita",
calendarParticipantsLabel: "Parte-hartzaileak",
calendarCreated: "Sortua",
calendarJoin: "Batu",
@@ -3198,11 +4208,11 @@ module.exports = {
calendarNotePlaceholder: "Oharra gehitu...",
calendarFirstDateLabel: "Data",
calendarFirstNoteLabel: "Oharrak",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Tartea",
calendarIntervalNone: "Errepikapenik gabe",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Astero",
+ calendarIntervalMonthly: "Hilero",
+ calendarIntervalYearly: "Urtero",
calendarFormDescription: "Deskribapena",
calendarNoDates: "Ez dago datarik.",
calendarNoNotes: "Ez dago oharrik.",
@@ -3210,6 +4220,8 @@ module.exports = {
calendarsDescription: "Aurkitu eta kudeatu zure sareko egutegiak.",
calendarMonthPrev: "← Aurrekoa",
calendarMonthNext: "Hurrengoa →",
+ calendarMonthNames: "Urtarrila,Otsaila,Martxoa,Apirila,Maiatza,Ekaina,Uztaila,Abuztua,Iraila,Urria,Azaroa,Abendua",
+ calendarDayInitials: "Al,Ar,Az,Og,Or,La,Ig",
calendarAllSectionTitle: "Egutegiak",
calendarRecentSectionTitle: "Egutegi Berriak",
calendarFavoritesSectionTitle: "Gogokoak",
@@ -3219,9 +4231,9 @@ module.exports = {
calendarCreateSectionTitle: "Egutegi berria sortu",
calendarUpdateSectionTitle: "Egutegia eguneratu",
calendarAddFavorite: "Gogokoen gehitu",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Ezabatu",
calendarRemoveFavorite: "Gogokoetatik kendu",
- calendarSearchPlaceholder: "Egutegiak bilatu...",
+ calendarSearchPlaceholder: "Bilatu hemen: Egutegia...",
calendarAddEntry: "Gehitu Sarrera",
statsCalendar: "Egutegiak",
statsCalendarDate: "Egutegi datak",
@@ -3233,6 +4245,146 @@ module.exports = {
tribeContentAccessDenied: "Sarbidea Ukatua",
tribeContentAccessDeniedMsg: "Eduki hau tribu batena da. Kide izan behar zara sartzeko.",
tribeViewTribes: "Tribuak Ikusi",
+ tribeFilesEmpty: "Oraindik ez dago fitxategiaik.",
+ filesLabel: "Fitxategiaak",
+ profileClearnetFilesLabel: "Fitxategiaak",
+ filesTitle: "Fitxategiaak",
+ filesDescription: "Esploratu eta kudeatu fitxategiaak zure sarean.",
+ fileAllSectionTitle: "Fitxategiaak",
+ fileMineSectionTitle: "Zure Fitxategiaak",
+ fileRecentSectionTitle: "Azken Fitxategiaak",
+ fileTopSectionTitle: "Fitxategia Onenak",
+ fileFavoritesSectionTitle: "Gogokoak",
+ fileFilterAll: "DENAK",
+ fileFilterMine: "NIREAK",
+ fileFilterRecent: "AZKENAK",
+ fileFilterTop: "ONENAK",
+ fileFilterFavorites: "GOGOKOAK",
+ fileCreateSectionTitle: "Fitxategiaa Igo",
+ fileUpdateSectionTitle: "Fitxategiaa Eguneratu",
+ fileCreateButton: "Fitxategiaa Igo",
+ fileUpdateButton: "Eguneratu",
+ fileAddFavoriteButton: "Gogokoetara Gehitu",
+ fileRemoveFavoriteButton: "Gogokoetatik Kendu",
+ fileFileLabel: "Aukeratu fitxategi bat (max: 75MB)",
+ calendarFilterRecent: "AZKENAK",
+ calendarFilterAll: "GUZTIAK",
+ calendarFilterMine: "NIREAK",
+ calendarFilterFavorites: "GOGOKOAK",
+ calendarFilterOpen: "IREKITA",
+ calendarFilterClosed: "ITXITA",
+ padFilterRecent: "AZKENAK",
+ padFilterAll: "GUZTIAK",
+ padFilterMine: "NIREAK",
+ padFilterOpen: "IREKITA",
+ padFilterClosed: "ITXITA",
+ chatFilterRecent: "AZKENAK",
+ chatFilterAll: "GUZTIAK",
+ chatFilterMine: "NIREAK",
+ chatFilterFavorites: "GOGOKOAK",
+ chatFilterOpen: "IREKITA",
+ chatFilterClosed: "ITXITA",
+ licenseLabel: "Lizentzia",
+ phoneTitle: "Telefonoa",
+ phoneDescription: "Kudeatu muturretik muturrera zifratutako zure bideodeiak.",
+ phoneUnavailable: "Deiak ez daude erabilgarri gailu honetan.",
+ phoneCallButton: "Deitu",
+ profileVisibilityPhone: "Telefono-zenbakia",
+ phoneNumberUnknown: "Zure sareko inork ez du {number} zenbakia.",
+ phoneNumberChoose: "Egiaztatu nori deitu nahi diozun {number} zenbakira:",
+ phoneAnswer: "Erantzun",
+ phoneSpeaker: "Bozgorailua",
+ phoneEarpiece: "Entzungailua",
+ phoneReject: "Baztertu",
+ phoneHangup: "Eseki",
+ phoneMute: "Isildu",
+ phoneUnmute: "Mikrofonoa aktibatu",
+ phoneCameraOn: "Kamera on",
+ phoneCameraOff: "Kamera off",
+ settingsPhoneVideo: "Bideoa",
+ settingsPhoneVideoOn: "Deietan eta geletan baimenduta",
+ settingsPhoneVideoOff: "Audioa bakarrik",
+ phoneSilence: "Ez entzun",
+ phoneUnsilence: "Berriro entzun",
+ phoneCalling: "Deitzen:",
+ phoneIsCalling: "deitzen ari zaizu",
+ notifyNewPmFrom: "MP berria:",
+ notifyNewPamFrom: "PaM berria:",
+ notifyUpdateLabel: "Eguneraketa",
+ updateInstalledLabel: "Instalatutako bertsioa",
+ updateAvailableLabel: "Bertsio erabilgarria",
+ updateChangesLabel: "Aldaketak",
+ updateFilesLabel: "Fitxategiak",
+ updateOriginLabel: "Jatorria",
+ phoneRecording: "PaM grabatzen honentzat:",
+ phoneLeaveMessage: "Inork ez du erantzun: utzi zure mezua seinalearen ondoren.",
+ phoneLeaveMessageBusy: "Beste dei batean dago: utzi zure mezua seinalearen ondoren.",
+ phoneLeaveMessageUnreachable: "Ezin izan da harremanetan jarri: utzi zure mezua seinalearen ondoren.",
+ phoneConnecting: "Konektatzen:",
+ phoneSendPam: "PaM bidali",
+ phoneCancel: "Utzi",
+ phoneSearchPlaceholder: "Bilatu Telefonoan...",
+ phonePamTitle: "Audio-grabazioak",
+ phoneNew: "Berria",
+ phoneDelete: "Ezabatu",
+ phoneNoPams: "Ez duzu audio-grabaziorik.",
+ phoneHistoryTitle: "Historia",
+ phoneLatestTitle: "Azken deiak",
+ phoneCreateButton: "Dei berria",
+ phoneLimitsHint: "Dei bakoitzeko 7 bizilagun gehienez; bat baino gehiagorekin dei bateratua da.",
+ phoneErrorPub: "Ezin zaio pub bati deitu.",
+ phoneJointCall: "Dei bateratua",
+ phoneWith: "Norekin",
+ phoneResult: "Emaitza",
+ phoneWhen: "Noiz",
+ phoneDuration: "Iraupena",
+ phoneOutgoing: "Irteerakoa",
+ phoneIncoming: "Sarrerakoa",
+ phoneNoHistory: "Oraindik ez dago erregistrorik.",
+ phoneOutcomeEnded: "Erantzunda",
+ phoneOutcomeMissed: "Galdua",
+ phoneOutcomeRejected: "Baztertua",
+ phoneOutcomeNoanswer: "Erantzunik gabe",
+ phoneOutcomeCancelled: "Bertan behera utzia",
+ phoneOutcomePam: "PaM bidalia",
+ phoneOutcomeFailed: "Huts egin du",
+ phoneDialAdd: "Gehitu",
+ phoneDialBack: "Ezabatu",
+ phoneDialClear: "Garbitu",
+ phoneDialPlaceholder: "Zenbakia edo Oasis IDa",
+ phoneDialInhabitants: "Biztanleak",
+ phoneDialRemove: "Kendu",
+ phoneOwnNumber: "Hori zure zenbakia da.",
+ phoneSettingsDesc: "Aukeratu nork deitu diezazukeen.",
+ phoneDnd: "Ez molestatu",
+ phoneOpen: "Irekia",
+ phoneRecipientRefuses: "Deitu nahi diozun biztanleak ez du deirik onartzen.",
+ phoneRefusedNotice: "Biztanle hauek ez dute deirik onartzen eta ez zaie deitu:",
+ fileEmptyError: "Fitxategia hutsik dago. Aukeratu beste fitxategi bat.",
+ fileTitleLabel: "Izenburua",
+ fileTitlePlaceholder: "Izenburua",
+ fileDescriptionLabel: "Deskribapena",
+ fileDescriptionPlaceholder: "Deskribapena",
+ fileTagsLabel: "Etiketak",
+ fileTagsPlaceholder: "Idatzi etiketak komaz bereizita",
+ fileSizeLabel: "Tamaina",
+ fileDownloadButton: "DESKARGATU",
+ fileDetailsButton: "XEHETASUNAK",
+ fileNoFile: "Fitxategia fitxategirik ez",
+ fileSearchPlaceholder: "Bilatu hemen: Fitxategiaak...",
+ fileSearchButton: "Bilatu",
+ fileSortRecent: "Berrienak",
+ fileSortOldest: "Zaharrenak",
+ fileSortTop: "Bozkatu enak",
+ fileNoMatch: "Ez dago fitxategia bat datorrenik.",
+ fileUpdatedAt: "Eguneratua",
+ typeFile: "FITXATEGIAAK",
+ modulesFilesLabel: "Fitxategiak",
+ modulesFilesDescription: "Fitxategiak aurkitu eta kudeatzeko modulua.",
+ tribeSectionFiles: "FITXATEGIAAK",
+ fileDescription: "Deskribapena",
+ fileDownload: "Deskargatu",
+ fileTypeLabel: "Mota",
torrentsTitle: "Torrentak",
torrentsDescription: "Esploratu eta kudeatu torrentak zure sarean.",
torrentAllSectionTitle: "Torrentak",
@@ -3258,12 +4410,35 @@ module.exports = {
torrentDescriptionLabel: "Deskribapena",
torrentDescriptionPlaceholder: "Deskribapena",
torrentTagsLabel: "Etiketak",
- torrentTagsPlaceholder: "Sartu etiketak komaz bereizita",
+ torrentTagsPlaceholder: "Idatzi etiketak komaz bereizita",
torrentSizeLabel: "Tamaina",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Torrenta sortu",
+ torrentFromContentMissing: "Fitxategia oraindik ez dago nodo honetan eskuragarri. Saiatu geroago.",
+ torrentDownloads: "Deskargak",
+ torrentFetchOasis: "Oasisen deskargatu",
+ torrentSaveFile: "Fitxategia gorde",
+ torrentSeeds: "hazi",
+ seedsLabel: "Haziak",
+ seedAction: "Lagundu",
+ torrentSourceFile: "Fitxategia",
+ torrentStateQueued: "Ilaran",
+ torrentStateProbing: "Haziak bilatzen",
+ torrentStateDownloading: "Deskargatzen",
+ torrentStateDone: "Osatuta",
+ torrentStateFailed: "Huts egin du",
+ torrentStateNoSource: "Ez dago hazirik konektatuta, zain",
+ torrentStateCancelled: "Bertan behera utzita",
+ torrentNoDownloads: "Oraindik ez dago deskargarik.",
+ torrentOriginalSection: "Jatorrizkoa",
+ torrentCancel: "Utzi",
+ torrentDownloadButton: "DESKARGATU",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "XEHETASUNAK",
torrentNoFile: "Torrent fitxategirik ez",
noTorrents: "Ez da torrentik aurkitu.",
- torrentSearchPlaceholder: "Bilatu izenburua, etiketak, egilea...",
+ noFiles: "Ez da fitxategiaik aurkitu.",
+ torrentSearchPlaceholder: "Bilatu hemen: Torrentak...",
torrentSearchButton: "Bilatu",
torrentSortRecent: "Berrienak",
torrentSortOldest: "Zaharrenak",
@@ -3271,10 +4446,12 @@ module.exports = {
torrentNoMatch: "Ez dago torrent bat datorrenik.",
torrentUpdatedAt: "Eguneratua",
statsTorrent: "Torrentak",
+ statsFile: "Fitxategiak",
typeTorrent: "TORRENTAK",
modulesTorrentsLabel: "Torrentak",
modulesTorrentsDescription: "Torrentak aurkitu eta kudeatzeko modulua.",
favoritesFilterTorrents: "TORRENTAK",
+ favoritesFilterFiles: "FITXATEGIAK",
favoritesFilterMarket: "MERKATUA",
favoritesFilterEvents: "EKITALDIAK",
favoritesFilterForum: "FOROA",
@@ -3288,15 +4465,17 @@ module.exports = {
favoritesFilterShopProducts: "DENDAKO ARTIKULUAK",
tribeSectionTorrents: "TORRENTAK",
tribeCreateTorrent: "Torrenta Igo",
+ tribeCreateFile: "Fitxategia igo",
settingsWishTitle: "Nahia",
- settingsWishDesc: "Konfiguratu zure Avatarraren nahia.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Eduki guztietara nola sartzen zaren eta Oasis sarean duzun esperientzia zehazten du.",
+ settingsWishWhole: "Multibertsoa",
+ settingsWishMutuals: "Elkar laguntza soilik",
+ settingsWishOnlyLan: "LAN soilik",
+ settingsWishLocal: "Lokala",
settingsPmVisibilityTitle: "Mezu Pribatuak",
settingsPmVisibilityDesc: "Konfiguratu sarean izan nahi duzun mezu pribatuen esposizio maila.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Multibertsoa",
+ settingsPmVisibilityMutuals: "Elkar laguntza soilik",
pmMutualNotice: "Bidalketa UX babes bat da. Jasotzea arreta-iragazkia.",
inhabitantsPendingFollowsTitle: "Onespen zain dauden eskaerak",
inhabitantsPendingAccept: "Onartu",
@@ -3340,7 +4519,7 @@ module.exports = {
tribeGovNoRevocations: "Oraindik ez dago errebokatzerik",
tribeGovNoHistorical: "Oraindik ez dago erregistrorik",
logsTitle: "Egunkaria",
- logsDescription: "Erregistratu zure esperientzia sarean.",
+ logsDescription: "Eraman zure esperientzien egunkari pribatua.",
logsViewTitle: "Egunkaria",
logsColumnType: "Mota",
logsView: "Ikusi",
@@ -3349,7 +4528,7 @@ module.exports = {
logsCreateTitle: "Sarrera sortu",
logsWriteButton: "Idatzi",
logsTextPlaceholder: "Deskribatu zure esperientziak...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "IA laguntzailea",
logsModeManual: "Eskuz",
logsModeAI: "AA",
logsColumnLog: "Egunkaria",
@@ -3368,19 +4547,20 @@ module.exports = {
logsExportOne: "Esportatu erregistroa",
logsViewDetails: "Ikusi xehetasunak",
logsGenerateButton: "Sortu testua",
- logsSearchText: "Bilatu egunkarietan...",
+ logsSearchText: "Bilatu hemen: Egunkaria...",
logsSearchAnyType: "Edozein mota",
logsSearchButton: "Bilatu",
logsEmpty: "Oraindik sarrerarik ez.",
+ logsNothingNew: "Ez dago erregistratzeko ekintza berririk.",
modulesLogsLabel: "Egunkaria",
- modulesLogsDescription: "Modulua zure esperientziak (AA laguntzailearen bidez) erregistratzeko.",
+ modulesLogsDescription: "Zure esperientzien egunkari pribatua eramateko modulua.",
statsLogsTitle: "Egunkaria",
typeLog: "EGUNKARIA",
larpTitle: "L.A.R.P.",
larpDescription: "Esperimentazio kolaboratiborako zuzeneko rol-joko geruza bat.",
larpNoHousesMatch: "Ez dago bilaketarekin bat datorren etxerik.",
- larpSearchPlaceholder: "Bilatu etxeak...",
+ larpSearchPlaceholder: "Bilatu hemen: L.A.R.P....",
larpAllHouses: "Etxeak:",
larpFilterRuling: "AGINTZEN",
larpFilterHouses: "ETXEAK",
@@ -3395,121 +4575,120 @@ module.exports = {
larpPostPlaceholder: "Zer du etxe honek esateko?",
larpPostSubmit: "Argitaratu",
larpCycleLabel: "Zikloa:",
- audioBackToBcs: "Back to BCS",
+ audioBackToBcs: "Itzuli BCSra",
audioFilterBcs: "BCS",
- audioTranscodeButton: "TRANSCODE",
- audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.",
- audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.",
- audioTranscodeDetailTitle: "Transcode",
- audioTranscodeStegoEmpty: "(none)",
- audioTranscodeStegoMessage: "TEXT",
- audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.",
- audioTranscodeStegoOasisId: "By",
- audioTranscodeStegoTimestamp: "Generated at",
+ audioTranscodeButton: "TRANSKODETU",
+ audioTranscodeCompositionEmpty: "Audio honek ez du blockchain-konposizio gordetakorik.",
+ audioTranscodeDetailDescription: "Deskodetu txertatutako karga eta blockchain-aren jatorrizko konposizio-mapa.",
+ audioTranscodeDetailTitle: "Transkodetu",
+ audioTranscodeStegoEmpty: "(bat ere ez)",
+ audioTranscodeStegoMessage: "TESTUA",
+ audioTranscodeStegoNotFound: "Ezin izan da audio honetatik karga esteganografikorik deskodetu.",
+ audioTranscodeStegoTimestamp: "Noiz sortua",
audioTranscodeStegoUnknown: "—",
- bankExchangeEcoTaxAnnual: "ECOin Taxes (annual)",
- bankExchangeEcoTaxMonthly: "ECOin Taxes (monthly)",
- bankOverviewYourTaxes: "Your taxes",
- bankRulesAlpha: "Alpha (max share of pub balance per epoch)",
+ bankExchangeEcoTaxAnnual: "ECOin zergak (urtekoak)",
+ bankExchangeEcoTaxMonthly: "ECOin zergak (hilekoak)",
+ bankOverviewYourTaxes: "Zergak guztira",
+ bankRulesAlpha: "Alpha (pubaren saldoaren gehieneko zatia aro bakoitzeko)",
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.",
- bankRulesArchTaxRate: "Rate",
- bankRulesArchTaxTitle: "ARCH Tax",
- bankRulesCapPerEpoch: "Cap per epoch (absolute)",
- bankRulesCapUser: "Cap per user per epoch",
- bankRulesCarbonFactor: "Carbon factor",
+ bankRulesArchTaxNote: "ARCH tasak sarearen artxiboa hazteko eta mantentzeko epe luzeko kostua islatzen du: zenbat eta zaharragoak izan zure datuak sarean, orduan eta handiagoa izango da mantentze-kostuan duzun zatia.",
+ bankRulesArchTaxRate: "Tarifa",
+ bankRulesArchTaxTitle: "ARCH tasa",
+ bankRulesCapPerEpoch: "Aro bakoitzeko muga (absolutua)",
+ bankRulesCapUser: "Erabiltzaile bakoitzeko muga aro bakoitzeko",
+ bankRulesCarbonFactor: "Karbono-faktorea",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
- bankRulesChipTitle: "ECO Tax chip color band",
+ bankRulesChipNote: "Elementu bakoitzaren txipa sarean inoiz ikusitako mezurik handienarekiko koloreztatzen da eta bizilagun aktiboen kopuruak leuntzen du — sare handiago batek karga banatzen du eta elementu gehiago eramaten ditu banda berdera.",
+ bankRulesChipTitle: "ECO tasaren txiparen kolore-banda",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
- bankRulesEcoTaxRate: "Rate",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesEpochKind: "Epoch granularity",
- bankRulesFloor: "Floor per user (gross)",
- bankRulesGraceDays: "Claim grace period",
+ bankRulesEcoTaxNote: "ECO tasa OBU gordinetik kentzen da aroaren esleipena kalkulatzen denean. Kendutako ECOak ez dira aro honetan birbanatzen — pubaren saldoan geratzen dira eta hurrengo aroaren funtsa elikatzen dute reserveMin / alpha mugen bidez.",
+ bankRulesEcoTaxRate: "Tarifa",
+ bankRulesEcoTaxTitle: "ECO tasa",
+ bankRulesEpochKind: "Aroaren granulartasuna",
+ bankRulesFloor: "Erabiltzaile bakoitzeko gutxienekoa (gordina)",
+ bankRulesGraceDays: "Eskaeraren grazia-epea",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
- bankRulesKarmaTitle: "Karma (user engagement score)",
+ bankRulesKarmaNote: "Karma zure ekintzetatik ateratzen da (argitalpenak, botoak, parlamentuan/epaitegietan parte hartzea, etab.), denborarekin ahultzen den faktore batekin, zure jarioak sortutako karbono-gramoak kenduta.",
+ bankRulesKarmaTitle: "Karma (erabiltzailearen konpromiso-puntuazioa)",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
- bankRulesPoolTitle: "Monthly pool",
- bankRulesReserveMin: "Reserve minimum (kept in pub balance)",
+ bankRulesPoolTitle: "Hileko funtsa",
+ bankRulesReserveMin: "Gutxieneko erreserba (pubaren saldoan gordea)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
- bankRulesShareTitle: "Per-user share",
+ bankRulesShareTitle: "Erabiltzaile bakoitzeko zatia",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankRulesWMax: "Maximum weight (w_max)",
- bankRulesWMin: "Minimum weight (w_min)",
- bankTaxes: "Taxes",
- bankTaxesAnnualEcoin: "ECO Tax (annual)",
- bankTaxesArchTaxAnnual: "ARCH Tax (annual)",
- bankTaxesArchTaxFirstBlock: "Your first block age",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxLifetime: "ARCH Tax (lifetime)",
- bankTaxesArchTaxMonthly: "ARCH Tax (monthly)",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, and their ongoing contribution may be required by networking consensus.",
- bankTaxesArchTaxRate: "Rate",
- bankTaxesArchTaxTitle: "ARCH Tax",
- bankTaxesArchTaxUserAmount: "Your ARCH tax (price to return)",
- bankTaxesEcoTaxLifetime: "ECO Tax (lifetime)",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesLookupAuthor: "Author",
- bankTaxesLookupButton: "Inspect",
- bankTaxesLookupCarbon: "Carbon footprint",
- bankTaxesLookupEcoin: "ECO Tax",
- bankTaxesLookupNotFound: "No block found in your local feed with that ID.",
- bankTaxesLookupPlaceholder: "Block ID (e.g. %abc...=.sha256)",
- bankTaxesLookupSize: "Size",
- bankTaxesLookupTitle: "Inspect a block",
- bankTaxesLookupType: "Type",
- bankTaxesMonthlyEcoin: "ECO Tax (monthly)",
- bankTaxesRate: "Rate",
- bankTaxesSpan: "Sampling span",
- bankTaxesTotalAnnual: "Total (annual)",
- bankTaxesTotalBlocks: "Total blocks",
- bankTaxesTotalBytes: "Total bytes",
- bankTaxesTotalCarbon: "Total carbon",
- bankTaxesTotalEcoin: "Total ECO tax (lifetime)",
- bankTaxesTotalLifetime: "Total (lifetime)",
- bankTaxesTotalMonthly: "Total (monthly)",
- bankTaxesTypesApply: "Set my taxes",
- bankTaxesTypesLabel: "Select which taxes you want to pay",
- bankTaxesUserAmount: "Your ECO tax (price to return)",
- 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.",
- 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.",
- blockchain: "BlockExplorer",
- blockchainBackToBlockexplorer: "Back to blockexplorer",
- blockchainBlockNotAvailable: "This block is not available in your local feed. It may belong to a peer you are not yet replicating from.",
- courtsMediatorsLabel: "Mediators",
- ecoTaxLabel: "ECO Tax",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- melodyAllEmpty: "No BCS compositions from other inhabitants yet.",
- melodyByLabel: "By",
- melodyNoteUnavailable: "block not in your local feed",
- melodyUploadBcsButton: "Publish",
- melodyUploadBcsNameNote: "The audio will be published with the auto-generated name",
- melodyUploadBcsTitle: "Publish",
- melodyUploadStegoLabel: "Hidden message (steganography)",
- melodyUploadStegoMaxLabel: "max 280 characters",
- melodyUploadStegoPlaceholder: "Optional.",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- parliamentRevocationPublish: "Publish Revocation",
- statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
- statsPad: "Pads",
- statsPadEntry: "Pad entries",
- statsTombstoneEmpty: "No tombstones in the network yet.",
- typeGameScore: "GAME SCORES",
+ bankRulesWMax: "Gehieneko pisua (w_max)",
+ bankRulesWMin: "Gutxieneko pisua (w_min)",
+ bankTaxes: "Zergak",
+ bankTaxesAnnualEcoin: "ECO tasa (urtekoa)",
+ bankTaxesArchTaxAnnual: "ARCH tasa (urtekoa)",
+ bankTaxesArchTaxFirstBlock: "Zure lehen blokearen adina",
+ bankTaxesArchTaxFootprintNote: "ARCH tasak sarearen artxiboa hazteko eta mantentzeko kostua islatzen du. Argitaratu zenuen lehen blokearen eta sareko bloke berrienaren arteko denbora-tartetik kalkulatzen da — zenbat eta denbora gehiago egon zure historia artxiboan, orduan eta handiagoa izango da mantentze-kostuan duzun zatia.",
+ bankTaxesArchTaxLifetime: "ARCH tasa (bizitza osoa)",
+ bankTaxesArchTaxMonthly: "ARCH tasa (hilekoa)",
+ bankTaxesArchTaxNoteBold: "ARCH tasa zuzenean murrizteari",
+ bankTaxesArchTaxNoteIntro: "Zure ARCH tasa sareak zure OBUaren gainetik sortzen duen soberakinetik kentzen da; OBUaren oinarrizko balioa minimo aldaezin gisa finkatzen da. Tasa ez da inoiz kentzen bizilagun bakoitzari OBU gisa dagokion zenbateko finkotik. Kendutako funtsek aberastasuna birbanatzeko algoritmoa elikatzen dute, eta beste bizilagun batzuengana itzultzen dira haien OBU eskaeren bidez. Bizilagun berrienek eta artxibatze-, erreplikazio- eta mantentze-lanetan berariaz aritzen direnek ziurrenik izango dute zure izenean sarearen artxiboa osasuntsu mantentzeko zereginen bat. Edo ",
+ bankTaxesArchTaxNoteOutro: " ekin diezaiokete, inausketa-akordioen, datu erredundanteen desbikoizketaren eta mantentze-azpiegitura partekatuaren bidez, eta sarearen adostasunak haien ekarpen jarraitua eska dezake.",
+ bankTaxesArchTaxRate: "Tarifa",
+ bankTaxesArchTaxTitle: "ARCH tasa",
+ bankTaxesArchTaxUserAmount: "Zure ARCH tasa (itzuli beharreko prezioa)",
+ bankTaxesEcoTaxLifetime: "ECO tasa (bizitza osoa)",
+ bankTaxesEcoTaxTitle: "ECO tasa",
+ bankTaxesLookupAuthor: "Egilea",
+ bankTaxesLookupButton: "Ikuskatu",
+ bankTaxesLookupCarbon: "Karbono-aztarna",
+ bankTaxesLookupEcoin: "ECO tasa",
+ bankTaxesLookupNotFound: "Ez da ID hori duen blokerik aurkitu zure jario lokalean.",
+ bankTaxesLookupPlaceholder: "Blokearen IDa (adib. %abc...=.sha256)",
+ bankTaxesLookupSize: "Tamaina",
+ bankTaxesLookupTitle: "Ikuskatu bloke bat",
+ bankTaxesLookupType: "Mota",
+ bankTaxesMonthlyEcoin: "ECO tasa (hilekoa)",
+ bankTaxesRate: "Tarifa",
+ bankTaxesSpan: "Lagintze-tartea",
+ bankTaxesTotalAnnual: "Guztira (urtekoa)",
+ bankTaxesTotalBlocks: "Blokeak guztira",
+ bankTaxesTotalBytes: "Byteak guztira",
+ bankTaxesTotalCarbon: "Karbonoa guztira",
+ bankTaxesTotalEcoin: "ECO tasa guztira (bizitza osoa)",
+ bankTaxesTotalLifetime: "Guztira (bizitza osoa)",
+ bankTaxesTotalMonthly: "Guztira (hilekoa)",
+ bankTaxesTypesApply: "Ezarri nire zergak",
+ bankTaxesTypesLabel: "Hautatu zein zerga ordaindu nahi dituzun",
+ bankTaxesUserAmount: "Zure ECO tasa (itzuli beharreko prezioa)",
+ bankTaxesUserNoteChips: "Elementu bakoitzaren ondoan agertzen den ECO tasaren txipak kolorez aldatzen du (berdea / horia / gorria), elementuaren tamainaren arabera sarean inoiz ikusitako blokerik handienarekin alderatuta, bizilagun aktiboen kopuruak leunduta — sare solar-punk handiago batek karga banatzen du eta elementu gehiago eramaten ditu banda berdera.",
+ bankTaxesUserNoteOtherParams: "ECO tasa gaur egun bloke bakoitzaren karbono-aztarnatik ateratzen da, baina denborarekin beste parametro batzuk gehi ditzake — erreplikazioan gastatutako energia, nodoen arteko biltegiratze erredundantea, blob-en banda-zabalera, deszifratzearen kostu konputazionala, lotutako transakzioen meatzaritza-aztarna edo sareak baloratzea adosten duen beste edozein karga neurgarri.",
+ blockchain: "Bloke-esploratzailea",
+ blockchainBackToBlockexplorer: "Itzuli bloke-esploratzailera",
+ blockchainBlockNotAvailable: "Bloke hau ez dago eskuragarri zure jario lokalean. Oraindik erreplikatzen ez duzun nodo batena izan daiteke.",
+ courtsMediatorsLabel: "Bitartekariak",
+ ecoTaxLabel: "ECO tasa",
+ gamesHallDate: "Data",
+ gamesNewRecord: "Errekor berria!",
+ indexingRefreshNote: "Orri hau 10 segundoro birkargatzen da.",
+ indexingMessage: "Oasis nodoen sare banatua sinkronizatzen ari da. Itxaron, mesedez.",
+ indexingTitle: "Sinkronizatzen",
+ melodyAllEmpty: "Oraindik ez dago beste bizilagunen BCS konposiziorik.",
+ melodyNoteUnavailable: "blokea ez dago zure jario lokalean",
+ melodyUploadBcsButton: "Argitaratu",
+ melodyUploadBcsNameNote: "Audioa automatikoki sortutako izenarekin argitaratuko da",
+ melodyUploadBcsTitle: "Argitaratu",
+ melodyUploadStegoLabel: "Mezu ezkutua (esteganografia)",
+ melodyUploadStegoMaxLabel: "gehienez 280 karaktere",
+ melodyUploadStegoPlaceholder: "Aukerakoa.",
+ padsNoItems: "Ez da padik aurkitu.",
+ padVersionHistory: "Bertsioen historia",
+ padAttributionView: "Egilearen arabera",
+ padVersionView: "Ikusi",
+ parliamentRevocationPublish: "Argitaratu ezeztapena",
+ statsChat: "Txatak",
+ statsChatMessage: "Txat-mezuak",
+ statsGameScore: "Jokoak",
+ statsWiki: "Wiki orriak",
+ statsPad: "Padak",
+ statsPadEntry: "Pad-sarrerak",
+ statsTombstoneEmpty: "Oraindik ez dago ezabaketarik (tombstone) sarean.",
+ typeGameScore: "JOKO-PUNTUAZIOAK",
bankTaxesLookupNote: "Sartu bloke-ID bat zure jario lokalean bilatzeko.",
bankTaxesUserNoteChipsClick: "Egin klik edozein chiptan bere blokea blockexplorer-en ikuskatzeko.",
mapUrlPlaceholder: "/maps/MAP_ID",
@@ -3524,6 +4703,14 @@ module.exports = {
settingsReplicationTitle: "Erreplikazioa",
settingsReplicationDesc: "Konfiguratu zenbat jauzi jarraitu behar dituen zure kideak zure jariotik abiatuz edukia erreplikatzean.",
settingsReplicationHopsLabel: "Jauziak",
+ settingsBlobCacheTitle: "Multimedia cachea",
+ settingsBlobCacheDesc: "Beste biztanleen edukia gailu honetan gordetzen da. Aukeratu zenbat leku har dezakeen.",
+ settingsBlobCacheUsage: "Uneko erabilera",
+ settingsBlobCacheFiles: "fitxategi",
+ settingsBlobCacheLimit: "Muga",
+ settingsBlobCacheUnlimited: "Mugarik gabe",
+ settingsBlobCacheCleanNow: "Garbitu orain",
+ settingsBlobCacheCleaned: "{n} fitxategi ezabatuta, {size} askatuta.",
aiApproveTagsLabel: "Etiketak (komaz bereizita)",
aiApproveTagsPlaceholder: "adib. oasis, gobernantza, ekologia",
aiApproveRatingLabel: "Balorazioa",
@@ -3551,8 +4738,6 @@ module.exports = {
larpInviteBannerHint: "Partekatu kode hau ACADEMIA-n dagoen norbaitekin. 30 zikloko edo erabilera bakar baten ostean iraungitzen da.",
larpTestRankingTitle: "Etxe bakoitzeko puntuazioa",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "Etxearen gonbidapen-kodea",
- invitesHouseJoinButton: "Etxera sartu",
larpLastAttemptTitle: "Zure azken saiakera",
larpLastAttemptHouse: "Etxea",
larpLastAttemptWhen: "Noiz",
@@ -3570,14 +4755,14 @@ module.exports = {
larpBadgeYou: "Zu",
larpBadgeRuling: "Agintzen",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "Oasis-en zuzeneko rol-joko geruzaren modulua (9 Etxeak).",
+ modulesLarpDescription: "Zuzeneko rol-jokoaren geruzarako modulua.",
larpProfileQ1: "Arazo konplexu baten aurrean, lehenik zer egiten duzu?",
larpProfileQ1O1: "Besteekin hitz egin adostasuna lortzeko",
larpProfileQ1O2: "Prototipo bat egin probatzeko",
larpProfileQ1O3: "Literatura ikertu",
larpProfileQ1O4: "Sortzen duen sistema sabotatu",
larpProfileQ2: "Zer ematen dio zentzua zure eguneroko lanari?",
- larpProfileQ2O1: "Maite ditudan pertsonak defendatu",
+ larpProfileQ2O1: "Maite ditudan biztanleak defendatu",
larpProfileQ2O2: "Zerbait ukigarria sortu",
larpProfileQ2O3: "Bizitza sendatu edo zaindu",
larpProfileQ2O4: "Hitzak eta ideiak landu",
@@ -3644,7 +4829,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Aukeratu nahi duzun UX nabigazio modua zure interfazerako.",
uxModeMenus: "Blokeak",
- uxModeAINav: "AI",
+ uxModeChats: "Elkarrizketak",
+ uxModeFeed: "Mikroblogintza",
+ feedTrendingTitle: "Joerako Etiketak",
+ feedActiveTitle: "Biztanle Aktiboak",
+ cnBrandSub: "Librea · P2P · Federatua",
+ cnSyncedPeers: "Sinkronizatutako nodoak",
+ cnLicense: "Lizentzia",
+ cnNotAccessible: "Edukia ez dago eskuragarri une honetan.",
+ cnUntitled: "Izenbururik gabe",
+ cnSearchPlaceholder: "Bilatu…",
+ cnHubTitle: "Clearnet HUBa",
+ cnHubDescription: "Oasis sare honetako bizilagunek partekatutako eduki publikoa.",
+ cnHubEmpty: "Oraindik ez da eduki publikorik partekatu Clearnet-en.",
+ cnPublicContent: "Edukia",
+ cnTribesContent: "Tribuak",
+ cnNetworkContent: "Sarea",
+ cnCategoryEmpty: "Ez dago edukirik kategoria honetan.",
+ cnInhabitantEmpty: "Bizilagun honek oraindik ez du edukirik argitaratu Clearnet-en.",
+ cnPrevPage: "← Aurrekoa",
+ cnNextPage: "Hurrengoa →",
+ cnPageOf: "{page}. orria {pages}-tik",
+ cnMoreInfo: "Informazio gehiago →",
+ cnOpenCourse: "Ikastaro irekia",
+ cnAuction: "ENKANTEA",
+ cnExchange: "TRUKEA",
+ cnRssDescription: "HUB honetako bizilagunek argitaratuak",
+ cnKindAudio: "Audioa",
+ cnKindBlog: "Bloga",
+ cnKindBookmark: "Laster-marka",
+ cnKindDocument: "Dokumentua",
+ cnKindEvent: "Ekitaldia",
+ cnKindFeed: "Jarioa",
+ cnKindImage: "Irudia",
+ cnKindJob: "Lana",
+ cnKindMarket: "Merkatua",
+ cnKindPodcast: "Podcasta",
+ cnKindProject: "Proiektua",
+ cnKindCourse: "Ikastaroa",
+ cnKindShop: "Denda",
+ cnKindTorrent: "Torrenta",
+ cnKindFile: "Fitxategia",
+ cnKindVideo: "Bideoa",
+ cnKindWiki: "Wikia",
+ cnKindRoom: "Gela",
+ cnKindMap: "Mapa",
+ uxModeAINav: "IA",
}
};
diff --git a/src/client/assets/translations/oasis_fr.js b/src/client/assets/translations/oasis_fr.js
index 50ccf57..dfac9d8 100644
--- a/src/client/assets/translations/oasis_fr.js
+++ b/src/client/assets/translations/oasis_fr.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "Achats",
shopMyOrdersDescription: "Vos commandes d’achat.",
shopMyOrdersEmpty: "Vous n’avez pas encore d’achats.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM Vendeur",
shopOrderSeller: "Vendeur",
shopOrderInvoice: "Facture",
shopOrderInvoiceConcept: "Facture",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Accepter",
shopOrderReject: "Rejeter",
shopOrderMarkShipped: "Marquer expédié",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM Acheteur",
shopOrderContractConcept: "Commande boutique",
shopOrdersPending: "Commandes en attente",
all: "Tous",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Récents",
anonymous: "Anonyme",
unnamed: "Anonyme",
- authorLabel: "AUTEUR",
+ authorLabel: "Auteur",
delete: "Supprimer",
save: "Enregistrer",
vote: "Voter",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "Avertissement de contenu",
invalidPost: "Contenu invalide",
invalidPostHint: "Ce message a un texte vide/invalide.",
- spreadBy: "Par",
spreadChron: "Diffusion",
spreaded: "Diffusé",
spreadContentUnavailable: "Contenu pas encore disponible (réplication en attente)",
filteredByTag: "Filtré par étiquette",
filteredByTagTitle: "Filtré par étiquette",
feedPublishedSuccess: "Flux publié avec succès !",
+ feedMastodonFailed: "Publié dans Oasis, mais l'envoi vers Mastodon a échoué.",
tribeFeedSent: "Message envoyé avec succès !",
tribeContentEncrypted: "Contenu chiffré",
tribeTorrentsEmpty: "Pas encore de torrents.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Dernière visite",
profileClearnetBookmarksLabel: "Favoris",
invitesPort: "Port",
- currentlyUnrecheable: "ERREUR !",
- peerHostValidation: "IPv4 valide (ex. 192.168.1.100) ou nom d’hôte (ex. pub.example.com)",
+ peerHostValidation: "IPv4 valide (ex. 192.168.1.100) ou nom d’hôte (ex. pub.solarnethub.com)",
peerPortValidation: "Port 1-65535",
peerKeyValidation: "Clé publique SSB ed25519 (@<44 caractères base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Désinscription de votre offre d’emploi",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Description de la tâche",
exportPasswordLabel: "Mot de passe d’export",
importPasswordPlaceholder: "Saisissez le mot de passe",
- searchCasesPlaceholder: "Rechercher des affaires…",
+ searchCasesPlaceholder: "Rechercher dans Tribunaux...",
shopBuyDeliveryAddressPlaceholder: "Adresse de livraison",
shopBuyNotesPlaceholder: "Notes",
bankTaxesUserNoteBold: "réduire directement la taxe ECO",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Soutenir l’affaire",
courtsSettlementAcceptBtn: "Accepter l’accord",
courtsSupportCount: "Soutiens",
- courtsVerdictVoteTitle: "Voter sur le verdict",
- courtsVerdictVoteLabel: "Vote du verdict",
- courtsVerdictVoteAccept: "Accepter",
- courtsVerdictVoteReject: "Rejeter",
- courtsVerdictVoteSubmit: "Soumettre le vote",
reportsSetStatus: "Définir le statut",
reportsStatusClosed: "CLÔTURÉ",
statsAvgPerInhabitant: "Moy. par habitant",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Avatar",
inhabitants: "Habitants",
- peersReplicatedFeeds: "Flux répliqués",
+ peersReplicatedFeeds: "Répliqués",
+ peersTorColumn: "TOR",
+ peersTorYes: "Joignable via Tor",
+ peersTorNo: "Non joignable via Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Version",
graphos: "Graphos",
graphosDescription: "Carte interactive du réseau autour de toi.",
+ graphosFederation: "Fédération",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Injoignables",
+ graphosFedLinks: "Liens mutuels",
+ graphosFedIsolated: "Isolés",
+ graphosFedNoData: "Pas de données",
+ graphosFedMutual: "Mutuel",
+ graphosFedOneWay: "Sens unique",
+ graphosFedTransport: "Réseau",
+ graphosFedWith: "Fédéré avec",
+ graphosZoom: "Agrandir",
+ graphosFedInhabitants: "Habitants",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "Votre nœud ne connaît encore aucun PUB.",
graphosViewingGraphOf: "Affichage",
graphosBackToMine: "← Mon réseau",
graphosShowing: "Affichage",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "Vous n’avez pas encore reçu de @mentions.",
- mentionsSearchPlaceholder: "Rechercher des mentions...",
+ mentionsSearchPlaceholder: "Rechercher dans Mentions...",
privateReminders: "RAPPELS",
+ inboxFilterPms: "MPs",
+ inboxFilterNotifications: "Notifications",
+ inboxMarkRead: "Marquer comme lu",
+ inboxMarkUnread: "Marquer comme non lu",
+ inboxUnreadChip: "Non lu",
+ inboxMarkAllRead: "Tout marquer comme lu",
+ inboxDeleteShown: "Tout supprimer",
+ inboxArchive: "Archiver",
+ inboxUnarchive: "Désarchiver",
+ inboxFilterArchived: "Archivés",
+ inboxEarlierMessages: "messages précédents",
+ inboxSortThread: "Par fil",
+ inboxSortRecent: "Plus récents d'abord",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Notifications de l'Inbox",
+ settingsInboxBotsDesc: "Choisissez quels bots peuvent vous notifier dans votre Inbox. Les bots décochés sont masqués et leurs avis ne sont pas comptés.",
inboxFiltersLabel: "Filtres :",
inboxToggleToMutuals: "Passer à mutuels",
inboxToggleToWhole: "Passer à tous",
@@ -214,8 +244,9 @@ module.exports = {
searchFromLabel: "De",
searchToLabel: "À",
searchQueryLabel: "Recherche",
- searchPerPageLabel: "Résultats par page",
+ searchPerPageLabel: "Résultats",
settings: "Configuration",
+ settingsDescription: "Configurez l'environnement de votre réseau.",
continueReading: "Continuer la lecture",
moreComments: "plus de commentaires",
readThread: "lire le reste du fil",
@@ -234,7 +265,6 @@ module.exports = {
profileClearnetHelp: 'Modules accessibles depuis l’extérieur d’Oasis.',
profileHubAll: 'Tout',
footerLicenseLabel: 'Licence',
- profileSwitchToOasis: 'Retour à Oasis',
profileVisibilityFediverse: "Multivers",
contributorsTitle: "Contributions",
colorLabel: 'Choisir une couleur',
@@ -244,6 +274,7 @@ module.exports = {
modulesViewTitle: "Modules",
modulesViewDescription: "Définissez votre environnement idéal en activant et désactivant des modules.",
inbox: "Boîte",
+ inboxSearchPlaceholder: "Rechercher dans Boîte...",
multiverse: "Multivers",
fediverse: "Multivers",
fediverseDescription: "Gérez vos autres comptes du multiverse, y compris l'envoi et la réception de contenu.",
@@ -252,9 +283,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Serveur",
+ nextcloudUserLabel: "Utilisateur",
+ nextcloudFolderLabel: "Dossier",
+ nextcloudUploadButton: "Envoyer",
+ nextcloudFileLabel: "Choisissez un fichier",
+ fileExternalLink: "Lien externe",
+ nextcloudErrConnect: "Impossible de joindre Nextcloud avec ces informations.",
+ nextcloudErrUpload: "L'envoi vers Nextcloud a échoué.",
+ nextcloudErrShare: "Nextcloud n'a pas donné de lien public pour le fichier.",
fediverseDisconnect: "Déconnecter",
fediverseEmptyLink: "vos réglages",
fediverseComposePlaceholder: "À quoi pensez-vous ?",
@@ -283,6 +322,76 @@ module.exports = {
fediverseErrPost: "Impossible de publier.",
fediverseErrMedia: "Impossible d'envoyer le fichier.",
fediverseErrEmpty: "Écrivez quelque chose ou joignez un fichier.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Numéro de téléphone",
+ telegramSendCode: "Envoyer le code",
+ telegramCodeHelp: "Saisissez le code que Telegram vient de vous envoyer (application ou SMS).",
+ telegramCodeLabel: "Code",
+ telegramPasswordHelp: "Ce compte utilise la validation en deux étapes. Saisissez votre mot de passe.",
+ telegramPasswordLabel: "Mot de passe",
+ telegramVerify: "Vérifier",
+ telegramCancel: "Annuler",
+ telegramChats: "Discussions",
+ telegramUnread: "Non lus",
+ telegramOpen: "Ouvrir",
+ telegramSend: "Envoyer",
+ telegramYou: "Vous",
+ telegramNoChats: "Aucune discussion pour l'instant.",
+ telegramNoMessages: "Aucun message pour l'instant.",
+ telegramComposePlaceholder: "Écrivez un message…",
+ telegramChannel: "Chaîne",
+ telegramGroup: "Groupe",
+ telegramPrivate: "Privé",
+ telegramErrConnect: "Impossible de contacter Telegram.",
+ telegramErrTimeout: "Telegram a mis trop de temps à répondre.",
+ telegramErrAuth: "Session Telegram invalide ou expirée. Reconnectez-vous.",
+ telegramErrFetch: "Impossible de charger les discussions.",
+ telegramErrSend: "Impossible d'envoyer le message.",
+ telegramErrMissing: "API ID, API hash et numéro de téléphone sont requis.",
+ telegramErrCode: "Code invalide. Réessayez.",
+ telegramErrCodeExpired: "Le code a expiré. Recommencez.",
+ telegramErrPassword: "Mot de passe incorrect.",
+ telegramErrPhone: "Numéro de téléphone invalide.",
+ telegramErrApi: "API ID ou API hash invalide.",
+ telegramErrFlood: "Trop de tentatives. Patientez puis réessayez.",
+ telegramErrNoLogin: "Aucune connexion en cours. Recommencez.",
+ peertubeUsernameLabel: "Nom d'utilisatrice",
+ peertubePasswordLabel: "Mot de passe",
+ peertubeSubscriptions: "Abonnements",
+ peertubeMyVideos: "Mes vidéos",
+ peertubeVideos: "Vidéos",
+ peertubeFollowers: "Abonné·es",
+ peertubeViews: "vues",
+ peertubeLikes: "j'aime",
+ peertubeQuota: "Quota",
+ peertubeUpload: "Téléverser une vidéo",
+ peertubeUploadHelp: "Choisissez un fichier vidéo. Il est envoyé sur votre chaîne et PeerTube le traite ensuite.",
+ peertubeTitleLabel: "Titre",
+ peertubeDescriptionLabel: "Description",
+ peertubePrivacyLabel: "Confidentialité",
+ peertubePrivacyPublic: "Publique",
+ peertubePrivacyUnlisted: "Non listée",
+ peertubePrivacyPrivate: "Privée",
+ peertubeNoVideos: "Aucune vidéo pour l'instant.",
+ peertubeComments: "Commentaires",
+ peertubeComment: "Commenter",
+ peertubeCommentPlaceholder: "Écrire un commentaire…",
+ peertubeNoComments: "Aucun commentaire pour l'instant.",
+ peertubeOpen: "Ouvrir sur PeerTube",
+ peertubeWatch: "Regarder",
+ peertubeChannel: "Chaîne",
+ peertubeNoStream: "Cette vidéo ne peut pas encore être lue ici. Ouvrez-la sur PeerTube.",
+ peertubeUploaded: "Vidéo envoyée. PeerTube la traite.",
+ peertubeErrConnect: "Impossible de contacter PeerTube.",
+ peertubeErrAuth: "Identifiant ou mot de passe incorrect, ou session expirée. Reconnectez-vous.",
+ peertubeErrInstance: "URL d'instance invalide.",
+ peertubeErrMissing: "Instance, identifiant et mot de passe sont requis.",
+ peertubeErrFetch: "Impossible de charger les vidéos.",
+ peertubeErrUpload: "Impossible d'envoyer la vidéo.",
+ peertubeErrTitle: "Titre requis.",
+ peertubeErrComment: "Impossible de publier le commentaire.",
+ peertubeErrNoFile: "Choisissez un fichier vidéo.",
bookmarksLabel: "Marque-pages",
videosLabel: "Vidéos",
torrentsLabel: "Torrents",
@@ -305,7 +414,6 @@ module.exports = {
comment: "Commenter",
subtopic: "Sous-sujet",
json: "JSON",
- createdBy: "par",
unfollow: "Ne plus soutenir",
follow: "Soutenir",
block: "Bloquer",
@@ -320,13 +428,16 @@ module.exports = {
relationshipMutualBlock: "Blocage mutuel",
relationshipNone: "Vous ne soutenez pas",
relationshipBlockingPost: "Post bloqué",
- viewLikes: "Voir les soutiens",
+ viewLikes: "Voir les diffusions",
+ viewSupporters: "Voir les soutiens",
spreadedDescription: "Liste des posts soutenus par habitant.",
preview: "Prévisualiser",
publish: "Publier",
contentWarningPlaceholder: "Ajoutez un titre à votre post (optionnel)",
- publishWarningPlaceholder: "Corps limité à 7000 caractères.",
+ publishWarningPlaceholder: "Écris le corps de ton billet.",
publishTooLong: "Votre publication est trop longue. Veuillez la raccourcir.",
+ keepTextRetry: "Envoyer à nouveau",
+ dateInPastError: "La date ne peut pas être dans le passé",
publishCustomDescription: [
"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 !",
],
@@ -356,9 +467,8 @@ module.exports = {
mentionsMatching: "Mentions",
mentionsName: "Nom",
mentionsRelationship: "Relation",
- updateit: "OBTENIR DES MISES À JOUR !",
updateBannerText: "Une nouvelle version d'Oasis est disponible.",
- updateBannerAction: "Mettre à jour →",
+ updateBannerAction: "Mettre à jour !",
info: "Info",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -366,16 +476,14 @@ module.exports = {
timeAgo: "il y a",
sendTime: "écrit ",
theme: "Thème",
- legacy: "Clés",
- legacyTitle: "Clés",
- legacyDescription: "Gérez votre secret (clé privée) rapidement et en toute sécurité.",
- legacyExportButton: "Exporter",
- legacyImportButton: "Importer",
+ backupKeysExportButton: "Exporter",
+ backupKeysImportButton: "Importer",
ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Configurez la limite de messages pour les flux de la blockchain.",
+ logWindowChip: "Derniers {n} flux de la blockchain",
saveSettings: "Enregistrer la configuration",
exportDescription: "Définissez un mot de passe (min 32 caractères) pour chiffrer votre secret",
- exportDataTitle: "Sauvegarde",
+ exportDataTitle: "Sauvegarde instantanée",
exportDataDescription: "Télécharger votre blockchain (clé privée exclue !)",
exportDataButton: "Télécharger la blockchain",
importDescription: "Importez votre secret chiffré (clé privée) pour activer votre avatar",
@@ -384,38 +492,33 @@ module.exports = {
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.",
+ welcomeBannerText: "Ton avatar n'est pas encore configuré.",
aiSuggestionBanner: "Suggestion :",
aiSuggestionsEnable: "Suggestions de l'IA",
- welcomeBannerAction: "Commencer !",
+ welcomeBannerAction: "Commencer",
welcomeTitle: "Bienvenue",
+ welcomeStepIdentity: "Identité",
+ welcomeStepType: "Type",
+ welcomeStepUse: "Usage",
+ welcomeStepLook: "Apparence",
+ welcomeStepCommunity: "Communauté",
+ welcomeStepIntro: "Bienvenue",
+ welcomeHintIdentity: "Votre nom et votre image.",
+ welcomeHintType: "Comment Oasis s'ouvre pour vous.",
+ welcomeHintUse: "Quels modules restent actifs.",
+ welcomeHintLook: "Le thème que porte Oasis.",
+ welcomeHintCommunity: "Rejoignez un PUB pour rencontrer d'autres habitants.",
+ welcomeHintIntro: "Envoyez un premier salut à la communauté.",
+ welcomeStepThemeAction: "Utiliser ce thème",
+ welcomeJoinPubs: "Rejoindre les PUBs",
+ welcomeNoFederation: "Sans fédération",
welcomeStepGreetingAction: "Envoyer",
- welcomeJoinPubButton: "Rejoindre le pub",
- welcomeStepLarpAction: "Rejoindre « L Académie »",
- welcomeStepLarpText: "Rejoignez notre jeu de rôle grandeur nature.",
- welcomeStepLarpTitle: "Rejoindre le L.A.R.P.",
- welcomeStepGreetingTitle: "Envoyez un « Hello world ! »",
- welcomeStepGreetingText: "Envoyez un message pour que les autres habitants puissent vous découvrir.",
- welcomeJoinPub: "Rejoindre",
welcomeDescription: "Quelques choses à faire avant de commencer.",
- welcomeProgress: "Terminé",
- welcomeStepDone: "fait",
- welcomeStepPending: "en attente",
welcomeSkip: "Pas maintenant",
- welcomeStepLanguageTitle: "Choisissez votre langue",
- welcomeStepLanguageText: "Oasis parle plusieurs langues. Vous pouvez en changer quand vous voulez.",
- welcomeStepProfileTitle: "Modifiez votre profil",
- welcomeStepProfileText: "Choisissez un nom, ajoutez une description et mettez une image pour que les autres habitants vous reconnaissent.",
welcomeStepProfileAction: "Enregistrer le profil",
- welcomeStepFederationTitle: "Rejoignez le réseau principal",
- welcomeStepFederationText: "Connectez-vous à notre pub pour rencontrer d autres habitants et commencer à répliquer.",
- welcomeStepFederationAction: "Voir les invitations",
- welcomeStepBackupTitle: "Sauvegardez votre ID",
- welcomeStepBackupText: "Votre identité est un fichier de clés sur cet appareil.",
- welcomeStepBackupWarning: "SI VOUS LE PERDEZ, PERSONNE NE POURRA LE RÉCUPÉRER.",
- welcomeStepBackupAction: "Sauvegarder !",
+ welcomeBootstrapRunning: "Chargement de l'instantané du pub. Le pub est rejoint dès la fin ; vous pouvez continuer à utiliser Oasis entre-temps.",
welcomeCompleteTitle: "Tout est prêt.",
- welcomeCompleteText: "Votre nœud est prêt. À partir d'ici le réseau grandit avec les gens que vous suivez.",
+ welcomeCompleteText: "Votre nœud est prêt. À partir d'ici le réseau grandit avec les habitants que vous soutenez.",
welcomeFindPeople: "Trouver des habitants",
devFilterFiles: "FICHIERS",
devFilterSearch: "CHERCHER",
@@ -425,7 +528,7 @@ module.exports = {
devFilterTests: "TESTS",
devVersion: "Version",
devNodeVersion: "Node",
- devStatsTests: "Suites de tests",
+ devStatsTests: "Tests",
devParentFolder: "Dossier parent",
devOpenFolder: "ouvrir",
devDescription: "Explorez le code source exécuté sur ce nœud.",
@@ -469,6 +572,27 @@ module.exports = {
"Si vous souhaitez utiliser une autre langue, sélectionnez-la ici.",
setLanguage: "Définir la langue",
peerConnectionsIntro: "Gérez toutes vos connexions avec d’autres nœuds.",
+ peersConnectFailed: "Connexion impossible : {reason}.",
+ peerStateLabel: "État",
+ peerAddressLabel: "Adresse",
+ peerLastChangeLabel: "Dernier changement",
+ peerStateConnected: "Connecté",
+ peerStateConnecting: "Connexion en cours",
+ peerStateStaged: "Disponible",
+ peerErrSilent: "Aucune activité",
+ peerErrTimeout: "Ne répond pas",
+ peerErrRefused: "Refuse la connexion",
+ peerErrNotFound: "Adresse inconnue",
+ peerErrUnreachable: "Réseau injoignable",
+ peerErrKeys: "Utilise des clés différentes",
+ peerErrIdentity: "N'accepte pas votre connexion",
+ peerErrTor: "TOR uniquement",
+ peerErrDropped: "Connexion coupée",
+ peerErrPaused: "Réseau en pause",
+ peerErrOther: "Erreur de connexion",
+ peerOutdated: "Obsolète",
+ peerVersionUnannounced: "N'annonce pas sa version : un ancien Oasis",
+ peersTorMissing: "Ce PUB n'accepte que des connexions via TOR.",
peerConnectionsTitle: "Connexions",
online: "En ligne",
offline: "Hors ligne",
@@ -487,22 +611,25 @@ 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.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Aucun pair enregistré pour l'instant.",
+ peerConnect: "Connecter",
+ peerDisconnect: "Déconnecter",
peerRefresh: "Rafraîchir",
peerPruneIdle: "Retirer les inactifs",
+ peersPause: "Pause",
+ peersResume: "Reprendre",
+ peersPausedNote: "En pause : Oasis ne se connecte à personne et personne ne peut s'y connecter.",
+ peersPauseHint: "Arrête toutes les connexions : Oasis ne se connecte à aucun autre nœud et n'en accepte aucun jusqu'à la reprise.",
peerExport: "Exporter",
peerImport: "Importer",
peerImportTitle: "Importer la liste de pairs",
peerImportPlaceholder: "Colle une adresse multiserver par ligne, ou téléverse un fichier .txt…",
connectionActionIntro:
"",
- startNetworking: "Démarrer le réseau",
- stopNetworking: "Arrêter le réseau",
- restartNetworking: "Redémarrer le réseau",
- sync: "Synchroniser le réseau",
indexes: "Index",
+ indexesRebuilt: "Index reconstruits",
+ indexesRebuildFailed: "Impossible de reconstruire les index",
+ indexesFiles: "Fichiers d'index",
indexesDescription:
"Reconstruire les index est sans risque et peut corriger certains problèmes dans votre blockchain.",
homePageTitle: "Page d'accueil",
@@ -512,57 +639,42 @@ module.exports = {
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",
invitesChatsTitle: "Chats",
- invitesChatInviteCodePlaceholder: "Saisissez le code du chat",
- invitesChatJoinButton: "Rejoindre le chat",
invitesPadsTitle: "Pads",
- invitesPadInviteCodePlaceholder: "Saisissez le code du pad",
- invitesPadJoinButton: "Rejoindre le pad",
invitesCalendarsTitle: "Calendriers",
- invitesCalendarInviteCodePlaceholder: "Saisissez le code du calendrier",
- invitesCalendarJoinButton: "Rejoindre le calendrier",
invitesEventsTitle: "Événements",
- invitesEventInviteCodePlaceholder: "Saisissez le code de l'événement",
- invitesEventJoinButton: "Rejoindre l'événement",
invitesForumsTitle: "Forums",
- invitesForumInviteCodePlaceholder: "Saisissez le code du forum",
- invitesForumJoinButton: "Rejoindre le forum",
invitesMapsTitle: "Cartes",
- invitesMapInviteCodePlaceholder: "Saisissez le code de la carte",
- invitesMapJoinButton: "Rejoindre la carte",
invitesShopsTitle: "Boutiques",
- invitesShopInviteCodePlaceholder: "Saisir le code d'invitation de la boutique",
- invitesShopJoinButton: "Rejoindre la boutique",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "PUBs Suggérés",
+ invitesFilterOthers: "Autres",
+ invitesJoinTitle: "Invitations",
+ invitesJoinHint: "Collez n'importe quel code d'invitation, quel que soit son objet, ou l'Oasis ID d'un habitant.",
+ invitesJoinPlaceholder: "Code d'invitation ou Oasis ID",
+ invitesJoinButton: "Rejoindre",
+ invitesUsedTitle: "Dernières invitations",
+ invitesUsedEmpty: "Vous n'avez encore employé aucune invitation.",
+ invitesUsedType: "Type",
+ invitesUsedName: "Nom",
+ invitesUsedDate: "Date",
invitesPubInviteCodePlaceholder: "Saisissez le code d’invitation du PUB",
invitesAcceptInvite: "Entrer dans le PUB",
+ invitesPubUses: "Invitations utilisées",
+ invitesPubExhausted: "Ce PUB n'a plus d'invitations disponibles.",
invitesAlreadyFederated: "Vous êtes déjà fédéré avec ce pub.",
+ invitesJoinPubMode: "Cet Oasis fonctionne comme PUB, en lecture seule. Pour le relier à un autre PUB, utilisez le terminal : ./oasis.sh join ",
+ invitesJoinLocalOnly: "Les invitations ne peuvent être acceptées que depuis l'appareil où tourne Oasis, ou via le lien d'administration affiché au démarrage.",
invitesFederationsTitle: "Fédérations",
invitesAcceptedInvites: "Fédérés",
invitesNoFederatedPubs: "Aucun pub fédéré.",
- invitesUnreachablePubs: "Inaccessibles",
- invitesNoUnreachablePubs: "Aucun pub inaccessible.",
invitesPubsRefresh: "Rafraîchir",
- invitesPubsClearUnreachable: "Retirer les injoignables",
+ invitesPubsClearUnreachable: "Nettoyer",
invitesPubsExport: "Exporter",
invitesPubsImport: "Importer",
invitesPubsImportTitle: "Importer des pubs",
invitesPubsImportPlaceholder: "Colle une adresse multiserver ou un code d'invitation par ligne, ou téléverse un fichier .txt…",
- currentlyUnreachable: "ERREUR !",
- errorDetails: "Détails de l’erreur",
genericError: "Une erreur s’est produite.",
panicMode: "Mode Panique !",
encryptData: "Définissez un mot de passe (min 32 caractères) pour chiffrer votre blockchain",
@@ -589,7 +701,6 @@ module.exports = {
votesOptionNoLabel:"Non",
votesOptionAbstentionLabel:"Abstention",
votesQuestionLabel:"Question",
- votesCreatedByLabel:"Créé le",
voteStatusOpen:"OUVERT",
voteStatusClosed:"FERMÉ",
commentDescription: ({ parentUrl }) => [
@@ -606,22 +717,22 @@ module.exports = {
searchSubmit: "Rechercher...",
votesLabel: "GOUVERNANCE",
pdfFallbackLabel: "Document PDF",
- shopLabel: "SHOPS",
+ shopLabel: "BOUTIQUES",
voteLabel: "VOTES",
submit: "Appliquer",
editProfile: "Éditer l’Avatar",
oasisIdLabel: "OasisID",
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- /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.",
+ 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- [/avatar](/profile) — Édite ton avatar, ton nom, ta description et les modules visibles sur ta partie publique.\n- /settings — Réglez votre instance locale : langue, thème, modules, confidentialité et synchronisation.\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 habitants.\n- /tribes — Crée ou rejoins des groupes privés chiffrés de bout en bout.\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é",
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",
- profileVisibilityWallet: "Portefeuille ECOIN",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "RBU",
+ profileVisibilityWallet: "Portefeuille ECOin",
+ profileVisibilityEcoTax: "Taxe ECO",
+ profileVisibilityLarpSign: "Sceau L.A.R.P.",
profileVisibilityGpg: "Clé GPG",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Boutiques",
@@ -634,6 +745,10 @@ module.exports = {
profileClearnetImagesLabel: "Images",
profileClearnetDocumentsLabel: "Documents",
profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Marché",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
editProfileDescription:
"",
profileName: "Nom",
@@ -657,9 +772,9 @@ module.exports = {
walletReceiveTitle: "Recevoir",
walletHistoryTitle: "Historique",
walletBalanceLine: ({ balance }) => `${balance} ECO`,
- walletCnfrs: "Cnfrs",
+ walletCnfrs: "Conf.",
walletConfirm: "Confirmer",
- walletDescription: "Gérez vos actifs numériques, y compris l’envoi et la réception d’ECOin, l’affichage du solde et l’accès à l’historique des transactions.",
+ walletDescription: "Gérez votre portefeuille ECOin.",
walletDate: "Date",
walletFee: "Frais (Plus les frais sont élevés, plus votre transaction sera traitée rapidement)",
walletFeeLine: ({ fee }) => `Frais : ECO ${fee}`,
@@ -667,6 +782,86 @@ module.exports = {
walletReceive: "Recevoir",
walletReset: "Réinitialiser",
walletSend: "Envoyer",
+ walletPayingTransfer: "Paiement du transfert",
+ walletCreateTransferLabel: "Générer un contrat (transfert)",
+ walletTransferNotifiedNote: "L'autre partie a été informée de ce paiement",
+ walletTransferCreatedNote: "Un transfert (reçu) a été créé pour ce paiement",
+ walletTransferNoPayeeNote: "Aucun habitant n'a publié cette adresse, aucun transfert créé",
+ walletTransferReceiptConcept: "Paiement depuis le portefeuille",
+ walletPaymentPmText: "vous a envoyé un paiement",
+ walletPayeeLabel: "Destinataire",
+ walletConceptLabel: "Concept",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Vous avez reçu votre RBU.",
+ bankingBotPaymentTitle: "Vous avez reçu un paiement.",
+ bankingBotUbiPaidText: "Votre Revenu de Base Universel a été versé",
+ bankUbiPubThisNode: "Ce nœud paie le RBU",
+ bankUbiPubConnected: "PUB du RBU",
+ bankUbiPubNone: "Aucun PUB n'annonce encore le RBU dans votre réseau",
+ bankUbiAddressPublished: "Adresse ECOin publiée",
+ bankUbiAddressMissing: "Publiez votre adresse ECOin pour recevoir le RBU",
+ bankUbiClaimedThisMonth: "Réclamé ce mois-ci",
+ bankUbiPubBalance: "Portefeuille du PUB disponible pour le RBU",
+ bankNoPubAddress: "Le PUB du RBU n'a pas encore publié d'adresse ECOin.",
+ bankUbiTab: "RBU",
+ bankDonateEco: "DONNER !",
+ donateTooltip: "Faire un don d'ECOin",
+ bankNoUserAddress: "Cet habitant ne partage pas d'adresse ECOin.",
+ bankUbiPubDefault: "Par défaut",
+ bankUbiPool: "Dotation",
+ bankUbiLastSeen: "Vu pour la dernière fois",
+ bankUbiLastPayout: "Dernière action",
+ bankUbiPaidOut: "Distribué",
+ bankRangeToday: "Aujourd'hui",
+ bankRangeWeek: "Semaine",
+ bankRangeMonth: "Mois",
+ bankRangeYear: "Année",
+ bankRangeFiveYears: "5 ans",
+ bankRangeAll: "Tout",
+ bankChartValueTitle: "Évolution de la valeur d'ECOin",
+ bankChartValueHours: "Équivalence en temps (h)",
+ bankChartWealthTitle: "Redistribution de la richesse ECOin",
+ bankChartDistributed: "RBU distribué (ECO)",
+ bankChartRebalanceTitle: "Redistribution des richesses entre PUBs",
+ bankChartRebalanced: "ECO déplacés entre PUBs",
+ bankChartTaxes: "Impôts retenus (ECO)",
+ bankChartNoDataRange: "Aucune donnée sur cette période.",
+ bankChartNoDataYet: "Pas encore de données",
+ bankChartPerHour: "par heure",
+ bankChartPerDay: "par jour",
+ bankChartPerMonth: "par mois",
+ bankTotalUbiDistributed: "RBU total redistribué (réseau)",
+ bankTotalTaxesWithheld: "Impôts totaux retenus (réseau)",
+ bankInflationIssuance: "Taux d'émission (annuel, récompense de bloc)",
+ bankRulesEligibilityTitle: "Qui peut recevoir le RBU",
+ bankRulesEligibility1: "Une adresse ECOin publiée dans votre profil (Profil → Capteurs → Portefeuille ECOin).",
+ bankRulesEligibility2: "Un feed de plus de 30 jours avec de l'activité : karma supérieur à zéro.",
+ bankRulesEligibility3: "Une réclamation par mois (epoch), depuis Banking avec le bouton Réclamer. Le mois en cours peut être refusé avec Refuser le RBU.",
+ bankRulesEligibility4: "Le plancher de 1 ECO est toujours payé ; les impôts ne réduisent que la part au-dessus et ne sont jamais facturés à part.",
+ bankRulesEligibility5: "Le PUB paie à son prochain cycle et publie un transfert RBU que vous pouvez confirmer.",
+ bankRulesEligibility6: "Sans adresse, avec un feed trop jeune, un mois refusé ou un PUB sans fonds, la réclamation est ignorée et journalisée sur le PUB.",
+ copyLinkTitle: "Copier le lien",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Refuser le RBU",
+ bankUbiRefusedThisMonth: "Vous avez refusé le RBU de ce mois.",
+ bankingBotUbiAvailableTitle: "Vous pouvez réclamer votre RBU.",
+ bankingBotUbiAvailableText: "Votre RBU de ce mois est disponible",
+ bankingBotConfirmTitle: "Vous avez un smart-contract en attente de confirmation",
+ bankingBotConfirmText: "Smart-contracts en attente de votre confirmation",
+ bankChartZoomHint: "Cliquer pour agrandir",
+ bankChartPoolTitle: "Dotation du RBU (dans le temps)",
+ bankChartNetworkUbiTitle: "RBU total redistribué (réseau)",
+ bankChartSupplyTitle: "Offre en circulation d'ECOin (dans le temps)",
+ bankChartInflationTitle: "Inflation d'ECOin (dans le temps)",
+ bankChartInflationSeries: "Taux annualisé (%)",
+ bankChartPool: "Dotation totale (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (dans le temps)",
+ bankChartFundsTitle: "Vos fonds ECOin (dans le temps)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin connecté",
+ bankWalletNotConfigured: "ECOin déconnecté",
+ transfersPayWithWallet: "PAYER !",
walletStatus: "État",
walletDisconnected: [
"Vous avez le ",
@@ -676,8 +871,11 @@ module.exports = {
" ou l’état de votre connexion.",
],
walletSentToLine: ({ destination, amount }) => `Envoyer ECO ${amount} à ${destination}`,
+ walletNotConfigured: "Votre portefeuille ECOin n'est pas encore configuré.",
walletSettingsDescription: "Intégrer Oasis avec votre portefeuille ECOin.",
- walletSettingsDocLink: "Guide d’installation d’ECOin",
+ walletSettingsMobileDescription: "Associez Oasis à l’application ECOin Wallet de cet appareil.",
+ walletDownloadEcoin: "Télécharger ECOin !",
+ walletRpcUrl: "URL du RPC",
walletStatusMessages: {
invalid_amount: "Montant invalide",
invalid_dest: "Adresse de destination invalide",
@@ -693,6 +891,7 @@ module.exports = {
walletUser: "Utilisateur",
walletPass: "Mot de passe",
walletConfiguration: "Configurer le portefeuille",
+ walletDisconnectButton: "Déconnecter le portefeuille",
cipher: "Chiffreur",
cipherTitle: "Chiffreur",
cipherDescription: "Chiffrez et déchiffrez votre texte de manière symétrique (à l’aide d’un mot de passe partagé).",
@@ -726,17 +925,16 @@ module.exports = {
bookmarkFilterRecent: "RÉCENTS",
bookmarkCreateButton: "Créer un marque-page",
bookmarkUpdateButton: "Mettre à jour",
- bookmarkDeleteButton: "Supprimer",
bookmarkAddFavoriteButton: "Ajouter aux favoris",
bookmarkRemoveFavoriteButton: "Retirer des favoris",
bookmarkUrlLabel: "Lien",
- bookmarkUrlPlaceholder: "https://exemple.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Description",
bookmarkDescriptionPlaceholder: "Optionnel",
bookmarkTagsLabel: "Étiquettes",
bookmarkTagsPlaceholder: "Saisissez des tags séparés par des virgules",
bookmarkLastVisitLabel: "Dernière visite",
- bookmarkSearchPlaceholder: "Rechercher URL, tags, catégorie, auteur...",
+ bookmarkSearchPlaceholder: "Rechercher dans Marque-pages...",
bookmarkSortRecent: "Plus récents",
bookmarkSortOldest: "Plus anciens",
bookmarkSortTop: "Les plus votés",
@@ -775,7 +973,7 @@ module.exports = {
videoDescriptionPlaceholder: "Facultatif",
videoNoFile: "Aucun fichier vidéo fourni",
noVideos: "Aucune vidéo disponible.",
- videoSearchPlaceholder: "Rechercher par titre, tags, auteur…",
+ videoSearchPlaceholder: "Rechercher dans Vidéos...",
videoSortRecent: "Les plus récentes",
videoSortOldest: "Les plus anciennes",
videoSortTop: "Les plus votées",
@@ -798,10 +996,9 @@ module.exports = {
documentFilterFavorites: "FAVORIS",
documentCreateButton: "Téléverser",
documentUpdateButton: "Mettre à jour",
- documentDeleteButton: "Supprimer",
documentAddFavoriteButton: "Ajouter aux favoris",
documentRemoveFavoriteButton: "Retirer des favoris",
- documentMessageAuthorButton: "PM",
+ documentMessageAuthorButton: "MP",
documentFileLabel: "Téléverser un document (.pdf)",
documentTagsLabel: "Étiquettes",
documentTagsPlaceholder: "Saisissez des tags séparés par des virgules",
@@ -811,7 +1008,7 @@ module.exports = {
documentDescriptionPlaceholder: "Optionnel",
documentNoFile: "Aucun fichier.",
noDocuments: "Aucun document disponible.",
- documentSearchPlaceholder: "Rechercher titre, tags, description, auteur...",
+ documentSearchPlaceholder: "Rechercher dans Documents...",
documentSortRecent: "Les plus récents",
documentSortOldest: "Les plus anciens",
documentSortTop: "Les plus votés",
@@ -832,31 +1029,31 @@ module.exports = {
audioFilterTop: "TOP",
audioCreateButton: "Téléverser un audio",
audioUpdateButton: "Mettre à jour",
- audioDeleteButton: "Supprimer",
audioAddFavoriteButton: "Ajouter aux favoris",
audioRemoveFavoriteButton: "Retirer des favoris",
audioFileLabel: "Sélectionnez un fichier audio (.mp3, .wav, .ogg)",
audioTagsLabel: "Étiquettes",
audioTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ tagsPlaceholder: "Saisissez des tags séparés par des virgules",
audioTitleLabel: "Titre",
audioTitlePlaceholder: "Facultatif",
audioDescriptionLabel: "Description",
audioDescriptionPlaceholder: "Facultatif",
audioNoFile: "Aucun fichier audio fourni",
noAudios: "Aucun audio disponible.",
- audioSearchPlaceholder: "Rechercher par titre, tags, auteur…",
+ audioSearchPlaceholder: "Rechercher dans Audios...",
audioSortRecent: "Les plus récents",
audioSortOldest: "Les plus anciens",
audioSortTop: "Les plus votés",
audioSearchButton: "Rechercher",
- audioMessageAuthorButton: "PM",
+ audioMessageAuthorButton: "MP",
audioUpdatedAt: "Mis à jour",
audioNoMatch: "Aucun audio ne correspond à votre recherche.",
audioFavoritesSectionTitle: "Favoris",
audioFilterFavorites: "FAVORIS",
favoritesTitle: "Favoris",
favoritesDescription: "Tous vos favoris au même endroit.",
- favoritesSearchPlaceholder: "Rechercher dans les favoris...",
+ favoritesSearchPlaceholder: "Rechercher dans Favoris...",
favoritesFilterAll: "TOUS",
favoritesFilterRecent: "RÉCENTS",
favoritesFilterAudios: "AUDIOS",
@@ -868,13 +1065,12 @@ module.exports = {
favoritesFilterChats: "CHATS",
favoritesFilterCalendars: "CALENDRIERS",
favoritesFilterVideos: "VIDÉOS",
- favoritesRemoveButton: "Retirer des favoris",
favoritesNoItems: "Aucun favori pour le moment.",
yourContacts: "Vos contacts",
allInhabitants: "Habitants",
allCVs: "CV",
discoverPeople: "Découvrez des habitants dans votre réseau.",
- searchInhabitantsPlaceholder: "FILTRER les habitants PAR NOM …",
+ searchInhabitantsPlaceholder: "Rechercher dans Habitants...",
filterLocation: "FILTRER les habitants PAR LOCALISATION …",
filterLanguage: "FILTRER les habitants PAR LANGUE …",
filterSkills: "FILTRER les habitants PAR COMPÉTENCES …",
@@ -898,7 +1094,6 @@ module.exports = {
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.",
@@ -916,6 +1111,18 @@ module.exports = {
parliamentFilterLeaders: "DIRIGEANTS",
parliamentFilterRules: "RÈGLES",
parliamentGovernmentCard: "Gouvernement actuel",
+ parliamentSeatsGovernment: "Gouvernement",
+ parliamentSeatsOpposition: "Opposition",
+ parliamentSeatsAbstention: "Abstention",
+ parliamentSeatsQuorum: "Quorum d'élection",
+ parliamentSeatsPass: "Seuil d'approbation",
+ parliamentSeatsByElection: "Par élection",
+ parliamentSeatsByHouses: "Par maison du LARP",
+ parliamentSeatsSeats: "sièges",
+ parliamentSeatsSeat: "siège",
+ parliamentSeatsLeader: "Chef",
+ parliamentSeatsVotesFor: "votes pour",
+ parliamentSeatsNoHouse: "Sans maison",
parliamentActorInPowerInhabitant: 'HABITANT AU POUVOIR',
parliamentActorInPowerTribe: 'TRIBU AU POUVOIR',
parliamentHistoricalGovernmentsTitle: 'GOUVERNEMENTS',
@@ -982,6 +1189,7 @@ module.exports = {
parliamentTimeRemaining: "Temps restant",
parliamentElectionsStatusTitle: "Prochain Gouvernement",
parliamentProposalDeadlineLabel: "Date limite",
+ parliamentViewReport: "Voir le rapport",
parliamentProposalTimeLeft: "Temps restant",
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.",
@@ -996,6 +1204,7 @@ module.exports = {
parliamentRulesLaws: "Lorsqu’une proposition atteint son seuil, elle devient une Loi et apparaît dans l’onglet Lois avec sa date d’entrée en vigueur.",
parliamentRulesHistorical: "Dans l’onglet Historique, vous pouvez voir chaque cycle de gouvernement qui a eu lieu ainsi que des données sur sa gestion.",
parliamentRulesLeaders: "Dans l’onglet Dirigeants, vous pouvez voir un classement des habitants/tribus qui ont gouverné (ou se sont présentés), classés par efficacité.",
+ parliamentRulesHemicycle: "L'hémicycle attribue un siège par habitant : le bloc du gouvernement (les électeurs de la candidature gagnante et le chef), un bloc d'opposition par autre candidature du cycle, et l'abstention. Les marques en pointillé indiquent le quorum d'élection (25 % du recensement) et le seuil d'approbation de la méthode en vigueur. « Par maison du LARP » colore les mêmes sièges par maison.",
parliamentProposalVoteStatusLabel: "Statut du vote",
parliamentProposalOnTrackYes: "Seuil atteint",
parliamentProposalOnTrackNo: "En dessous du seuil",
@@ -1009,6 +1218,7 @@ module.exports = {
courtsCaseFormTitle: "Ouvrir une affaire",
courtsCaseRespondent: "Accusé / Défendeur",
courtsCaseRespondentPh: "ID Oasis (@...) ou nom de Tribu",
+ courtsCaseSubjectPlaceholder: "Objet ou courte description",
courtsCaseMethod: "Méthode de résolution",
courtsCaseSubmit: "Déposer l'affaire",
courtsNominateJudge: "Nommer un juge",
@@ -1043,15 +1253,30 @@ module.exports = {
courtsMethodDICTATOR: "Dictateur",
courtsMethodPOPULAR: "Populaire",
courtsMethodKARMATOCRACY: "Karmatocratie",
+ courtsCaseType: "Type de dossier",
+ courtsPresetMinorConflict: "Conflit mineur",
+ courtsPresetModerateConflict: "Conflit modéré",
+ courtsPresetSevereConflict: "Conflit grave",
+ courtsPresetHarassment: "Harcèlement ou abus",
+ courtsPresetContentModeration: "Modération de contenu",
+ courtsPresetBanRestriction: "Bannissement ou restriction",
+ courtsPresetGovernanceDispute: "Litige de gouvernance",
+ courtsStatusOPEN: "Ouvert",
+ courtsStatusIN_PROGRESS: "En cours",
+ courtsStatusDECIDED: "Décidé",
+ courtsStatusCLOSED: "Clos",
+ courtsStatusSOLVED: "Résolu",
+ courtsStatusUNSOLVED: "Non résolu",
+ courtsStatusDISCARDED: "Rejeté",
courtsRulesTitle: "Fonctionnement des Tribunaux",
courtsRulesIntro: "Les Tribunaux sont un processus géré par la communauté pour résoudre les conflits et promouvoir la justice réparatrice. Le dialogue, des preuves claires et des remèdes proportionnels sont privilégiés.",
courtsRulesLifecycle: "Processus : 1) Ouvrir une affaire 2) Choisir une méthode 3) Soumettre des preuves 4) Audience et délibération 5) Verdict et remède 6) Exécution et clôture 7) Appel (le cas échéant).",
- courtsRulesRoles: "Accusation : ouvre l’affaire. Défense : personne ou tribu mise en cause. Méthode : mécanisme choisi par la communauté pour faciliter, évaluer les preuves et rendre un verdict. Témoin : fournit des témoignages ou des preuves. Médiateurs : personnes neutres invitées par l’accusation et/ou la défense, avec accès à tous les détails, qui aident à désamorcer le conflit et à co-créer des accords.",
+ courtsRulesRoles: "Accusation : ouvre l’affaire. Défense : habitant ou tribu mis en cause. Méthode : mécanisme choisi par la communauté pour faciliter, évaluer les preuves et rendre un verdict. Témoin : fournit des témoignages ou des preuves. Médiateurs : habitants neutres invités par l’accusation et/ou la défense, avec accès à tous les détails, qui aident à désamorcer le conflit et à co-créer des accords.",
courtsRulesEvidence: "Description jusqu’à 1000 caractères. Joignez des images, audios, vidéos et documents PDF pertinents et légaux. Ne partagez pas de données privées sensibles sans consentement.",
courtsRulesDeliberation: "Les audiences peuvent être publiques ou privées. Les juges garantissent le respect, demandent des clarifications et peuvent écarter le matériel non pertinent ou illégal.",
courtsRulesVerdict: "La restauration est prioritaire : excuses, accords de médiation, modération de contenu, restrictions temporaires ou autres mesures proportionnées. Le raisonnement doit être consigné.",
courtsRulesAppeals: "Appel : autorisé en présence de nouvelles preuves ou d’une erreur procédurale manifeste. Doit être déposé dans les 7 jours sauf indication contraire.",
- courtsRulesPrivacy: "Respectez la vie privée et la sécurité. Le doxing, la haine ou les menaces sont supprimés. Les juges peuvent modifier ou sceller certaines parties du dossier pour protéger les personnes à risque.",
+ courtsRulesPrivacy: "Respectez la vie privée et la sécurité. Le doxing, la haine ou les menaces sont supprimés. Les juges peuvent modifier ou sceller certaines parties du dossier pour protéger les habitants à risque.",
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",
@@ -1067,12 +1292,16 @@ module.exports = {
exploreTrending: "Explorez le contenu le plus populaire dans votre réseau.",
votesButton: "GOUVERNANCE",
shopProductButton: "BOUTIQUE",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "ÉPISODE",
+ campaignButton: "CAMPAGNE",
+ logisticsRouteButton: "TRAJET",
trendingTotalOpinions: "Total des avis",
trendingNoContentMessage: "Pas encore de tendances.",
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...",
+ taskSearchPlaceholder: "Rechercher dans Tâches...",
taskTitleLabel: "Titre",
taskDescriptionLabel: "Description",
taskStartTimeLabel: "Date de début",
@@ -1091,7 +1320,7 @@ module.exports = {
taskStatusOpen: "Ouverte",
taskStatusInProgress: "En cours",
taskStatusClosed: "Fermée",
- taskAssignedTo: "Assignée à",
+ taskAssignedTo: "Assignée",
taskAssignedChip: "Assignée",
taskUnassignedChip: "Non assignée",
taskAssignees: "Assignés",
@@ -1101,6 +1330,7 @@ module.exports = {
taskUpdateButton: "Mettre à jour",
taskDeleteButton: "Supprimer",
taskFilterAll: "TOUS",
+ taskFilterRecent: "RÉCENTS",
taskFilterMine: "MIENS",
taskFilterOpen: "OUVERTES",
taskFilterInProgress: "EN COURS",
@@ -1128,14 +1358,13 @@ module.exports = {
eventUpcomingDates: "Prochaines dates",
eventsTitle: "Événements",
eventsDescription: "Découvrez et gérez des événements dans votre réseau.",
- eventSearchPlaceholder: "Rechercher des événements...",
+ eventSearchPlaceholder: "Rechercher dans Événements...",
eventPrice: "Prix",
eventStatus: "État",
eventAllSectionTitle: "Événements",
eventMineSectionTitle: "Vos événements",
eventCreateSectionTitle: "Créer un événement",
eventUpdateSectionTitle: "Mettre à jour l'événement",
- eventDeleteButton: "Supprimer",
eventCreateButton: "Créer un événement",
eventAddToCalendar: "Ajouter au calendrier",
eventVisitCalendar: "Voir le calendrier",
@@ -1177,6 +1406,7 @@ module.exports = {
eventDate: "Date",
eventAttendButton: "Assister à l'événement",
eventFilterAll: "TOUS",
+ eventFilterRecent: "RÉCENTS",
eventFilterMine: "MIENS",
eventFilterToday: "AUJOURD'HUI",
eventFilterWeek: "CETTE SEMAINE",
@@ -1203,7 +1433,7 @@ module.exports = {
tagsFilterTop: "TOP",
tagsFilterCloud: "NUAGE",
tagsNoItems: "Aucune étiquette disponible.",
- tagsSearchPlaceholder: "Rechercher des étiquettes...",
+ tagsSearchPlaceholder: "Rechercher dans Étiquettes...",
tagsTableHeaderTag: "ÉTIQUETTE/LINK :",
tagsTableHeaderCount: "COMPTEUR :",
transfersTitle: "Transferts",
@@ -1211,7 +1441,10 @@ module.exports = {
transfersFrom: "De",
transfersTo: "À",
transfersFilterAll: "TOUS",
+ transfersFilterRecent: "RÉCENTS",
transfersFilterMine: "MIENS",
+ transfersFilterMinePending: "EN ATTENTE",
+ transfersFilterMineConfirmed: "SIGNÉS",
transfersFilterUBI: "RBU",
transfersFilterMarket: "MARCHÉ",
transfersFilterTop: "TOP",
@@ -1226,7 +1459,6 @@ module.exports = {
transfersCategoryEconomic: "Économique",
transfersCategoryTime: "Temps",
transfersCategoryTrust: "Confiance",
- transfersCategoryApply: "Appliquer",
transfersUnitEco: "ECO",
transfersUnitHours: "h",
transfersUnitTrust: "confiance",
@@ -1256,7 +1488,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Transferts rejetés",
transfersCreateSectionTitle: "Créer un transfert",
transfersAllSectionTitle: "Transferts",
- transfersSearchPlaceholder: "Rechercher concept, tags, utilisateurs...",
+ transfersSearchPlaceholder: "Rechercher dans Transferts...",
transfersMinAmountLabel: "Montant min.",
transfersMaxAmountLabel: "Montant max.",
transfersSortRecent: "Plus récents",
@@ -1278,6 +1510,7 @@ module.exports = {
voteErrorTitle: "Vérifiez le formulaire",
voteErrorDeadlineMin: "La date limite doit être d’au moins {days} jours à partir de maintenant.",
voteErrorGeneric: "Le vote n’a pas pu être enregistré.",
+ voteLocked: "Ce vote a déjà reçu des votes ou des avis, ou appartient au Parlement ou aux Tribunaux : il ne peut plus être modifié ni supprimé.",
voteUpdateButton: "Mettre à jour",
voteDeleteButton: "Supprimer",
voteOptionYes: "OUI",
@@ -1287,6 +1520,7 @@ module.exports = {
voteFollowMajority: "SUIVRE LA MAJORITÉ",
voteNotInterested: "SANS INTÉRÊT",
voteFilterAll: "TOUS",
+ voteFilterRecent: "RÉCENTS",
voteFilterMine: "MIENS",
voteFilterOpen: "OUVERTS",
voteFilterClosed: "FERMÉS",
@@ -1302,7 +1536,6 @@ module.exports = {
voteTags: "Étiquettes",
voteOpinions: "Opinions",
novotes: "Aucune proposition de vote disponible.",
- voteBy: "Par",
voteCreatedAt: "Créé le",
voteNoQuestion: "Aucune question fournie",
voteUnknownCreator: "Créateur inconnu",
@@ -1312,6 +1545,7 @@ module.exports = {
voteCommentsForumButton: 'Ouvrir la discussion',
voteCommentsSectionTitle: 'Discussion ouverte',
voteNoCommentsYet: 'Il n’y a pas encore de commentaires. Soyez le premier à répondre.',
+ commentsGoToLast: "Aller au dernier commentaire",
voteNewCommentPlaceholder: 'Écrivez votre commentaire ici…',
voteNewCommentButton: 'Publier le commentaire',
voteNewCommentLabel: 'Ajouter un commentaire',
@@ -1322,6 +1556,8 @@ module.exports = {
cvNameLabel: "Nom complet",
cvDescriptionLabel: "Résumé",
cvPhotoLabel: "Photo",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Voir le CV",
cvPersonalExperiencesLabel: "Expériences personnelles",
cvPersonalSkillsLabel: "Compétences personnelles (séparées par des virgules)",
cvOasisExperiencesLabel: "Expériences de contribution dans Oasis",
@@ -1353,7 +1589,7 @@ module.exports = {
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",
+ blogPublish: "Publier",
pollsTitle: "Sondages",
dataTitle: "Correspondances",
dataDescription: "Explorez et visualisez les correspondances de votre réseau.",
@@ -1372,12 +1608,23 @@ module.exports = {
dataKindTasks: "TÂCHES",
dataKindReports: "RAPPORTS",
dataKindVotes: "VOTES",
- dataSearchPlaceholder: "Rechercher dans les données croisées...",
+ dataSearchPlaceholder: "Rechercher dans Correspondances...",
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é",
+ dataReasonFollowing: "Vous soutenez cet habitant",
+ dataReasonTribe: "Partage une tribu avec vous",
+ dataReasonPinned: "Correspond à un contenu que vous avez épinglé",
+ dataReasonCv: "Correspond aux compétences de votre CV",
+ dataReasonContent: "Lié à ce que vous publiez",
+ dataReasonRelated: "Lié à vos centres d’intérêt",
+ dataReasonAlike: "Publié par un habitant qui vous ressemble",
+ dataReasonSupportsYou: "Vous soutient",
+ dataReasonMutual: "Soutien mutuel",
+ dataReasonRated: "Bien noté par le réseau",
+ dataReasonNear: "Près de chez vous",
dataStatPeople: "CV",
dataStatConnected: "Connectés",
dataStatSkills: "Compétences",
@@ -1430,7 +1677,7 @@ module.exports = {
pollStatusLabel: "Statut",
pollStatusOpen: "OUVERT",
pollStatusClosed: "FERMÉ",
- pollSearchPlaceholder: "Rechercher des sondages...",
+ pollSearchPlaceholder: "Rechercher dans Sondages...",
pollsNoItems: "Aucun sondage trouvé.",
viewPoll: "Voir le Sondage",
pollChatCreate: "Créer un Sondage",
@@ -1443,7 +1690,7 @@ module.exports = {
blogFilterFavorites: "FAVORIS",
blogFilterTop: "TOP",
blogCreateButton: "Créer un Blog",
- blogSearchPlaceholder: "Rechercher des blogs...",
+ blogSearchPlaceholder: "Rechercher dans Blogs...",
blogComments: "Commentaires",
blogAllowComments: "Autoriser les commentaires",
blogCommentsClosed: "L'auteur a fermé les commentaires de ce blog.",
@@ -1456,12 +1703,11 @@ 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...",
+ forumSearchPlaceholder: "Rechercher dans Forums...",
forumFilterAll: "TOUS",
forumFilterMine: "MIENS",
forumFilterRecent: "RÉCENTS",
forumFilterTop: "TOP",
- forumDeleteButton: "Supprimer",
forumParticipants: "participants",
forumMessages: "messages",
forumMessageLabel: "Message",
@@ -1488,7 +1734,6 @@ module.exports = {
imageFilterGallery: "GALERIE",
imageCreateButton: "Téléverser une image",
imageUpdateButton: "Mettre à jour",
- imageDeleteButton: "Supprimer",
imageAddFavoriteButton: "Ajouter aux favoris",
imageRemoveFavoriteButton: "Retirer des favoris",
imageFileLabel: "Sélectionnez un fichier image (.jpeg, .jpg, .png, .gif)",
@@ -1500,13 +1745,14 @@ module.exports = {
imageDescriptionPlaceholder: "Facultatif",
imageNoFile: "Aucun fichier image fourni",
noImages: "Aucune image disponible.",
- imageSearchPlaceholder: "Rechercher par titre, tags, description, auteur…",
+ imageSearchPlaceholder: "Rechercher dans Images...",
imageSortRecent: "Les plus récentes",
imageSortOldest: "Les plus anciennes",
imageSortTop: "Les plus votées",
imageSearchButton: "Rechercher",
imageUpdatedAt: "Mis à jour",
imageNoMatch: "Aucune image ne correspond à votre recherche.",
+ feedSearchPlaceholder: "Rechercher dans Fil...",
feedTitle: "Fil",
feedDetailTitle: "Fil",
feedOpenDiscussion: "Ouvrir la discussion",
@@ -1525,7 +1771,7 @@ module.exports = {
alreadyRefeeded: "Vous avez déjà repartagé ceci.",
activityTitle: "Activité",
yourActivity: "Votre activité",
- globalActivity: "Activité globale",
+ globalActivity: "Activité",
activityList: "Activité",
activityDesc: "Découvrez l’activité récente de votre réseau.",
allButton: "TOUT",
@@ -1539,7 +1785,8 @@ module.exports = {
meme: "Mème",
typeRecent: "RÉCENT",
typeTop: "TOP",
- typePost: "BLOGS",
+ typePost: "BLOG",
+ activityUpdateLabel: "MISE À JOUR",
typeTribe: "TRIBUS",
typeLarp: "L.A.R.P.",
typeInhabitants: "HABITANTS",
@@ -1567,7 +1814,7 @@ module.exports = {
typeTombstone: "SUPPRIMÉ",
typeBanking: "BANQUE",
typeBankWallet: "BANQUE/PORTEFEUILLE",
- typeBankClaim: "BANQUE/UBI",
+ typeBankClaim: "BANQUE/RBU",
typeKarmaScore: "KARMA",
typeParliament: "PARLEMENT",
typeSpread: "SOUTIENS",
@@ -1602,7 +1849,7 @@ module.exports = {
location: "Lieu",
contentWarning: "Sujet",
bankWalletConnected: "Portefeuille ECOin",
- bankUbiReceived: "UBI reçu",
+ bankUbiReceived: "RBU reçue",
bankTx: "Tx",
bankEpochShort: "Époque",
viewDetails: "Voir les détails",
@@ -1673,7 +1920,7 @@ module.exports = {
courtsNoCases: 'Aucun dossier.',
reportsTitle: "Rapports",
reportsDescription: "Gérez et suivez les signalements de votre réseau.",
- reportsSearchPlaceholder: "Rechercher des rapports...",
+ reportsSearchPlaceholder: "Rechercher dans Rapports...",
reportsFilterAll: "TOUS",
reportsFilterRecent: "RÉCENTS",
reportsFilterTop: "TOP",
@@ -1721,7 +1968,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Rapports en révision",
reportsResolvedSectionTitle: "Rapports résolus",
reportsInvalidSectionTitle: "Rapports invalides",
- reportsTemplateSectionTitle: 'Modèle de signalement',
reportsBugTemplateTitle: 'Détails de reproduction (Bugs)',
reportsFeatureTemplateTitle: 'Détails (Fonctionnalités)',
reportsAbuseTemplateTitle: 'Détails (Abus)',
@@ -1774,8 +2020,6 @@ module.exports = {
tribeGallerySectionTitle: "Galerie de tribus",
tribeRecentSectionTitle: "Tribus récentes",
tribeTopSectionTitle: "Tribus populaires",
- tribeviewTribeButton: "Visiter la tribu",
- tribeviewSubTribeButton: "Visiter la sous-tribu",
tribeRootLabel: "RACINE",
tribeDescription: "Explorez ou créez des tribus dans votre réseau.",
tribeMainTribeLabel: "TRIBU PRINCIPALE",
@@ -1784,19 +2028,28 @@ module.exports = {
tribeDeleteButton: "Supprimer",
tribeImageLabel: "Télécharger un média (max: 50 Mo)",
tribeTitleLabel: "Titre",
- searchTribesPlaceholder: "FILTRER les tribus PAR NOM …",
+ searchTribesPlaceholder: "Rechercher dans Tribus...",
tribeTitlePlaceholder: "Nom de la tribu",
tribeDescriptionLabel: "Description",
tribeDescriptionPlaceholder: "Décrivez cette tribu",
tribeLocationLabel: "Localisation",
tribeLocationPlaceholder: "Où se situe cette tribu ?",
tribeTagsLabel: "Étiquettes",
- tribeTagsPlaceholder: "Saisissez des étiquettes séparées par des virgules",
+ tribeTagsPlaceholder: "Saisissez des tags séparés par des virgules",
tribeInviteMode: "Mode d’invitation",
tribeModeLabel: "MODE",
tribeIsAnonymousLabel: "STATUT",
tribeMembersCount: "Membres",
tribeEnterInvite: "SAISIR LE CODE",
+ subscriptionTitle: "Abonnements",
+ subscriptionOn: "Abonné",
+ subscriptionOff: "Non abonné",
+ subscriptionSubscribe: "S'abonner",
+ subscriptionUnsubscribe: "Se désabonner",
+ subscriptionSubscribers: "Abonnés",
+ pmListLabel: "Envoyer à",
+ pmListNone: "— Aucune liste —",
+ pmListNoSubscribers: "Aucun abonné",
tribeLeaveButton: "QUITTER",
tribePublic: "PUBLIQUE",
tribePrivate: "PRIVÉE",
@@ -1829,16 +2082,16 @@ module.exports = {
tribeSectionVideos: "VIDÉOS",
tribeSectionDocuments: "DOCUMENTS",
tribeSectionBookmarks: "SIGNETS",
- tribeSectionMaps: "MAPS",
+ tribeSectionMaps: "CARTES",
tribeSectionPads: "PADS",
tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionCalendars: "CALENDRIERS",
+ tribePadCreate: "Créer un pad",
+ tribeChatCreate: "Créer un chat",
+ tribeCalendarCreate: "Créer un calendrier",
+ tribePadsEmpty: "Aucun pad pour l'instant.",
+ tribeChatsEmpty: "Aucun chat pour l'instant.",
+ tribeCalendarsEmpty: "Aucun calendrier pour l'instant.",
tribeInhabitantsEmpty: "Aucun habitant dans cette tribu pour l'instant.",
tribeEventCreate: "Créer un événement",
tribeEventsEmpty: "Aucun événement pour l'instant.",
@@ -1893,9 +2146,14 @@ module.exports = {
tribeMediaTypeDocument: "Document",
tribeMediaTypeBookmark: "Signet",
tribeContentDelete: "SUPPRIMER",
+ tribeReachTribe: "TRIBU",
+ tribeReachNotice: "OASIS le montre à tous les habitants et CLEARNET aussi sur le web ouvert. L'ouvrir laisse une copie lisible hors de la tribu : revenir à TRIBU le masque, mais les copies déjà partagées ne peuvent pas être effacées.",
+ tribeReachPrivate: "Le contenu d'une tribu privée ne peut rester que dans la tribu.",
+ tribeReachOpenedBy: "Ouvert par",
+ tribeReachChange: "Où c'est publié",
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.",
+ tribeInviteCodeHint: "Partagez ce code avec la personne que vous souhaitez inviter. Elle peut rejoindre via /invites.",
tribeStatusOpen: "OUVERT",
tribeStatusClosed: "FERMÉ",
tribeStatusInProgress: "EN COURS",
@@ -1935,7 +2193,7 @@ module.exports = {
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...",
+ agendaSearchPlaceholder: "Rechercher dans Agenda...",
agendaFilterAll: "TOUS",
agendaFilterToday: "AUJOURD’HUI",
agendaFilterUpcoming: "À VENIR",
@@ -1956,6 +2214,7 @@ module.exports = {
agendaNoItems: "Aucune affectation trouvée.",
agendaDiscardButton: "Écarter",
agendaRestoreButton: "Restaurer",
+ agendaRemoveButton: "Retirer",
agendaMembersCount: "Membres",
agendaLocationLabel: "Localisation",
agendaYes: "OUI",
@@ -2022,8 +2281,8 @@ module.exports = {
pmComposeTitle: "Envoyer un message",
pmRecipients: "Destinataires",
pmRecipientsHint: "Saisissez les IDs Oasis séparés par des virgules",
- pmLimitsHint: "Jusqu'à 7 destinataires par message.",
- pmTextPlaceholder: "Corps limité à 7000 caractères.",
+ pmLimitsHint: "Jusqu'à 7 habitants par message.",
+ pmTextPlaceholder: "Écris ton message.",
pmSubject: "Sujet",
pmSubjectHint: "Saisissez l’objet du message",
pmText: "Message",
@@ -2045,8 +2304,8 @@ module.exports = {
pmCrypterCharsLabel: "caractères",
pmInvalidRecipients: "Identifiant Oasis invalide (devrait ressembler à @…=.ed25519).",
pmEncryptionLabel: "Chiffrement",
- private: "Privés",
- privateDescription: "Vos messages chiffrés.",
+ private: "Boîte",
+ privateDescription: "Gérez vos messages privés.",
privateInbox: "BOÎTE DE RÉCEPTION",
privateSent: "ENVOYÉS",
privateDelete: "Supprimer",
@@ -2055,6 +2314,7 @@ module.exports = {
pmReply: "Répondre",
pmReplies: "réponses",
inReplyTo: "EN RÉPONSE À",
+ forumInThread: "DANS LE FIL",
pmPreview: "Aperçu",
pmPreviewTitle: "Aperçu",
performed: "→",
@@ -2106,20 +2366,19 @@ module.exports = {
blockchainBack: 'Retour à l’explorateur',
banking: 'Banque',
bankingTitle: 'Banque',
- bankingDescription: "L'économie ECOin : solde, revenu de base, taxes et valeur de l'industrie.",
+ bankingDescription: "L'économie collective d'ECOin.",
bankOverview: 'Aperçu',
bankEpochs: 'Époques',
bankRules: 'Règles',
pending: 'En attente',
closed: 'Fermées',
- bankViewTx: 'Voir la Tx',
bankClaimNow: 'Réclamer',
- bankClaimUBI: 'Réclamer RBU !',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: 'Réclamer RBU ',
+ bankClaimAndPay: "Réclamer et payer",
+ bankClaimedPending: "Réclamation en attente...",
+ bankStatusClaimed: "Réclamé",
+ bankStatusExpired: "Expiré",
+ bankPubOnly: "Opération réservée aux PUBs",
bankEpoch: 'Époque',
bankPool: 'Fonds (cette époque)',
bankWeightsSum: 'Somme des poids',
@@ -2138,8 +2397,8 @@ module.exports = {
bankViewEpoch: 'Voir l’époque',
bankYourIndustryBalance: "Votre part de l'industrie",
bankYourUbiMonth: "Votre RBU (ce mois-ci)",
- bankYourFundsMonth: "Vos fonds (ce mois-ci)",
- bankIndustryBalance: "Production industrielle (estimée)",
+ bankYourFundsMonth: "Total des fonds",
+ bankIndustryBalance: "Production industrielle",
bankUserBalance: 'Votre solde',
bankAddresses: 'Adresses',
bankNoAddresses: 'Aucune adresse trouvée.',
@@ -2147,6 +2406,10 @@ module.exports = {
bankAddress: 'Adresse',
bankAddAddressTitle: 'Ajouter une adresse ECOIN',
bankAddAddressUser: 'ID d’Oasis',
+ bankAddAddressLabel: "Étiquette (facultatif)",
+ bankAddAddressLabelPlaceholder: "Portefeuille de Bob, boutique d'Alice…",
+ bankAddAddressUserOptional: "Oasis ID (facultatif)",
+ bankAddressUnnamed: "Adresse sans nom",
bankAddAddressAddress: 'Adresse ECOIN',
bankAddAddressSave: 'Enregistrer',
bankAddressAdded: 'Adresse ajoutée',
@@ -2164,12 +2427,12 @@ module.exports = {
bankAddressDeleteConfirm: 'Supprimer cette adresse ?',
search: 'Rechercher !',
bankLocal: 'Local',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Réseau",
bankingUserEngagementScore: "Score KARMA",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "PAS DE FONDS!",
bankUbiAvailableOk: "DISPONIBLE!",
- bankUbiAvailability: "RBU (réseau)",
+ bankUbiAvailability: "RBU",
bankAlreadyClaimedThisMonth: "Déjà réclamé ce mois-ci",
bankUbiThisMonth: "RBU (ce mois)",
bankUbiLastClaimed: "RBU (dernière réclamation)",
@@ -2199,6 +2462,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Chiffré en transit",
shopAddFavorite: "Ajouter Favori",
shopRemoveFavorite: "Retirer Favori",
shopOpen: "OUVERTE",
@@ -2206,6 +2470,13 @@ module.exports = {
shopMakePrivate: "RENDRE PRIVÉE (E2E)",
shopMakePublic: "RENDRE PUBLIQUE",
shopProducts: "Produits",
+ shopFilterAll: "TOUTES",
+ shopFilterRecent: "RÉCENTES",
+ shopFilterMine: "MIENNES",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUITS",
+ shopFilterPrices: "PRIX",
+ shopFilterFavorites: "FAVORIS",
shopProductAdd: "Ajouter Produit",
shopProductTitle: "Produit",
shopProductUpdate: "Modifier Produit",
@@ -2233,7 +2504,7 @@ module.exports = {
marketVisitItem: "VOIR L’ARTICLE",
shopStatus: "STATUT",
shopCreatedAt: "CRÉÉ",
- shopSearchPlaceholder: "Rechercher des boutiques...",
+ shopSearchPlaceholder: "Rechercher dans Boutiques...",
shopUrl: "URL",
shopLocation: "Localisation",
shopTags: "Étiquettes",
@@ -2243,15 +2514,17 @@ module.exports = {
shopTitlePlaceholder: "Nom de votre boutique",
shopDescriptionPlaceholder: "Description détaillée de votre boutique",
shopLocationPlaceholder: "Ville, Pays",
- shopTagsPlaceholder: "tag1, tag2, tag3",
+ shopTagsPlaceholder: "Saisissez des tags séparés par des virgules",
mapTitlePlaceholder: "Titre de la carte",
shopProductFeatured: "Produit Vedette",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "Envoyer au marché",
typeShop: "BOUTIQUES",
typeShopProduct: "PRODUIT BOUTIQUE",
bankExchange: 'Échange',
bankExchangeCurrentValue: 'Valeur d’ECOin (1h)',
- bankTotalSupply: 'Offre totale d’ECOin',
+ bankTotalSupply: "Offre ECOin totale",
+ bankPubsSupply: "Offre ECOin de la réserve des PUBs",
+ bankHoldingSupply: "Offre ECOin hors RBU",
bankHoursOfWork: 'heures',
bankUnitMs: "ms",
bankUnitSeconds: "secondes",
@@ -2265,14 +2538,15 @@ module.exports = {
bankExchangeChartSupply: 'Offre',
bankExchangeChartInflation: 'Inflation %',
bankExchangeChartEmpty: 'Pas encore assez d’échantillons — reviens plus tard',
- bankCurrentSupply: 'Offre actuelle d’ECOin',
+ bankCurrentSupply: "Offre ECOin actuelle",
bankingSyncStatus: 'État d’ECOin',
bankingSyncStatusSynced: 'Synchronisé',
- bankingSyncStatusOutdated: 'Obsolète',
+ bankingSyncStatusOutdated: "Non synchronisé",
statsTitle: 'Statistiques',
statistics: "Statistiques",
statsDescription: "Découvrez des statistiques sur votre réseau.",
ALLButton: "TOUT",
+ RECENTButton: "RÉCENTS",
MINEButton: "MIENS",
TOMBSTONEButton: "SUPPRESSIONS",
statsCreatedAt: "Créé le",
@@ -2280,7 +2554,8 @@ module.exports = {
statsYourOpinions: "Avis",
statsNetworkContent: "Contenu",
statsNetworkOpinions: "Avis",
- statsEcoWalletLabel: "Portefeuille ECOIN",
+ statsEcoWalletLabel: "Portefeuille ECOin",
+ walletAddressCopyHint: "Cliquez pour sélectionner, puis copiez",
statsEcoWalletNotConfigured: "Non configuré !",
statsBookmark: "Signets",
statsEvent: "Événements",
@@ -2302,6 +2577,8 @@ module.exports = {
statsTransfer: "Transferts",
statsAiExchange: "IA",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "Nœuds",
+ statsTotalLabel: "Total",
statsPost: "Publications",
statsSize: "Total (taille)",
statsBlockchainSize: "Blockchain (taille)",
@@ -2353,8 +2630,14 @@ module.exports = {
aiPrompt: "Fournissez une réponse informative et précise.",
aiConfiguration: "Configurer le prompt",
aiPromptUsed: "Invite",
- aiClearHistory: "Effacer l’historique du chat",
- aiServerError: "L’IA n’a pas pu répondre. Réessayez.",
+ aiClearHistory: "Effacer l'historique",
+ aiServerError: "Je ne peux pas répondre correctement. Réessayez.",
+ aiStatusLoading: "42 charge le modèle. Réessayez dans un instant.",
+ aiThinking: "Réflexion",
+ aiWaiting: "En attente",
+ aiStatusMissingModel: "Le modèle d'IA n'est pas installé : src/AI/oasis-42-1-chat.Q4_K_M.gguf est absent.",
+ aiExportFineTuning: "Exporter le Fine-Tuning",
+ aiFactsTitle: "Données de votre réseau",
aiInputPlaceholder: "Qu'est-ce qu'Oasis ?",
typeAiExchange: "IA",
aiApproveTrain: "Ajouter à l’entraînement collectif",
@@ -2383,7 +2666,7 @@ module.exports = {
marketFilterDiscarded: "JETÉ",
marketFilterRecent: "RÉCENT",
marketFilterMyBids: "ENCHÈRES",
- marketCreateButton: "Créer un article",
+ marketCreateButton: "Vendre quelque chose",
marketItemType: "Type",
marketItemTitle: "Titre",
marketItemAvailable: "Date limite",
@@ -2394,7 +2677,7 @@ module.exports = {
marketItemCondition: "État",
marketItemPrice: "Prix",
marketItemTags: "Étiquettes",
- marketItemTagsPlaceholder: "Entrez des tags séparés par des virgules",
+ marketItemTagsPlaceholder: "Saisissez des tags séparés par des virgules",
marketItemDeadline: "Date limite",
marketItemIncludesShipping: "Livraison incluse ?",
marketItemHighestBid: "Meilleure offre",
@@ -2411,7 +2694,7 @@ module.exports = {
marketNoItems: "Aucun article disponible pour le moment.",
marketYourBid: "Votre offre",
marketCreateFormImageLabel: "Télécharger un média (max: 50 Mo)",
- marketSearchPlaceholder: "Rechercher par titre ou tags",
+ marketSearchPlaceholder: "Rechercher dans Marché...",
marketMinPriceLabel: "Prix minimum",
marketMaxPriceLabel: "Prix maximum",
marketSortRecent: "Les plus récents",
@@ -2477,8 +2760,7 @@ module.exports = {
housingSetClosed: "Rendre indisponible",
housingCreateButton: "Créer un lieu",
housingUpdateButton: "Mettre à jour",
- housingDeleteButton: "Supprimer",
- housingSearchPlaceholder: "Rechercher des lieux...",
+ housingSearchPlaceholder: "Rechercher dans Logement...",
housingSearchButton: "Rechercher",
housingMinPrice: "Prix min",
housingMaxPrice: "Prix max",
@@ -2556,12 +2838,11 @@ module.exports = {
jobsExchangeSkill: "Compétence demandée en échange",
jobTimePartial: "Partiel",
jobTimeComplete: "Complet",
- jobsDeleteButton: "SUPPRIMER",
jobsUpdateButton: "METTRE À JOUR",
jobsFilterApplied: "POSTULÉ",
jobsAppliedTitle: "Mes candidatures",
jobsAppliedBadge: "Candidaté",
- jobsSearchPlaceholder: "Rechercher titre, tags, description...",
+ jobsSearchPlaceholder: "Rechercher dans Offres d’emploi...",
jobsMinSalaryLabel: "Salaire min.",
jobsMaxSalaryLabel: "Salaire max.",
jobsSortRecent: "Plus récents",
@@ -2573,15 +2854,15 @@ module.exports = {
jobSetOpen: "Marquer ouvert",
jobsTagsLabel: "Étiquettes",
noJobsMatch: "Aucune offre ne correspond à votre recherche.",
- industrySearchPlaceholder: "Rechercher des usines…",
+ industrySearchPlaceholder: "Rechercher dans Industrie...",
industryAllSectors: "Tous les secteurs",
industryVisitButton: "Visiter l’industrie",
industryAdvanceTo: "Passer à",
industryAmount: "Montant",
industryApproveBuild: "Approuver",
- industryBlueprint: "Blueprint",
- industryBlueprints: "Blueprints",
- industryBuild: "Build",
+ industryBlueprint: "Plan",
+ industryBlueprints: "Plans",
+ industryBuild: "Production",
industryBuildNotes: "Notes",
industryBuildStart: "Date de début",
industryVoteUpdateButton: "Voter la mise à jour",
@@ -2589,7 +2870,7 @@ module.exports = {
industryRevokeVote: "Révoquer",
industryTimeLeft: "Temps restant",
industryBuildEnd: "Date de fin",
- industryBuilds: "Builds",
+ industryBuilds: "Productions",
industryBuildTitle: "Titre",
industryContribute: "Contribuer",
industryContributeButton: "Contribuer",
@@ -2647,7 +2928,6 @@ 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",
@@ -2662,7 +2942,7 @@ module.exports = {
housingBotYouRequestedTitle: "Vous avez demandé un lieu.",
housingBotYouCancelledTitle: "Vous avez annulé une demande.",
housingBotUnavailableTitle: "Un lieu que vous aviez demandé n’est plus disponible.",
- housingBotUnavailableSentTitle: "Vous avez prévenu les personnes qui avaient demandé ce lieu.",
+ housingBotUnavailableSentTitle: "Vous avez prévenu les habitants qui avaient demandé ce lieu.",
industryBotAdmittedTitle: "Vous avez été admis dans une usine.",
industryBotApplicationTitle: "Nouvelle demande d'adhésion dans votre usine.",
industryBotInvitedTitle: "Vous avez été invité dans une usine.",
@@ -2674,7 +2954,7 @@ module.exports = {
industryRulesIntro: "Industry permet aux habitants de posséder collectivement les moyens de production : une Usine est un atelier du réseau que personne ne possède à titre privé.",
industryRulesSteward: "Le fondateur est l'intendant — un gardien, pas un propriétaire : il ne peut ni vendre, ni privatiser, ni dissoudre l'Usine seul.",
industryRulesMembership: "La politique d'adhésion définit comment on rejoint : Ouverte (adhésion immédiate), Par vote (admis par le vote des membres) ou Sur invitation (un membre doit inviter d'abord).",
- industryRulesQuorum: "Le quorum est le nombre minimum de membres qui doivent voter pour qu'une décision compte, afin qu'une petite Usine ne soit pas décidée par une seule personne.",
+ industryRulesQuorum: "Le quorum est le nombre minimum de membres qui doivent voter pour qu'une décision compte, afin qu'une petite Usine ne soit pas décidée par un seul habitant.",
industryRulesMajority: "La majorité est la fraction de votes nécessaire (0,5 = moitié, 1 = unanimité) ; une décision passe quand les OUI atteignent au moins max(quorum, membres × majorité).",
industryRulesDecisions: "Les membres votent pour admettre de nouveaux venus, approuver les builds et dissoudre l'Usine ; l'intendant ne peut pas passer outre ces décisions collectives.",
industryRulesBlueprints: "Les Blueprints sont des recettes libres (COPYLEFT) — les intrants (matériaux, heures de travail, compétences) et la sortie (un bien physique ou numérique) — et chacun peut les forker.",
@@ -2693,13 +2973,14 @@ module.exports = {
industryPauseVotes: "Votes de statut",
industryTitle: "Industrie",
industryDescription: "Module pour gérer collectivement les moyens de production.",
- typeIndustryBuild: "BUILD",
- typeIndustryBlueprint: "BLUEPRINT",
+ typeIndustryBuild: "PRODUCTION",
+ typeIndustryBlueprint: "PLAN",
typeIndustryAllocation: "DISTRIBUTION",
typeIndustry: "INDUSTRIE",
modulesIndustryLabel: "Industrie",
modulesIndustryDescription: "Module pour gérer collectivement les moyens de production.",
industryFilterAll: "TOUTES",
+ industryFilterRecent: "RÉCENTS",
industryFilterMember: "MEMBRE",
industryFilterBlueprints: "PLANS",
industryFilterBuilds: "PRODUCTIONS",
@@ -2708,6 +2989,7 @@ module.exports = {
industryFilterPaused: "EN PAUSE",
industryFilterDissolved: "DISSOUTES",
industryAllTitle: "Industrie",
+ industryRecentTitle: "Usines récentes",
industryMemberTitle: "Usines dont je fais partie",
industryMineTitle: "Mes usines",
industryActiveTitle: "En marche",
@@ -2755,7 +3037,7 @@ module.exports = {
industryPolicy_invite: "Sur invitation",
projectsTitle: "Projets",
projectsDescription: "Créez, financez et suivez des projets communautaires dans votre réseau.",
- projectSearchPlaceholder: "Rechercher des projets...",
+ projectSearchPlaceholder: "Rechercher dans Projets...",
projectCreateProject: "Créer un projet",
projectCreateButton: "Créer un projet",
projectUpdateButton: "METTRE À JOUR",
@@ -2850,15 +3132,13 @@ module.exports = {
modulesModuleName: "Nom",
modulesModuleDescription: "Description",
modulesModuleStatus: "Statut",
- modulesTotalModulesLabel: "Modules chargés",
+ modulesTotalModulesLabel: "Total",
modulesEnabledModulesLabel: "Activés",
modulesDisabledModulesLabel: "Désactivés",
modulesInvitesLabel: "Invitations",
modulesInvitesDescription: "Module pour gérer et appliquer des codes d'invitation.",
modulesWalletLabel: "Portefeuille",
modulesWalletDescription: "Module pour gérer vos actifs numériques (ECOin).",
- modulesLegacyLabel: "Héritage",
- modulesLegacyDescription: "Module pour gérer rapidement et en toute sécurité votre secret (clé privée).",
modulesCipherLabel: "Chiffreur",
modulesCipherDescription: "Module pour crypter et décrypter votre texte de manière symétrique (en utilisant un mot de passe partagé).",
modulesBookmarksLabel: "Signets",
@@ -2920,20 +3200,23 @@ module.exports = {
modulesProjectsLabel: "Projets",
modulesProjectsDescription: "Module pour explorer, financer et gérer des projets.",
modulesBankingLabel: "Banque",
- modulesBankingDescription: "Module pour connaître la valeur réelle de ECOIN et distribuer une RBU en utilisant la trésorerie commune.",
+ modulesBankingDescription: "Module pour gérer le trésor commun : valeur de l’ECOIN, taxes et RBU.",
modulesFavoritesLabel: "Favoris",
modulesFavoritesDescription: "Module pour gérer votre contenu favori.",
fileTooLargeTitle: "Fichier trop volumineux",
fileTooLargeMessage: "Le fichier dépasse la taille maximale autorisée (50 Mo). Veuillez sélectionner un fichier plus petit.",
goBack: "Retour",
+ errorDismiss: "OK",
errorPageTitle: "Une erreur est survenue",
+ errorNoAllocation: "Aucune allocation trouvée pour cette réclamation.",
+ errorInvalidClaim: "Cette allocation ne peut pas être réclamée.",
visibilityLabel: "Visibilité",
+ clearnetPrivateConflict: "Un contenu privé, masqué, fermé, sur invitation ou payant ne peut pas être publié sur la CLEARNET. Choisis OASIS ou rends-le public.",
visibilityPublic: "Publique",
visibilityHidden: "Cachée",
visibilityMakePublic: "Rendre publique",
visibilityMakeHidden: "Cacher",
invitesInhabitantsTitle: "Habitants",
- invitesInhabitantsFollow: "Suivre",
aiNavPlaceholder: "Décrivez ce qu'il vous faut...",
aiNavDisabled: "La navigation par IA est désactivée.",
aiNavResultsTitle: "Suggestions AINav",
@@ -2944,20 +3227,20 @@ module.exports = {
modulesAINavDescription: "Module pour des requêtes en langage naturel sur le contenu du réseau.",
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)",
+ peerPort: "Port",
peerPublicKey: "Clé publique (@...ed25519)",
connectAndFollow: "Connecter",
modulesPresetTitle: "Configurations Communes",
- workflowsTitle: "Workflows",
+ workflowsTitle: "Flux de travail",
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_kids: "Enfants",
+ workflow_activists: "Activisme",
workflow_mobile: "Mobile",
statsCarbonFootprintTitle: "Empreinte Carbone",
statsCarbonTombstone: "Empreinte du tombstoning",
@@ -2970,12 +3253,13 @@ module.exports = {
visitContent: "Visiter le Contenu",
favoriteAdd: "Épingler aux Favoris",
pmContentTooltip: "Envoyer un Message Privé",
+ phoneCallTooltip: "Passer un Appel",
favoriteRemove: "Retirer des Favoris",
reportContent: "Signaler le Contenu",
- bankEcoinHours: "Équivalence ECOin en temps",
+ bankEcoinHours: "Équivalence ECOin en temps (1 ECO)",
mapsLabel: "Cartes",
mapTitle: "Cartes",
- mapDescription: "Explorez et gérez des cartes hors ligne dans votre réseau.",
+ mapDescription: "Gérez et partagez des cartes hors ligne dans votre réseau.",
mapMineSectionTitle: "Vos Cartes",
mapCreateSectionTitle: "Créer une Carte",
mapUpdateSectionTitle: "Modifier la Carte",
@@ -3004,7 +3288,7 @@ module.exports = {
mapTypeOpen: "OUVERT",
mapTypeClosed: "FERMÉ",
mapTagsLabel: "Étiquettes",
- mapTagsPlaceholder: "Entrez des étiquettes séparées par des virgules",
+ mapTagsPlaceholder: "Saisissez des tags séparés par des virgules",
mapUrlLabel: "URL de la carte",
mapMarkersTitle: "Marqueurs",
mapMarkerDefault: "Marqueur",
@@ -3015,9 +3299,22 @@ module.exports = {
markerImageLabel: "Image du Marqueur",
mapAddMarkerTitle: "Ajouter un Marqueur",
mapAddMarkerButton: "Ajouter un Marqueur",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Effacer le marqueur",
mapApplyZoom: "Appliquer Zoom",
- mapSearchPlaceholder: "Chercher description, étiquettes, auteur...",
+ mapPlaceSearchPlaceholder: "Trouver un lieu ou un pays...",
+ mapNoPlaces: "Aucun lieu trouvé.",
+ mapClusterTitle: "marqueurs ici, cliquez pour zoomer",
+ mapDeleteMarker: "Supprimer le marqueur",
+ mapZoomIn: "Zoom avant",
+ mapZoomOut: "Zoom arrière",
+ mapFitMarkers: "Ajuster à tous les marqueurs",
+ mapPanLabel: "Déplacer la carte",
+ mapCenterHere: "Centrer ici",
+ mapNear: "près de",
+ mapPickedSpot: "Point choisi",
+ mapPickHint: "Cliquez sur la carte pour choisir un point.",
+ mapClearPick: "Effacer",
+ mapSearchPlaceholder: "Rechercher dans Cartes...",
mapSearchButton: "Chercher",
mapUpdatedAt: "Mis à jour",
mapNoMatch: "Aucune carte ne correspond à votre recherche.",
@@ -3028,31 +3325,602 @@ module.exports = {
typeMapMarker: "MARQUEUR DE CARTE",
modulesMapLabel: "Cartes",
modulesMapDescription: "Module pour gérer et partager des cartes hors ligne.",
+ emergenciesTitle: "Urgences",
+ modulesEmergenciesLabel: "Urgences",
+ modulesEmergenciesDescription: "Module pour lancer, confirmer et suivre des urgences dans le réseau.",
+ emergenciesDescription: "Module pour lancer, confirmer et suivre des urgences dans le réseau.",
+ emergencyCreate: "Créer une urgence",
+ emergencyUpdate: "Mettre à jour",
+ emergencyDelete: "Supprimer",
+ emergencyTitleLabel: "Titre",
+ emergencyTitlePlaceholder: "Que se passe-t-il ?",
+ emergencyTextLabel: "Détails",
+ emergencyTextPlaceholder: "Où, depuis quand, que faire...",
+ emergencyCategoryLabel: "Catégorie",
+ emergencyCategoryWeather: "MÉTÉO",
+ emergencyCategoryInfrastructure: "INFRASTRUCTURE",
+ emergencyCategoryHealth: "SANTÉ",
+ emergencyCategorySecurity: "SÉCURITÉ",
+ emergencyCategoryLost: "OBJETS TROUVÉS",
+ emergencyCategoryNeighborhood: "VOISINAGE",
+ emergencyExpiresLabel: "Expire dans",
+ emergencyExpires1d: "1 jour",
+ emergencyExpires3d: "3 jours",
+ emergencyExpires7d: "1 semaine",
+ emergencyExpires30d: "1 mois",
+ emergencyExpiresNone: "Indéfini",
+ emergencyExpiresKeep: "Conserver la date actuelle",
+ emergencyTagsLabel: "Étiquettes",
+ emergencyTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ emergencyFilterAll: "TOUTES",
+ emergencyFilterMine: "MIENNES",
+ emergencyFilterRecent: "RÉCENTES",
+ emergencySeverityUnverified: "NON VÉRIFIÉE",
+ emergencySeverityLow: "FAIBLE",
+ emergencySeverityMedium: "MOYENNE",
+ emergencySeverityHigh: "ÉLEVÉE",
+ emergencyStatusActive: "ACTIVE",
+ emergencyStatusResolved: "RÉSOLUE",
+ emergencyStatusExpired: "EXPIRÉE",
+ emergencyConfirmations: "Confirmations",
+ emergencyConfirmButton: "Confirmer",
+ emergencyConfirmed: "Vous avez confirmé cette urgence",
+ emergencyResolveButton: "Résoudre",
+ emergencyReopenButton: "Rouvrir",
+ emergencyGenerateReport: "Générer le rapport",
+ emergencyUpdateEdited: "Modifiée",
+ emergencyLastUpdate: "DERNIÈRE MISE À JOUR",
+ emergencyUpdatesTitle: "Dernières mises à jour :",
+ emergencyNoUpdates: "Pas encore de mises à jour.",
+ emergencyAddUpdate: "Publier une mise à jour",
+ emergencyUpdatePlaceholder: "Qu’est-ce qui a changé ?",
+ emergencyNoItems: "Aucune urgence trouvée.",
+ emergencyExpiresAt: "Expire",
+ emergencyBannerLabel: "Urgence active",
+ emergencyCreateSectionTitle: "Créer une urgence",
+ emergencyUpdateSectionTitle: "Mettre à jour l’urgence",
+ emergencySearchPlaceholder: "Rechercher dans les urgences...",
+ typeEmergency: "URGENCES",
+ typeEmergencyConfirm: "CONFIRMATION D’URGENCE",
+ typeEmergencyUpdate: "MISE À JOUR D’URGENCE",
+ statsEmergency: "Urgences",
+ statsEmergencyConfirm: "Confirmations d’urgences",
+ statsEmergencyUpdate: "Mises à jour d’urgences",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Une urgence que vous suivez a une mise à jour.",
+ emergencyBotResolvedTitle: "Une urgence que vous suivez a été résolue.",
+ dataKindEmergencies: "URGENCES",
+ mailingTitle: "Listes de diffusion",
+ modulesMailingLabel: "Listes de diffusion",
+ modulesMailingDescription: "Découvrez et gérez des listes de diffusion dans votre réseau.",
+ modulesPhoneLabel: "Téléphone",
+ modulesPhoneDescription: "Module pour appeler d'autres habitants avec des appels vidéo chiffrés de bout en bout.",
+ mailingDescription: "Découvrez et gérez des listes de diffusion dans votre réseau.",
+ mailingCreate: "Créer une liste de diffusion",
+ mailingUpdate: "Mettre à jour",
+ mailingArchive: "Archiver",
+ mailingActivate: "Activer",
+ mailingCreateSectionTitle: "Créer une liste de diffusion",
+ mailingUpdateSectionTitle: "Mettre à jour la liste de diffusion",
+ mailingTitleLabel: "Titre",
+ mailingTitlePlaceholder: "Nom de la liste de diffusion",
+ mailingDescriptionLabel: "Description",
+ mailingDescriptionPlaceholder: "De quoi parle cette liste ?",
+ mailingTypeLabel: "Type de liste de diffusion",
+ mailingTypeOpen: "OUVERTE",
+ mailingTypeClosed: "FERMÉE",
+ mailingStatusLabel: "Statut",
+ mailingStatusActive: "ACTIVE",
+ mailingStatusArchived: "ARCHIVÉE",
+ mailingMembersLabel: "Inviter des habitants",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Abonnés",
+ mailingTagsLabel: "Étiquettes",
+ mailingTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ mailingFilterAll: "TOUTES",
+ mailingFilterMine: "MIENNES",
+ mailingFilterSubscribed: "ABONNÉES",
+ mailingFilterRecent: "RÉCENTES",
+ mailingHistoryDate: "DATE",
+ mailingHistoryThreads: "FILS",
+ mailingHistoryInhabitants: "HABITANTS",
+ mailingHistorySearchPlaceholder: "Rechercher dans l’historique...",
+ mailingNoMessages: "Pas encore de messages.",
+ mailingNoItems: "Aucune liste de diffusion trouvée.",
+ mailingSearchPlaceholder: "Rechercher dans les listes de diffusion...",
+ mailingWriteButton: "Écrire un message",
+ mailingWriteTitle: "Écrire à la liste",
+ mailingReplyTitle: "Répondre à la liste",
+ mailingSend: "Envoyer",
+ mailingTextPlaceholder: "Votre message atteint tous les participants de la liste.",
+ mailingParticipants: "Participants",
+ inboxFilterMailing: "Listes de diffusion",
+ mailingReplyPlaceholder: "Répondre à la liste...",
+ mailingReplyToList: "Répondre à la liste",
+ typeMailingList: "LISTE DE DIFFUSION",
+ statsMailingList: "Listes de diffusion",
+ mailingListLabel: "LISTE DE DIFFUSION",
+ logisticsTitle: "Logistique",
+ modulesLogisticsLabel: "Logistique",
+ modulesLogisticsDescription: "Découvrez et gérez des plans logistiques dans votre réseau.",
+ logisticsDescription: "Découvrez et gérez des plans logistiques dans votre réseau.",
+ logisticsCreate: "Créer une route",
+ logisticsUpdate: "Mettre à jour",
+ logisticsClose: "Clôturer",
+ logisticsReopen: "Rouvrir",
+ logisticsCreateSectionTitle: "Créer une route",
+ logisticsUpdateSectionTitle: "Mettre à jour la route",
+ logisticsTitleLabel: "Titre",
+ logisticsTitlePlaceholder: "Trajet vers le marché, camionnette disponible...",
+ logisticsKindLabel: "Type de logistique",
+ logisticsKindTrip: "TRAJET",
+ logisticsKindShipment: "ENVOI",
+ logisticsKindTrips: "TRAJETS",
+ logisticsKindShipments: "ENVOIS",
+ logisticsModeLabel: "Mode",
+ logisticsModeOffer: "J’OFFRE",
+ logisticsModeRequest: "JE CHERCHE",
+ logisticsModeOffers: "OFFRES",
+ logisticsModeRequests: "DEMANDES",
+ logisticsDescriptionLabel: "Description",
+ logisticsDescriptionPlaceholder: "Point de rendez-vous, ce que vous transportez, conditions...",
+ logisticsOriginLabel: "Origine",
+ logisticsOriginPlaceholder: "Point de départ",
+ logisticsDestinationLabel: "Destination",
+ logisticsDestinationPlaceholder: "Point d’arrivée",
+ logisticsDateLabel: "Date et heure",
+ logisticsRecurrenceLabel: "Récurrence",
+ logisticsFrequencyLabel: "Fréquence",
+ logisticsRecurrenceNone: "UNIQUE",
+ logisticsRecurrenceDaily: "QUOTIDIEN",
+ logisticsRecurrenceWeekly: "HEBDOMADAIRE",
+ logisticsRecurrenceMonthly: "MENSUEL",
+ logisticsSeatsLabel: "Places",
+ logisticsSizeLabel: "Taille",
+ logisticsSizePlaceholder: "ex. 2m x 1m",
+ logisticsWeightLabel: "Poids",
+ logisticsWeightPlaceholder: "ex. 40kg",
+ logisticsPriceFree: "GRATUIT",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TEMPS",
+ logisticsPriceLabel: "Prix",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Lien de commande",
+ logisticsOrderRefPlaceholder: "/shops/... ou /market/... de la commande à livrer",
+ logisticsOrderLink: "Commande liée",
+ logisticsTagsLabel: "Étiquettes",
+ logisticsTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ logisticsFilterAll: "TOUTES",
+ logisticsFilterMine: "MIENNES",
+ logisticsFilterBooked: "RÉSERVÉES",
+ logisticsFilterRecent: "RÉCENTES",
+ logisticsFilterHistory: "HISTORIQUE",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "OUVERTE",
+ logisticsStatusUpcoming: "À VENIR",
+ logisticsStatusPast: "PASSÉES",
+ logisticsStatusClosed: "CLÔTURÉES",
+ logisticsZoneLabel: "Zone",
+ logisticsSearchPlaceholder: "Rechercher dans la logistique...",
+ logisticsNoItems: "Aucune route trouvée.",
+ logisticsBookingPending: "EN ATTENTE",
+ logisticsBookingConfirmed: "CONFIRMÉE",
+ logisticsBookingRejected: "REFUSÉE",
+ logisticsBookingCancelled: "ANNULÉE",
+ logisticsBookingDelivered: "LIVRÉE",
+ logisticsConfirm: "Confirmer",
+ logisticsReject: "Refuser",
+ logisticsDeliver: "Livrer",
+ logisticsReceiptLabel: "Reçu",
+ logisticsReceiptPlaceholder: "Note de livraison (facultatif)",
+ logisticsCancelBooking: "Annuler la réservation",
+ logisticsBookTitle: "Réserver cette route",
+ logisticsNotesLabel: "Notes",
+ logisticsNotesPlaceholder: "Ce que le responsable doit savoir",
+ logisticsBook: "Réserver",
+ logisticsBookingsTitle: "Réservations",
+ logisticsMyBookingTitle: "Votre réservation",
+ logisticsRatingsTitle: "Évaluations",
+ logisticsNoRatings: "Pas encore d’évaluations.",
+ logisticsRatingsWhenClosed: "Les évaluations s’ouvrent une fois la route clôturée.",
+ logisticsScoreLabel: "Note",
+ logisticsRatingPlaceholder: "Comment ça s’est passé ?",
+ logisticsRate: "Évaluer",
+ typeLogisticsRoute: "ROUTE",
+ typeLogisticsRating: "ÉVALUATION DE ROUTE",
+ statsLogisticsRoute: "Routes",
+ statsLogisticsRating: "Évaluations de routes",
+ logisticsRouteLabel: "ROUTE",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Module pour publier des chaînes de podcast.",
+ podcastsDescription: "Module pour publier des chaînes de podcast.",
+ podcastCreate: "Créer un podcast",
+ podcastUpdate: "Mettre à jour",
+ podcastDelete: "Supprimer",
+ podcastCreateSectionTitle: "Créer un podcast",
+ podcastUpdateSectionTitle: "Mettre à jour le podcast",
+ podcastTitleLabel: "Titre",
+ podcastTitlePlaceholder: "Nom de la chaîne",
+ podcastDescriptionLabel: "Description",
+ podcastDescriptionPlaceholder: "De quoi parle ce podcast ?",
+ podcastCategoryLabel: "Catégorie",
+ podcastCategoryNews: "ACTUALITÉS",
+ podcastCategoryMusic: "MUSIQUE",
+ podcastCategoryTalk: "DISCUSSION",
+ podcastCategoryEducation: "ÉDUCATION",
+ podcastCategoryTech: "TECH",
+ podcastCategoryCulture: "CULTURE",
+ podcastCategoryCommunity: "COMMUNAUTÉ",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "AUTRE",
+ podcastTagsLabel: "Étiquettes",
+ podcastCoverLabel: "Couverture (image ou vidéo)",
+ podcastEpisodeAudioLabel: "Fichier audio ou vidéo (max : 75MB)",
+ podcastTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ podcastFilterAll: "TOUS",
+ podcastFilterMine: "MIENS",
+ podcastFilterRecent: "RÉCENTS",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "AUDITEURS",
+ podcastSearchPlaceholder: "Rechercher dans les podcasts...",
+ podcastNoItems: "Aucun podcast trouvé.",
+ podcastEpisodesLabel: "Épisodes",
+ podcastPlaysLabel: "Vues",
+ podcastLastEpisode: "Dernier épisode",
+ podcastEpisodesTitle: "Épisodes",
+ podcastNoEpisodes: "Pas encore d’épisodes.",
+ podcastEpisodeAdd: "Ajouter un épisode",
+ podcastEpisodeCreateTitle: "Publier un épisode",
+ podcastEpisodeUpdateTitle: "Mettre à jour l’épisode",
+ podcastEpisodeTitleLabel: "Titre de l’épisode",
+ podcastEpisodeTitlePlaceholder: "Titre de l’épisode",
+ podcastEpisodeDescriptionLabel: "Notes",
+ podcastEpisodeDescriptionPlaceholder: "Ce qui se passe dans cet épisode, liens, crédits...",
+ podcastEpisodePublish: "Publier",
+ podcastPlayed: "Écouté",
+ podcastMarkPlayed: "Marquer comme écouté",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "ÉPISODE",
+ typePodcastOpinion: "AVIS SUR L’ÉPISODE",
+ typePodcastPlay: "ÉCOUTE",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Épisodes",
+ statsPodcastPlay: "Écoutes",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Un blog que vous suivez a une nouvelle entrée.",
+ podcastBotEpisodeTitle: "Un podcast que vous suivez a un nouvel épisode.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "ÉPISODE",
+ campaignsTitle: "Campagnes",
+ modulesCampaignsLabel: "Campagnes",
+ modulesCampaignsDescription: "Découvrez et gérez des campagnes dans votre réseau.",
+ campaignsDescription: "Découvrez et gérez des campagnes dans votre réseau.",
+ campaignCreate: "Créer une campagne",
+ campaignUpdate: "Mettre à jour",
+ campaignDelete: "Supprimer",
+ campaignClose: "Clôturer",
+ campaignReopen: "Rouvrir",
+ campaignCreateSectionTitle: "Créer une campagne",
+ campaignUpdateSectionTitle: "Mettre à jour la campagne",
+ campaignTitleLabel: "Titre",
+ campaignTitlePlaceholder: "Que voulez-vous obtenir ?",
+ campaignTextLabel: "Texte",
+ campaignTextPlaceholder: "Expliquez la cause, qui décide et ce que vous demandez...",
+ campaignCategoryLabel: "Catégorie",
+ campaignCategoryEnvironment: "ENVIRONNEMENT",
+ campaignCategoryRights: "DROITS",
+ campaignCategoryHealth: "SANTÉ",
+ campaignCategoryEducation: "ÉDUCATION",
+ campaignCategoryInfrastructure: "INFRASTRUCTURE",
+ campaignCategoryCulture: "CULTURE",
+ campaignCategoryEconomy: "ÉCONOMIE",
+ campaignCategoryOther: "AUTRE",
+ campaignGoalLabel: "Objectif de signatures",
+ campaignDeadlineLabel: "Échéance",
+ campaignTagsLabel: "Étiquettes",
+ campaignTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ campaignFilterAll: "TOUTES",
+ campaignFilterMine: "MIENNES",
+ campaignFilterSigned: "SIGNÉES",
+ campaignFilterRecent: "RÉCENTES",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "OUVERTE",
+ campaignStatusAchieved: "ATTEINTE",
+ campaignStatusUnachieved: "NON ATTEINTE",
+ campaignStatusClosed: "CLÔTURÉE",
+ campaignSearchPlaceholder: "Rechercher dans les campagnes...",
+ campaignNoItems: "Aucune campagne trouvée.",
+ campaignSignaturesLabel: "Signatures",
+ campaignSignaturesTitle: "Soutiens",
+ campaignNoSignatures: "Pas encore de signatures.",
+ campaignSignTitle: "Signer cette campagne",
+ campaignSignPlaceholder: "Pourquoi la soutenez-vous ? (facultatif)",
+ campaignSign: "Signer",
+ campaignSigned: "Vous avez déjà signé !",
+ campaignNotSigned: "Il manque encore votre signature",
+ campaignElevate: "Porter au Parlement",
+ campaignElevated: "Portée au Parlement",
+ campaignUpdatesTitle: "Mises à jour",
+ campaignNoUpdates: "Pas encore de mises à jour.",
+ campaignUpdatePlaceholder: "Que s’est-il passé ?",
+ campaignAddUpdate: "Publier la mise à jour",
+ campaignQrAlt: "QR pour signer cette campagne",
+ campaignQrCaption: "Scannez pour signer",
+ typeCampaign: "CAMPAGNE",
+ typeCampaignSignature: "SIGNATURE",
+ typeCampaignUpdate: "MISE À JOUR DE CAMPAGNE",
+ statsCampaign: "Campagnes",
+ statsCampaignSignature: "Signatures de campagnes",
+ statsCampaignUpdate: "Mises à jour de campagnes",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Une campagne que vous suivez a une mise à jour.",
+ campaignBotAchievedTitle: "Une campagne que vous suivez a atteint son objectif.",
+ campaignBotRaisedTitle: "Une campagne que vous avez signée a été portée au Parlement.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Un trajet que vous avez réservé a changé.",
+ logisticsBotClosedTitle: "Un trajet que vous avez réservé a été fermé.",
+ logisticsBotBookedTitle: "Quelqu'un a réservé votre trajet.",
+ logisticsBotCancelledTitle: "Une réservation sur votre trajet a été annulée.",
+ logisticsBotConfirmedTitle: "Votre réservation est confirmée : le colis est en route.",
+ logisticsBotRejectedTitle: "Votre réservation a été refusée.",
+ logisticsBotDeliveredTitle: "Votre colis est arrivé.",
+ campaignLabel: "CAMPAGNE",
+ campaignGenerateReport: "Générer le rapport",
+ logisticsGenerateReport: "Générer le rapport",
+ mailingGenerateReport: "Générer le rapport",
+ campaignUpdateEdited: "Modifiée",
+ mailingMessagesLabel: "Messages",
+ logisticsBookingsLabel: "Réservations",
+ backupTitle: "Sauvegarde",
+ modulesBackupLabel: "Sauvegarde",
+ modulesBackupDescription: "Module pour exporter et importer vos clés et faire des sauvegardes chiffrées.",
+ backupDescription: "Module pour exporter et importer vos clés et faire des sauvegardes chiffrées.",
+ backupTypeRecovery: "RÉCUPÉRATION",
+ backupTypeKeys: "EXPORTER LES CLÉS",
+ backupTypeFull: "SAUVEGARDE COMPLÈTE",
+ backupTypeRestore: "RESTAURER LA SAUVEGARDE",
+ backupTypeInstant: "INSTANTANÉE",
+ backupInstantDescription: "Un .zip brut de tout votre registre et de vos fichiers, sans votre clé secrète et sans mot de passe. Rapide, mais ",
+ backupInstantRisk: "quiconque a le fichier lit tout.",
+ backupKitPageDescription: "Le kit de récupération ne peut être ouvert que depuis cet appareil.",
+ backupKitId: "ID Oasis",
+ backupKitDate: "Généré",
+ backupKitQrAlt: "Code QR de votre clé secrète",
+ backupKitStep1: "Imprimez-le ou recopiez-le et rangez-le en lieu sûr, hors ligne.",
+ backupKitStep2: "Pour récupérer, installez Oasis sur un nouvel appareil et importez ce secret depuis Sauvegarde › Clés.",
+ backupKitStep3: "Détruisez cette page si elle est un jour exposée.",
+ backupKitPdfButton: "Générer le PDF",
+ backupScopeLabel: "Portée",
+ backupScopeAll: "TOUT",
+ backupScopeMine: "SEULEMENT MON CONTENU",
+ backupSinceLabel: "Depuis",
+ backupEstimateTitle: "Estimation",
+ backupFileInfo: "Votre copie chiffrée sera téléchargée sur votre appareil (nom : oasis-backup-DATE.oasisbk)",
+ backupExportButton: "Télécharger la sauvegarde",
+ backupRestorePassword: "Saisissez le mot de passe utilisé lors de la sauvegarde",
+ backupRestoreButton: "Restaurer la sauvegarde",
+ backupRestoredLine: "Sauvegarde restaurée.",
+ backupRestoredMessages: "Messages ajoutés",
+ backupRestoredSkipped: "Déjà présents",
+ backupRestoredBlobs: "Fichiers ajoutés",
+ backupRestoredState: "Réglages restaurés",
+ backupRestoredFailed: "Échecs",
+ backupRestoredForked: "Divergents",
+ backupRestoreRunning: "Restauration de la copie en cours. Cette page se rafraîchit automatiquement ; vous pouvez continuer à utiliser Oasis.",
+ backupRestoreElapsed: "Écoulé",
+ backupRestoreFailedLine: "La copie n’a pas pu être restaurée.",
+ backupRestoreForkMine: "Cet appareil a déjà publié des messages avec votre identité qui ne figurent pas dans la copie, elle n’a donc pas pu être appliquée par-dessus. Restaurez sur une installation propre juste après avoir importé vos clés, avant toute autre action.",
+ verificationTitle: "Vérification",
+ verificationDescription: "Vérifiez la chaîne de votre fil, détectez les bifurcations et passez en revue les fichiers orphelins ou manquants.",
+ verificationRun: "Lancer la vérification",
+ verificationTotalMessages: "messages dans le journal",
+ verificationFeed: "Votre fil",
+ verificationMessages: "messages",
+ verificationLastSequence: "dernière séquence",
+ verificationGaps: "Trous",
+ verificationBrokenLinks: "Liens rompus",
+ verificationBadHashes: "Hashs incorrects",
+ verificationBadSignatures: "Signatures incorrectes",
+ verificationDuplicates: "Séquences dupliquées",
+ verificationForks: "Bifurcations",
+ verificationBlobs: "Fichiers",
+ verificationBlobsPresent: "présents",
+ verificationBlobsReferenced: "référencés",
+ verificationBlobsOrphan: "orphelins",
+ verificationBlobsMissing: "manquants",
+ verificationBlobsMissingOwn: "Vos propres fichiers absents de cet appareil",
+ verificationBlobsMissingOthers: "Fichiers d'autres habitants pas encore téléchargés",
+ verificationBlobsUnavailable: "Impossible de lister les fichiers sur cet appareil.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Module pour découvrir et gérer des wikis.",
+ wikiDescription: "Module pour découvrir et gérer des wikis.",
+ wikiCreate: "Créer un wiki",
+ wikiUpdate: "Mettre à jour",
+ wikiDelete: "Supprimer",
+ wikiEdit: "Modifier",
+ wikiTitleLabel: "Titre",
+ wikiTitlePlaceholder: "Titre du wiki...",
+ wikiBodyLabel: "Contenu",
+ wikiBodyPlaceholder: "Reliez d’autres wikis avec [[Titre du wiki]] ou [[Titre du wiki|un libellé personnalisé]].\n\nMentionnez un habitant avec @id.\n\nÉtiquetez avec #oasis.\n\nCollez des liens comme https://solarnethub.com\n\nUne ligne vide ouvre un nouveau paragraphe ; les sauts de ligne simples sont conservés.\n\nJoignez n’importe quel média pris en charge : il sera intégré ici.",
+ formatBarLabel: "Format",
+ wikiStatusLabel: "Type de wiki",
+ wikiStatusOpen: "OUVERT",
+ wikiStatusClosed: "FERMÉ",
+ wikiTagsLabel: "Étiquettes",
+ wikiTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ wikiSummaryLabel: "Résumé de la modification",
+ wikiSummaryPlaceholder: "Qu’est-ce qui a changé ?",
+ wikiFilterAll: "TOUTES",
+ wikiFilterMine: "MIENNES",
+ wikiFilterRecent: "RÉCENTES",
+ wikiFilterLinked: "LIÉES",
+ wikiChanges: "Modifications récentes",
+ wikiNoPages: "Aucun wiki trouvé.",
+ wikiNoChanges: "Aucune modification pour l’instant.",
+ wikiHistory: "Historique",
+ wikiVersion: "Version",
+ wikiVersions: "versions",
+ wikiRestore: "Restaurer",
+ wikiDiff: "Modifications",
+ wikiViewVersion: "Voir",
+ wikiLinkedPages: "Pages liées",
+ wikiNoLinkedPages: "Cette page n'est encore liée à aucune autre.",
+ wikiMissingLink: "La page n’existe pas encore",
+ wikiDuplicateTitle: "Une page portant ce titre existe déjà. Changez le titre pour créer une autre page.",
+ wikiCreateSectionTitle: "Créer un wiki",
+ wikiUpdateSectionTitle: "Mettre à jour le wiki",
+ wikiSearchPlaceholder: "Rechercher dans le Wiki...",
+ wikiCurrentVersion: "Version actuelle",
+ wikiViewingVersion: "Vous consultez une ancienne version",
+ wikiBackToPage: "Retour à la page",
+ wikiLinkedChip: "Liée",
+ wikiRestoredSummary: "Version restaurée",
+ wikiExportPdf: "Générer la page",
+ wikiPreview: "Aperçu",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Créer un wiki",
+ tribeWikiEmpty: "Pas encore de wikis.",
+ typeWiki: "WIKI",
padsTitle: "Pads",
padTitle: "Pad",
modulesPadsLabel: "Pads",
- modulesPadsDescription: "Module pour gérer les éditeurs de texte collaboratifs.",
+ modulesPadsDescription: "Module pour gérer des éditeurs de texte collaboratifs.",
padCreate: "Créer Pad",
padUpdate: "Modifier",
padDelete: "Supprimer",
padTitleLabel: "Titre",
padTitlePlaceholder: "Entrez le titre du pad...",
padStatusLabel: "Statut",
+ padTypeLabel: "Type de pad",
padStatusOpen: "OUVERT",
padStatusInviteOnly: "SUR INVITATION",
padStatusClosed: "FERMÉ",
padDeadlineLabel: "Date limite",
padTagsLabel: "Tags",
- padTagsPlaceholder: "tag1, tag2, ...",
+ padTagsPlaceholder: "Saisissez des tags séparés par des virgules",
padMembersLabel: "Membres",
padCreated: "Créé",
- padStartEditing: "COMMENCER À ÉDITER !",
+ padStartEditing: "Modifier",
padEditorPlaceholder: "Commencez à écrire...",
padSubmitEntry: "Envoyer",
padNoEntries: "Aucune entrée pour l'instant.",
padAllSectionTitle: "Tous les Pads",
padMineSectionTitle: "Mes Pads",
padsDescription: "Gérez des éditeurs de texte chiffrés collaboratifs dans votre réseau.",
+ roomsTitle: "Salons",
+ roomsDescription: "Découvrez et rejoignez des salons de visioconférence chiffrés dans votre réseau.",
+ modulesRoomsLabel: "Salons",
+ modulesRoomsDescription: "Module pour découvrir et rejoindre des salons de visioconférence chiffrés.",
+ roomFilterRecent: "RÉCENTS",
+ roomFilterMine: "LES MIENS",
+ roomFilterAll: "TOUS",
+ roomFilterLive: "EN DIRECT",
+ roomFilterOpen: "OUVERTS",
+ roomFilterInvite: "SUR INVITATION",
+ roomFilterClosed: "FERMÉS",
+ roomCreate: "Créer un salon",
+ roomUpdate: "Modifier",
+ roomDelete: "Supprimer",
+ roomClose: "Fermer",
+ roomCreateSectionTitle: "Créer un salon",
+ roomUpdateSectionTitle: "Modifier le salon",
+ roomTitlePlaceholder: "Titre du salon",
+ roomDescriptionLabel: "Description",
+ roomDescriptionPlaceholder: "De quoi allez-vous parler ?",
+ roomTypeLabel: "Type de salon",
+ roomTagsLabel: "Tags",
+ roomStatusOpen: "OUVERT",
+ roomStatusInviteOnly: "SUR INVITATION",
+ roomStatusClosed: "FERMÉ",
+ roomParticipants: "Participants",
+ roomJoin: "Rejoindre",
+ roomLeave: "Quitter",
+ roomFull: "Salon complet",
+ roomLiveChip: "EN DIRECT",
+ roomMuted: "micro coupé",
+ roomRec: "Enregistrer l'audio",
+ roomRecStop: "Arrêter l'enregistrement",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} est entré dans la salle",
+ roomEventLeft: "{name} a quitté la salle",
+ roomEventRecStart: "{name} a commencé à enregistrer",
+ roomEventRecStop: "{name} a arrêté d'enregistrer",
+ roomEventMuted: "{name} a coupé son micro",
+ roomEventUnmuted: "{name} a réactivé son micro",
+ roomEventHand: "{name} a levé la main",
+ roomRaiseHand: "Lever la main",
+ roomLowerHand: "Baisser la main",
+ confirmActionTitle: "Confirmer cette action",
+ confirmActionButton: "Confirmer",
+ confirmJoinText: "Vous allez rejoindre avec cette invitation.",
+ confirmFollowText: "Vous allez soutenir cet habitant.",
+ confirmSignText: "Vous allez signer cette campagne.",
+ confirmDownloadText: "Vous allez télécharger ce fichier sur votre appareil.",
+ roomRecordings: "Enregistrements",
+ roomClearNotices: "Effacer",
+ roomLineSwitchboard: "Standard",
+ roomLineDndError: "Le numéro de ce salon n'accepte pas d'appels.",
+ roomNumberHint: "Composez ce numéro depuis Téléphone pour rejoindre le salon.",
+ liveRefresh: "Rafraîchir",
+ roomNobody: "Personne n'est dans le salon pour le moment.",
+ roomSomeone: "{n} dans le salon en ce moment.",
+ roomYou: "vous",
+ roomYouAreIn: "Vous y êtes",
+ roomNobodyInside: "Il n'y a personne dans cette salle pour le moment.",
+ roomErrorFull: "Le salon est complet. Vous pourrez entrer quand quelqu'un partira.",
+ roomErrorUnreachable: "Le salon est injoignable pour le moment. Réessayez plus tard.",
+ roomErrorBusy: "Vous êtes déjà dans un appel ou dans un autre salon.",
+ roomErrorClosed: "Ce salon est fermé.",
+ roomAccessDenied: "Ce salon est sur invitation. Il vous faut une invitation pour entrer.",
+ roomsNoItems: "Aucun salon trouvé.",
+ roomSearchPlaceholder: "Rechercher des salons...",
+ roomInviteMode: "Invitation",
+ tribeSectionRooms: "SALONS",
+ tribeRoomCreate: "Créer un salon",
+ tribeRoomsEmpty: "Aucun salon pour l'instant.",
+ typeRoom: "SALONS",
+ typeRoomMember: "PARTICIPANT DE SALON",
+ statsRoom: "Salons",
+ statsRoomMember: "Participants aux salons",
+ favoritesFilterRooms: "SALONS",
+ invitesRoomsTitle: "Salons",
+ inviteCodeInvalid: "Ce code d'invitation n'est pas valide ou a déjà été utilisé.",
+ inviteAlreadyMember: "Vous en faites déjà partie. Vous pouvez l'ouvrir depuis son module.",
+ actionFailed: "Cela n'a pas pu être fait. Réessayez.",
+ publishTooShort: "Votre publication est trop courte.",
+ walletSendFailed: "Le paiement n'a pas pu être envoyé : {reason}",
+ pixeliaCoordsError: "Ces coordonnées sont en dehors de la grille.",
+ courtsErrTitle: "Un titre est requis.",
+ courtsErrRespondent: "Indiquez contre qui porte l'affaire.",
+ courtsErrRespondentId: "Ce n'est pas un Oasis ID valide.",
+ courtsErrMethod: "Choisissez comment l'affaire sera résolue.",
+ courtsErrCaseNotFound: "Cette affaire est introuvable.",
+ courtsErrBrief: "Rédigez votre réponse.",
+ courtsErrStance: "Choisissez votre position.",
+ courtsErrResult: "Indiquez le résultat.",
+ courtsErrTerms: "Rédigez les termes de l'accord.",
+ courtsErrMediator: "Ajoutez au moins un médiateur.",
+ courtsErrSelfMediator: "Vous ne pouvez pas être médiateur dans votre propre affaire.",
+ courtsErrJudge: "Choisissez un juge.",
+ courtsErrSelfJudge: "Vous ne pouvez pas juger votre propre affaire.",
+ courtsErrVisibility: "Choisissez qui peut voir l'affaire.",
+ courtsErrNomination: "Cette nomination est introuvable.",
+ opinionAlreadyGiven: "Vous avez déjà donné votre avis.",
+ cipherPasswordShort: "Le mot de passe doit contenir au moins 32 caractères.",
+ errorForbidden: "Vous n'avez pas accès à ceci.",
+ errorNotFound: "Introuvable.",
+ errorClosed: "C'est fermé.",
+ errorInviteOnly: "C'est sur invitation. Il vous faut une invitation.",
+ errorTooLong: "Ce texte est trop long.",
+ errorRequired: "Des informations obligatoires manquent.",
+ errorInvalid: "Certaines informations ne sont pas valides.",
+ errorNotAuthor: "Seul l'auteur peut faire cela.",
+ panicRemoved: "Votre blockchain a été supprimée.",
padRecentSectionTitle: "Pads Récents",
padOpenSectionTitle: "Pads Ouverts",
padClosedSectionTitle: "Pads Fermés",
@@ -3064,18 +3932,18 @@ module.exports = {
padRemoveFavorite: "Retirer des Favoris",
padClose: "Fermer",
padBackToEditor: "Retour à l'éditeur",
- padSearchPlaceholder: "Rechercher des pads...",
+ padSearchPlaceholder: "Rechercher dans Pads...",
modulesChatsLabel: "Chats",
- modulesChatsDescription: "Module pour découvrir et gérer les chats chiffrés.",
+ modulesChatsDescription: "Module pour découvrir et gérer des chats.",
typeChat: "CHATS",
typeChatMessage: "MESSAGE CHAT",
chatsTitle: "Chats",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "Vos chats",
+ chatRecentTitle: "Chats récents",
chatFavoritesTitle: "Favoris",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "Chats ouverts",
+ chatClosedTitle: "Chats fermés",
chatDescription: "Description",
chatCategory: "Catégorie",
chatStatus: "STATUT",
@@ -3090,34 +3958,172 @@ module.exports = {
chatMessagesLabel: "Messages",
chatThreadsLabel: "Fils",
chatCreatedAt: "CRÉÉ",
- chatSearchPlaceholder: "Rechercher chats...",
+ chatSearchPlaceholder: "Rechercher dans Chats...",
chatStatusOpen: "OUVERT",
chatStatusInviteOnly: "SUR INVITATION",
chatStatusClosed: "FERMÉ",
chatSendMessage: "Envoyer",
chatJumpLatest: "Dernier message",
+ chatReply: "Répondre",
+ chatReplyCancel: "Annuler la réponse",
+ chatPin: "Épingler",
+ chatUnpin: "Désépingler",
+ chatPinned: "Épinglés",
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",
+ activitySearchPlaceholder: "Rechercher dans Activité...'activité...",
+ trendingSearchPlaceholder: "Rechercher dans Tendances...",
+ opinionsSearchPlaceholder: "Rechercher dans Opinions...",
+ votesSearchPlaceholder: "Rechercher dans Votations...",
+ gamesSearchPlaceholder: "Rechercher dans Jeux...",
+ schoolTitle: "École",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Une page wiki que vous suivez a été modifiée.",
+ wikiBotRestoredTitle: "Une version antérieure d’une page wiki que vous suivez a été restaurée.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Un nouvel étudiant s'est inscrit à votre cours.",
+ schoolBotInvitedTitle: "Vous avez été invité à un cours.",
+ schoolBotAdmittedTitle: "Vous avez été admis à un cours.",
+ schoolBotCertificateTitle: "Vous avez reçu un certificat.",
+ schoolBotPassedTitle: "Un étudiant a réussi votre cours.",
+ schoolBotLessonTitle: "Une nouvelle leçon a été publiée.",
+ invitesSchoolTitle: "École",
+ schoolEnrollLabel: "Rejoindre le cours",
+ schoolExamRetryLater: "Vous pourrez réessayer après 24 heures.",
+ schoolApproved: "RÉUSSI",
+ schoolExamPassMark: "Note de passage (0-10)",
+ schoolExamPassed: "RÉUSSI",
+ schoolExamPending: "En attente",
+ schoolExamFailed: "ÉCHOUÉ",
+ schoolExamAddQuestion: "Ajouter une question",
+ schoolExamCreateQuestion: "Créer une question",
+ schoolExamOption: "Option",
+ schoolExamCorrect: "Option correcte",
+ schoolExamPoints: "Points",
+ schoolMaterialTextPlaceholder: "Notes pour cette leçon...",
+ schoolMaterials: "Matériels",
+ schoolAddMaterial: "Ajouter du matériel",
+ schoolNoMaterials: "Pas encore de matériel.",
+ bankYourSchoolBalance: "Vos revenus de l'école",
+ schoolProgress: "Progression",
+ schoolProgressMark: "Marquer comme terminée",
+ schoolProgressDone: "Terminée",
+ schoolExams: "Examens",
+ schoolExamCreate: "Créer un examen",
+ schoolExamTitlePlaceholder: "Titre de l'examen",
+ schoolExamHelp: "Une question par ligne : Question ? ; option ; option correcte* ; option",
+ schoolExamQuestionsPlaceholder: "Qu'est-ce que SSB ? ; Une base de données ; Un protocole P2P* ; Un navigateur",
+ schoolExamSubmit: "Envoyer les réponses",
+ schoolExamScore: "Votre note",
+ schoolNoScoresYet: "Pas encore de résultats.",
+ schoolLessonUnit: "Unité / phase",
+ schoolLessonUnitPlaceholder: "p. ex. Phase 1",
+ schoolLessonOrder: "Ordre",
+ profileClearnetSchoolLabel: "École",
+ schoolStartDate: "Date de début",
+ schoolSessionDate: "Date de la session",
+ schoolCourseChat: "Chat du cours",
+ agendaFilterSchool: "ÉCOLE",
+ agendaFilterCampaigns: "CAMPAGNES",
+ agendaFilterLogistics: "LOGISTIQUE",
+ schoolCourseType: "Type de cours",
+ schoolTypeOpen: "OUVERT",
+ schoolTypePaid: "PAYANT",
+ schoolTypeInvite: "SUR INVITATION",
+ schoolLessonLocked: "Leçon chiffrée — demandez la clé du cours à l'enseignant.",
+ schoolGrantAccess: "Envoyer la clé du cours",
+ schoolKeySent: "Clé envoyée",
+ schoolOngoing: "En cours",
+ schoolFilterApplied: "INSCRIT",
+ schoolFilterOpen: "OUVERTS",
+ schoolFilterFavorites: "FAVORIS",
+ schoolPendingPayment: "Paiement en attente",
+ schoolPendingStudents: "Inscriptions en attente",
+ schoolViewBill: "Voir la facture",
+ schoolPaymentNote: "L'inscription génère une facture en ECO (un transfert). Votre inscription est confirmée une fois le transfert signé.",
+ schoolCloseCourse: "Fermer le cours",
+ schoolReopenCourse: "Rouvrir le cours",
+ schoolDescription: "Enseignez et apprenez des cours dans votre réseau.",
+ schoolFilterAll: "TOUS",
+ schoolFilterMine: "LES MIENS",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RÉCENTS",
+ schoolCreateButton: "Créer un Cours",
+ schoolCreateSectionTitle: "Créer un cours",
+ schoolUpdateSectionTitle: "Mettre à jour le cours",
+ schoolCourseTitlePlaceholder: "Nom de votre cours",
+ schoolCourseDescriptionPlaceholder: "Qu'allez-vous enseigner dans ce cours ?",
+ schoolCourseImage: "Image du cours (taille max : 75MB)",
+ schoolTags: "Étiquettes",
+ schoolTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ schoolPrice: "Prix (ECO)",
+ schoolVisibility: "Visibilité",
+ schoolVisibilityPublic: "Public",
+ schoolVisibilityInvite: "Sur invitation",
+ schoolStatus: "Statut",
+ schoolClosed: "Fermé",
+ schoolFree: "Gratuit",
+ schoolCreate: "Créer le cours",
+ schoolUpdate: "Mettre à jour le cours",
+ schoolSearchPlaceholder: "Rechercher dans École...",
+ schoolSortTitle: "Titre",
+ schoolNoCourses: "Aucun cours trouvé.",
+ schoolStudents: "Étudiants",
+ schoolTeacher: "Enseignant",
+ schoolCreatedAt: "CRÉÉ",
+ schoolLessons: "Leçons",
+ schoolNoLessons: "Pas encore de leçons.",
+ schoolEnrollToSee: "Inscrivez-vous pour voir les leçons de ce cours.",
+ schoolEnrollButton: "S'INSCRIRE",
+ schoolUnenrollButton: "Quitter le cours",
+ schoolInviteRequired: "Ce cours est sur invitation.",
+ schoolTeacherPanel: "Panneau de l'enseignant",
+ schoolStudentPanel: "Panneau de l'étudiant",
+ schoolAddLesson: "Créer une leçon",
+ schoolLessonTitlePlaceholder: "Titre de la leçon",
+ schoolLessonTextPlaceholder: "Décrivez les notions abordées dans cette leçon...",
+ schoolInviteStudents: "Inviter des étudiants",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "INVITER",
+ schoolInvited: "Invités",
+ schoolIssueCertificate: "Créer un certificat",
+ schoolCertified: "Certifié",
+ schoolCertificateTextPlaceholder: "Note du certificat (optionnel)",
+ schoolLessonOpen: "Ouvrir la leçon",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificats",
+ schoolNoCertificates: "Aucun certificat émis pour le moment.",
+ schoolEditButton: "Modifier",
+ schoolDeleteButton: "Supprimer",
+ typeSchool: "ÉCOLE",
+ schoolCourseLabel: "COURS",
+ emergencyLabel: "URGENCE",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Cours",
+ statsSchoolLesson: "Leçons",
+ statsSchoolEnroll: "Inscriptions",
+ statsSchoolCertificate: "Certificats de l'école",
+ modulesSchoolLabel: "École",
+ modulesSchoolDescription: "Module pour échanger des connaissances.",
+ welcomeStepUxAction: "Enregistrer la vue",
+ welcomeStepWorkflowTitle: "Quel usage d'OASIS avez-vous en tête ?",
+ welcomeStepWorkflowText: "Oasis a beaucoup de modules. Choisissez la configuration qui vous correspond et seuls les modules utiles resteront activés. Vous pourrez l'ajuster à tout moment dans Modules.",
+ welcomeStepWorkflowAction: "Enregistrer la configuration",
+ welcomeWorkflow_full: "Par défaut",
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.",
chatTitlePlaceholder: "Titre du chat",
chatDescriptionPlaceholder: "Description du chat",
- chatTagsPlaceholder: "tag1, tag2, tag3",
+ chatTagsPlaceholder: "Saisissez des tags séparés par des virgules",
chatImageLabel: "Sélectionnez un fichier image (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Auteur",
chatAddFavorite: "Ajouter aux Favoris",
chatRemoveFavorite: "Retirer des Favoris",
chatPM: "MP",
chatStatusLabel: "Statut",
+ chatTypeLabel: "Type de chat",
chatCategoryLabel: "Catégorie",
gamesTitle: "Jeux",
gamesDescription: "Découvrez et jouez à des jeux.",
@@ -3148,22 +4154,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Lancez une pièce et pariez sur pile ou face. Quelle est votre chance?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "Billard vu de dessus. Cliquez pour viser, maintenez pour charger la puissance. Empochez toutes les boules en un minimum de coups.",
+ gamesArtilleryTitle: "Artillerie",
+ gamesArtilleryDesc: "Visez avec votre canon, tenez compte du vent et touchez la cible. 5 manches, le moins de tirs l'emporte.",
+ gamesLabyrinthTitle: "Labyrinthe",
+ gamesLabyrinthDesc: "Échappez au labyrinthe avant d'épuiser vos mouvements. Chaque niveau est plus grand et plus difficile.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Mangez tous les points, évitez les fantômes. Les fantômes se déplacent en temps réel — ne vous arrêtez pas !",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
+ gamesAudioPendulumTitle: "Pendule sonore",
+ gamesAudioPendulumDesc: "Simulateur de physique chaotique avec synthèse audio en temps réel. Les vitesses angulaires deviennent des fréquences, les pics des coups de percussion. Aucune simulation ne sonne pareil.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Mixez des visuels en direct sur deux platines : choisissez un motif pour chacune, réglez vitesse, couleur et zoom, enchaînez de l'une à l'autre et lancez des flashs en rythme. Tapez le tempo ou laissez le micro mener la pulsation.",
+ gamesTetrisDesc: "Les blocs qui tombent, un classique. Complétez des lignes pour marquer des points. Combien de temps tiendrez-vous ?",
+ gamesMinesweeperTitle: "Démineur",
+ gamesMinesweeperDesc: "La chasse aux mines classique. Déminez le plateau pour monter de niveau — grilles plus grandes, plus de mines, score plus élevé.",
+ gamesFilterScoring: "SCORES",
+ gamesHallOfFame: "Panthéon",
+ gamesHallPlayer: "Joueur",
gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesNoScores: "Aucun score pour l'instant.",
calendarsTitle: "Calendriers",
calendarTitle: "Calendrier",
modulesCalendarsLabel: "Calendriers",
@@ -3171,15 +4181,15 @@ module.exports = {
typeCalendar: "CALENDRIERS",
calendarCreate: "Créer un calendrier",
calendarUpdate: "Mettre à jour",
- calendarDelete: "Supprimer",
calendarTitleLabel: "Titre",
calendarTitlePlaceholder: "Titre du calendrier...",
calendarStatusLabel: "Statut",
+ calendarTypeLabel: "Type de calendrier",
calendarStatusOpen: "OUVERT",
calendarStatusClosed: "FERMÉ",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Échéance",
calendarTagsLabel: "Étiquettes",
- calendarTagsPlaceholder: "tag1, tag2...",
+ calendarTagsPlaceholder: "Saisissez des tags séparés par des virgules",
calendarParticipantsLabel: "Participants",
calendarCreated: "Créé",
calendarJoin: "Rejoindre",
@@ -3190,11 +4200,11 @@ module.exports = {
calendarNotePlaceholder: "Ajouter une note...",
calendarFirstDateLabel: "Date",
calendarFirstNoteLabel: "Notes",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Intervalle",
calendarIntervalNone: "Sans répétition",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Hebdomadaire",
+ calendarIntervalMonthly: "Mensuel",
+ calendarIntervalYearly: "Annuel",
calendarFormDescription: "Description",
calendarNoDates: "Aucune date ajoutée.",
calendarNoNotes: "Aucune note.",
@@ -3202,6 +4212,8 @@ module.exports = {
calendarsDescription: "Découvrez et gérez les calendriers de votre réseau.",
calendarMonthPrev: "← Précédent",
calendarMonthNext: "Suivant →",
+ calendarMonthNames: "Janvier,Février,Mars,Avril,Mai,Juin,Juillet,Août,Septembre,Octobre,Novembre,Décembre",
+ calendarDayInitials: "L,M,M,J,V,S,D",
calendarAllSectionTitle: "Calendriers",
calendarRecentSectionTitle: "Calendriers Récents",
calendarFavoritesSectionTitle: "Favoris",
@@ -3211,9 +4223,9 @@ module.exports = {
calendarCreateSectionTitle: "Créer un calendrier",
calendarUpdateSectionTitle: "Mettre à jour le calendrier",
calendarAddFavorite: "Ajouter aux favoris",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Supprimer",
calendarRemoveFavorite: "Retirer des favoris",
- calendarSearchPlaceholder: "Rechercher des calendriers...",
+ calendarSearchPlaceholder: "Rechercher dans Calendrier...",
calendarAddEntry: "Ajouter une entrée",
statsCalendar: "Calendriers",
statsCalendarDate: "Dates de calendrier",
@@ -3225,6 +4237,146 @@ module.exports = {
tribeContentAccessDenied: "Accès Refusé",
tribeContentAccessDeniedMsg: "Ce contenu appartient à une tribu. Vous devez en être membre pour y accéder.",
tribeViewTribes: "Voir les Tribus",
+ tribeFilesEmpty: "Pas encore de fichiers.",
+ filesLabel: "Fichiers",
+ profileClearnetFilesLabel: "Fichiers",
+ filesTitle: "Fichiers",
+ filesDescription: "Explorez et gérez les fichiers de votre réseau.",
+ fileAllSectionTitle: "Fichiers",
+ fileMineSectionTitle: "Vos Fichiers",
+ fileRecentSectionTitle: "Fichiers Récents",
+ fileTopSectionTitle: "Meilleurs Fichiers",
+ fileFavoritesSectionTitle: "Favoris",
+ fileFilterAll: "TOUS",
+ fileFilterMine: "MES",
+ fileFilterRecent: "RÉCENTS",
+ fileFilterTop: "MEILLEURS",
+ fileFilterFavorites: "FAVORIS",
+ fileCreateSectionTitle: "Téléverser un Fichier",
+ fileUpdateSectionTitle: "Mettre à jour le Fichier",
+ fileCreateButton: "Téléverser un Fichier",
+ fileUpdateButton: "Mettre à jour",
+ fileAddFavoriteButton: "Ajouter aux Favoris",
+ fileRemoveFavoriteButton: "Retirer des Favoris",
+ fileFileLabel: "Sélectionnez un fichier (max: 50 Mo)",
+ calendarFilterRecent: "RÉCENTS",
+ calendarFilterAll: "TOUS",
+ calendarFilterMine: "À MOI",
+ calendarFilterFavorites: "FAVORIS",
+ calendarFilterOpen: "OUVERTS",
+ calendarFilterClosed: "FERMÉS",
+ padFilterRecent: "RÉCENTS",
+ padFilterAll: "TOUS",
+ padFilterMine: "À MOI",
+ padFilterOpen: "OUVERTS",
+ padFilterClosed: "FERMÉS",
+ chatFilterRecent: "RÉCENTS",
+ chatFilterAll: "TOUS",
+ chatFilterMine: "À MOI",
+ chatFilterFavorites: "FAVORIS",
+ chatFilterOpen: "OUVERTS",
+ chatFilterClosed: "FERMÉS",
+ licenseLabel: "Licence",
+ phoneTitle: "Téléphone",
+ phoneDescription: "Gérez vos appels vidéo chiffrés de bout en bout.",
+ phoneUnavailable: "Les appels ne sont pas disponibles sur cet appareil.",
+ phoneCallButton: "Appeler",
+ profileVisibilityPhone: "Numéro de téléphone",
+ phoneNumberUnknown: "Personne dans votre réseau n'a le numéro {number}.",
+ phoneNumberChoose: "Vérifiez qui vous voulez appeler au {number} :",
+ phoneAnswer: "Répondre",
+ phoneSpeaker: "Haut-parleur",
+ phoneEarpiece: "Écouteur",
+ phoneReject: "Refuser",
+ phoneHangup: "Raccrocher",
+ phoneMute: "Couper le micro",
+ phoneUnmute: "Réactiver le micro",
+ phoneCameraOn: "Caméra on",
+ phoneCameraOff: "Caméra off",
+ settingsPhoneVideo: "Vidéo",
+ settingsPhoneVideoOn: "Autorisée dans les appels et les salles",
+ settingsPhoneVideoOff: "Audio seulement",
+ phoneSilence: "Ne plus entendre",
+ phoneUnsilence: "Entendre à nouveau",
+ phoneCalling: "Appel vers",
+ phoneIsCalling: "vous appelle",
+ notifyNewPmFrom: "Nouveau MP de",
+ notifyNewPamFrom: "Nouveau PaM de",
+ notifyUpdateLabel: "Mise à jour",
+ updateInstalledLabel: "Version installée",
+ updateAvailableLabel: "Version disponible",
+ updateChangesLabel: "Modifications",
+ updateFilesLabel: "Fichiers",
+ updateOriginLabel: "Source",
+ phoneRecording: "Enregistrement du PaM pour",
+ phoneLeaveMessage: "Personne ne répond : laissez votre message après le bip.",
+ phoneLeaveMessageBusy: "Cette personne est déjà en ligne : laissez votre message après le bip.",
+ phoneLeaveMessageUnreachable: "Impossible de joindre cette personne : laissez votre message après le bip.",
+ phoneConnecting: "Connexion avec",
+ phoneSendPam: "Envoyer le PaM",
+ phoneCancel: "Annuler",
+ phoneSearchPlaceholder: "Rechercher dans Téléphone...",
+ phonePamTitle: "Enregistrements audio",
+ phoneNew: "Nouveau",
+ phoneDelete: "Supprimer",
+ phoneNoPams: "Vous n'avez aucun enregistrement audio.",
+ phoneHistoryTitle: "Historique",
+ phoneLatestTitle: "Derniers appels",
+ phoneCreateButton: "Nouvel appel",
+ phoneLimitsHint: "Jusqu'à 7 habitants par appel ; à plus d'un, c'est un appel conjoint.",
+ phoneErrorPub: "Impossible d'appeler un pub.",
+ phoneJointCall: "Appel conjoint",
+ phoneWith: "Avec",
+ phoneResult: "Résultat",
+ phoneWhen: "Quand",
+ phoneDuration: "Durée",
+ phoneOutgoing: "Sortant",
+ phoneIncoming: "Entrant",
+ phoneNoHistory: "Aucun journal pour l'instant.",
+ phoneOutcomeEnded: "Répondu",
+ phoneOutcomeMissed: "Manqué",
+ phoneOutcomeRejected: "Refusé",
+ phoneOutcomeNoanswer: "Pas de réponse",
+ phoneOutcomeCancelled: "Annulé",
+ phoneOutcomePam: "PaM envoyé",
+ phoneOutcomeFailed: "Échoué",
+ phoneDialAdd: "Ajouter",
+ phoneDialBack: "Effacer",
+ phoneDialClear: "Vider",
+ phoneDialPlaceholder: "Numéro ou Oasis ID",
+ phoneDialInhabitants: "Habitants",
+ phoneDialRemove: "Retirer",
+ phoneOwnNumber: "C'est votre propre numéro.",
+ phoneSettingsDesc: "Choisissez qui peut vous appeler.",
+ phoneDnd: "Ne pas déranger",
+ phoneOpen: "Ouvert",
+ phoneRecipientRefuses: "L'habitant que vous essayez d'appeler n'accepte pas les appels.",
+ phoneRefusedNotice: "Ces habitants n'acceptent pas les appels et n'ont pas été appelés :",
+ fileEmptyError: "Le fichier est vide. Choisissez un autre fichier.",
+ fileTitleLabel: "Titre",
+ fileTitlePlaceholder: "Titre",
+ fileDescriptionLabel: "Description",
+ fileDescriptionPlaceholder: "Description",
+ fileTagsLabel: "Étiquettes",
+ fileTagsPlaceholder: "Saisissez des tags séparés par des virgules",
+ fileSizeLabel: "Taille",
+ fileDownloadButton: "TÉLÉCHARGER",
+ fileDetailsButton: "DÉTAILS",
+ fileNoFile: "Aucun fichier fichier",
+ fileSearchPlaceholder: "Rechercher dans Fichiers...",
+ fileSearchButton: "Rechercher",
+ fileSortRecent: "Plus récents",
+ fileSortOldest: "Plus anciens",
+ fileSortTop: "Plus votés",
+ fileNoMatch: "Aucun fichier correspondant.",
+ fileUpdatedAt: "Mis à jour",
+ typeFile: "FICHIERS",
+ modulesFilesLabel: "Fichiers",
+ modulesFilesDescription: "Module pour découvrir et gérer les fichiers.",
+ tribeSectionFiles: "FICHIERS",
+ fileDescription: "Description",
+ fileDownload: "Télécharger",
+ fileTypeLabel: "Type",
torrentsTitle: "Torrents",
torrentsDescription: "Explorez et gérez les torrents de votre réseau.",
torrentAllSectionTitle: "Torrents",
@@ -3250,12 +4402,35 @@ module.exports = {
torrentDescriptionLabel: "Description",
torrentDescriptionPlaceholder: "Description",
torrentTagsLabel: "Étiquettes",
- torrentTagsPlaceholder: "Entrez des étiquettes séparées par des virgules",
+ torrentTagsPlaceholder: "Saisissez des tags séparés par des virgules",
torrentSizeLabel: "Taille",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Générer un torrent",
+ torrentFromContentMissing: "Le fichier n'est pas encore disponible sur ce nœud. Réessayez plus tard.",
+ torrentDownloads: "Téléchargements",
+ torrentFetchOasis: "Télécharger dans Oasis",
+ torrentSaveFile: "Enregistrer le fichier",
+ torrentSeeds: "sources",
+ seedsLabel: "Sources",
+ seedAction: "Soutenir",
+ torrentSourceFile: "Fichier",
+ torrentStateQueued: "En attente",
+ torrentStateProbing: "Recherche de sources",
+ torrentStateDownloading: "Téléchargement",
+ torrentStateDone: "Terminé",
+ torrentStateFailed: "Échec",
+ torrentStateNoSource: "Aucune source connectée, en attente",
+ torrentStateCancelled: "Annulé",
+ torrentNoDownloads: "Aucun téléchargement pour l'instant.",
+ torrentOriginalSection: "Original",
+ torrentCancel: "Annuler",
+ torrentDownloadButton: "TÉLÉCHARGER",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DÉTAILS",
torrentNoFile: "Aucun fichier torrent",
noTorrents: "Aucun torrent trouvé.",
- torrentSearchPlaceholder: "Rechercher titre, étiquettes, auteur...",
+ noFiles: "Aucun fichier trouvé.",
+ torrentSearchPlaceholder: "Rechercher dans Torrents...",
torrentSearchButton: "Rechercher",
torrentSortRecent: "Plus récents",
torrentSortOldest: "Plus anciens",
@@ -3263,10 +4438,12 @@ module.exports = {
torrentNoMatch: "Aucun torrent correspondant.",
torrentUpdatedAt: "Mis à jour",
statsTorrent: "Torrents",
+ statsFile: "Fichiers",
typeTorrent: "TORRENTS",
modulesTorrentsLabel: "Torrents",
modulesTorrentsDescription: "Module pour découvrir et gérer les torrents.",
favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "FICHIERS",
favoritesFilterMarket: "MARCHÉ",
favoritesFilterEvents: "ÉVÉNEMENTS",
favoritesFilterForum: "FORUM",
@@ -3280,15 +4457,17 @@ module.exports = {
favoritesFilterShopProducts: "ARTICLES BOUTIQUE",
tribeSectionTorrents: "TORRENTS",
tribeCreateTorrent: "Téléverser un Torrent",
+ tribeCreateFile: "Envoyer un fichier",
settingsWishTitle: "Souhait",
- settingsWishDesc: "Configurez le souhait de votre Avatar.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Détermine comment vous accédez à tout le contenu et votre expérience dans le réseau Oasis.",
+ settingsWishWhole: "Multivers",
+ settingsWishMutuals: "Soutien mutuel uniquement",
+ settingsWishOnlyLan: "LAN uniquement",
+ settingsWishLocal: "Local",
settingsPmVisibilityTitle: "Messages Privés",
settingsPmVisibilityDesc: "Configurez votre niveau d'exposition aux messages privés.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Multivers",
+ settingsPmVisibilityMutuals: "Soutien mutuel uniquement",
pmMutualNotice: "L'envoi est un garde-fou UX. La réception est un filtre d'attention.",
inhabitantsPendingFollowsTitle: "Demandes de soutien en attente",
inhabitantsPendingAccept: "Accepter",
@@ -3332,7 +4511,7 @@ module.exports = {
tribeGovNoRevocations: "Aucune révocation pour l’instant",
tribeGovNoHistorical: "Aucun enregistrement pour l’instant",
logsTitle: "Journal",
- logsDescription: "Enregistrez votre expérience sur le réseau.",
+ logsDescription: "Tenez un journal privé de vos expériences.",
logsViewTitle: "Journal",
logsColumnType: "Type",
logsView: "Voir",
@@ -3341,7 +4520,7 @@ module.exports = {
logsCreateTitle: "Créer une entrée",
logsWriteButton: "Écrire",
logsTextPlaceholder: "Décrivez vos expériences...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "Assistant IA",
logsModeManual: "Manuel",
logsModeAI: "IA",
logsColumnLog: "Journal",
@@ -3360,19 +4539,20 @@ module.exports = {
logsExportOne: "Exporter le journal",
logsViewDetails: "Voir les détails",
logsGenerateButton: "Générer le texte",
- logsSearchText: "Chercher dans les journaux...",
+ logsSearchText: "Rechercher dans Journal...",
logsSearchAnyType: "Tout type",
logsSearchButton: "Chercher",
logsEmpty: "Aucune entrée pour l'instant.",
+ logsNothingNew: "Il n'y a aucune nouvelle action à consigner.",
modulesLogsLabel: "Journal",
- modulesLogsDescription: "Module pour enregistrer (via un assistant IA) vos expériences.",
+ modulesLogsDescription: "Module pour tenir un journal privé de vos expériences.",
statsLogsTitle: "Journal",
typeLog: "JOURNAL",
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...",
+ larpSearchPlaceholder: "Rechercher dans L.A.R.P....",
larpAllHouses: "Maisons :",
larpFilterRuling: "RÈGNE",
larpFilterHouses: "MAISONS",
@@ -3388,46 +4568,47 @@ module.exports = {
larpPostSubmit: "Publier",
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.",
+ bankRulesArchTaxNote: "La taxe ARCH reflète le coût à long terme de la croissance et de la maintenance de l'archive du réseau : plus vos données vivent depuis longtemps dans le réseau, plus votre part du coût de maintenance est importante.",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
+ bankRulesChipNote: "La pastille de chaque élément est colorée par rapport au plus grand message jamais observé sur le réseau et atténuée par le nombre d'habitants actifs — un réseau plus grand répartit la charge et fait passer davantage d'éléments dans la bande verte.",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
+ bankRulesEcoTaxNote: "La taxe ECO est déduite de la RBU brute lors du calcul de l'allocation de l'époque. Les ECO déduits ne sont pas redistribués pendant cette époque — ils restent dans le solde du pub et alimentent le fonds de l'époque suivante via les plafonds reserveMin / alpha.",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
+ bankRulesKarmaNote: "Le karma est calculé à partir de vos actions (publications, votes, participation au parlement/aux tribunaux, etc.) avec un facteur de décroissance temporelle, moins les grammes de carbone générés par votre fil.",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, 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.",
- 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.",
+ bankTaxesArchTaxFootprintNote: "La taxe ARCH reflète le coût de la croissance et de la maintenance de l'archive du réseau. Elle est calculée à partir de l'écart de temps entre votre premier bloc publié et le bloc le plus récent du réseau — plus votre historique a vécu longtemps dans l'archive, plus votre part du coût de maintenance est importante.",
+ bankTaxesArchTaxNoteBold: "réduire directement la taxe ARCH",
+ bankTaxesArchTaxNoteIntro: "Votre taxe ARCH est déduite de l'excédent que le réseau génère au-delà de votre RBU ; la valeur de base de la RBU est fixée comme un minimum intangible. La taxe n'est jamais déduite du montant fixe qui revient à chaque habitant en tant que RBU. Les fonds déduits alimentent l'algorithme de redistribution des richesses et sont reversés à d'autres habitants via leurs demandes de RBU. Les habitants les plus récents et ceux qui se consacrent spécifiquement aux tâches d'archivage, de réplication et de maintenance auront probablement une tâche dédiée à maintenir l'archive du réseau en bonne santé en votre nom. Ou ils peuvent se consacrer à ",
+ bankTaxesArchTaxNoteOutro: " grâce à des accords d'élagage, à la déduplication des données redondantes et à une infrastructure de maintenance partagée, et leur contribution continue peut être exigée par le consensus du réseau.",
+ bankTaxesUserNoteChips: "La pastille Taxe ECO affichée à côté de chaque élément change de couleur (vert / jaune / rouge) selon la taille de l'élément par rapport au plus grand bloc jamais vu sur le réseau, atténuée par le nombre d'habitants actifs — un réseau solarpunk plus grand répartit la charge et fait passer davantage d'éléments dans la bande verte.",
+ bankTaxesUserNoteOtherParams: "La taxe ECO est actuellement calculée à partir de l'empreinte carbone de chaque bloc, mais elle pourra intégrer d'autres paramètres avec le temps — énergie dépensée pour la réplication, stockage redondant entre pairs, bande passante des blobs, coût de calcul du déchiffrement, empreinte de minage des transactions associées, ou toute autre charge mesurable que le réseau décide de valoriser.",
gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- parliamentRevocationPublish: "Publish Revocation",
- reportsAcceptanceCriteriaLabel: "Acceptance criteria",
- reportsActualBehaviorPlaceholder: "What actually happens?",
- reportsEvidenceLinksPlaceholder: "Paste links, message IDs, screenshots (if applicable), etc.",
- reportsUserStoryLabel: "Inhabitant story",
- reportsUserStoryPlaceholder: "As a , I want , so that .",
- reportsWhatHappenedLabel: "What happened?",
- reportsWhatHappenedPlaceholder: "Describe the incident with context and approximate dates.",
+ gamesNewRecord: "Nouveau record !",
+ indexingRefreshNote: "Cette page se recharge toutes les 10 secondes.",
+ indexingMessage: "Oasis synchronise le réseau de nœuds distribué. Veuillez patienter.",
+ indexingTitle: "Synchronisation",
+ padsNoItems: "Aucun pad trouvé.",
+ padVersionHistory: "Historique des versions",
+ padAttributionView: "Par autrice",
+ padVersionView: "Voir",
+ parliamentRevocationPublish: "Publier la révocation",
+ reportsAcceptanceCriteriaLabel: "Critères d'acceptation",
+ reportsActualBehaviorPlaceholder: "Que se passe-t-il réellement ?",
+ reportsEvidenceLinksPlaceholder: "Collez des liens, des identifiants de messages, des captures d'écran (le cas échéant), etc.",
+ reportsUserStoryLabel: "Récit d'habitant",
+ reportsUserStoryPlaceholder: "En tant que , je veux , afin de .",
+ reportsWhatHappenedLabel: "Que s'est-il passé ?",
+ reportsWhatHappenedPlaceholder: "Décrivez l'incident avec le contexte et des dates approximatives.",
statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
+ statsChatMessage: "Messages de chat",
+ statsGameScore: "Jeux",
+ statsWiki: "Pages wiki",
statsPad: "Pads",
- statsPadEntry: "Pad entries",
- typeGameScore: "GAME SCORES",
+ statsPadEntry: "Entrées de pad",
+ typeGameScore: "SCORES DE JEU",
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",
@@ -3442,6 +4623,14 @@ module.exports = {
settingsReplicationTitle: "Réplication",
settingsReplicationDesc: "Configure le nombre de sauts que ton pair suit à partir de ton propre flux lors de la réplication du contenu.",
settingsReplicationHopsLabel: "Sauts",
+ settingsBlobCacheTitle: "Cache des médias",
+ settingsBlobCacheDesc: "Le contenu des autres habitants est conservé sur cet appareil. Choisissez l'espace qu'il peut occuper.",
+ settingsBlobCacheUsage: "Utilisation actuelle",
+ settingsBlobCacheFiles: "fichiers",
+ settingsBlobCacheLimit: "Limite",
+ settingsBlobCacheUnlimited: "Illimité",
+ settingsBlobCacheCleanNow: "Nettoyer maintenant",
+ settingsBlobCacheCleaned: "{n} fichiers supprimés, {size} libérés.",
aiApproveTagsLabel: "Étiquettes (séparées par virgules)",
aiApproveTagsPlaceholder: "ex. oasis, gouvernance, écologie",
aiApproveRatingLabel: "Note",
@@ -3469,13 +4658,11 @@ module.exports = {
larpInviteBannerHint: "Partage ce code avec une personne en ACADEMIA. Il expire dans 30 cycles ou après une utilisation.",
larpTestRankingTitle: "Score par maison",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "Code d'invitation de maison",
- invitesHouseJoinButton: "Rejoindre la Maison",
- ecoTaxLabel: "ECO Tax",
+ ecoTaxLabel: "Taxe ECO",
bankTaxes: "Impôts",
- bankOverviewYourTaxes: "Tes impôts",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesArchTaxTitle: "ARCH Tax",
+ bankOverviewYourTaxes: "Total des impôts",
+ bankTaxesEcoTaxTitle: "Taxe ECO",
+ bankTaxesArchTaxTitle: "Taxe ARCH",
bankTaxesUserAmount: "Ton ECO Tax (prix à rendre)",
bankTaxesArchTaxUserAmount: "Ton ARCH Tax (prix à rendre)",
bankTaxesArchTaxFirstBlock: "Âge de ton premier bloc",
@@ -3503,7 +4690,7 @@ module.exports = {
bankTaxesLookupType: "Type",
bankTaxesLookupSize: "Taille",
bankTaxesLookupCarbon: "Empreinte carbone",
- bankTaxesLookupEcoin: "ECO Tax",
+ bankTaxesLookupEcoin: "Taxe ECO",
bankExchangeEcoTaxAnnual: "ECOin Taxes (annuel)",
bankExchangeEcoTaxMonthly: "ECOin Taxes (mensuel)",
bankTaxesTypesLabel: "Sélectionne les impôts que tu veux payer",
@@ -3511,14 +4698,14 @@ module.exports = {
bankRulesPoolTitle: "Pool mensuel",
bankRulesShareTitle: "Part par utilisateur",
bankRulesKarmaTitle: "Karma (score d'engagement)",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesArchTaxTitle: "ARCH Tax",
+ bankRulesEcoTaxTitle: "Taxe ECO",
+ bankRulesArchTaxTitle: "Taxe ARCH",
bankRulesChipTitle: "Bande de couleur du chip ECO Tax",
bankRulesEpochKind: "Granularité d'epoch",
bankRulesAlpha: "Alpha (part max. du solde du pub par epoch)",
bankRulesReserveMin: "Réserve minimale (conservée dans le solde du pub)",
bankRulesCapPerEpoch: "Plafond par epoch (absolu)",
- bankRulesGraceDays: "Délai de claim",
+ bankRulesGraceDays: "Délai de grâce de la réclamation",
bankRulesWMin: "Poids minimum (w_min)",
bankRulesWMax: "Poids maximum (w_max)",
bankRulesFloor: "Plancher par utilisateur (brut)",
@@ -3530,12 +4717,11 @@ module.exports = {
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",
- audioTranscodeDetailTitle: "Transcode",
+ audioTranscodeButton: "TRANSCODER",
+ audioTranscodeDetailTitle: "Transcoder",
audioTranscodeDetailDescription: "Décode la charge utile incrustée et la carte de composition d'origine de la blockchain.",
- audioTranscodeStegoOasisId: "Par",
audioTranscodeStegoTimestamp: "Généré le",
- audioTranscodeStegoMessage: "TEXT",
+ audioTranscodeStegoMessage: "TEXTE",
audioTranscodeStegoEmpty: "(aucun)",
audioTranscodeStegoUnknown: "—",
audioTranscodeStegoNotFound: "Aucune charge stéganographique n'a pu être décodée depuis cet audio.",
@@ -3543,7 +4729,6 @@ module.exports = {
audioBackToBcs: "Retour à BCS",
melodyCompositionTitle: "Carte de composition blockchain",
melodyFilterMine: "MIEN",
- melodyByLabel: "Par",
melodyAllEmpty: "Pas encore de compositions BCS d'autres habitants.",
melodyNoteUnavailable: "le bloc n'est pas dans ton feed local",
melodyUploadBcsTitle: "Publier",
@@ -3569,7 +4754,7 @@ module.exports = {
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).",
+ modulesLarpDescription: "Module pour la couche de jeu de rôle grandeur nature.",
larpProfileQ1: "Face à un problème complexe, que fais-tu en premier ?",
larpProfileQ1O1: "Parler aux autres pour trouver un consensus",
larpProfileQ1O2: "Construire un prototype à tester",
@@ -3643,7 +4828,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Choisis le mode de navigation UX que tu veux pour ton interface.",
uxModeMenus: "Blocs",
- uxModeAINav: "AI",
+ uxModeChats: "Conversations",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Tags Tendance",
+ feedActiveTitle: "Habitants Actifs",
+ cnBrandSub: "Libre · P2P · Fédéré",
+ cnSyncedPeers: "Pairs synchronisés",
+ cnLicense: "Licence",
+ cnNotAccessible: "Le contenu n'est pas accessible pour le moment.",
+ cnUntitled: "Sans titre",
+ cnSearchPlaceholder: "Rechercher…",
+ cnHubTitle: "HUB Clearnet",
+ cnHubDescription: "Contenu public partagé par les habitants de ce réseau Oasis.",
+ cnHubEmpty: "Aucun contenu public n'a encore été partagé sur la Clearnet.",
+ cnPublicContent: "Contenu",
+ cnTribesContent: "Tribus",
+ cnNetworkContent: "Réseau",
+ cnCategoryEmpty: "Aucun contenu dans cette catégorie.",
+ cnInhabitantEmpty: "Cet habitant n'a pas encore publié de contenu sur la Clearnet.",
+ cnPrevPage: "← Précédent",
+ cnNextPage: "Suivant →",
+ cnPageOf: "Page {page} sur {pages}",
+ cnMoreInfo: "Plus d'infos →",
+ cnOpenCourse: "Cours ouvert",
+ cnAuction: "ENCHÈRE",
+ cnExchange: "ÉCHANGE",
+ cnRssDescription: "publiés par les habitants de ce HUB",
+ cnKindAudio: "Audio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Marque-page",
+ cnKindDocument: "Document",
+ cnKindEvent: "Événement",
+ cnKindFeed: "Fil",
+ cnKindImage: "Image",
+ cnKindJob: "Emploi",
+ cnKindMarket: "Marché",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Projet",
+ cnKindCourse: "Cours",
+ cnKindShop: "Boutique",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "Fichier",
+ cnKindVideo: "Vidéo",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Salon",
+ cnKindMap: "Carte",
+ uxModeAINav: "IA",
}
};
diff --git a/src/client/assets/translations/oasis_gl.js b/src/client/assets/translations/oasis_gl.js
new file mode 100644
index 0000000..76d39db
--- /dev/null
+++ b/src/client/assets/translations/oasis_gl.js
@@ -0,0 +1,4880 @@
+const { a, em, strong } = require('../../../server/node_modules/hyperaxe');
+module.exports = {
+ gl: {
+ shopOrderStatusPaid: "Pagamento recibido",
+ shopOrderStatusReceived: "Recibido",
+ shopOrderMarkPaid: "Marcar pagamento recibido",
+ shopOrderConfirmReceived: "Confirmar recibido",
+ shopMyOrdersTitle: "Os meus pedidos",
+ shopPurchasesButton: "Compras",
+ shopMyOrdersDescription: "Os teus pedidos de compra.",
+ shopMyOrdersEmpty: "Aínda non tes compras.",
+ shopOrderPmSeller: "PM Vendedor",
+ shopOrderSeller: "Vendedor",
+ shopOrderInvoice: "Factura",
+ shopOrderInvoiceConcept: "Factura",
+ shopOrderStatusPending: "Pendente",
+ shopOrderStatusAccepted: "Aceptado",
+ shopOrderStatusRejected: "Rexeitado",
+ shopOrderStatusShipped: "Enviado",
+ shopOrderAccept: "Aceptar",
+ shopOrderReject: "Rexeitar",
+ shopOrderMarkShipped: "Marcar enviado",
+ shopOrderPmBuyer: "PM Comprador",
+ shopOrderContractConcept: "Pedido de tenda",
+ shopOrdersPending: "Pedidos pendentes",
+ all: "Todos",
+ mine: "Meus",
+ recent: "Recentes",
+ anonymous: "Anónimo",
+ unnamed: "Anónimo",
+ authorLabel: "Autoría",
+ delete: "Eliminar",
+ save: "Gardar",
+ vote: "Votar",
+ url: "URL",
+ price: "Prezo",
+ priority: "Prioridade",
+ severity: "Gravidade",
+ organizer: "Organizador",
+ edited: "editado",
+ isPublic: "Público",
+ searchIsPublicLabel: "Público",
+ privacyPrivate: "PRIVADO",
+ privacyPublic: "PÚBLICO",
+ notFound: "Non atopado",
+ no_results: "Sen datos",
+ searchButton: "Buscar",
+ mapZoomLabel: "Zoom",
+ modulesTitle: "Módulos",
+ viewJson: "Ver JSON",
+ matchScore: "Puntuación de coincidencia",
+ preferencesLabel: "Preferencias",
+ inhabitantProfileTitle: "Habitante",
+ contentWarningLabel: "Aviso de contido",
+ invalidPost: "Contido non válido",
+ invalidPostHint: "Esta mensaxe ten o texto baleiro ou non válido.",
+ spreadChron: "Réplicas",
+ spreaded: "Replicado",
+ spreadContentUnavailable: "Contido aínda non dispoñible (replicación pendente)",
+ filteredByTag: "Filtrado por etiqueta",
+ filteredByTagTitle: "Filtrado por etiqueta",
+ feedPublishedSuccess: "Publicación creada correctamente!",
+ feedMastodonFailed: "Publicado en Oasis, pero non se puido enviar a Mastodon.",
+ tribeFeedSent: "Mensaxe enviada correctamente!",
+ tribeContentEncrypted: "Contido cifrado",
+ tribeTorrentsEmpty: "Aínda non hai torrents.",
+ torrentDescription: "Descrición",
+ torrentDownload: "Descargar",
+ chatInviteMode: "Convidar",
+ padInviteMode: "Convidar",
+ noInviteMode: "Sen modo de convite",
+ noDeadline: "Sen data límite",
+ noStatus: "Sen estado",
+ noSeverity: "Sen gravidade",
+ calendarDeleteDate: "Eliminar data",
+ calendarIntervalUntil: "Ata",
+ bookmarkLastVisit: "Última visita",
+ profileClearnetBookmarksLabel: "Marcadores",
+ invitesPort: "Porto",
+ peerHostValidation: "IPv4 válida (p. ex. 192.168.1.100) ou nome de host (p. ex. pub.solarnethub.com)",
+ peerPortValidation: "Porto 1-65535",
+ peerKeyValidation: "Chave pública SSB ed25519 (@<44 caracteres base64>=.ed25519)",
+ inboxJobUnsubscribedTitle: "Baixa da túa oferta de emprego",
+ inboxProjectFollowedTitle: "Novo seguidor do teu proxecto",
+ inboxProjectUnfollowedTitle: "Deixou de seguir o teu proxecto",
+ pmHasFollowedYourProject: "seguiu o teu proxecto",
+ pmHasUnfollowedYourProject: "deixou de seguir o teu proxecto",
+ pmHasUnsubscribedFromYourJobOffer: "deuse de baixa da túa oferta de emprego",
+ marketDeleteButton: "Eliminar",
+ marketNoBids: "Aínda non se fixeron poxas.",
+ marketAuctionBidAmount: "Importe da poxa",
+ marketAuctionBidTime: "Hora da poxa",
+ marketAuctionUser: "Poxador",
+ parliamentActorInPower: "TRIBO GOBERNANTE",
+ parliamentWinningCandidature: "Candidatura gañadora",
+ projectBounty: "Recompensa",
+ projectFollowing: "SEGUINDO",
+ projectBackerAuthor: "Patrocinador",
+ projectBackerDate: "Data",
+ projectConfirmTransferButton: "Confirmar transferencia",
+ projectPendingTransfersTitle: "Transferencias pendentes",
+ transfersUpdateSectionTitle: "Actualizar transferencia",
+ taskUnassignedFrom: "Desasignado de",
+ taskDescriptionPlaceholder: "Descrición da tarefa",
+ exportPasswordLabel: "Contrasinal de exportación",
+ importPasswordPlaceholder: "Introduce o contrasinal",
+ searchCasesPlaceholder: "Buscar en Tribunais...",
+ shopBuyDeliveryAddressPlaceholder: "Enderezo de entrega",
+ shopBuyNotesPlaceholder: "Notas",
+ bankTaxesUserNoteBold: "reducir directamente o imposto ECO",
+ bankTaxesUserNoteIntro: "O teu imposto ECO dedúcese do excedente que a rede xera por riba da túa RBU; o valor base da RBU fíxase como mínimo inamovible. O imposto nunca se deduce da cantidade fixa que lle corresponde a cada habitante como RBU. Os fondos deducidos alimentan o algoritmo de redistribución da riqueza e canalízanse de volta cara a outros habitantes mediante as súas reclamacións de RBU. Eses outros habitantes que reciben máis RBU para os seus proxectos probablemente terán algunha tarefa dedicada a axudarte a reducir o teu imposto ECO. Ou poden dedicarse a ",
+ bankTaxesUserNoteOutro: ", e o consenso da rede pode requirir a súa contribución continua.",
+ courtsViewDetails: "Ver",
+ courtsViewDetailsShort: "Detalles",
+ courtsThDetails: "Detalles",
+ courtsDetailsAnswersTitle: "Respostas",
+ courtsDetailsEvidenceTitle: "Probas",
+ courtsDetailsSettlementsTitle: "Acordos",
+ courtsDetailsVerdictTitle: "Veredicto",
+ courtsDetailsNotPublic: "Non público",
+ courtsEvidenceSideAccuser: "Probas da acusación",
+ courtsEvidenceSideRespondent: "Probas da defensa",
+ courtsEvidenceSideUnknown: "Descoñecido",
+ courtsJudgeNotAssigned: "-",
+ courtsSupportCase: "Apoiar o caso",
+ courtsSettlementAcceptBtn: "Aceptar acordo",
+ courtsSupportCount: "Apoios",
+ reportsSetStatus: "Cambiar estado",
+ reportsStatusClosed: "PECHADO",
+ statsAvgPerInhabitant: "Media por habitante",
+ statsCarbonMaxAnnual: "Estimación máx. anual",
+ statsCarbonNetwork: "Total da rede",
+ statsCarbonOfEstMax: "da capacidade máx. estimada",
+ statsCarbonYearProgress: "do ano transcorrido",
+ statsNetworkTitle: "Rede",
+ statsStorageTitle: "Almacenamento",
+ statsEcoTaxTitle: "Taxa ECO",
+ statsAccountTitle: "Conta",
+ statsAveragesTitle: "Medias",
+ statsCarbonOfNetwork: "do total da rede",
+ statsCarbonUser: "A túa pegada",
+ statsContentCountColumn: "Cantidade",
+ statsContentTypeColumn: "Tipo",
+ statsMsgsPerDay: "Mensaxes/día (histórico)",
+ statsMyShare: "A túa parte da rede",
+ statsNetworkSpan: "Antigüidade da rede",
+ statsTombstoneRatioLabel: "Proporción de borrados",
+ statsTopTagsTitle: "Etiquetas principais",
+ statsTopTypesTitle: "Tipos de contido principais",
+ statsTotalMsgs: "Mensaxes totais",
+ extended: "Multiverso",
+ extendedDescription: [
+ "Cando apoias a alguén, podes descargar as publicacións dos habitantes que apoia, e esas publicacións aparecerán aquí, ordenadas pola máis recente.",
+ ],
+ popular: "Destacadas",
+ popularDescription: [
+ "Publicacións de habitantes da túa rede, ",
+ strong("ordenadas por apoios"),
+ ". Selecciona o período de tempo para obter unha lista.",
+ ],
+ week: "Semana",
+ month: "Mes",
+ year: "Ano",
+ latest: "Últimos",
+ latestDescription: [
+ strong("Publicacións"),
+ " túas e de habitantes que apoias, ordenadas polas máis recentes.",
+ ],
+ topics: "Temas",
+ topicsDescription: [
+ strong("Temas"),
+ " teus e de habitantes que apoias, ordenados polos máis recentes.",
+ ],
+ summaries: "Resumos",
+ summariesDescription: [
+ strong("Temas e algúns comentarios"),
+ " teus e de habitantes que apoias, ordenados polos máis recentes.",
+ ],
+ threads: "Fíos",
+ threadsDescription: [
+ strong("Publicacións que teñen comentarios"),
+ " de habitantes que apoias e do teu multiverso, ordenadas polas máis recentes.",
+ ],
+ profile: "Avatar",
+ inhabitants: "Habitantes",
+ peersReplicatedFeeds: "Replicados",
+ peersTorColumn: "TOR",
+ peersTorYes: "Accesible por Tor",
+ peersTorNo: "Non accesible por Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Versión",
+ graphos: "Graphos",
+ graphosDescription: "Mapa interactivo da rede ao teu redor.",
+ graphosFederation: "Federación",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Inalcanzables",
+ graphosFedLinks: "Ligazóns mutuas",
+ graphosFedIsolated: "Illados",
+ graphosFedNoData: "Sen datos",
+ graphosFedMutual: "Mutuo",
+ graphosFedOneWay: "Nun sentido",
+ graphosFedTransport: "Rede",
+ graphosFedWith: "Federado con",
+ graphosZoom: "Ampliar",
+ graphosFedInhabitants: "Habitantes",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "O teu nodo aínda non coñece ningún PUB.",
+ graphosViewingGraphOf: "Vendo",
+ graphosBackToMine: "← A miña rede",
+ graphosShowing: "Amosando",
+ graphosYou: "Ti",
+ graphosTotalNodes: "Nodos totais",
+ mentions: "Mencións",
+ mentionsDescription: [
+ strong("Todas as mensaxes que te @mencionan"),
+ ".",
+ ],
+ noMentions: "Aínda non recibiches @mencións.",
+ mentionsSearchPlaceholder: "Buscar en Mencións...",
+ privateReminders: "RECORDATORIOS",
+ inboxFilterPms: "PMs",
+ inboxFilterNotifications: "Notificacións",
+ inboxMarkRead: "Marcar como lido",
+ inboxMarkUnread: "Marcar como non lido",
+ inboxUnreadChip: "Non lido",
+ inboxMarkAllRead: "Marcar todo como lido",
+ inboxDeleteShown: "Borrar todo",
+ inboxArchive: "Arquivar",
+ inboxUnarchive: "Desarquivar",
+ inboxFilterArchived: "Arquivados",
+ inboxEarlierMessages: "mensaxes anteriores",
+ inboxSortThread: "Por fío",
+ inboxSortRecent: "Máis recentes primeiro",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Notificacións do Inbox",
+ settingsInboxBotsDesc: "Escolle que bots poden avisarte no teu Inbox. Os bots desmarcados ocúltanse e os seus avisos non se contan.",
+ inboxFiltersLabel: "Filtros:",
+ inboxToggleToMutuals: "Cambiar a mutuos",
+ inboxToggleToWhole: "Cambiar a todos",
+ privateDate: "Data",
+ peers: "Nodos",
+ searchDescription: "Descrición",
+ searchFromLabel: "Desde",
+ searchToLabel: "Ata",
+ searchQueryLabel: "Busca",
+ searchPerPageLabel: "Resultados",
+ settings: "Configuración",
+ settingsDescription: "Configura o contorno da túa rede.",
+ continueReading: "Continuar lendo",
+ moreComments: "máis comentarios",
+ readThread: "ler o resto do fío",
+ pixeliaTitle: "Pixelia",
+ pixeliaDescription: "Debuxa píxeles nunha grella e colabor-ART con habitantes da túa rede.",
+ melodyTitle: "Melody",
+ melodyDescription: "Reproduce a melodía da túa blockchain — cada bloque convértese nunha nota.",
+ melodyEmpty: "Aínda non hai notas — a túa blockchain aínda non xerou ningún bloque.",
+ melodyTotalBlocks: "Notas",
+ melodyFilterAll: "TODAS",
+ melodyRegenerate: "Rexenerar",
+ melodyDownload: "Descargar BCS",
+ profileContentSectionTitle: "Contido do Avatar",
+ profileContentHelp: "Escolle que módulos se amosarán no teu avatar.",
+ profileSensorsHelp: "Métricas opcionais que se amosan no teu avatar.",
+ profileClearnetHelp: "Módulos que se poden consultar desde fóra de Oasis.",
+ profileHubAll: "Todo",
+ footerLicenseLabel: "Licenza",
+ profileVisibilityFediverse: "Multiverso",
+ contributorsTitle: "Contribucións",
+ colorLabel: "Escolle unha cor",
+ paintButton: "Debuxar!",
+ totalPixels: "Total de píxeles",
+ modules: "Módulos",
+ modulesViewTitle: "Módulos",
+ modulesViewDescription: "Define o teu contorno ideal activando e desactivando módulos.",
+ inbox: "Buzón",
+ inboxSearchPlaceholder: "Buscar no Buzón...",
+ multiverse: "Multiverso",
+ fediverse: "Multiverso",
+ fediverseDescription: "Xestiona as túas outras contas do multiverso, incluído enviar e recibir contido.",
+ fediverseStatus: "Estado",
+ fediverseDisconnected: "Multiverso desconectado. Comproba %LINK% ou o estado da conexión.",
+ fediverseSettingsTitle: "Multiverso",
+ fediverseInstanceLabel: "Enderezo",
+ fediverseTokenLabel: "Token de acceso",
+ fediverseConnect: "Conectar",
+ fediverseConnectedAs: "Conectado como",
+ nextcloudServerLabel: "Servidor",
+ nextcloudUserLabel: "Usuario",
+ nextcloudFolderLabel: "Cartafol",
+ nextcloudUploadButton: "Subir",
+ nextcloudFileLabel: "Escolle un ficheiro",
+ fileExternalLink: "Ligazón externa",
+ nextcloudErrConnect: "Non se puido chegar a Nextcloud con estes datos.",
+ nextcloudErrUpload: "A subida a Nextcloud fallou.",
+ nextcloudErrShare: "Nextcloud non deu unha ligazón pública para o ficheiro.",
+ fediverseDisconnect: "Desconectar",
+ fediverseEmptyLink: "a túa configuración",
+ fediverseComposePlaceholder: "Que estás a pensar?",
+ fediverseReplyPlaceholder: "Escribe a túa resposta…",
+ fediverseAttach: "Anexar multimedia",
+ fediversePublish: "Publicar",
+ fediverseReply: "Responder",
+ fediverseBoosted: "impulsou",
+ fediverseNoPosts: "A túa cronoloxía está baleira.",
+ fediverseTimeline: "Cronoloxías",
+ fediverseFollowers: "Seguidores",
+ fediverseFollowing: "Seguindo",
+ fediversePosts: "Publicacións",
+ fediverseJoined: "Uniuse",
+ fediverseRefresh: "Actualizar",
+ fediverseWrite: "Escribir",
+ fediversePreview: "Vista previa",
+ fediverseManage: "Xestionar",
+ fediverseError: "Non se puido contactar con Mastodon.",
+ fediverseErrInstance: "URL de instancia non válido.",
+ fediverseErrAuth: "Token non válido ou caducado.",
+ fediverseErrConnect: "Non se puido conectar coa instancia.",
+ fediverseErrToken: "O token é obrigatorio.",
+ fediverseErrPublic: "Non dispoñible en modo público.",
+ fediverseErrFetch: "Non se puido cargar a cronoloxía.",
+ fediverseErrPost: "Non se puido publicar.",
+ fediverseErrMedia: "Non se puido subir o ficheiro.",
+ fediverseErrEmpty: "Escribe algo ou anexa un ficheiro.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Número de teléfono",
+ telegramSendCode: "Enviar código",
+ telegramCodeHelp: "Introduce o código que Telegram che acaba de enviar (app ou SMS).",
+ telegramCodeLabel: "Código",
+ telegramPasswordHelp: "Esta conta ten verificación en dous pasos. Introduce o teu contrasinal.",
+ telegramPasswordLabel: "Contrasinal",
+ telegramVerify: "Verificar",
+ telegramCancel: "Cancelar",
+ telegramChats: "Chats",
+ telegramUnread: "Sen ler",
+ telegramOpen: "Abrir",
+ telegramSend: "Enviar",
+ telegramYou: "Ti",
+ telegramNoChats: "Aínda non hai chats.",
+ telegramNoMessages: "Aínda non hai mensaxes.",
+ telegramComposePlaceholder: "Escribe unha mensaxe…",
+ telegramChannel: "Canle",
+ telegramGroup: "Grupo",
+ telegramPrivate: "Privado",
+ telegramErrConnect: "Non se puido contactar con Telegram.",
+ telegramErrTimeout: "Telegram tardou demasiado en responder.",
+ telegramErrAuth: "Sesión de Telegram non válida ou caducada. Conéctaa de novo.",
+ telegramErrFetch: "Non se puideron cargar os chats.",
+ telegramErrSend: "Non se puido enviar a mensaxe.",
+ telegramErrMissing: "Fan falta o API ID, o API hash e o número de teléfono.",
+ telegramErrCode: "Código incorrecto. Téntao de novo.",
+ telegramErrCodeExpired: "O código caducou. Comeza de novo.",
+ telegramErrPassword: "Contrasinal incorrecto.",
+ telegramErrPhone: "Número de teléfono non válido.",
+ telegramErrApi: "API ID ou API hash non válidos.",
+ telegramErrFlood: "Demasiados intentos. Agarda un anaco e téntao de novo.",
+ telegramErrNoLogin: "Non hai ningún inicio de sesión en curso. Comeza de novo.",
+ peertubeUsernameLabel: "Usuaria",
+ peertubePasswordLabel: "Contrasinal",
+ peertubeSubscriptions: "Subscricións",
+ peertubeMyVideos: "Os meus vídeos",
+ peertubeVideos: "Vídeos",
+ peertubeFollowers: "Seguidoras",
+ peertubeViews: "visualizacións",
+ peertubeLikes: "gústame",
+ peertubeQuota: "Cota",
+ peertubeUpload: "Subir vídeo",
+ peertubeUploadHelp: "Escolle un ficheiro de vídeo. Súbese á túa canle e PeerTube procésao despois.",
+ peertubeTitleLabel: "Título",
+ peertubeDescriptionLabel: "Descrición",
+ peertubePrivacyLabel: "Privacidade",
+ peertubePrivacyPublic: "Público",
+ peertubePrivacyUnlisted: "Non listado",
+ peertubePrivacyPrivate: "Privado",
+ peertubeNoVideos: "Aínda non hai vídeos.",
+ peertubeComments: "Comentarios",
+ peertubeComment: "Comentar",
+ peertubeCommentPlaceholder: "Escribe un comentario…",
+ peertubeNoComments: "Aínda non hai comentarios.",
+ peertubeOpen: "Abrir en PeerTube",
+ peertubeWatch: "Ver",
+ peertubeChannel: "Canle",
+ peertubeNoStream: "Este vídeo aínda non se pode reproducir aquí. Ábreo en PeerTube.",
+ peertubeUploaded: "Vídeo subido. PeerTube estao a procesar.",
+ peertubeErrConnect: "Non se puido contactar con PeerTube.",
+ peertubeErrAuth: "Usuaria ou contrasinal incorrectos, ou a sesión caducou. Conéctaa de novo.",
+ peertubeErrInstance: "URL de instancia non válida.",
+ peertubeErrMissing: "Fan falta instancia, usuaria e contrasinal.",
+ peertubeErrFetch: "Non se puideron cargar os vídeos.",
+ peertubeErrUpload: "Non se puido subir o vídeo.",
+ peertubeErrTitle: "Fai falta un título.",
+ peertubeErrComment: "Non se puido publicar o comentario.",
+ peertubeErrNoFile: "Escolle un ficheiro de vídeo.",
+ bookmarksLabel: "Marcadores",
+ videosLabel: "Vídeos",
+ torrentsLabel: "Torrents",
+ docsLabel: "Documentos",
+ audiosLabel: "Audios",
+ tagsLabel: "Etiquetas",
+ imagesLabel: "Imaxes",
+ inhabitantsLabel: "Habitantes",
+ trendingLabel: "Tendencias",
+ eventsLabel: "Eventos",
+ apply: "Aplicar",
+ menuPersonal: "Persoal",
+ menuGovernance: "Gobernanza",
+ menuOffice: "Oficina",
+ menuNetwork: "Comunidade",
+ menuCreative: "Creativo",
+ menuEconomy: "Economía",
+ menuMedia: "Biblioteca",
+ menuTools: "Ferramentas",
+ comment: "Comentar",
+ subtopic: "Subtema",
+ json: "JSON",
+ unfollow: "Deixar de apoiar",
+ follow: "Apoiar",
+ block: "Bloquear",
+ unblock: "Desbloquear",
+ relationshipNotFollowing: "Non te apoia",
+ relationshipTheyFollow: "Apóiate",
+ relationshipMutuals: "Apoio mutuo",
+ relationshipFollowing: "Estás apoiando",
+ relationshipYou: "Ti",
+ relationshipBlocking: "Estás bloqueando",
+ relationshipBlockedBy: "Bloquéate",
+ relationshipMutualBlock: "Bloqueo mutuo",
+ relationshipNone: "Non estás apoiando",
+ relationshipBlockingPost: "Post bloqueado",
+ viewLikes: "Ver réplicas",
+ viewSupporters: "Ver apoios",
+ spreadedDescription: "Lista de contidos replicados por habitante.",
+ preview: "Previsualizar",
+ publish: "Publicar",
+ contentWarningPlaceholder: "Engade un título ao teu post (opcional)",
+ publishWarningPlaceholder: "Escribe o corpo da túa entrada.",
+ publishTooLong: "A túa publicación é demasiado longa. Acúrtaa, por favor.",
+ keepTextRetry: "Enviar de novo",
+ dateInPastError: "A data non pode ser anterior a hoxe",
+ publishCustomDescription: [
+ "LEMBRA: Por mor da tecnoloxía blockchain, unha vez que publicas algo, non se pode editar nin borrar. Pénsao ben!",
+ ],
+ commentWarning: [
+ "LEMBRA: Por mor da tecnoloxía blockchain, unha vez que publicas algo, non se pode editar nin borrar. Pénsao ben!",
+ ],
+ commentLabel: ({ publicOrPrivate, markdownUrl }) => [
+ ],
+ publishLabel: ({ markdownUrl, linkTarget }) => [
+ "LEMBRA: Por mor da tecnoloxía blockchain, unha vez que publicas algo, non se pode editar nin borrar. Pénsao ben!",
+ ],
+ replyLabel: ({ markdownUrl }) => [
+ "LEMBRA: Por mor da tecnoloxía blockchain, unha vez que publicas algo, non se pode editar nin borrar. Pénsao ben!",
+ ],
+ publishCustomInfo: ({ href }) => [
+ "Se tes experiencia, tamén podes ",
+ a({ href }, "escribir un post avanzado"),
+ ".",
+ ],
+ publishBasicInfo: ({ href }) => [
+ "Se non tes experiencia, deberías ",
+ a({ href }, "escribir un post normal"),
+ ".",
+ ],
+ publishCustom: "Escribir un post avanzado",
+ messagePreview: "Vista previa",
+ mentionsMatching: "Mencións",
+ mentionsName: "Nome",
+ mentionsRelationship: "Relación",
+ updateBannerText: "Hai unha nova versión de Oasis dispoñible.",
+ updateBannerAction: "Actualizar agora!",
+ info: "Info",
+ settingsIntro: ({ version }) => [
+ `[SNH] ꖒ OASIS [ v.${version} ]`,
+ ],
+ timeAgo: "hai",
+ sendTime: "escrito ",
+ theme: "Tema",
+ backupKeysExportButton: "Exportar",
+ backupKeysImportButton: "Importar",
+ ssbLogStream: "Blockchain",
+ ssbLogStreamDescription: "Configura o límite de mensaxes para os fluxos da blockchain.",
+ logWindowChip: "Últimos {n} streams da blockchain",
+ saveSettings: "Gardar a configuración",
+ exportDescription: "Establece un contrasinal (mínimo 32 caracteres de lonxitude) para cifrar o teu segredo",
+ exportDataTitle: "Copia instantánea",
+ exportDataDescription: "Descargar a túa blockchain (chave privada excluída!)",
+ exportDataButton: "Descargar a blockchain",
+ importDescription: "Importa o teu segredo cifrado (chave privada) para activar o teu avatar",
+ passwordImport: "Escribe o teu contrasinal para descifrar os datos que se gardarán no teu sistema (nome: secret)",
+ exportPasswordPlaceholder: "Usa minúsculas, maiúsculas, números e símbolos",
+ fileInfo: "O teu segredo cifrado descargarase no teu dispositivo (nome: oasis.enc)",
+ developer: "Desenvolvemento",
+ devTitle: "Desenvolvemento",
+ welcomeBannerText: "O teu avatar aínda non está configurado.",
+ aiSuggestionBanner: "Suxestión:",
+ aiSuggestionsEnable: "Suxestións da IA",
+ welcomeBannerAction: "Comezar",
+ welcomeTitle: "Benvida",
+ welcomeStepIdentity: "Identidade",
+ welcomeStepType: "Tipo",
+ welcomeStepUse: "Uso",
+ welcomeStepLook: "Aparencia",
+ welcomeStepCommunity: "Comunidade",
+ welcomeStepIntro: "Benvida",
+ welcomeHintIdentity: "O teu nome e a túa imaxe.",
+ welcomeHintType: "Como se abre Oasis para ti.",
+ welcomeHintUse: "Que módulos quedan activos.",
+ welcomeHintLook: "O tema que viste Oasis.",
+ welcomeHintCommunity: "Entra nun PUB para coñecer outros habitantes.",
+ welcomeHintIntro: "Envía un primeiro saúdo á comunidade.",
+ welcomeStepThemeAction: "Usar este tema",
+ welcomeJoinPubs: "Entrar nos PUBs",
+ welcomeNoFederation: "Sen federarse",
+ welcomeStepGreetingAction: "Enviar feed",
+ welcomeDescription: "Unhas poucas cousas que convén facer antes de comezar.",
+ welcomeSkip: "Agora non",
+ welcomeStepProfileAction: "Gardar o perfil",
+ welcomeBootstrapRunning: "Cargando a instantánea do pub. Ao rematar únese ao pub automaticamente; mentres tanto podes seguir usando Oasis.",
+ welcomeCompleteTitle: "Todo listo.",
+ welcomeCompleteText: "O teu nodo está preparado. A partir de aquí a rede medra cos habitantes aos que apoias.",
+ welcomeFindPeople: "Buscar habitantes",
+ devFilterFiles: "FICHEIROS",
+ devFilterSearch: "BUSCAR",
+ devFilterModules: "MÓDULOS",
+ devFilterTranslations: "TRADUCIÓNS",
+ devFilterStyles: "ESTILOS",
+ devFilterTests: "TESTS",
+ devVersion: "Versión",
+ devNodeVersion: "Node",
+ devStatsTests: "Tests",
+ devParentFolder: "Cartafol superior",
+ devOpenFolder: "abrir",
+ devDescription: "Explora o código que se está a executar neste nodo.",
+ devRoot: "raíz",
+ devSearchPlaceholder: "Texto que buscar no código",
+ devAnyExtension: "Calquera ficheiro",
+ devStatsFiles: "Ficheiros",
+ devStatsLines: "Liñas",
+ devStatsModules: "Módulos",
+ devStatsLanguages: "Idiomas",
+ devNotViewable: "non visualizable",
+ devEmptyFolder: "Este cartafol está baleiro.",
+ devSize: "Tamaño",
+ devShowing: "Amosando",
+ devLine: "liña",
+ devReportBug: "Informar dun erro",
+ devCreateTask: "Crear tarefa",
+ devRaw: "RAW",
+ devReportContext: "Atopado lendo o código de Oasis",
+ devTaskPrefix: "Revisar",
+ devPrevPage: "Liñas anteriores",
+ devNextPage: "Liñas seguintes",
+ devMatches: "coincidencias",
+ devFilesScanned: "ficheiros revisados",
+ devNoResults: "Aínda non hai coincidencias.",
+ devColModule: "Módulo",
+ devColState: "Estado",
+ devColModel: "Modelo",
+ devColView: "Vista",
+ devColRoutes: "Rutas",
+ devColTests: "Tests",
+ devOn: "activo",
+ devOff: "inactivo",
+ modulesDevLabel: "Desenvolvemento",
+ modulesDevDescription: "Módulo para xestionar o código de Oasis.",
+ themeIntro:
+ "Escolle un tema.",
+ setTheme: "Establecer o tema",
+ language: "Idioma",
+ languageDescription:
+ "Se queres usar outro idioma, selecciónao aquí.",
+ setLanguage: "Establecer o idioma",
+ peerConnectionsIntro: "Xestiona todas as túas conexións con outros nodos.",
+ peersConnectFailed: "Non se puido conectar: {reason}.",
+ peerStateLabel: "Estado",
+ peerAddressLabel: "Enderezo",
+ peerLastChangeLabel: "Último cambio",
+ peerStateConnected: "Conectado",
+ peerStateConnecting: "Conectando",
+ peerStateStaged: "Dispoñible",
+ peerErrSilent: "Sen actividade",
+ peerErrTimeout: "Non responde",
+ peerErrRefused: "Rexeita a conexión",
+ peerErrNotFound: "Enderezo descoñecido",
+ peerErrUnreachable: "Rede inaccesible",
+ peerErrKeys: "Usando chaves diferentes",
+ peerErrIdentity: "Non acepta a túa conexión",
+ peerErrTor: "Só TOR",
+ peerErrDropped: "Conexión cortada",
+ peerErrPaused: "Rede en pausa",
+ peerErrOther: "Erro de conexión",
+ peerOutdated: "Desactualizado",
+ peerVersionUnannounced: "Non anuncia a súa versión: un Oasis antigo",
+ peersTorMissing: "Este PUB só permite conexións dende TOR.",
+ peerConnectionsTitle: "Conexións",
+ online: "Conectado",
+ offline: "Desconectado",
+ discovered: "Descubertos",
+ unknown: "Descoñecidos",
+ lanBroadcastActive: "Activa (multicast UDP na LAN)",
+ peerSourceRpc: "RPC",
+ peerSourceGossip: "Gossip",
+ peerSourceEbt: "EBT",
+ peerSourceRecent: "Recente",
+ peerSourceLan: "LAN",
+ pub: "PUB",
+ supported: "Apoiado",
+ recommended: "Recomendado",
+ blocked: "Bloqueado",
+ noConnections: "Non hai nodos conectados.",
+ noDiscovered: "Non descubriches ningún nodo.",
+ noUnknownPeers: "Non hai nodos descoñecidos no grafo de amizades.",
+ peersTechnicalEmpty: "Aínda non hai nodos rexistrados.",
+ peerConnect: "Conectar",
+ peerDisconnect: "Desconectar",
+ peerRefresh: "Refrescar",
+ peerPruneIdle: "Quitar inactivos",
+ peersPause: "Pausar",
+ peersResume: "Retomar",
+ peersPausedNote: "En pausa: Oasis non se conecta con ninguén e ninguén se pode conectar a el.",
+ peersPauseHint: "Detén todas as conexións: Oasis non se conecta a outros nodos nin os acepta ata que retomes.",
+ peerExport: "Exportar",
+ peerImport: "Importar",
+ peerImportTitle: "Importar lista de nodos",
+ peerImportPlaceholder: "Pega un enderezo multiserver por liña, ou sube un ficheiro .txt…",
+ connectionActionIntro:
+ "",
+ indexes: "Índices",
+ indexesRebuilt: "Índices reconstruídos",
+ indexesRebuildFailed: "Non se puideron reconstruír os índices",
+ indexesFiles: "Ficheiros de índice",
+ indexesDescription:
+ "Reconstruír os índices é seguro e pode arranxar algúns erros da túa blockchain.",
+ homePageTitle: "Páxina de inicio",
+ homePageDescription: "Selecciona que módulo queres como páxina de inicio.",
+ saveHomePage: "Establecer a páxina de inicio",
+ invites: "Convites",
+ invitesDescription: "Xestiona e aplica códigos de convite na túa rede.",
+ invitesPubsHint: "Pega un código de convite dun pub para federarte con el e comezar a replicar os seus habitantes.",
+ invitesFederationsHint: "Pubs cos que estás federado: actualízaos, quita os inalcanzables ou exporta a lista.",
+ invitesTribesTitle: "Tribos",
+ invitesChatsTitle: "Chats",
+ invitesPadsTitle: "Pads",
+ invitesCalendarsTitle: "Calendarios",
+ invitesEventsTitle: "Eventos",
+ invitesForumsTitle: "Foros",
+ invitesMapsTitle: "Mapas",
+ invitesShopsTitle: "Tendas",
+ invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "PUBs Suxeridos",
+ invitesFilterOthers: "Outras",
+ invitesJoinTitle: "Convites",
+ invitesJoinHint: "Pega calquera código de convite, sexa do que sexa, ou o Oasis ID dun habitante.",
+ invitesJoinPlaceholder: "Código de convite ou Oasis ID",
+ invitesJoinButton: "Entrar",
+ invitesUsedTitle: "Últimos convites",
+ invitesUsedEmpty: "Aínda non utilizaches ningún convite.",
+ invitesUsedType: "Tipo",
+ invitesUsedName: "Nome",
+ invitesUsedDate: "Data",
+ invitesPubInviteCodePlaceholder: "Introduce o código de convite do PUB",
+ invitesAcceptInvite: "Entrar no PUB",
+ invitesPubUses: "Invitacións usadas",
+ invitesPubExhausted: "Este PUB non ten invitacións dispoñibles.",
+ invitesAlreadyFederated: "Xa estás federado con este pub.",
+ invitesJoinPubMode: "Este Oasis funciona como PUB, en modo de só lectura. Para unilo a outro PUB, usa no terminal: ./oasis.sh join ",
+ invitesJoinLocalOnly: "As invitacións só se aceptan desde o equipo onde funciona Oasis, ou coa ligazón de administración que mostra ao arrincar.",
+ invitesFederationsTitle: "Federacións",
+ invitesAcceptedInvites: "Federadas",
+ invitesNoFederatedPubs: "Non hai pubs federados.",
+ invitesPubsRefresh: "Refrescar",
+ invitesPubsClearUnreachable: "Limpar",
+ invitesPubsExport: "Exportar",
+ invitesPubsImport: "Importar",
+ invitesPubsImportTitle: "Importar pubs",
+ invitesPubsImportPlaceholder: "Pega un enderezo multiserver ou un código de convite por liña, ou sube un ficheiro .txt…",
+ genericError: "Produciuse un erro.",
+ panicMode: "Modo pánico!",
+ encryptData: "Establece un contrasinal (mínimo 32 caracteres de lonxitude) para cifrar a túa blockchain",
+ decryptData: "Introduce o contrasinal para descifrar a túa blockchain",
+ removeDataDescription: "COIDADO: Este proceso non se pode desfacer.",
+ removePanicButton: "BORRAR TODOS OS TEUS DATOS!",
+ searchTitle: "Buscar",
+ searchDescriptionLabel: "Busca contido na túa rede.",
+ searchPlaceholder:"Buscar contido...",
+ searchLocationLabel:"Localización",
+ searchPriceLabel:"Prezo",
+ searchCategoryLabel:"Categoría",
+ searchPriorityLabel:"Prioridade",
+ searchStatusLabel:"Estado",
+ statusLabel:"Estado",
+ noResultsFound:"Non se atoparon resultados.",
+ votesOption:"Opinións votadas",
+ voteYesLabel:"Si",
+ voteNoLabel:"Non",
+ allTypesLabel: "SEN LÍMITES",
+ YESLabel:"SI",
+ NOLabel:"NON",
+ votesOptionYesLabel:"Si",
+ votesOptionNoLabel:"Non",
+ votesOptionAbstentionLabel:"Abstención",
+ votesQuestionLabel:"Pregunta",
+ voteStatusOpen:"ABERTO",
+ voteStatusClosed:"PECHADO",
+ commentDescription: ({ parentUrl }) => [
+ " comentou en ",
+ a({ href: parentUrl }, " fío"),
+ ],
+ commentTitle: ({ authorName }) => [`Comentou no post de @${authorName}`],
+ subtopicDescription: ({ parentUrl }) => [
+ " creou un subtema desde ",
+ a({ href: parentUrl }, " un post"),
+ ],
+ subtopicTitle: ({ authorName }) => [`Creou un subtema no post de @${authorName}`],
+ oasisDescription: "OASIS Rede de Proxectos",
+ searchSubmit: "Buscar...",
+ votesLabel: "GOBERNO",
+ pdfFallbackLabel: "Documento PDF",
+ shopLabel: "TENDAS",
+ voteLabel: "VOTOS",
+ submit: "Aplicar",
+ editProfile: "Editar o Avatar",
+ oasisIdLabel: "OasisID",
+ spreadContent: "Replicar",
+ welcomePmSubject: "Hello World!",
+ welcomePmBody: "Dámosche a benvida a Oasis — unha rede social libre, peer-to-peer, federada e cifrada, cunha arquitectura distribuída e só por convite.\n\nAlgúns lugares interesantes para comezar:\n\n- [/avatar](/profile) — Edita o teu avatar, nome, descrición e que módulos se amosan no teu avatar público.\n- /settings — Axusta a túa instancia local: idioma, tema, módulos, privacidade e sincronización.\n- /invites — Engade un pub para federarte co resto da rede.\n- /peers — Mira quen está conectado, volve escanear a túa LAN, exporta ou importa listas de nodos.\n- /inhabitants — Descubre e visita os avatares doutros habitantes.\n- /tribes — Crea grupos privados con cifrado de extremo a extremo ou únete a eles.\n- /search — Busca o contido da rede por tipo.\n\nAlgúns lugares interesantes para conectar:\n\n- /multiverse — Xestiona as túas outras contas do multiverso, incluído enviar e recibir contido.\n\nEsta mensaxe enviouse de forma privada desde ti cara a ti, por iso non fixo falta conexión para recibila.",
+ profileSensorsSectionTitle: "Sensores",
+ profileVisibilityActivity: "Nivel de actividade",
+ profileDeviceLockedHint: "Este sensor está sempre activo: permite que outros vexan desde que dispositivo te conectas e non se pode desactivar.",
+ profileVisibilityKarma: "Puntuación KARMA",
+ profileVisibilityUbi: "RBU",
+ profileVisibilityWallet: "Carteira ECOin",
+ profileVisibilityEcoTax: "Taxa ECO",
+ profileVisibilityLarpSign: "Selo L.A.R.P.",
+ profileVisibilityGpg: "Chave GPG",
+ clearnetSectionTitle: "Clearnet",
+ profileClearnetShopsLabel: "Tendas",
+ profileClearnetJobsLabel: "Emprego",
+ profileClearnetEventsLabel: "Eventos",
+ profileClearnetProjectsLabel: "Proxectos",
+ profileClearnetPostsLabel: "Blogs",
+ profileClearnetAudiosLabel: "Audios",
+ profileClearnetVideosLabel: "Vídeos",
+ profileClearnetImagesLabel: "Imaxes",
+ profileClearnetDocumentsLabel: "Documentos",
+ profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Mercado",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
+ editProfileDescription:
+ "",
+ profileName: "Nome",
+ profileImage: "Imaxe do Avatar",
+ profileGpgKey: "Chave pública GPG (.asc)",
+ profileGpgChip: "GPG",
+ profileGpgDownload: "Descargar",
+ profileGpgRemove: "Eliminar",
+ profileDescription: "Descrición",
+ hashtagDescription:
+ "Posts de habitantes da túa rede que fan referencia a este #hashtag, ordenados polo máis recente.",
+ rebuildName: "Reconstruír a blockchain",
+ wallet: "Carteira",
+ walletAddress: "Enderezo",
+ walletAmount: "Cantidade",
+ walletAddressLine: ({ address }) => `Enderezo: ${address}`,
+ walletAmountLine: ({ amount }) => `Cantidade: ${amount} ECO`,
+ walletBack: "Volver",
+ walletBalanceTitle: "Saldo",
+ walletWalletSendTitle: "Enviar",
+ walletReceiveTitle: "Recibir",
+ walletHistoryTitle: "Historial",
+ walletBalanceLine: ({ balance }) => `${balance} ECO`,
+ walletCnfrs: "Conf.",
+ walletConfirm: "Confirmar",
+ walletDescription: "Xestiona a túa carteira ECOin.",
+ walletDate: "Data",
+ walletFee: "Taxa (canto maior sexa a taxa, máis rápido se procesará a túa transacción)",
+ walletFeeLine: ({ fee }) => `Taxa: ECO ${fee}`,
+ walletHistory: "Historial",
+ walletReceive: "Recibir",
+ walletReset: "Restablecer",
+ walletSend: "Enviar",
+ walletPayingTransfer: "Pagando o transfer",
+ walletCreateTransferLabel: "Xerar contrato (transfer)",
+ walletTransferNotifiedNote: "Avisouse do pagamento á outra parte",
+ walletTransferCreatedNote: "Creouse un transfer (recibo) deste pagamento",
+ walletTransferNoPayeeNote: "Ningún habitante publicou este enderezo, así que non se creou ningún transfer",
+ walletTransferReceiptConcept: "Pagamento desde a carteira",
+ walletPaymentPmText: "envioute un pagamento",
+ walletPayeeLabel: "Destinatario",
+ walletConceptLabel: "Concepto",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Recibiches a túa RBU.",
+ bankingBotPaymentTitle: "Recibiches un pagamento.",
+ bankingBotUbiPaidText: "A túa Renda Básica Universal foi pagada",
+ bankUbiPubThisNode: "Este nodo paga a RBU",
+ bankUbiPubConnected: "PUB da RBU",
+ bankUbiPubNone: "De momento non hai PUBs que anuncien unha RBU.",
+ bankUbiAddressPublished: "Enderezo ECOin publicado",
+ bankUbiAddressMissing: "Publica o teu enderezo ECOin para recibir a RBU",
+ bankUbiClaimedThisMonth: "Reclamada este mes",
+ bankUbiPubBalance: "Carteira do PUB dispoñible para a RBU",
+ bankNoPubAddress: "O PUB da RBU aínda non publicou ningún enderezo ECOin.",
+ bankUbiTab: "RBU",
+ bankDonateEco: "DOAR!",
+ donateTooltip: "Doar ECOin",
+ bankNoUserAddress: "Este habitante non comparte ningún enderezo ECOin.",
+ bankUbiPubDefault: "Por defecto",
+ bankUbiPool: "Asignación",
+ bankUbiLastSeen: "Visto por última vez",
+ bankUbiLastPayout: "Última acción",
+ bankUbiPaidOut: "Repartido",
+ bankRangeToday: "Hoxe",
+ bankRangeWeek: "Semana",
+ bankRangeMonth: "Mes",
+ bankRangeYear: "Ano",
+ bankRangeFiveYears: "5 anos",
+ bankRangeAll: "Todo",
+ bankChartValueTitle: "Evolución do valor de ECOin",
+ bankChartValueHours: "Equivalencia en tempo (h)",
+ bankChartWealthTitle: "Redistribución da riqueza ECOin",
+ bankChartDistributed: "RBU repartida (ECO)",
+ bankChartRebalanceTitle: "Redistribución da riqueza entre PUBs",
+ bankChartRebalanced: "ECO movidos entre PUBs",
+ bankChartTaxes: "Impostos retidos (ECO)",
+ bankChartNoDataRange: "Non hai datos neste intervalo.",
+ bankChartNoDataYet: "Aínda non hai datos",
+ bankChartPerHour: "por hora",
+ bankChartPerDay: "por día",
+ bankChartPerMonth: "por mes",
+ bankTotalUbiDistributed: "RBU total redistribuída (rede)",
+ bankTotalTaxesWithheld: "Impostos totais retidos (rede)",
+ bankInflationIssuance: "Taxa de emisión (anual, por recompensa de bloque)",
+ bankRulesEligibilityTitle: "Quen pode recibir a RBU",
+ bankRulesEligibility1: "Un enderezo ECOin publicado no teu perfil (Perfil → Sensores → Carteira ECOin).",
+ bankRulesEligibility2: "Un feed con máis de 30 días e actividade na rede: karma por riba de cero.",
+ bankRulesEligibility3: "Unha reclamación por mes (epoch), desde Banca co botón Reclamar RBU. Pódese rexeitar a do mes en curso con Rexeitar RBU.",
+ bankRulesEligibility4: "O mínimo de 1 ECO págase sempre; os impostos só reducen a parte que o supera e nunca se cobran á parte.",
+ bankRulesEligibility5: "O PUB paga no seu seguinte ciclo e publica un transfer RBU que podes confirmar.",
+ bankRulesEligibility6: "Se falta o teu enderezo, o feed é demasiado novo, rexeitaches o mes ou o PUB non ten fondos, a reclamación sáltase e queda rexistrada no PUB.",
+ copyLinkTitle: "Copiar a ligazón",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Rexeitar RBU",
+ bankUbiRefusedThisMonth: "Rexeitaches a RBU deste mes.",
+ bankingBotUbiAvailableTitle: "Podes reclamar a túa RBU.",
+ bankingBotUbiAvailableText: "A túa RBU deste mes está dispoñible",
+ bankingBotConfirmTitle: "Tes un contrato pendente de confirmación",
+ bankingBotConfirmText: "Contratos pendentes de confirmación",
+ bankChartZoomHint: "Preme para ampliar",
+ bankChartPoolTitle: "Asignación da RBU (no tempo)",
+ bankChartNetworkUbiTitle: "RBU total redistribuída (rede)",
+ bankChartSupplyTitle: "Oferta circulante de ECOin (no tempo)",
+ bankChartInflationTitle: "Inflación de ECOin (no tempo)",
+ bankChartInflationSeries: "Taxa anualizada (%)",
+ bankChartPool: "Asignación total (ECO)",
+ bankChartKarmaTitle: "Puntuación KARMA (no tempo)",
+ bankChartFundsTitle: "Os teus fondos ECOin (no tempo)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin conectada",
+ bankWalletNotConfigured: "ECOin desconectada",
+ transfersPayWithWallet: "PAGAR!",
+ walletStatus: "Estado",
+ walletDisconnected: [
+ "Tes a ",
+ strong("carteira de ECOin desconectada"),
+ ". Revisa ",
+ a({ href: '/settings#wallet' }, "a túa configuración"),
+ " ou o estado da túa conexión.",
+ ],
+ walletSentToLine: ({ destination, amount }) => `Enviar ECO ${amount} a ${destination}`,
+ walletNotConfigured: "A túa carteira de ECOin aínda non está configurada.",
+ walletSettingsDescription: "Integrar Oasis coa túa carteira de ECOin.",
+ walletSettingsMobileDescription: "Vincula Oasis coa app ECOin Wallet deste dispositivo.",
+ walletDownloadEcoin: "Descargar ECOin!",
+ walletRpcUrl: "URL do RPC",
+ walletStatusMessages: {
+ invalid_amount: "Cantidade non válida",
+ invalid_dest: "Enderezo de destino non válido",
+ invalid_fee: "Taxa non válida",
+ validation_errors: "Erros na validación",
+ send_tx_success: "Transacción realizada",
+ },
+ walletTitle: "Carteira",
+ walletTotalCostLine: ({ totalCost }) => `Custo total: ECO ${totalCost}`,
+ walletTransactionId: "ID da transacción",
+ walletTxId: "ID Tx",
+ walletType: "Tipo",
+ walletUser: "Usuario",
+ walletPass: "Contrasinal",
+ walletConfiguration: "Configurar a carteira",
+ walletDisconnectButton: "Desconectar a carteira",
+ cipher: "Cifrador",
+ cipherTitle: "Cifrador",
+ cipherDescription: "Cifra e descifra o teu texto de forma simétrica (cun contrasinal compartido).",
+ randomPassword: "Contrasinal aleatorio",
+ cipherTextPlaceholder: "Introduce o texto que queres cifrar...",
+ cipherPasswordLabel: "Establece un contrasinal (mínimo 32 caracteres) para cifrar o teu texto",
+ cipherPasswordDecryptLabel: "Establece un contrasinal (mínimo 32 caracteres) para descifrar o teu texto",
+ cipherPasswordPlaceholder: "Introduce un contrasinal...",
+ cipherEncryptButton: "Cifrar",
+ cipherEncryptedMessageLabel: "Texto cifrado",
+ cipherDecryptedMessageLabel: "Texto descifrado",
+ cipherEncryptedTextPlaceholder: "Introduce o texto cifrado...",
+ cipherDecryptButton: "Descifrar",
+ password: "Contrasinal",
+ text: "Texto",
+ encryptedText: "Texto cifrado",
+ iv: "Vector de inicialización (IV)",
+ bookmarkTitle: "Marcadores",
+ bookmarkDescription: "Descobre e xestiona marcadores na túa rede.",
+ bookmarkAllSectionTitle: "Marcadores",
+ bookmarkMineSectionTitle: "Os teus marcadores",
+ bookmarkRecentSectionTitle: "Marcadores recentes",
+ bookmarkTopSectionTitle: "Marcadores top",
+ bookmarkFavoritesSectionTitle: "Favoritos",
+ bookmarkCreateSectionTitle: "Crear un marcador",
+ bookmarkUpdateSectionTitle: "Actualizar o marcador",
+ bookmarkFilterAll: "TODOS",
+ bookmarkFilterMine: "MEUS",
+ bookmarkFilterTop: "TOP",
+ bookmarkFilterFavorites: "FAVORITOS",
+ bookmarkFilterRecent: "RECENTES",
+ bookmarkCreateButton: "Crear un marcador",
+ bookmarkUpdateButton: "Actualizar",
+ bookmarkAddFavoriteButton: "Engadir a favoritos",
+ bookmarkRemoveFavoriteButton: "Quitar de favoritos",
+ bookmarkUrlLabel: "Ligazón",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
+ bookmarkDescriptionLabel: "Descrición",
+ bookmarkDescriptionPlaceholder: "Opcional",
+ bookmarkTagsLabel: "Etiquetas",
+ bookmarkTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ bookmarkLastVisitLabel: "Última visita",
+ bookmarkSearchPlaceholder: "Buscar en Marcadores...",
+ bookmarkSortRecent: "Máis recentes",
+ bookmarkSortOldest: "Máis antigos",
+ bookmarkSortTop: "Máis votados",
+ bookmarkSearchButton: "Buscar",
+ bookmarkUpdatedAt: "Actualizado",
+ bookmarkNoMatch: "Non hai marcadores que coincidan coa túa busca.",
+ noBookmarks: "Non hai marcadores dispoñibles.",
+ noUrl: "Sen ligazón",
+ noCategory: "Sen categoría",
+ noLastVisit: "Sen última visita",
+ videoTitle: "Vídeos",
+ videoDescription: "Explora e xestiona contido de vídeo na túa rede.",
+ videoMineSectionTitle: "Os teus vídeos",
+ videoCreateSectionTitle: "Subir un vídeo",
+ videoUpdateSectionTitle: "Actualizar o vídeo",
+ videoAllSectionTitle: "Vídeos",
+ videoRecentSectionTitle: "Vídeos recentes",
+ videoTopSectionTitle: "Vídeos máis votados",
+ videoFavoritesSectionTitle: "Favoritos",
+ videoFilterAll: "TODOS",
+ videoFilterMine: "MEUS",
+ videoFilterRecent: "RECENTES",
+ videoFilterTop: "TOP",
+ videoFilterFavorites: "FAVORITOS",
+ videoCreateButton: "Subir un vídeo",
+ videoUpdateButton: "Actualizar",
+ videoDeleteButton: "Eliminar",
+ videoAddFavoriteButton: "Engadir a favoritos",
+ videoRemoveFavoriteButton: "Quitar de favoritos",
+ videoFileLabel: "Selecciona un ficheiro de vídeo (.mp4, .webm, .ogv, .mov)",
+ videoTagsLabel: "Etiquetas",
+ videoTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ videoTitleLabel: "Título",
+ videoTitlePlaceholder: "Opcional",
+ videoDescriptionLabel: "Descrición",
+ videoDescriptionPlaceholder: "Opcional",
+ videoNoFile: "Non se proporcionou ningún ficheiro de vídeo",
+ noVideos: "Non hai vídeos dispoñibles.",
+ videoSearchPlaceholder: "Buscar en Vídeos...",
+ videoSortRecent: "Máis recentes",
+ videoSortOldest: "Máis antigos",
+ videoSortTop: "Máis votados",
+ videoSearchButton: "Buscar",
+ videoUpdatedAt: "Actualizado",
+ videoNoMatch: "Ningún vídeo coincide coa túa busca.",
+ documentTitle: "Documentos",
+ documentDescription: "Descobre e xestiona documentos na túa rede.",
+ documentAllSectionTitle: "Documentos",
+ documentMineSectionTitle: "Os teus documentos",
+ documentRecentSectionTitle: "Documentos recentes",
+ documentTopSectionTitle: "Documentos top",
+ documentFavoritesSectionTitle: "Favoritos",
+ documentCreateSectionTitle: "Subir un documento",
+ documentUpdateSectionTitle: "Editar o documento",
+ documentFilterAll: "TODO",
+ documentFilterMine: "MEUS",
+ documentFilterRecent: "RECENTES",
+ documentFilterTop: "TOP",
+ documentFilterFavorites: "FAVORITOS",
+ documentCreateButton: "Subir un documento",
+ documentUpdateButton: "Actualizar",
+ documentAddFavoriteButton: "Engadir a favoritos",
+ documentRemoveFavoriteButton: "Quitar de favoritos",
+ documentMessageAuthorButton: "MP",
+ documentFileLabel: "Subir un documento (.pdf)",
+ documentTagsLabel: "Etiquetas",
+ documentTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ documentTitleLabel: "Título",
+ documentTitlePlaceholder: "Opcional",
+ documentDescriptionLabel: "Descrición",
+ documentDescriptionPlaceholder: "Opcional",
+ documentNoFile: "Sen ficheiro.",
+ noDocuments: "Non hai documentos dispoñibles.",
+ documentSearchPlaceholder: "Buscar en Documentos...",
+ documentSortRecent: "Máis recentes",
+ documentSortOldest: "Máis antigos",
+ documentSortTop: "Máis votados",
+ documentSearchButton: "Buscar",
+ documentNoMatch: "Non hai documentos que coincidan coa túa busca.",
+ documentUpdatedAt: "Actualizado",
+ audioTitle: "Audios",
+ audioDescription: "Explora e xestiona contido de audio na túa rede.",
+ audioMineSectionTitle: "Os teus audios",
+ audioCreateSectionTitle: "Subir un audio",
+ audioUpdateSectionTitle: "Actualizar o audio",
+ audioAllSectionTitle: "Audios",
+ audioRecentSectionTitle: "Audios recentes",
+ audioTopSectionTitle: "Audios máis votados",
+ audioFilterAll: "TODOS",
+ audioFilterMine: "MEUS",
+ audioFilterRecent: "RECENTES",
+ audioFilterTop: "TOP",
+ audioCreateButton: "Subir un audio",
+ audioUpdateButton: "Actualizar",
+ audioAddFavoriteButton: "Engadir a favoritos",
+ audioRemoveFavoriteButton: "Quitar de favoritos",
+ audioFileLabel: "Selecciona un ficheiro de audio (.mp3, .wav, .ogg)",
+ audioTagsLabel: "Etiquetas",
+ audioTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ tagsPlaceholder: "Introduce etiquetas separadas por comas",
+ audioTitleLabel: "Título",
+ audioTitlePlaceholder: "Opcional",
+ audioDescriptionLabel: "Descrición",
+ audioDescriptionPlaceholder: "Opcional",
+ audioNoFile: "Non se proporcionou ningún ficheiro de audio",
+ noAudios: "Non hai audios dispoñibles.",
+ audioSearchPlaceholder: "Buscar en Audios...",
+ audioSortRecent: "Máis recentes",
+ audioSortOldest: "Máis antigos",
+ audioSortTop: "Máis votados",
+ audioSearchButton: "Buscar",
+ audioMessageAuthorButton: "MP",
+ audioUpdatedAt: "Actualizado",
+ audioNoMatch: "Ningún audio coincide coa túa busca.",
+ audioFavoritesSectionTitle: "Favoritos",
+ audioFilterFavorites: "FAVORITOS",
+ favoritesTitle: "Favoritos",
+ favoritesDescription: "Todos os teus elementos marcados como favoritos nun só lugar.",
+ favoritesSearchPlaceholder: "Buscar en Favoritos...",
+ favoritesFilterAll: "TODOS",
+ favoritesFilterRecent: "RECENTES",
+ favoritesFilterAudios: "AUDIOS",
+ favoritesFilterBookmarks: "MARCADORES",
+ favoritesFilterDocuments: "DOCUMENTOS",
+ favoritesFilterImages: "IMAXES",
+ favoritesFilterMaps: "MAPAS",
+ favoritesFilterPads: "PADS",
+ favoritesFilterChats: "CHATS",
+ favoritesFilterCalendars: "CALENDARIOS",
+ favoritesFilterVideos: "VÍDEOS",
+ favoritesNoItems: "Aínda non hai favoritos.",
+ yourContacts: "Os teus contactos",
+ allInhabitants: "Habitantes",
+ allCVs: "CV",
+ discoverPeople: "Descobre habitantes na túa rede.",
+ searchInhabitantsPlaceholder: "Buscar en Habitantes...",
+ filterLocation: "FILTRAR habitantes POR LOCALIZACIÓN …",
+ filterLanguage: "FILTRAR habitantes POR IDIOMA …",
+ filterSkills: "FILTRAR habitantes POR HABILIDADES …",
+ cvSkillsCount: "Habilidades",
+ applyFilters: "Aplicar os filtros",
+ locationLabel: "Localización",
+ languagesLabel: "Idiomas",
+ skillsLabel: "Habilidades",
+ commonSkills: "Habilidades comúns",
+ mutualFollowers: "Seguidores mutuos",
+ suggestedFollowsYou: "Ségueche",
+ latestInteractions: "Últimas interaccións",
+ suggestedSectionTitle: "Suxeridos",
+ topkarmaSectionTitle: "Mellor karma",
+ topecoSectionTitle: "Mellor Eco",
+ topactivitySectionTitle: "Máis actividade",
+ "TOP INACTIVITYButton": "MÁIS INACTIVOS",
+ topinactivitySectionTitle: "Habitantes menos activos",
+ blockedSectionTitle: "Bloqueados",
+ gallerySectionTitle: "GALERÍA",
+ topSectionTitle: "TOP",
+ blockedLabel: "Usuario bloqueado",
+ inhabitantviewDetails: "Ver os detalles",
+ keepReading: "Seguir lendo...",
+ oasisId: "ID",
+ noInhabitantsFound: "Aínda non se atoparon habitantes.",
+ inhabitantActivityLevel: "Nivel de actividade",
+ lifespanLabel: "Vixencia",
+ deviceLabel: "Dispositivo",
+ parliamentTitle: "Parlamento",
+ parliamentDescription: "Explora formas de goberno e políticas de xestión colectiva.",
+ parliamentFilterGovernment: "GOBERNO",
+ parliamentFilterCandidatures: "CANDIDATURAS",
+ parliamentFilterProposals: "PROPOSTAS",
+ parliamentFilterLaws: "LEIS",
+ parliamentFilterRevocations: "REVOGACIÓNS",
+ parliamentFilterHistorical: "HISTÓRICO",
+ parliamentFilterLeaders: "LÍDERES",
+ parliamentFilterRules: "REGRAS",
+ parliamentGovernmentCard: "Goberno actual",
+ parliamentSeatsGovernment: "Goberno",
+ parliamentSeatsOpposition: "Oposición",
+ parliamentSeatsAbstention: "Abstención",
+ parliamentSeatsQuorum: "Quórum de elección",
+ parliamentSeatsPass: "Limiar de aprobación",
+ parliamentSeatsByElection: "Por elección",
+ parliamentSeatsByHouses: "Por casa do LARP",
+ parliamentSeatsSeats: "escanos",
+ parliamentSeatsSeat: "escano",
+ parliamentSeatsLeader: "Líder",
+ parliamentSeatsVotesFor: "votos a",
+ parliamentSeatsNoHouse: "Sen casa",
+ parliamentActorInPowerInhabitant: "HABITANTE NO PODER",
+ parliamentActorInPowerTribe: "TRIBO NO PODER",
+ parliamentHistoricalGovernmentsTitle: "GOBERNOS",
+ parliamentHistoricalElectionsTitle: "CICLOS ELECTORAIS",
+ parliamentHistoricalLawsTitle: "HISTÓRICO",
+ parliamentHistoricalLeadersTitle: "LÍDERES",
+ parliamentThCycles: "CICLOS",
+ parliamentThTimesInPower: "MANDATOS",
+ parliamentThTotalCandidatures: "CANDIDATURAS",
+ parliamentThProposed: "LEIS PROPOSTAS",
+ parliamentThApproved: "LEIS APROBADAS",
+ parliamentThDeclined: "LEIS REXEITADAS",
+ parliamentThDiscarded: "LEIS DESCARTADAS",
+ parliamentMembers: "MEMBROS",
+ parliamentLegSince: "INICIO DO CICLO",
+ parliamentLegEnd: "FIN DO CICLO",
+ parliamentPoliciesProposal: "PROPOSTAS DE LEI",
+ parliamentPoliciesApproved: "LEIS APROBADAS",
+ parliamentPoliciesDeclined: "LEIS REXEITADAS",
+ parliamentPoliciesDiscarded: "LEIS DESCARTADAS",
+ parliamentEfficiency: "% EFICIENCIA",
+ parliamentRevocationFormTitle: "Revogar unha lei",
+ parliamentRevocationLaw: "Lei",
+ parliamentRevocationReasons: "Motivos",
+ parliamentRevocationPublish: "Publicar a revogación",
+ parliamentCurrentRevocationsTitle: "Revogacións actuais",
+ parliamentFutureRevocationsTitle: "Revogacións futuras",
+ parliamentPoliciesRevocated: "LEIS REVOGADAS",
+ parliamentPoliciesTitle: "HISTÓRICO",
+ parliamentLawsTitle: "LEIS APROBADAS",
+ parliamentRulesRevocations: "Calquera lei aprobada pode ser revogada co método de goberno vixente.",
+ parliamentNoStableGov: "Aínda non hai un goberno elixido.",
+ parliamentNoGovernments: "Aínda non hai gobernos no histórico.",
+ parliamentCandidatureFormTitle: "Propoñer unha candidatura",
+ parliamentCandidatureIdPh: "Oasis ID (@...) ou nome da tribo",
+ parliamentCandidatureMethod: "Método",
+ parliamentCandidatureProposeBtn: "Publicar a candidatura",
+ parliamentVoteBtn: "Votar",
+ parliamentProposalFormTitle: "Propoñer unha lei",
+ parliamentProposalDescription: "Descrición (≤1000)",
+ parliamentProposalPublish: "Publicar a proposta",
+ parliamentNoProposals: "Aínda non hai propostas de lei.",
+ parliamentNoLaws: "Aínda non hai leis aprobadas.",
+ parliamentMethodDEMOCRACY: "Democracia",
+ parliamentMethodMAJORITY: "Maioría (80%)",
+ parliamentMethodMINORITY: "Minoría (20%)",
+ parliamentMethodDICTATORSHIP: "Ditadura",
+ parliamentMethodKARMATOCRACY: "Karmatocracia",
+ parliamentThId: "ID",
+ parliamentThProposalDate: "Data da proposta",
+ parliamentThMethod: "Método",
+ parliamentThKarma: "Karma",
+ parliamentThSupports: "Apoios",
+ parliamentThVote: "Votar",
+ parliamentCurrentProposalsTitle: "Propostas actuais",
+ parliamentVotesSlashTotal: "Votos/Total",
+ parliamentVotesNeeded: "Votos necesarios",
+ parliamentFutureLawsTitle: "Futuras leis",
+ parliamentVoteAction: "Votar",
+ parliamentThLeader: "AVATAR",
+ parliamentPopulation: "Poboación",
+ parliamentThPresented: "CANDIDATURAS",
+ parliamentNoLeaders: "Aínda non hai líderes.",
+ parliamentCandidaturesListTitle: "Lista de candidaturas",
+ parliamentTimeRemaining: "Tempo restante",
+ parliamentElectionsStatusTitle: "Próximo goberno",
+ parliamentProposalDeadlineLabel: "Data límite",
+ parliamentViewReport: "Ver o informe",
+ parliamentProposalTimeLeft: "Tempo restante",
+ parliamentRulesTitle: "Como funciona o Parlamento",
+ parliamentRulesIntro: "As eleccións resólvense cada 2 meses; as candidaturas son continuas e reinícianse cando se elixe un goberno.",
+ parliamentRulesCandidates: "Calquera habitante pode propoñerse a si mesmo, a outro habitante ou a calquera tribo. Cada habitante pode propoñer ata 3 candidaturas por ciclo; rexéitanse os duplicados no mesmo ciclo.",
+ parliamentRulesElection: "Gaña a candidatura con máis votos no momento da resolución.",
+ parliamentRulesTies: "Desempate: maior karma do habitante; se persiste, perfil máis antigo; se persiste, proposta máis temperá; despois, orde lexicográfica por ID.",
+ parliamentRulesTerm: "A lapela Goberno amosa o goberno actual e as súas estatísticas.",
+ parliamentRulesMethods: "Formas: Anarquía (maioría simple), Democracia (50%+1), Maioría (80%), Minoría (20%), Karmatocracia (propostas con maior karma), Ditadura (aprobación instantánea).",
+ parliamentRulesAnarchy: "A Anarquía é o modo por defecto: se ao resolver non se elixe ningunha candidatura, proclámase a Anarquía. En Anarquía, calquera habitante pode propoñer leis.",
+ parliamentRulesProposals: "Se es o habitante gobernante ou membro da tribo gobernante, podes publicar propostas de lei. Os métodos non ditatoriais crean unha votación pública.",
+ parliamentRulesLimit: "Cada habitante pode publicar como máximo 3 propostas de lei por ciclo.",
+ parliamentRulesLaws: "Cando unha proposta alcanza o seu limiar, convértese en Lei e aparece na lapela Leis coa súa data de entrada en vigor.",
+ parliamentRulesHistorical: "En Histórico pódese ver cada ciclo de goberno que houbo e datos sobre a súa xestión.",
+ parliamentRulesLeaders: "En Líderes pódese ver unha clasificación de habitantes/tribos que gobernaron (ou se presentaron), ordenados por eficacia.",
+ parliamentRulesHemicycle: "O hemiciclo dá un escano por habitante: o bloque de goberno (votantes da candidatura gañadora e o líder), un bloque de oposición por cada outra candidatura do ciclo, e a abstención. As marcas descontinuas sinalan o quórum de elección (25 % do censo) e o limiar de aprobación do método vixente. \"Por casa do LARP\" colorea os mesmos escanos por casa.",
+ parliamentProposalVoteStatusLabel: "Estado da votación",
+ parliamentProposalOnTrackYes: "Limiar alcanzado",
+ parliamentProposalOnTrackNo: "Por debaixo do limiar",
+ courtsTitle: "Tribunais",
+ courtsDescription: "Explora formas de resolución de conflitos e de xestión colectiva da xustiza.",
+ courtsFilterCases: "CASOS",
+ courtsFilterMyCases: "MEUS",
+ courtsFilterJudges: "XUÍCES",
+ courtsFilterHistory: "HISTORIAL",
+ courtsFilterRules: "REGRAS",
+ courtsCaseFormTitle: "Abrir un caso",
+ courtsCaseRespondent: "Acusado / Parte demandada",
+ courtsCaseRespondentPh: "ID de Oasis (@...) ou nome da tribo",
+ courtsCaseSubjectPlaceholder: "Asunto ou descrición breve",
+ courtsCaseMethod: "Método de resolución",
+ courtsCaseSubmit: "Presentar o caso",
+ courtsNominateJudge: "Nomear un xuíz",
+ courtsJudgeId: "Xuíz",
+ courtsJudgeIdPh: "ID de Oasis (@...) ou nome do habitante",
+ courtsNominateBtn: "Nomear",
+ courtsAddEvidence: "Engadir probas",
+ courtsEvidenceText: "Texto",
+ courtsEvidenceLink: "Ligazón",
+ courtsEvidenceLinkPh: "https://…",
+ courtsEvidenceSubmit: "Anexar",
+ courtsAnswerText: "Resumo da resposta",
+ courtsAnswerSubmit: "Enviar a resposta",
+ courtsVerdictTitle: "Emitir veredicto",
+ courtsVerdictOrdersPh: "Accións, prazos, pasos restaurativos...",
+ courtsIssueVerdict: "Emitir veredicto",
+ courtsMediationPropose: "Propoñer un acordo",
+ courtsSettlementProposeBtn: "Propoñer",
+ courtsNominationsTitle: "Nomeamentos á xudicatura",
+ courtsThJudge: "Xuíz",
+ courtsThDate: "Data",
+ courtsThVote: "Votar",
+ courtsNoNominations: "Aínda non hai nomeamentos.",
+ courtsRespondentInvalid: "Debe ser un ID SSB válido (@...ed25519)",
+ courtsCaseMediatorsRespondentTitle: "Engadir mediadores da defensa",
+ courtsCaseMediatorsRespondent: "Mediadores (defensa)",
+ courtsMediatorsAccuserLabel: "Mediadores (acusación)",
+ courtsMediatorsRespondentLabel: "Mediadores (defensa)",
+ courtsMediatorsSubmit: "Gardar os mediadores",
+ courtsNoMyCases: "Aínda non tes conflitos.",
+ courtsNoHistory: "Aínda non hai xuízos rexistrados.",
+ courtsMethodDICTATOR: "Ditador",
+ courtsMethodPOPULAR: "Popular",
+ courtsMethodKARMATOCRACY: "Karmatocracia",
+ courtsCaseType: "Tipo de caso",
+ courtsPresetMinorConflict: "Conflito leve",
+ courtsPresetModerateConflict: "Conflito moderado",
+ courtsPresetSevereConflict: "Conflito grave",
+ courtsPresetHarassment: "Acoso ou abuso",
+ courtsPresetContentModeration: "Moderación de contido",
+ courtsPresetBanRestriction: "Expulsión ou restrición",
+ courtsPresetGovernanceDispute: "Disputa de goberno",
+ courtsStatusOPEN: "Aberto",
+ courtsStatusIN_PROGRESS: "En curso",
+ courtsStatusDECIDED: "Decidido",
+ courtsStatusCLOSED: "Pechado",
+ courtsStatusSOLVED: "Resolto",
+ courtsStatusUNSOLVED: "Sen resolver",
+ courtsStatusDISCARDED: "Descartado",
+ courtsRulesTitle: "Como funcionan os Tribunais",
+ courtsRulesIntro: "Os Tribunais son un proceso xestionado pola comunidade para resolver conflitos e promover a xustiza restaurativa. Priorízanse o diálogo, as probas claras e os remedios proporcionais.",
+ courtsRulesLifecycle: "Proceso: 1) Abrir o caso 2) Seleccionar o método 3) Presentar probas 4) Audiencia e deliberación 5) Veredicto e remedio 6) Cumprimento e peche 7) Apelación (se procede).",
+ courtsRulesRoles: "Acusación: abre o caso. Defensa: habitante ou tribo acusada. Método: mecanismo elixido pola comunidade para facilitar, avaliar as probas e emitir veredicto. Testemuña: achega testemuño ou probas. Mediadores: habitantes neutrais convidados pola acusación e/ou a defensa, con acceso a todos os detalles, que axudan a desescalar o conflito e a cocrear acordos.",
+ courtsRulesEvidence: "Descrición de ata 1000 caracteres. Anexa imaxes, audio, vídeo e documentos PDF relevantes e legais. Non compartas datos privados sensibles sen consentimento.",
+ courtsRulesDeliberation: "As audiencias poden ser públicas ou privadas. Os xuíces garanten o respecto, piden aclaracións e poden descartar material irrelevante ou ilegal.",
+ courtsRulesVerdict: "Priorízase a restauración: desculpas, acordos de mediación, moderación de contido, restricións temporais ou outras medidas proporcionais. O razoamento debe quedar rexistrado.",
+ courtsRulesAppeals: "Apelación: permitida cando hai probas novas ou un erro procesual claro. Debe presentarse nun prazo de 7 días salvo que se indique o contrario.",
+ courtsRulesPrivacy: "Respecta a privacidade e a seguridade. O doxing, o odio ou as ameazas elimínanse. Os xuíces poden editar ou selar partes do expediente para protexer habitantes en risco.",
+ courtsRulesMisconduct: "O acoso, a manipulación ou as probas fabricadas poden levar a unha resolución negativa inmediata.",
+ courtsRulesGlossary: "Caso: rexistro dun conflito. Probas: materiais que respaldan as afirmacións. Veredicto: decisión con remedio. Apelación: solicitude para revisar o veredicto.",
+ courtsFilterActions: "ACCIÓNS",
+ courtsThRole: "Rol",
+ courtsRoleAccuser: "Acusación",
+ courtsRoleDefence: "Defensa",
+ courtsRoleMediator: "Mediador",
+ courtsRoleJudge: "Xuíz",
+ courtsRoleDictator: "Ditador",
+ courtsAssignJudgeTitle: "Elixir un xuíz",
+ courtsAssignJudgeBtn: "Elixir un xuíz",
+ trendingTitle: "Tendencias",
+ exploreTrending: "Explora o contido máis popular da túa rede.",
+ votesButton: "GOBERNO",
+ shopProductButton: "TENDA",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISODIO",
+ campaignButton: "CAMPAÑA",
+ logisticsRouteButton: "RUTA",
+ trendingTotalOpinions: "Total de opinións",
+ trendingNoContentMessage: "Aínda non hai tendencias.",
+ trendingTotalCount: "Total de contadores",
+ tasksTitle: "Tarefas",
+ tasksDescription: "Descobre e xestiona tarefas na túa rede.",
+ taskSearchPlaceholder: "Buscar en Tarefas...",
+ taskTitleLabel: "Título",
+ taskDescriptionLabel: "Descrición",
+ taskStartTimeLabel: "Data de inicio",
+ taskEndTimeLabel: "Data de fin",
+ taskPriorityLabel: "Prioridade",
+ taskPriorityUrgent: "Urxente",
+ taskPriorityHigh: "Alta",
+ taskPriorityMedium: "Media",
+ taskPriorityLow: "Baixa",
+ taskLocationLabel: "Localización",
+ taskTagsLabel: "Etiquetas",
+ taskVisibilityLabel: "Visibilidade",
+ taskPublic: "público",
+ taskPrivate: "privado",
+ taskStatus: "Estado",
+ taskStatusOpen: "Aberta",
+ taskStatusInProgress: "En curso",
+ taskStatusClosed: "Pechada",
+ taskAssignedTo: "Asignada",
+ taskAssignedChip: "Asignada",
+ taskUnassignedChip: "Sen asignar",
+ taskAssignees: "Asignados",
+ taskAssignButton: "Asignarma",
+ taskUnassignButton: "Desasignar",
+ taskCreateButton: "Crear unha tarefa",
+ taskUpdateButton: "Actualizar",
+ taskDeleteButton: "Eliminar",
+ taskFilterAll: "TODAS",
+ taskFilterRecent: "RECENTES",
+ taskFilterMine: "MIÑAS",
+ taskFilterOpen: "ABERTAS",
+ taskFilterInProgress: "EN CURSO",
+ taskFilterClosed: "PECHADAS",
+ taskFilterAssigned: "ASIGNADAS",
+ taskFilterUrgent: "URXENTES",
+ taskFilterHigh: "ALTAS",
+ taskFilterMedium: "MEDIAS",
+ taskFilterLow: "BAIXAS",
+ taskAllSectionTitle: "Tarefas",
+ taskMineSectionTitle: "As túas tarefas",
+ taskCreateSectionTitle: "Crear unha tarefa",
+ taskUpdateSectionTitle: "Actualizar",
+ taskOpenTitle: "Tarefas abertas",
+ taskInProgressTitle: "Tarefas en curso",
+ taskClosedTitle: "Tarefas pechadas",
+ taskAssignedTitle: "Tarefas asignadas",
+ notasks: "Non hai tarefas dispoñibles.",
+ noLocation: "Non se especificou ningunha localización",
+ taskSetStatus: "Establecer o estado",
+ eventDateLabel: "Data",
+ eventRecurrenceLabel: "Recorrencia",
+ eventRecurrenceUntil: "Repetir ata",
+ eventRecurrenceHint: "Deixa baleira a data de repetición para un evento único.",
+ eventUpcomingDates: "Próximas datas",
+ eventsTitle: "Eventos",
+ eventsDescription: "Descobre e xestiona eventos na túa rede.",
+ eventSearchPlaceholder: "Buscar en Eventos...",
+ eventPrice: "Prezo",
+ eventStatus: "Estado",
+ eventAllSectionTitle: "Eventos",
+ eventMineSectionTitle: "Os teus eventos",
+ eventCreateSectionTitle: "Crear un evento",
+ eventUpdateSectionTitle: "Actualizar o evento",
+ eventCreateButton: "Crear un evento",
+ eventAddToCalendar: "Engadir ao calendario",
+ eventVisitCalendar: "Visitar o calendario",
+ viewTask: "Ver a tarefa",
+ viewEvent: "Ver o evento",
+ viewPad: "Ver o pad",
+ viewMap: "Ver o mapa",
+ viewCalendar: "Ver o calendario",
+ viewReport: "Ver o informe",
+ viewTransfer: "Ver a transferencia",
+ viewItem: "Ver o artigo",
+ viewShop: "Ver a tenda",
+ viewProject: "Ver o proxecto",
+ viewJob: "Ver o emprego",
+ viewPlace: "Ver o lugar",
+ generatePdf: "Xerar PDF",
+ sharePm: "Compartir por PM",
+ galleryImages: "Imaxes (tamaño máx.: 75MB cada unha)",
+ galleryPhotos: "Imaxes",
+ galleryAddPhoto: "Engadir unha imaxe",
+ galleryRemovePhoto: "Quitar",
+ galleryVideo: "Vídeo (tamaño máx.: 75MB)",
+ galleryAddVideo: "Engadir un vídeo",
+ galleryRemoveVideo: "Quitar o vídeo",
+ viewVotation: "Ver a votación",
+ voteCastTitle: "Emitir o voto",
+ voteResults: "Resultados",
+ eventTitleLabel: "Título",
+ eventDescriptionLabel: "Descrición",
+ eventDescriptionPlaceholder: "Introduce a descrición do evento...",
+ eventUpdateButton: "Actualizar",
+ eventTagsLabel: "Etiquetas",
+ eventPriceLabel: "Prezo",
+ eventUrlLabel: "URL",
+ eventAttendees: "Asistentes",
+ eventLocation: "Localización",
+ eventLocationLabel: "Localización",
+ noevents: "Non hai eventos dispoñibles.",
+ eventDate: "Data",
+ eventAttendButton: "Asistir ao evento",
+ eventFilterAll: "TODOS",
+ eventFilterRecent: "RECENTES",
+ eventFilterMine: "MEUS",
+ eventFilterToday: "HOXE",
+ eventFilterWeek: "ESTA SEMANA",
+ eventFilterMonth: "ESTE MES",
+ eventFilterYear: "ESTE ANO",
+ eventFilterArchived: "ARQUIVADOS",
+ eventPrivacyLabel: "Visibilidade",
+ eventPublic: "Público",
+ eventPrivate: "Privado",
+ eventAttended: "Asisto",
+ eventUnattended: "Non asisto",
+ eventStatusOpen: "Aberto",
+ eventStatusClosed: "Pechado",
+ tagsTitle: "Etiquetas",
+ tagsDescription: "Descobre e explora patróns de taxonomía na túa rede.",
+ tagsAllSectionTitle: "Etiquetas",
+ tagsTopSectionTitle: "Etiquetas principais",
+ tagsCloudSectionTitle: "Nube de etiquetas",
+ tagsFilterAll: "TODAS",
+ tagsFilterMine: "MIÑAS",
+ tagsFilterRecent: "RECENTES",
+ tagsMineSectionTitle: "As miñas etiquetas",
+ tagsRecentSectionTitle: "Etiquetas recentes",
+ tagsFilterTop: "TOP",
+ tagsFilterCloud: "NUBE",
+ tagsNoItems: "Non hai etiquetas dispoñibles.",
+ tagsSearchPlaceholder: "Buscar en Etiquetas...",
+ tagsTableHeaderTag: "ETIQUETA/LIGAZÓN:",
+ tagsTableHeaderCount: "CONTADOR:",
+ transfersTitle: "Transferencias",
+ transfersDescription: "Descobre e xestiona transferencias na túa rede.",
+ transfersFrom: "De",
+ transfersTo: "A",
+ transfersFilterAll: "TODAS",
+ transfersFilterRecent: "RECENTES",
+ transfersFilterMine: "MIÑAS",
+ transfersFilterMinePending: "PENDENTES",
+ transfersFilterMineConfirmed: "ASINADAS",
+ transfersFilterUBI: "RBU",
+ transfersFilterMarket: "MERCADO",
+ transfersFilterTop: "TOP",
+ transfersFilterPending: "PENDENTES",
+ transfersFilterUnconfirmed: "NON CONFIRMADAS",
+ transfersFilterClosed: "PECHADAS",
+ transfersFilterDiscarded: "DESCARTADAS",
+ transfersFilterEconomic: "ECONÓMICA",
+ transfersFilterTime: "TEMPO",
+ transfersFilterTrust: "CONFIANZA",
+ transfersCategory: "Categoría",
+ transfersCategoryEconomic: "Económica",
+ transfersCategoryTime: "Tempo",
+ transfersCategoryTrust: "Confianza",
+ transfersUnitEco: "ECO",
+ transfersUnitHours: "h",
+ transfersUnitTrust: "confianza",
+ transfersEconomicSectionTitle: "Transferencias económicas",
+ transfersTimeSectionTitle: "Transferencias de tempo",
+ transfersTrustSectionTitle: "Transferencias de confianza",
+ transfersCreateButton: "Crear unha transferencia",
+ transfersUpdateButton: "Actualizar",
+ transfersDeleteButton: "Eliminar",
+ transfersToUser: "ID de Oasis",
+ transfersToUserValidation: "ID de Oasis válido, p. ex. @…=.ed25519",
+ transfersConcept: "Concepto",
+ transfersAmount: "Cantidade",
+ transfersDeadline: "Prazo",
+ transfersTags: "Etiquetas",
+ transfersStatus: "Estado",
+ transfersConfirmations: "CONFIRMACIÓNS",
+ transfersExportContract: "Xerar a factura",
+ transfersConfirmButton: "Confirmar a transferencia",
+ transfersNoItems: "Non se atoparon transferencias.",
+ transfersMineSectionTitle: "As túas transferencias",
+ transfersUBISectionTitle: "Transferencias RBU",
+ transfersTopSectionTitle: "Transferencias principais",
+ transfersPendingSectionTitle: "Transferencias pendentes",
+ transfersUnconfirmedSectionTitle: "Transferencias non confirmadas",
+ transfersClosedSectionTitle: "Transferencias pechadas",
+ transfersDiscardedSectionTitle: "Transferencias descartadas",
+ transfersCreateSectionTitle: "Crear unha transferencia",
+ transfersAllSectionTitle: "Transferencias",
+ transfersSearchPlaceholder: "Buscar en Transferencias...",
+ transfersMinAmountLabel: "Importe mín.",
+ transfersMaxAmountLabel: "Importe máx.",
+ transfersSortRecent: "Máis recentes",
+ transfersSortAmount: "Maior importe",
+ transfersSortDeadline: "Prazo máis próximo",
+ transfersSearchButton: "Buscar",
+ transfersExpiredBadge: "CADUCADA",
+ transfersUpdatedAt: "Actualizado",
+ transfersNoMatch: "Non hai transferencias que coincidan coa túa busca.",
+ votationsTitle: "Votacións",
+ votationsDescription: "Descobre e xestiona votacións na túa rede.",
+ voteMineSectionTitle: "As túas votacións",
+ voteCreateSectionTitle: "Crear unha votación",
+ voteUpdateSectionTitle: "Actualizar",
+ voteOpenTitle: "Votacións abertas",
+ voteClosedTitle: "Votacións pechadas",
+ voteAllSectionTitle: "Goberno",
+ voteCreateButton: "Crear unha votación",
+ voteErrorTitle: "Revisa o formulario",
+ voteErrorDeadlineMin: "A data límite debe ser de polo menos {days} días desde agora.",
+ voteErrorGeneric: "Non se puido gardar a votación.",
+ voteLocked: "Esta votación xa recibiu votos ou opinións, ou pertence ao Parlamento ou aos Tribunais: xa non se pode editar nin borrar.",
+ voteUpdateButton: "Actualizar",
+ voteDeleteButton: "Eliminar",
+ voteOptionYes: "SI",
+ voteOptionNo: "NON",
+ voteOptionAbstention: "ABSTENCIÓN",
+ voteConfused: "CONFUNDIDO",
+ voteFollowMajority: "SEGUIR A MAIORÍA",
+ voteNotInterested: "SEN INTERESE",
+ voteFilterAll: "TODAS",
+ voteFilterRecent: "RECENTES",
+ voteFilterMine: "MIÑAS",
+ voteFilterOpen: "ABERTAS",
+ voteFilterClosed: "PECHADAS",
+ voteQuestionLabel: "Pregunta",
+ voteDeadlineLabel: "Prazo",
+ voteOptionsLabel: "O teu voto",
+ voteBreakdown: "Desagregación",
+ voteFinalResult: "RESULTADO",
+ voteNoQuorum: "SEN QUÓRUM",
+ voteTagsLabel: "Etiquetas",
+ voteDeadline: "Prazo",
+ voteStatus: "Estado",
+ voteTags: "Etiquetas",
+ voteOpinions: "Opinións",
+ novotes: "Non hai propostas de votación dispoñibles.",
+ voteCreatedAt: "Creado o",
+ voteNoQuestion: "Non se proporcionou ningunha pregunta",
+ voteUnknownCreator: "Creador descoñecido",
+ voteUnknownDate: "Data descoñecida",
+ voteDetailSectionTitle: "Detalles da votación",
+ voteCommentsLabel: "Comentarios",
+ voteCommentsForumButton: "Abrir a conversa",
+ voteCommentsSectionTitle: "Conversa aberta",
+ voteNoCommentsYet: "Aínda non hai comentarios. Sé a primeira persoa en opinar.",
+ commentsGoToLast: "Ir ao último comentario",
+ voteNewCommentPlaceholder: "Escribe aquí o teu comentario…",
+ voteNewCommentButton: "Publicar o comentario",
+ voteNewCommentLabel: "Engade un comentario",
+ cvTitle: "CV",
+ cvEditSectionTitle: "Editar o CV",
+ cvCreateSectionTitle: "Crear un CV",
+ cvDescription: "Xestiona e comparte as túas habilidades profesionais e a túa información.",
+ cvNameLabel: "Nome completo",
+ cvDescriptionLabel: "Resumo",
+ cvPhotoLabel: "Foto",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Visitar o CV",
+ cvPersonalExperiencesLabel: "Experiencias persoais",
+ cvPersonalSkillsLabel: "Habilidades persoais (separadas por comas)",
+ cvOasisExperiencesLabel: "Experiencias de contribución en Oasis",
+ cvOasisSkillsLabel: "Habilidades de contribución en Oasis (separadas por comas)",
+ cvEducationExperiencesLabel: "Experiencias educativas",
+ cvEducationalSkillsLabel: "Habilidades educativas (separadas por comas)",
+ cvProfessionalExperiencesLabel: "Experiencias profesionais",
+ cvProfessionalSkillsLabel: "Habilidades profesionais (separadas por comas)",
+ cvLanguagesLabel: "Idiomas",
+ cvLocationLabel: "Localización",
+ cvStatusLabel: "Estado",
+ cvPreferencesLabel: "Preferencias",
+ cvPersonal: "Persoal",
+ cvOasis: "Contribuínte de Oasis (opcional)",
+ cvOasisContributorView: "Contribución",
+ cvEducational: "Educativo (opcional)",
+ cvEducationalView: "Educativo",
+ cvProfessional: "Profesional (opcional)",
+ cvProfessionalView: "Profesional",
+ cvAvailability: "Dispoñibilidade (opcional)",
+ cvUpdateButton: "Actualizar",
+ cvCreateButton: "Crear un CV",
+ cvCreatedAt: "Creado o",
+ cvUpdatedAt: "Actualizado o",
+ cvEditButton: "Actualizar",
+ cvDeleteButton: "Eliminar",
+ cvNoCV: "Non se atopou ningún CV.",
+ blogSubject: "Asunto",
+ blogMessage: "Mensaxe",
+ blogImage: "Subir contido multimedia (máx.: 75MB)",
+ blogMedia: "Anexos (ata 8 imaxes e un vídeo)",
+ blogPublish: "Publicar",
+ pollsTitle: "Enquisas",
+ dataTitle: "Coincidencias",
+ dataDescription: "Explora e visualiza as coincidencias da túa rede.",
+ dataFilterAll: "TODO",
+ dataFilterMine: "MEUS",
+ dataFilterRecent: "RECENTES",
+ dataFilterTop: "TOP",
+ dataKindInhabitants: "HABITANTES",
+ dataKindJobs: "EMPREGOS",
+ dataKindProjects: "PROXECTOS",
+ dataKindEvents: "EVENTOS",
+ dataKindTribes: "TRIBOS",
+ dataKindMarket: "MERCADO",
+ dataKindHousing: "VIVENDA",
+ dataKindIndustry: "INDUSTRIA",
+ dataKindTasks: "TAREFAS",
+ dataKindReports: "INFORMES",
+ dataKindVotes: "VOTACIÓNS",
+ dataSearchPlaceholder: "Buscar en Coincidencias...",
+ dataCohesionTitle: "Coeficiente de cohesión (CC)",
+ dataCcShort: "CC",
+ dataCohesionHint: "Afinidade media entre todo o que publicou a rede.",
+ dataAffinity: "Afinidade",
+ dataCommonTerms: "Palabra clave",
+ dataReasonFollowing: "Apoias a este habitante",
+ dataReasonTribe: "Comparte tribo contigo",
+ dataReasonPinned: "Coincide con algo que fixaches",
+ dataReasonCv: "Coincide coas habilidades do teu CV",
+ dataReasonContent: "Relacionado co que publicas",
+ dataReasonRelated: "Relacionado cos teus intereses",
+ dataReasonAlike: "Publicado por un habitante afín a ti",
+ dataReasonSupportsYou: "Apóiate",
+ dataReasonMutual: "Apoio mutuo",
+ dataReasonRated: "Ben valorado pola rede",
+ dataReasonNear: "Preto de ti",
+ dataStatPeople: "CV",
+ dataStatConnected: "Conectados",
+ dataStatSkills: "Habilidades",
+ dataBestMatch: "Mellor coincidencia",
+ dataStatIsolated: "Illados",
+ dataStatEntities: "Entidades comparadas",
+ dataStatTerms: "Termos distintos",
+ dataStatPairs: "Pares conectados",
+ dataMatchesTitle: "Coincidencias",
+ dataMatchesHint: "Suxestións personalizadas do algoritmo.",
+ dataTermsTitle: "Palabras clave",
+ dataTermsHint: "Os termos que aparecen en máis contidos.",
+ dataConnections: "Coincidencias ligadas",
+ dataTopicTitle: "Todo o relacionado con",
+ dataTopicHint: "O que o algoritmo relaciona con este tema",
+ dataNoMatches: "Non hai datos cruzados que amosar.",
+ dataNoProfile: "Publica contido ou escribe o teu CV para que o algoritmo aprenda que che interesa.",
+ pollsDescription: "Módulo para preguntarlle á rede e contar as respostas.",
+ pollFilterAll: "TODAS",
+ pollFilterMine: "MIÑAS",
+ pollFilterRecent: "RECENTES",
+ pollFilterTop: "TOP",
+ pollFilterVoted: "VOTADAS",
+ pollFilterOpen: "ABERTAS",
+ pollFilterClosed: "PECHADAS",
+ pollCreateButton: "Crear unha enquisa",
+ pollCreateTitle: "Crear unha enquisa",
+ pollEditTitle: "Editar a enquisa",
+ pollQuestion: "Pregunta",
+ pollQuestionPlaceholder: "Que queres preguntar?",
+ pollOptions: "Opcións (unha por liña)",
+ pollOutcome: "Resultado",
+ pollNoVotesYet: "Aínda sen votos",
+ pollTie: "Empate",
+ pollOptionsPlaceholder: "Praza\nParque\nBar",
+ pollAnonymous: "Anónima",
+ pollAnonymousLabel: "Enquisa anónima",
+ pollMultiple: "Resposta múltiple",
+ pollMultipleLabel: "Permitir varias respostas",
+ pollDeadline: "Data límite",
+ pollTags: "Etiquetas",
+ pollPublishButton: "Publicar a enquisa",
+ pollUpdateButton: "Actualizar",
+ pollCloseButton: "Pechar",
+ pollDeleteButton: "Eliminar",
+ pollVoteButton: "Votar",
+ pollChangeVote: "Cambiar o voto",
+ pollVoters: "Votantes",
+ pollComments: "Comentarios",
+ pollStatusLabel: "Estado",
+ pollStatusOpen: "ABERTA",
+ pollStatusClosed: "PECHADA",
+ pollSearchPlaceholder: "Buscar en Enquisas...",
+ pollsNoItems: "Non se atoparon enquisas.",
+ viewPoll: "Ver a enquisa",
+ pollChatCreate: "Crear unha enquisa",
+ pollInChat: "Enquisa",
+ blogTitle: "Blogs",
+ blogDescription: "Módulo para descubrir e xestionar blogs.",
+ blogFilterAll: "TODOS",
+ blogFilterMine: "MEUS",
+ blogFilterRecent: "RECENTES",
+ blogFilterFavorites: "FAVORITOS",
+ blogFilterTop: "TOP",
+ blogCreateButton: "Crear un blog",
+ blogSearchPlaceholder: "Buscar en Blogs...",
+ blogComments: "Comentarios",
+ blogAllowComments: "Permitir comentarios",
+ blogCommentsClosed: "O autor pechou os comentarios deste blog.",
+ blogNoItems: "Non se atoparon blogs.",
+ viewBlog: "Ver o blog",
+ forumTitle: "Foros",
+ forumCategoryLabel: "Categoría",
+ forumTitleLabel: "Título",
+ forumTitlePlaceholder: "Título do foro...",
+ forumCreateButton: "Crear un foro",
+ forumCreateSectionTitle: "Crear un foro",
+ forumDescription: "Fala abertamente con habitantes da túa rede.",
+ forumSearchPlaceholder: "Buscar en Foros...",
+ forumFilterAll: "TODOS",
+ forumFilterMine: "MEUS",
+ forumFilterRecent: "RECENTES",
+ forumFilterTop: "TOP",
+ forumParticipants: "participantes",
+ forumMessages: "mensaxes",
+ forumMessageLabel: "Mensaxe",
+ forumMessagePlaceholder: "Escribe a túa mensaxe...",
+ forumSendButton: "Enviar",
+ noForums: "Aínda non hai foros dispoñibles.",
+ forumVisitButton: "Visitar o foro",
+ forumTopicLabel: "Tema",
+ imageTitle: "Imaxes",
+ imageDescription: "Explora e xestiona contido de imaxes na túa rede.",
+ imageMineSectionTitle: "As túas imaxes",
+ imageCreateSectionTitle: "Subir unha imaxe",
+ imageUpdateSectionTitle: "Actualizar a imaxe",
+ imageAllSectionTitle: "Imaxes",
+ imageRecentSectionTitle: "Imaxes recentes",
+ imageTopSectionTitle: "Imaxes top",
+ imageFavoritesSectionTitle: "Favoritos",
+ imageGallerySectionTitle: "Galería",
+ imageFilterAll: "TODAS",
+ imageFilterMine: "MIÑAS",
+ imageFilterRecent: "RECENTES",
+ imageFilterTop: "TOP",
+ imageFilterFavorites: "FAVORITOS",
+ imageFilterGallery: "GALERÍA",
+ imageCreateButton: "Subir unha imaxe",
+ imageUpdateButton: "Actualizar",
+ imageAddFavoriteButton: "Engadir a favoritos",
+ imageRemoveFavoriteButton: "Quitar de favoritos",
+ imageFileLabel: "Selecciona un ficheiro de imaxe (.jpeg, .jpg, .png, .gif)",
+ imageTagsLabel: "Etiquetas",
+ imageTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ imageTitleLabel: "Título",
+ imageTitlePlaceholder: "Opcional",
+ imageDescriptionLabel: "Descrición",
+ imageDescriptionPlaceholder: "Opcional",
+ imageNoFile: "Non se proporcionou ningún ficheiro de imaxe",
+ noImages: "Non hai imaxes dispoñibles.",
+ imageSearchPlaceholder: "Buscar en Imaxes...",
+ imageSortRecent: "Máis recentes",
+ imageSortOldest: "Máis antigas",
+ imageSortTop: "Máis votadas",
+ imageSearchButton: "Buscar",
+ imageUpdatedAt: "Actualizado",
+ imageNoMatch: "Ningunha imaxe coincide coa túa busca.",
+ feedSearchPlaceholder: "Buscar en Feed...",
+ feedTitle: "Feed",
+ feedDetailTitle: "Feed",
+ feedOpenDiscussion: "Abrir o debate",
+ feedPostComment: "Publicar o comentario",
+ noComments: "Aínda non hai comentarios",
+ createFeedTitle: "Crear un feed",
+ createFeedButton: "Enviar o feed!",
+ feedPlaceholder: "Que está a pasar? (máximo 280 caracteres)",
+ TODAYButton: "HOXE",
+ totalOpinions: "Total de opinións",
+ moreVoted: "Máis votado",
+ noFeedsFound: "Non se atoparon feeds.",
+ createdAtLabel: "Creado o",
+ FeedshareYourOpinions: "Descobre e comparte textos breves na túa rede.",
+ refeedButton: "Reenviar",
+ alreadyRefeeded: "Xa realimentaches isto.",
+ activityTitle: "Actividade",
+ yourActivity: "A túa actividade",
+ globalActivity: "Actividade",
+ activityList: "Actividade",
+ activityDesc: "Consulta a actividade máis recente da túa rede.",
+ allButton: "TODO",
+ mineButton: "MIÑAS",
+ noActions: "Non hai actividade dispoñible.",
+ from: "De",
+ to: "A",
+ amount: "Cantidade",
+ concept: "Concepto",
+ description: "Descrición",
+ meme: "Meme",
+ typeRecent: "RECENTES",
+ typeTop: "TOP",
+ typePost: "BLOG",
+ activityUpdateLabel: "ACTUALIZACIÓN",
+ typeTribe: "TRIBOS",
+ typeLarp: "L.A.R.P.",
+ typeInhabitants: "HABITANTES",
+ typeAbout: "HABITANTES",
+ typeCurriculum: "CV",
+ typeImage: "IMAXES",
+ typeBookmark: "MARCADORES",
+ typeDocument: "DOCUMENTOS",
+ typeVotes: "VOTACIÓNS",
+ typeAudio: "AUDIOS",
+ typeMarket: "MERCADO",
+ typeJob: "EMPREGOS",
+ typeProject: "PROXECTOS",
+ typeVideo: "VÍDEOS",
+ typeVote: "DIFUSIÓN",
+ typeEvent: "EVENTOS",
+ typeTransfer: "TRANSFERENCIAS",
+ typeTask: "TAREFAS",
+ typePixelia: "PIXELIA",
+ typeForum: "FOROS",
+ typeReport: "INFORMES",
+ typeFeed: "FEEDS",
+ typeContact: "CONTACTO",
+ typePub: "PUB",
+ typeTombstone: "ELIMINADO",
+ typeBanking: "BANCA",
+ typeBankWallet: "BANCA/CARTEIRA",
+ typeBankClaim: "BANCA/RBU",
+ typeKarmaScore: "KARMA",
+ typeParliament: "PARLAMENTO",
+ typeSpread: "RÉPLICAS",
+ typeParliamentCandidature: "Parlamento · Candidatura",
+ typeParliamentTerm: "Parlamento · Mandato",
+ typeParliamentProposal:"Parlamento · Proposta",
+ typeParliamentRevocation:"Parlamento · Revogación",
+ typeParliamentLaw: "Parlamento · Nova lei",
+ typeCourts: "TRIBUNAIS",
+ typeCourtsCase: "Tribunais · Caso",
+ typeCourtsEvidence: "Tribunais · Proba",
+ typeCourtsAnswer: "Tribunais · Resposta",
+ typeCourtsVerdict: "Tribunais · Veredicto",
+ typeCourtsSettlement: "Tribunais · Acordo",
+ typeCourtsSettlementProposal: "Tribunais · Proposta de acordo",
+ typeCourtsSettlementAccepted: "Tribunais · Acordo aceptado",
+ typeCourtsNomination: "Tribunais · Nomeamento",
+ typeCourtsNominationVote: "Tribunais · Votación de nomeamento",
+ question: "Pregunta",
+ deadline: "Data límite",
+ status: "Estado",
+ votes: "Votos",
+ totalVotes: "Votos totais",
+ voteTotalVotes: "Votos totais",
+ name: "Nome",
+ skills: "Habilidades",
+ tags: "Etiquetas",
+ title: "Título",
+ date: "Data",
+ category: "Categoría",
+ attendees: "Asistentes",
+ location: "Localización",
+ contentWarning: "Asunto",
+ bankWalletConnected: "Carteira ECOin",
+ bankUbiReceived: "RBU recibida",
+ bankTx: "Tx",
+ bankEpochShort: "Época",
+ viewDetails: "Ver os detalles",
+ link: "Ligazón",
+ activityProjectFollow: "%OASIS% agora está %ACTION% este proxecto %PROJECT%",
+ activityProjectUnfollow: "%OASIS% agora está %ACTION% este proxecto %PROJECT%",
+ following: "SEGUINDO",
+ unfollowing: "DEIXANDO DE SEGUIR",
+ pledged: "ACHEGADO",
+ parliamentCandidatureId: "Candidatura",
+ parliamentGovMethod: "Método",
+ parliamentVotesReceived: "Votos recibidos",
+ parliamentMethodANARCHY: "Anarquía",
+ parliamentMethodVOTE: "Votación comunitaria",
+ parliamentMethodRANKED: "Voto preferencial",
+ parliamentMethodPLURALITY: "Pluralidade",
+ parliamentMethodCOUNCIL: "Consello",
+ parliamentMethodJURY: "Xurado",
+ parliamentAnarchy: "ANARQUÍA",
+ parliamentElectionsStart: "Inicio das eleccións",
+ parliamentElectionsEnd: "Fin das eleccións",
+ parliamentCurrentLeader: "Candidatura gañadora",
+ parliamentProposalTitle: "Título",
+ parliamentOpenVote: "Votación aberta",
+ parliamentStatus: "Estado",
+ parliamentLawQuestion: "Pregunta",
+ parliamentLawMethod: "Método",
+ parliamentLawProposer: "Proponente",
+ parliamentLawEnacted: "Promulgada",
+ parliamentLawVotes: "Votos",
+ createdAt: "Creado o",
+ courtsCaseTitle: "Caso",
+ courtsMethod: "Método",
+ courtsMethodJUDGE: "Xuíz",
+ courtsMethodJUDGES: "Panel de xuíces",
+ courtsMethodSINGLE_JUDGE: "Xuíz único",
+ courtsMethodJURY: "Xurado",
+ courtsMethodCOUNCIL: "Consello",
+ courtsMethodCOMMUNITY: "Comunidade",
+ courtsMethodARBITRATION: "Arbitraxe",
+ courtsMethodVOTE: "Votación comunitaria",
+ courtsAccuser: "Acusación",
+ courtsRespondent: "Defensa",
+ courtsThStatus: "Estado",
+ courtsThAnswerBy: "Responder antes de",
+ courtsThEvidenceBy: "Probas ata",
+ courtsThDecisionBy: "Decisión antes de",
+ courtsVotesNeeded: "Votos necesarios",
+ courtsVotesSlashTotal: "SI/TOTAL",
+ courtsOpenVote: "Votación aberta",
+ courtsAnswerTitle: "Resposta",
+ courtsVerdictResult: "Resultado",
+ courtsVerdictOrders: "Ordes",
+ courtsSettlementText: "Acordo",
+ courtsSettlementAccepted: "Aceptado",
+ courtsJudge: "Xuíz",
+ courtsThSupports: "Apoios",
+ courtsFilterOpenCase: "Abrir un caso",
+ courtsCaseMediatorsPh: "IDs de Oasis dos mediadores, separados por comas",
+ courtsMediatorsLabel: "Mediadores",
+ courtsThCase: "Caso",
+ courtsThCreatedAt: "Data de inicio",
+ courtsPublicPrefLabel: "Visibilidade tras a resolución",
+ courtsPublicPrefYes: "Acepto que este caso sexa totalmente público",
+ courtsPublicPrefNo: "Prefiro manter privados os detalles",
+ courtsPublicPrefSubmit: "Gardar a preferencia de visibilidade",
+ courtsMethodMEDIATION: "Mediación",
+ courtsNoCases: "Non hai casos.",
+ reportsTitle: "Informes",
+ reportsDescription: "Xestiona e segue os informes da túa rede.",
+ reportsSearchPlaceholder: "Buscar en Informes...",
+ reportsFilterAll: "TODOS",
+ reportsFilterRecent: "RECENTES",
+ reportsFilterTop: "TOP",
+ reportsFilterMine: "MEUS",
+ reportsFilterFeatures: "FUNCIÓNS",
+ reportsFilterBugs: "ERROS",
+ reportsFilterAbuse: "ABUSOS",
+ reportsFilterContent: "CONTIDO",
+ reportsFilterConfirmed: "CONFIRMADOS",
+ reportsFilterResolved: "RESOLTOS",
+ reportsFilterOpen: "ABERTOS",
+ reportsFilterUnderReview: "EN REVISIÓN",
+ reportsFilterInvalid: "NON VÁLIDOS",
+ reportsCreateButton: "Crear un informe",
+ reportsTitleLabel: "Título",
+ reportsCategory: "Categoría",
+ reportsCategoryFeatures: "Funcións",
+ reportsCategoryBugs: "Erros",
+ reportsCategoryAbuse: "Abuso",
+ reportsCategoryContent: "Contido",
+ reportsUpdateButton: "Actualizar",
+ reportsDeleteButton: "Eliminar",
+ reportsMineSectionTitle: "Os teus informes",
+ reportsFeaturesSectionTitle: "Solicitudes de funcións",
+ reportsBugsSectionTitle: "Erros",
+ reportsAbuseSectionTitle: "Informes de abuso",
+ reportsContentSectionTitle: "Problemas de contido",
+ reportsAllSectionTitle: "Informes",
+ reportsNoItems: "Non hai informes dispoñibles.",
+ reportsSeverity: "Gravidade",
+ reportsSeverityLow: "Baixa",
+ reportsSeverityMedium: "Media",
+ reportsSeverityHigh: "Alta",
+ reportsSeverityCritical: "Crítica",
+ reportsStatus: "Estado",
+ reportsStatusOpen: "Aberto",
+ reportsStatusUnderReview: "En revisión",
+ reportsStatusResolved: "Resolto",
+ reportsStatusInvalid: "Non válido",
+ reportsConfirmButton: "CONFIRMAR O INFORME!",
+ reportsConfirmations: "Confirmacións",
+ reportsConfirmedSectionTitle: "Informes confirmados",
+ reportsCreateTaskButton: "Crear unha tarefa",
+ reportsOpenSectionTitle: "Informes abertos",
+ reportsUnderReviewSectionTitle: "Informes en revisión",
+ reportsResolvedSectionTitle: "Informes resoltos",
+ reportsInvalidSectionTitle: "Informes non válidos",
+ reportsBugTemplateTitle: "Datos para reproducir (erros)",
+ reportsFeatureTemplateTitle: "Detalles (funcións)",
+ reportsAbuseTemplateTitle: "Detalles (abuso)",
+ reportsContentTemplateTitle: "Detalles (problemas de contido)",
+ reportsStepsToReproduceLabel: "Pasos para reproducilo",
+ reportsStepsToReproducePlaceholder: "1) ...\n2) ...\n3) ...",
+ reportsExpectedBehaviorLabel: "Resultado esperado",
+ reportsExpectedBehaviorPlaceholder: "Que debería pasar?",
+ reportsActualBehaviorLabel: "Resultado real",
+ reportsActualBehaviorPlaceholder: "Que pasa realmente?",
+ reportsEnvironmentLabel: "Contorno",
+ reportsEnvironmentPlaceholder: "Versión, dispositivo, SO, navegador, configuración, rexistros, etc.",
+ reportsReproduceRateLabel: "Frecuencia",
+ reportsReproduceRateAlways: "Sempre",
+ reportsReproduceRateOften: "A miúdo",
+ reportsReproduceRateSometimes: "Ás veces",
+ reportsReproduceRateRarely: "Raramente",
+ reportsReproduceRateUnable: "Non se pode reproducir",
+ reportsReproduceRateUnknown: "Non especificado",
+ reportsProblemStatementLabel: "Problema / necesidade",
+ reportsProblemStatementPlaceholder: "Que problema resolve esta función?",
+ reportsUserStoryLabel: "Historia de habitante",
+ reportsUserStoryPlaceholder: "Como , quero , para .",
+ reportsAcceptanceCriteriaLabel: "Criterios de aceptación",
+ reportsAcceptanceCriteriaPlaceholder: "- Dado...\n- Cando...\n- Entón...",
+ reportsWhatHappenedLabel: "Que ocorreu?",
+ reportsWhatHappenedPlaceholder: "Describe o incidente con contexto e datas aproximadas.",
+ reportsReportedUserLabel: "Habitante / entidade denunciada",
+ reportsReportedUserPlaceholder: "@habitante, feed, ID, ligazón, etc.",
+ reportsEvidenceLinksLabel: "Probas / ligazóns",
+ reportsEvidenceLinksPlaceholder: "Pega ligazóns, IDs de mensaxes, capturas (se procede), etc.",
+ reportsContentLocationLabel: "Onde está o contido",
+ reportsContentLocationPlaceholder: "Ligazón, ID, canle, fío, autor, etc.",
+ reportsWhyInappropriatePlaceholder: "Explica o motivo e o impacto.",
+ reportsRequestedActionLabel: "Acción solicitada",
+ reportsRequestedActionPlaceholder: "Eliminar, agochar, marcar, advertir, etc.",
+ tribesTitle: "Tribos",
+ tribeFilterAll: "TODAS",
+ tribeFilterRecent: "RECENTES",
+ tribeFilterMine: "MIÑAS",
+ tribeFilterMembership: "PERTENZA",
+ tribeFilterSubtribes: "SUBTRIBOS",
+ tribeFilterTop: "TOP",
+ tribeFilterGallery: "GALERÍA",
+ tribeFeedFilterTOP: "TOP",
+ tribeFeedFilterMINE: "MEUS",
+ tribeFeedFilterALL: "TODOS",
+ tribeFeedFilterRECENT: "RECENTES",
+ courtsStanceDENY: "Negar",
+ courtsStanceADMIT: "Admitir",
+ courtsStancePARTIAL: "Admitir en parte",
+ tribeAllSectionTitle: "Tribos",
+ tribeMineSectionTitle: "As túas tribos",
+ tribeCreateSectionTitle: "Crear unha tribo",
+ tribeUpdateSectionTitle: "Actualizar a tribo",
+ tribeGallerySectionTitle: "Galería de tribos",
+ tribeRecentSectionTitle: "Tribos recentes",
+ tribeTopSectionTitle: "Tribos populares",
+ tribeRootLabel: "RAÍZ",
+ tribeDescription: "Explora ou crea tribos na túa rede.",
+ tribeMainTribeLabel: "TRIBO PRINCIPAL",
+ tribeCreateButton: "Crear unha tribo",
+ tribeUpdateButton: "Actualizar",
+ tribeDeleteButton: "Eliminar",
+ tribeImageLabel: "Subir contido multimedia (máx.: 75MB)",
+ tribeTitleLabel: "Título",
+ searchTribesPlaceholder: "Buscar en Tribos...",
+ tribeTitlePlaceholder: "Nome da tribo",
+ tribeDescriptionLabel: "Descrición",
+ tribeDescriptionPlaceholder: "Describe esta tribo",
+ tribeLocationLabel: "Localización",
+ tribeLocationPlaceholder: "Onde está situada esta tribo?",
+ tribeTagsLabel: "Etiquetas",
+ tribeTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ tribeInviteMode: "Modo de convite",
+ tribeModeLabel: "MODO",
+ tribeIsAnonymousLabel: "ESTADO",
+ tribeMembersCount: "Membros",
+ tribeEnterInvite: "INTRODUCIR O CONVITE",
+ subscriptionTitle: "Subscricións",
+ subscriptionOn: "Subscrito",
+ subscriptionOff: "Non subscrito",
+ subscriptionSubscribe: "Subscribirse",
+ subscriptionUnsubscribe: "Cancelar a subscrición",
+ subscriptionSubscribers: "Subscritores",
+ pmListLabel: "Enviar a",
+ pmListNone: "— Sen lista —",
+ pmListNoSubscribers: "Sen subscritores",
+ tribeLeaveButton: "SAÍR",
+ tribePublic: "PÚBLICA",
+ tribePrivate: "PRIVADA",
+ tribeGenerateInvite: "CONVITE ÚNICO",
+ tribeOpenInvitation: "CONVITE ABERTO",
+ tribeJoinOpen: "UNIRSE Á TRIBO",
+ tribeRemoveInvitation: "ELIMINAR O CONVITE",
+ tribeCreatedAt: "Creado o",
+ tribeAuthor: "Por",
+ tribeStrict: "Estrito",
+ tribeOpen: "Aberta",
+ tribeFeedRefeeds: "Redifusións",
+ tribeFeedRefeed: "Redifundir",
+ tribeFeedMessagePlaceholder: "Escribe un feed…",
+ tribeFeedSend: "Enviar",
+ tribeFeedEmpty: "Aínda non hai mensaxes de feed dispoñibles.",
+ noTribes: "Aínda non se atoparon tribos.",
+ tribeNotFound: "Non se atopou a tribo!",
+ createTribeTitle: "Crear unha tribo",
+ updateTribeTitle: "Actualizar a tribo",
+ tribeSectionInhabitants: "Habitantes",
+ tribeSectionVotations: "VOTACIÓNS",
+ tribeSectionEvents: "EVENTOS",
+ tribeSectionTasks: "TAREFAS",
+ tribeSectionFeed: "FEED",
+ tribeSectionForum: "FORO",
+ tribeSectionMedia: "Multimedia",
+ tribeSectionImages: "IMAXES",
+ tribeSectionAudios: "AUDIOS",
+ tribeSectionVideos: "VÍDEOS",
+ tribeSectionDocuments: "DOCUMENTOS",
+ tribeSectionBookmarks: "MARCADORES",
+ tribeSectionMaps: "MAPAS",
+ tribeSectionPads: "PADS",
+ tribeSectionChats: "CHATS",
+ tribeSectionCalendars: "CALENDARIOS",
+ tribePadCreate: "Crear un pad",
+ tribeChatCreate: "Crear un chat",
+ tribeCalendarCreate: "Crear un calendario",
+ tribePadsEmpty: "Aínda non hai pads.",
+ tribeChatsEmpty: "Aínda non hai chats.",
+ tribeCalendarsEmpty: "Aínda non hai calendarios.",
+ tribeInhabitantsEmpty: "Aínda non hai habitantes nesta tribo.",
+ tribeEventCreate: "Crear un evento",
+ tribeEventsEmpty: "Aínda non hai eventos.",
+ tribeEventTitle: "Título",
+ tribeEventDescription: "Descrición",
+ tribeEventDate: "Data",
+ tribeEventLocation: "Localización",
+ tribeEventAttend: "ASISTIR",
+ tribeEventUnattend: "NON ASISTIR",
+ tribeEventAttendees: "Asistentes",
+ tribeTaskCreate: "Crear unha tarefa",
+ tribeTasksEmpty: "Aínda non hai tarefas.",
+ tribeTaskTitle: "Título",
+ tribeTaskDescription: "Descrición",
+ tribeTaskPriority: "Prioridade",
+ tribeTaskDeadline: "Data límite",
+ tribeTaskAssignees: "Asignados",
+ tribeTaskStatusInProgress: "EN CURSO",
+ tribeTaskStatusClosed: "PECHAR",
+ tribeTaskAssign: "ASIGNAR",
+ tribeTaskUnassign: "DESASIGNAR",
+ tribeVotationCreate: "Crear unha votación",
+ tribeVotationsEmpty: "Aínda non hai votacións.",
+ tribeVotationTitle: "Título",
+ tribeVotationDescription: "Descrición",
+ tribeVotationOptions: "Opcións",
+ tribeVotationDeadline: "Data límite",
+ tribeVotationVote: "VOTAR",
+ tribeVotationResults: "Votos",
+ tribeVotationClose: "PECHAR A VOTACIÓN",
+ tribeVotationOptionPlaceholder: "Opción",
+ tribeForumCreate: "Crear un foro",
+ tribeForumEmpty: "Aínda non hai fíos.",
+ tribeForumTitle: "Título",
+ tribeForumText: "Mensaxe",
+ tribeForumCategory: "Categoría",
+ tribeForumReply: "Responder",
+ tribeForumReplies: "Respostas",
+ tribeMediaUpload: "Subir multimedia",
+ readDocument: "Ler o documento",
+ tribeCreateImage: "Crear unha imaxe",
+ tribeCreateAudio: "Crear un audio",
+ tribeCreateVideo: "Crear un vídeo",
+ tribeCreateDocument: "Crear un documento",
+ tribeCreateBookmark: "Crear un marcador",
+ tribeMediaEmpty: "Aínda non hai multimedia.",
+ tribeMediaTitle: "Título",
+ tribeMediaDescription: "Descrición",
+ tribeMediaTypeImage: "Imaxe",
+ tribeMediaTypeVideo: "Vídeo",
+ tribeMediaTypeAudio: "Audio",
+ tribeMediaTypeDocument: "Documento",
+ tribeMediaTypeBookmark: "Marcador",
+ tribeContentDelete: "ELIMINAR",
+ tribeReachTribe: "TRIBO",
+ tribeReachNotice: "OASIS amósao a todos os habitantes e CLEARNET tamén na web aberta. Abrilo deixa unha copia lexible fóra da tribo: volver a TRIBO agóchao, pero as copias xa compartidas non se poden borrar.",
+ tribeReachPrivate: "O contido dunha tribo privada só pode quedar dentro da tribo.",
+ tribeReachOpenedBy: "Aberto por",
+ tribeReachChange: "Onde se publica",
+ tribeInviteCodeText: "Código de convite: ",
+ oasisVersionLabel: "Versión de Oasis",
+ tribeInviteCodeHint: "Comparte este código con quen queiras convidar. Pode unirse desde /invites.",
+ tribeStatusOpen: "ABERTO",
+ tribeStatusClosed: "PECHADO",
+ tribeStatusInProgress: "EN CURSO",
+ tribePriorityLow: "BAIXA",
+ tribePriorityMedium: "MEDIA",
+ tribePriorityHigh: "ALTA",
+ tribePriorityCritical: "CRÍTICA",
+ tribeTaskFilterAll: "TODAS",
+ tribeMediaFilterAll: "TODOS",
+ tribeForumCatGeneral: "XERAL",
+ tribeForumCatProposal: "PROPOSTA",
+ tribeForumCatQuestion: "PREGUNTA",
+ tribeForumCatAnnouncement: "ANUNCIO",
+ tribeStatusLabel: "Estado",
+ tribeSubTribes: "SUBTRIBOS",
+ tribeSubTribesCreate: "Crear unha subtribo",
+ tribeSubTribesStrictDenied: "O modo estrito da tribo non che permite crear novas subtribos. Ponte en contacto co administrador.",
+ tribeActivityRefeed: "REFEED",
+ tribeSectionActivity: "ACTIVIDADE",
+ tribeSectionTrending: "TENDENCIAS",
+ tribeSectionTags: "ETIQUETAS",
+ tribeSectionSearch: "BUSCAR",
+ tribeActivityEmpty: "Aínda non hai actividade.",
+ tribeActivityCreated: "creou",
+ tribeActivityPosted: "publicou",
+ tribeActivityReplied: "respondeu",
+ tribeTrendingEmpty: "Aínda non hai contido en tendencia.",
+ tribeTrendingPeriodDay: "Hoxe",
+ tribeTrendingPeriodWeek: "Esta semana",
+ tribeTrendingPeriodAll: "Todo",
+ tribeTrendingEngagement: "interacción",
+ tribeTopCategory: "Máis votado",
+ tribeTagsEmpty: "Non se atoparon etiquetas.",
+ tribeSearchPlaceholder: "Buscar contido da tribo...",
+ tribeSearchEmpty: "Sen resultados.",
+ tribeSearchResults: "Resultados",
+ tribeSearchMinChars: "Introduce polo menos 2 caracteres para buscar.",
+ agendaTitle: "Axenda",
+ agendaDescription: "Aquí podes atopar todos os teus elementos asignados.",
+ agendaSearchPlaceholder: "Buscar na Axenda...",
+ agendaFilterAll: "TODOS",
+ agendaFilterToday: "HOXE",
+ agendaFilterUpcoming: "PRÓXIMOS",
+ agendaFilterOverdue: "VENCIDOS",
+ agendaFilterOpen: "ABERTOS",
+ agendaFilterClosed: "PECHADOS",
+ agendaFilterTasks: "TAREFAS",
+ agendaFilterMarket: "MERCADO",
+ agendaFilterTribes: "TRIBOS",
+ agendaFilterEvents: "EVENTOS",
+ agendaFilterReports: "INFORMES",
+ agendaFilterTransfers: "TRANSFERENCIAS",
+ agendaFilterJobs: "EMPREGOS",
+ agendaFilterIndustry: "INDUSTRIA",
+ agendaFilterHousing: "VIVENDA",
+ agendaFilterProjects: "PROXECTOS",
+ agendaFilterCalendars: "CALENDARIOS",
+ agendaNoItems: "Non se atoparon asignacións.",
+ agendaDiscardButton: "Descartar",
+ agendaRestoreButton: "Restaurar",
+ agendaRemoveButton: "Quitar",
+ agendaMembersCount: "Membros",
+ agendaLocationLabel: "Localización",
+ agendaYes: "SI",
+ agendaNo: "NON",
+ agendaInviteModeLabel: "Modo de convite",
+ agendaAnonymousLabel: "Modo anónimo",
+ agendaMembersLabel: "Membros",
+ agendareportCategory: "Categoría",
+ agendareportSeverity: "Gravidade",
+ agendareportStatus: "Estado",
+ agendaTransferConcept: "Concepto",
+ agendaTransferAmount: "Cantidade",
+ agendaTransferDeadline: "Prazo",
+ opinionsTitle: "Opinións",
+ shareYourOpinions: "Descobre e vota opinións na túa rede.",
+ author: "Por",
+ voteNow: "Vota agora",
+ alreadyVoted: "Xa opinaches.",
+ noOpinionsFound: "Non se atoparon opinións.",
+ TOPButton: "TOP",
+ opinionsTotalCount: "Total de opinións",
+ voteInteresting: "Interesante",
+ voteNecessary: "Necesario",
+ voteUseful: "Útil",
+ voteInformative: "Informativo",
+ voteWellResearched: "Ben investigado",
+ voteNeedsSources: "Necesita fontes",
+ voteWrong: "Incorrecto",
+ voteLowQuality: "Baixa calidade",
+ voteLove: "Amor",
+ voteClear: "Claro",
+ voteMisleading: "Enganoso",
+ voteOffTopic: "Fóra de tema",
+ voteDuplicate: "Duplicado",
+ voteClickbait: "Cebo de clics",
+ votePropaganda: "Propaganda",
+ voteFunny: "Divertido",
+ voteInspiring: "Inspirador",
+ voteUplifting: "Alentador",
+ voteUnnecessary: "Innecesario",
+ voteRejected: "Rexeitado",
+ voteConfusing: "Confuso",
+ voteTroll: "Troll",
+ voteNsfw: "NSFW",
+ voteViolent: "Violento",
+ voteToxic: "Tóxico",
+ voteHarassment: "Acoso",
+ voteHate: "Odio",
+ voteScam: "Estafa",
+ voteTriggering: "Provocador",
+ voteInsightful: "Perspicaz",
+ voteAccurate: "Preciso",
+ voteActionable: "Aplicable",
+ voteCreative: "Creativo",
+ voteSpam: "Spam",
+ voteAdultOnly: "Só adultos",
+ privateMessage: "MP",
+ pmSendTitle: "Mensaxes privadas",
+ pmSend: "Enviar!",
+ pmCancel: "Cancelar",
+ pmReset: "Restablecer",
+ pmSharedKeyHint: "Comparte esta chave co destinatario por outra canle. É necesaria para descifrar.",
+ pmDescription: "Usa este formulario para enviar unha mensaxe/ficheiro cifrado a outros habitantes.",
+ pmComposeTitle: "Enviar unha mensaxe",
+ pmRecipients: "Destinatarios",
+ pmRecipientsHint: "Introduce os IDs de Oasis separados por comas",
+ pmLimitsHint: "Ata 7 habitantes por mensaxe.",
+ pmTextPlaceholder: "Escribe a túa mensaxe.",
+ pmSubject: "Asunto",
+ pmSubjectHint: "Introduce o asunto da mensaxe",
+ pmText: "Mensaxe",
+ pmCrypterChip: "2xE2E",
+ pmCrypterDecryptButton: "Descifrar",
+ fileShareTitle: "Compartir un ficheiro",
+ fileShareRecipientPlaceholder: "@...=.ed25519",
+ fileShareFileLabel: "Ficheiro",
+ fileShareDownload: "Descargar",
+ fileShareMutualError: "Só podes compartir ficheiros con habitantes que se apoien mutuamente contigo.",
+ fileShareNoFile: "Non se seleccionou ningún ficheiro.",
+ fileShareTooLarge: "O ficheiro supera o tamaño permitido.",
+ fileShareFailed: "Non se puido preparar o ficheiro.",
+ fileShareSendError: "Non se puido enviar o ficheiro.",
+ fileShareUnavailable: "Este ficheiro non está dispoñible agora mesmo. Téntao máis tarde.",
+ pmCrypterBadKey: "A chave compartida é incorrecta!",
+ pmCrypterTooLong: "A mensaxe é demasiado longa para cifrala co Crypter. Acúrtaa e téntao de novo.",
+ pmCrypterCipherLabel: "Mensaxe recifrada",
+ pmCrypterCharsLabel: "caracteres",
+ pmInvalidRecipients: "Oasis ID non válido (debería ser como @…=.ed25519).",
+ pmEncryptionLabel: "Cifrado",
+ private: "Buzón",
+ privateDescription: "Xestiona as túas mensaxes privadas.",
+ privateInbox: "BUZÓN",
+ privateSent: "ENVIADAS",
+ privateDelete: "Borrar",
+ pmCreateButton: "Escribir unha MP",
+ noPrivateMessages: "Non hai mensaxes privadas.",
+ pmReply: "Responder",
+ pmReplies: "respostas",
+ inReplyTo: "EN RESPOSTA A",
+ forumInThread: "NO FÍO",
+ pmPreview: "Previsualizar",
+ pmPreviewTitle: "Vista previa",
+ performed: "→",
+ pmFromLabel: "De:",
+ pmToLabel: "Para:",
+ pmNoSubject: "(sen asunto)",
+ pmSubjectLabel: "Asunto:",
+ pmBotJobs: "JobsBot",
+ pmBotProjects: "ProjectsBot",
+ pmBotMarket: "MarketBot",
+ pmBotShops: "ShopsBot",
+ pmBotPolitical: "PoliticalBot",
+ politicalBotLarpTitle: "A casa gobernante do L.A.R.P cambiou.",
+ politicalBotParliamentTitle: "Comezou un novo ciclo de goberno no Parlamento.",
+ politicalBotTribeTitle: "Comezou un novo ciclo de goberno nunha das túas tribos.",
+ politicalBotLarpIntro: "Agora goberna {house} durante este ciclo: {cycle}",
+ politicalBotParliamentIntro: "O goberno actual é {gov}",
+ politicalBotParliamentIntroLeader: "O goberno actual é {gov}, exercido por {leader}",
+ politicalBotTribeIntro: "O goberno actual na tribo {tribe} é {gov}",
+ politicalBotTribeIntroLeader: "O goberno actual na tribo {tribe} é {gov}, exercido por {leader}",
+ politicalBotLeaderLabel: "Líder",
+ inboxJobSubscribedTitle: "Nova subscrición á túa oferta de emprego",
+ pmInhabitantWithId: "Habitante con ID OASIS:",
+ pmHasSubscribedToYourJobOffer: "subscribiuse á túa oferta de emprego",
+ inboxMarketItemSoldTitle: "Artigo vendido",
+ inboxShopSoldTitle: "Produto vendido",
+ pmYourItem: "O teu artigo",
+ pmHasBeenSoldTo: "vendeuse a",
+ pmFor: "por",
+ inboxProjectPledgedTitle: "Nova achega ao teu proxecto",
+ pmHasPledged: "achegou",
+ pmToYourProject: "ao teu proxecto",
+ blockchain: "Explorador",
+ blockchainDescription: "Explora e visualiza os bloques da cadea.",
+ blockchainNoBlocks: "Non se atoparon bloques na cadea.",
+ blockchainStatsTitle: "Estatísticas",
+ blockchainStatsTypeBreakdown: "Desagregación por tipo",
+ blockchainStatsTopAuthors: "Autores principais",
+ blockchainStatsCount: "Bloques",
+ blockchainBlockID: "ID do bloque",
+ blockchainBlockAuthor: "Autoría",
+ blockchainBlockCarbon: "Pegada de carbono",
+ blockchainBlockType: "Tipo",
+ blockchainBlockTimestamp: "Marca de tempo",
+ blockchainLatestDatagram: "Último datagrama",
+ blockchainDatagram: "Datagrama",
+ blockchainDetails: "Ver os detalles do bloque",
+ blockchainViewBlockexplorer: "Ver en Blockexplorer",
+ blockchainBack: "Volver a Blockexplorer",
+ banking: "Banca",
+ bankingTitle: "Banca",
+ bankingDescription: "A economía colectiva de ECOin.",
+ bankOverview: "Resumo",
+ bankEpochs: "Épocas",
+ bankRules: "Regras",
+ pending: "Pendentes",
+ closed: "Pechadas",
+ bankClaimNow: "Reclamar",
+ bankClaimUBI: "Reclamar RBU",
+ bankClaimAndPay: "Reclamar e pagar",
+ bankClaimedPending: "Reclamación pendente...",
+ bankStatusClaimed: "Reclamado",
+ bankStatusExpired: "Caducado",
+ bankPubOnly: "Operación só para PUBs",
+ bankEpoch: "Época",
+ bankPool: "Fondo (esta época)",
+ bankWeightsSum: "Suma de pesos",
+ bankNoAllocations: "Non se atoparon asignacións.",
+ bankNoEpochs: "Non se atoparon épocas.",
+ bankEpochAllocations: "Asignacións da época",
+ bankAllocId: "ID de asignación",
+ bankAllocDate: "Data",
+ bankAllocConcept: "Concepto",
+ bankAllocFrom: "De",
+ bankAllocTo: "Para",
+ bankAllocAmount: "Cantidade",
+ bankAllocStatus: "Estado",
+ bankEpochId: "ID de época",
+ bankRuleHash: "Hash da instantánea de regras",
+ bankViewEpoch: "Ver a época",
+ bankYourIndustryBalance: "A túa parte da industria",
+ bankYourUbiMonth: "A túa RBU (este mes)",
+ bankYourFundsMonth: "Fondos totais",
+ bankIndustryBalance: "Produción industrial",
+ bankUserBalance: "O teu saldo",
+ bankAddresses: "Enderezos",
+ bankNoAddresses: "Non se atoparon enderezos.",
+ bankUser: "ID de Oasis",
+ bankAddress: "Enderezo",
+ bankAddAddressTitle: "Engadir un enderezo de ECOin",
+ bankAddAddressUser: "ID de Oasis",
+ bankAddAddressLabel: "Etiqueta (opcional)",
+ bankAddAddressLabelPlaceholder: "Carteira de Bob, tenda de Alice…",
+ bankAddAddressUserOptional: "Oasis ID (opcional)",
+ bankAddressUnnamed: "Enderezo sen nome",
+ bankAddAddressAddress: "Enderezo de ECOin",
+ bankAddAddressSave: "Gardar",
+ bankAddressAdded: "Enderezo engadido",
+ bankAddressUpdated: "Enderezo actualizado",
+ bankAddressExists: "O enderezo xa existe",
+ bankAddressInvalid: "Enderezo non válido",
+ bankAddressDeleted: "Enderezo eliminado",
+ bankAddressNotFound: "Non se atopou o enderezo",
+ bankAddressForbidden: "Só podes configurar o teu propio enderezo de cobro",
+ bankAddressTotal: "Total de enderezos",
+ bankAddressSearch: "Buscar @habitante ou enderezo",
+ bankAddressActions: "Accións",
+ bankAddressDelete: "Eliminar",
+ bankAddressSource: "Fonte",
+ bankAddressDeleteConfirm: "Queres eliminar este enderezo?",
+ search: "Buscar!",
+ bankLocal: "Local",
+ bankFromOasis: "Rede",
+ pubIdLabel: "PUB ID",
+ bankUbiAvailableNo: "SEN FONDOS!",
+ bankUbiAvailableOk: "DISPOÑIBLE!",
+ bankUbiAvailability: "RBU",
+ bankAlreadyClaimedThisMonth: "Xa reclamada este mes",
+ bankUbiThisMonth: "RBU (este mes)",
+ bankUbiLastClaimed: "RBU (última reclamada)",
+ bankUbiNeverClaimed: "Nunca reclamada",
+ bankUbiTotalClaimed: "RBU (total reclamado)",
+ bankUbiPub: "PUB",
+ bankUbiInhabitant: "HABITANTE",
+ bankUbiClaimedAmount: "RECLAMADO (ECO)",
+ typeBankUbiResult: "BANCA - RBU",
+ bankNoPubConfigured: "Non hai ningún PUB configurado. Establece o ID do teu PUB en Configuración.",
+ shopsTitle: "Tendas",
+ shopDescription: "Descobre e xestiona tendas na rede.",
+ shopTitle: "Tenda",
+ shopUpload: "Crear unha tenda",
+ shopAllSectionTitle: "Tendas",
+ shopMineSectionTitle: "As miñas tendas",
+ shopRecentSectionTitle: "Tendas recentes",
+ shopTopSectionTitle: "Tendas destacadas",
+ shopProductsSectionTitle: "Produtos destacados",
+ shopPricesSectionTitle: "Produtos por prezo",
+ shopFavoritesSectionTitle: "Favoritas",
+ shopCreateSectionTitle: "Crear unha tenda",
+ shopUpdateSectionTitle: "Actualizar a tenda",
+ shopCreate: "Crear",
+ shopUpdate: "Actualizar",
+ shopDelete: "Eliminar",
+ shopReachClearnet: "Clearnet",
+ shopReachOasis: "Oasis",
+ encryptedChipLabel: "E2E",
+ transportChipLabel: "Cifrado en tránsito",
+ shopAddFavorite: "Engadir a favoritas",
+ shopRemoveFavorite: "Quitar de favoritas",
+ shopOpen: "ABERTA",
+ shopClosed: "PECHADA",
+ shopMakePrivate: "FACELA PRIVADA (E2E)",
+ shopMakePublic: "FACELA PÚBLICA",
+ shopProducts: "Produtos",
+ shopFilterAll: "TODAS",
+ shopFilterRecent: "RECENTES",
+ shopFilterMine: "MIÑAS",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUTOS",
+ shopFilterPrices: "PREZOS",
+ shopFilterFavorites: "FAVORITOS",
+ shopProductAdd: "Engadir un produto",
+ shopProductTitle: "Produto",
+ shopProductUpdate: "Actualizar o produto",
+ shopProductPrice: "Prezo (ECO)",
+ shopProductStock: "Stock",
+ shopProductUntitled: "Produto sen título",
+ shopUntitled: "Tenda sen título",
+ shopNoItems: "Non se atoparon tendas.",
+ shopNoProducts: "Aínda non hai produtos.",
+ shopOutOfStock: "Esgotado",
+ shopBuy: "Comprar",
+ shopBuyEncryptedNote: "Os teus datos de entrega envíanse cifrados; só o dono da tenda pode velos.",
+ shopBuyDeliveryAddress: "Enderezo de entrega",
+ shopBuyContact: "Contacto",
+ shopBuyContactPlaceholder: "correo, teléfono, etc.",
+ shopBuyNotes: "Notas",
+ shopBuyDeliveryRequired: "O enderezo de entrega é obrigatorio.",
+ shopOrdersTitle: "Pedidos",
+ shopOrdersDescription: "Pedidos recibidos por esta tenda.",
+ shopOrdersEmpty: "Aínda non hai pedidos.",
+ shopOrderProduct: "Produto",
+ shopOrderPrice: "Prezo",
+ shopOrderBuyer: "Comprador",
+ shopBackToShop: "Volver á tenda",
+ marketVisitItem: "VER O ARTIGO",
+ shopStatus: "ESTADO",
+ shopCreatedAt: "CREADA",
+ shopSearchPlaceholder: "Buscar en Tendas...",
+ shopUrl: "URL",
+ shopLocation: "Localización",
+ shopTags: "Etiquetas",
+ shopVisibility: "Visibilidade",
+ shopShortDescription: "Descrición curta",
+ shopShortDescriptionPlaceholder: "Descrición breve para as tarxetas (máx. 160 caracteres)",
+ shopTitlePlaceholder: "Nome da túa tenda",
+ shopDescriptionPlaceholder: "Descrición detallada da túa tenda",
+ shopLocationPlaceholder: "Cidade, País",
+ shopTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ mapTitlePlaceholder: "Título do mapa",
+ shopProductFeatured: "Produto destacado",
+ shopSendToMarket: "Enviar ao mercado",
+ typeShop: "TENDAS",
+ typeShopProduct: "PRODUTO DE TENDA",
+ bankExchange: "Intercambio",
+ bankExchangeCurrentValue: "Valor de ECOin (1h)",
+ bankTotalSupply: "Oferta total de ECOin",
+ bankPubsSupply: "Oferta de ECOin do fondo dos PUBs",
+ bankHoldingSupply: "Oferta de ECOin fóra da RBU",
+ bankHoursOfWork: "horas",
+ bankUnitMs: "ms",
+ bankUnitSeconds: "segundos",
+ bankUnitMinutes: "minutos",
+ bankUnitDays: "días",
+ bankExchangeNoData: "Non hai datos dispoñibles",
+ bankInflation: "Inflación de ECOin (anual)",
+ bankInflationMonthly: "Inflación de ECOin (mensual)",
+ bankExchangeChartTitle: "Evolución do valor de ECOin ao longo do tempo",
+ bankExchangeChartValue: "Valor (ECO/h)",
+ bankExchangeChartSupply: "Oferta",
+ bankExchangeChartInflation: "Inflación %",
+ bankExchangeChartEmpty: "Aínda non hai mostras suficientes — volve máis tarde",
+ bankCurrentSupply: "Oferta actual de ECOin",
+ bankingSyncStatus: "Estado de ECOin",
+ bankingSyncStatusSynced: "Sincronizado",
+ bankingSyncStatusOutdated: "Sen sincronizar",
+ statsTitle: "Estatísticas",
+ statistics: "Estatísticas",
+ statsDescription: "Descobre estatísticas sobre a túa rede.",
+ ALLButton: "TODO",
+ RECENTButton: "RECENTES",
+ MINEButton: "MIÑAS",
+ TOMBSTONEButton: "ELIMINADOS",
+ statsCreatedAt: "Creado o",
+ statsYourContent: "Contido",
+ statsYourOpinions: "Opinións",
+ statsNetworkContent: "Contido",
+ statsNetworkOpinions: "Opinións",
+ statsEcoWalletLabel: "Carteira ECOin",
+ walletAddressCopyHint: "Preme para seleccionar e copiar",
+ statsEcoWalletNotConfigured: "Non configurada!",
+ statsBookmark: "Marcadores",
+ statsEvent: "Eventos",
+ statsTask: "Tarefas",
+ statsVotes: "Votos",
+ statsMarket: "Mercado",
+ statsForum: "Foros",
+ statsJob: "Empregos",
+ statsReport: "Informes",
+ statsFeed: "Feed",
+ statsTribe: "Tribos",
+ statsImage: "Imaxes",
+ statsAudio: "Audios",
+ statsVideo: "Vídeos",
+ statsDocument: "Documentos",
+ statsMap: "Mapas",
+ statsShop: "Tendas",
+ statsShopProduct: "Produtos de tenda",
+ statsTransfer: "Transferencias",
+ statsAiExchange: "IA",
+ statsPUBs: "PUBs",
+ statsSyncedPeers: "Nodos",
+ statsTotalLabel: "Total",
+ statsPost: "Publicacións",
+ statsSize: "Total (tamaño)",
+ statsBlockchainSize: "Blockchain (tamaño)",
+ statsBlobsSize: "Blobs (tamaño)",
+ statsActivity7d: "Actividade (últimos 7 días)",
+ statsActivity7dTotal: "Total 7 días",
+ statsActivity30dTotal: "Total 30 días",
+ day: "Día",
+ messages: "Mensaxes",
+ statsProject: "Proxectos",
+ statsProjectsTitle: "Proxectos",
+ statsProjectsTotal: "Total de proxectos",
+ statsProjectsActive: "Activos",
+ statsProjectsCompleted: "Completados",
+ statsProjectsPaused: "En pausa",
+ statsProjectsCancelled: "Cancelados",
+ statsProjectsGoalTotal: "Meta total",
+ statsProjectsPledgedTotal: "Achega total",
+ statsMarketTitle: "Mercado",
+ statsMarketTotal: "Artigos totais",
+ statsMarketForSale: "En venda",
+ statsMarketReserved: "Reservados",
+ statsMarketClosed: "Pechados",
+ statsMarketSold: "Vendidos",
+ statsUsersTitle: "Habitantes",
+ user: "Habitante",
+ statsTombstoneRatio: "Ratio de eliminados (%)",
+ bankingUserEngagementScore: "Puntuación de KARMA",
+ statsParliamentCandidature: "Candidaturas do parlamento",
+ statsParliamentTerm: "Mandatos do parlamento",
+ statsParliamentProposal: "Propostas do parlamento",
+ statsParliamentRevocation: "Revogacións do parlamento",
+ statsParliamentLaw: "Leis do parlamento",
+ statsCourtsCase: "Casos xudiciais",
+ statsCourtsEvidence: "Probas xudiciais",
+ statsCourtsAnswer: "Respostas xudiciais",
+ statsCourtsVerdict: "Veredictos xudiciais",
+ statsCourtsSettlement: "Acordos xudiciais",
+ statsCourtsSettlementProposal: "Propostas de acordo",
+ statsCourtsSettlementAccepted: "Acordos aceptados",
+ statsCourtsNomination: "Nomeamentos de xuíces",
+ statsCourtsNominationVote: "Votos de nomeamento",
+ ai: "IA",
+ aiTitle: "IA",
+ aiDescription: "Unha Intelixencia Artificial Colectiva (IAC) chamada '42' que aprende da túa rede.",
+ aiUserQuestion: "Pregunta",
+ aiResponseTitle: "Resposta",
+ aiSubmitButton: "Enviar!",
+ aiSettingsDescription: "Configura o teu prompt (máx. 128 caracteres) para o modelo de IA.",
+ aiPrompt: "Proporciona unha resposta informativa e precisa.",
+ aiConfiguration: "Configurar o prompt",
+ aiPromptUsed: "Indicación",
+ aiClearHistory: "Borrar o historial",
+ aiServerError: "Non podo responder ben. Téntao de novo.",
+ aiStatusLoading: "42 está a cargar o modelo. Pregunta de novo nun momento.",
+ aiThinking: "Pensando",
+ aiWaiting: "Agardando",
+ aiStatusMissingModel: "O modelo de IA non está instalado: falta src/AI/oasis-42-1-chat.Q4_K_M.gguf.",
+ aiExportFineTuning: "Exportar Fine-Tuning",
+ aiFactsTitle: "Datos da túa rede",
+ aiInputPlaceholder: "Que é Oasis?",
+ typeAiExchange: "IA",
+ aiApproveTrain: "Engadir ao adestramento colectivo",
+ aiRejectTrain: "Non adestrar",
+ aiTrainApproved: "Aprobado para o adestramento",
+ aiTrainRejected: "Rexeitado para o adestramento",
+ aiSnippetsUsed: "Fragmentos usados",
+ aiSnippetsLearned: "Fragmentos aprendidos",
+ statsAITraining: "Adestramento de IA",
+ aiCustomAnswerPlaceholder: "Escribe a túa resposta personalizada…",
+ marketMineSectionTitle: "Os teus artigos",
+ marketCreateSectionTitle: "Crear un artigo",
+ marketUpdateSectionTitle: "Actualizar",
+ marketAllSectionTitle: "Mercado",
+ marketTitle: "Mercado",
+ marketDescription: "Un mercado para intercambiar bens ou servizos na túa rede.",
+ marketFilterAll: "TODOS",
+ marketFilterMine: "MEUS",
+ marketFilterAuctions: "POXAS",
+ marketFilterItems: "INTERCAMBIO",
+ marketFilterNew: "NOVO",
+ marketFilterUsed: "USADO",
+ marketFilterBroken: "ROTO",
+ marketFilterForSale: "EN VENDA",
+ marketFilterSold: "VENDIDO",
+ marketFilterDiscarded: "DESCARTADO",
+ marketFilterRecent: "RECENTES",
+ marketFilterMyBids: "POXAS FEITAS",
+ marketCreateButton: "Vender algo",
+ marketItemType: "Tipo",
+ marketItemTitle: "Título",
+ marketItemAvailable: "Data límite",
+ marketItemDescription: "Descrición",
+ marketItemDescriptionPlaceholder: "Describe o artigo que vendes",
+ marketItemStatus: "Estado",
+ marketShopLabel: "Tenda",
+ marketItemCondition: "Condición",
+ marketItemPrice: "Prezo",
+ marketItemTags: "Etiquetas",
+ marketItemTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ marketItemDeadline: "Data límite",
+ marketItemIncludesShipping: "Inclúe o envío?",
+ marketItemHighestBid: "Poxa máis alta",
+ marketItemStock: "Existencias",
+ marketOutOfStock: "Sen stock",
+ marketActionsUpdate: "Actualizar",
+ marketUpdateButton: "Actualizar",
+ marketActionsDelete: "Eliminar",
+ marketActionsChangeStatus: "CAMBIAR O ESTADO",
+ marketActionsBuy: "COMPRAR!",
+ marketAuctionBids: "Poxas actuais",
+ marketPlaceBidButton: "Poxar",
+ marketItemSeller: "Vendedor",
+ marketNoItems: "Aínda non hai artigos dispoñibles.",
+ marketYourBid: "A túa poxa",
+ marketCreateFormImageLabel: "Subir contido multimedia (máx.: 75MB)",
+ marketSearchPlaceholder: "Buscar no Mercado...",
+ marketMinPriceLabel: "Prezo mínimo",
+ marketMaxPriceLabel: "Prezo máximo",
+ marketSortRecent: "Máis recentes",
+ marketSortPrice: "Prezo",
+ marketSortDeadline: "Data límite",
+ marketSearchButton: "Buscar",
+ marketAuctionEndsIn: "Remata",
+ marketAuctionEnded: "Rematou",
+ marketNoItemsMatch: "Non hai artigos que coincidan coa túa busca.",
+ housingTitle: "Vivenda",
+ housingDescriptionText: "Descobre e xestiona lugares na túa rede.",
+ modulesHousingLabel: "Vivenda",
+ modulesHousingDescription: "Módulo para descubrir e xestionar lugares.",
+ typeHousing: "VIVENDA",
+ housingFilterAll: "TODO",
+ housingFilterMine: "MEUS",
+ housingFilterRequested: "SOLICITADOS",
+ housingFilterSale: "VENDA",
+ housingFilterRent: "ALUGUER",
+ housingFilterCouchsurfing: "COUCHSURFING",
+ housingFilterOpen: "DISPOÑIBLES",
+ housingFilterClosed: "NON DISPOÑIBLES",
+ housingFilterRecent: "RECENTES",
+ housingFilterTop: "TOP",
+ housingType: "Oferta",
+ housingTypeSALE: "En venda",
+ housingTypeRENT: "En aluguer",
+ housingTypeCOUCHSURFING: "Couchsurfing",
+ housingProperty: "Inmoble",
+ housingPropertyAPARTMENT: "Piso",
+ housingPropertyHOUSE: "Casa",
+ housingPropertyROOM: "Habitación",
+ housingPropertyLAND: "Terreo",
+ housingPropertyOTHER: "Outro",
+ housingTitleLabel: "Título",
+ housingTitlePlaceholder: "Nome do lugar",
+ housingDescription: "Descrición",
+ housingDescriptionPlaceholder: "Describe o lugar, o barrio, que inclúe: baños, xardín, camas…",
+ housingRules: "Normas",
+ housingRulesPlaceholder: "Mascotas, fumar, horas de silencio, estadía mínima…",
+ housingPlace: "Lugar",
+ housingPlacePlaceholder: "País, cidade, enderezo",
+ housingPrice: "Prezo",
+ housingPriceLabel: "Prezo (ECO)",
+ housingSizeLabel: "Superficie (m²)",
+ housingFree: "GRATIS",
+ housingPerMonth: "/mes",
+ housingRooms: "Habitacións",
+ housingSize: "Superficie",
+ housingCapacity: "Hóspedes",
+ housingAvailableFrom: "Dispoñible desde",
+ housingAvailableTo: "Dispoñible ata",
+ housingTags: "Etiquetas",
+ spreadEditWarning: "Este contido perderá as súas réplicas ao editalo",
+ housingRequests: "Solicitudes",
+ housingRequestButton: "Solicitar",
+ housingCancelButton: "Cancelar a solicitude",
+ housingRequestedBadge: "SOLICITADO",
+ housingStatus: "Estado",
+ housingStatusOPEN: "DISPOÑIBLE",
+ housingStatusCLOSED: "NON DISPOÑIBLE",
+ housingSetOpen: "Marcar como dispoñible",
+ housingSetClosed: "Marcar como non dispoñible",
+ housingCreateButton: "Crear un lugar",
+ housingUpdateButton: "Actualizar",
+ housingSearchPlaceholder: "Buscar en Vivenda...",
+ housingSearchButton: "Buscar",
+ housingMinPrice: "Prezo mín.",
+ housingMaxPrice: "Prezo máx.",
+ housingSortRecent: "Máis recentes",
+ housingSortPrice: "Prezo máis baixo",
+ housingSortRequests: "Máis solicitados",
+ housingSortRating: "Mellor valorados",
+ housingNoItems: "Non se atoparon lugares.",
+ jobsTitle: "Emprego",
+ jobsCandidatesTitle: "Candidatos suxeridos",
+ jobsCandidatesDescription: "Habitantes con competencias que encaixan con este emprego. Envíalles unha mensaxe privada para convidalos.",
+ jobsCandidatesPmBody: "Ola, creo que o teu perfil encaixa coa miña oferta de emprego",
+ jobsDescription: "Descobre e xestiona ofertas de emprego na túa rede.",
+ jobsFilterRecent: "RECENTES",
+ jobsFilterMine: "MEUS",
+ jobsFilterAll: "TODOS",
+ jobsFilterRemote: "REMOTOS",
+ jobsFilterOpen: "ABERTOS",
+ jobsFilterClosed: "PECHADOS",
+ jobsCV: "CV",
+ jobsCreateJob: "Publicar un emprego",
+ jobsRecentTitle: "Empregos recentes",
+ jobsMineTitle: "Os teus empregos",
+ jobsAllTitle: "Ofertas de emprego",
+ jobsRemoteTitle: "Empregos remotos",
+ jobsOpenTitle: "Empregos abertos",
+ jobsClosedTitle: "Empregos pechados",
+ jobsCVTitle: "CV",
+ jobsFilterPresencial: "PRESENCIAL",
+ jobsFilterFreelancer: "FREELANCE",
+ jobsFilterEmployee: "ASALARIADO",
+ jobsPresencialTitle: "Empregos presenciais",
+ jobsFreelancerTitle: "Empregos freelance",
+ jobsEmployeeTitle: "Empregos asalariados",
+ jobTitle: "Título",
+ jobLocation: "Localización",
+ jobSalary: "Salario (ECO/1h)",
+ jobVacants: "Vacantes",
+ jobDescription: "Descrición",
+ jobRequirements: "Requisitos",
+ jobLanguages: "Idiomas",
+ jobStatus: "Estado",
+ jobStatusOPEN: "ABERTA",
+ jobStatusCLOSED: "PECHADA",
+ jobSetClosed: "Marcar como PECHADA",
+ jobSubscribeButton: "Únete a esta oferta!",
+ jobUnsubscribeButton: "Sae desta oferta!",
+ jobTitlePlaceholder: "Introduce o título do emprego",
+ jobDescriptionPlaceholder: "Describe o posto",
+ jobRequirementsPlaceholder: "Introduce os requisitos",
+ jobLanguagesPlaceholder: "Inglés, francés, castelán, galego...",
+ jobTasksPlaceholder: "Lista de tarefas",
+ jobLocationPresencial: "Presencial",
+ jobLocationRemote: "Remoto",
+ jobVacantsPlaceholder: "Número de vacantes",
+ jobImage: "Subir contido multimedia (máx.: 75MB)",
+ jobTasks: "Tarefas",
+ jobType: "Tipo de emprego",
+ jobTime: "Tempo de traballo",
+ jobSubscribers: "Subscritores",
+ noSubscribers: "Sen subscritores",
+ jobsFilterTop: "TOP",
+ jobsTopTitle: "Empregos mellor pagados",
+ createJobButton: "Publicar un emprego",
+ noJobsFound: "Non se atoparon ofertas de emprego.",
+ jobAuthor: "Por",
+ jobTypeFreelance: "Autónomo",
+ jobTypeSalary: "Asalariado",
+ jobTypeExchange: "Intercambio de horas",
+ jobTypeEXCHANGE: "INTERCAMBIO DE HORAS",
+ jobsFilterExchange: "INTERCAMBIO",
+ jobsExchangeTitle: "Empregos por intercambio de horas",
+ jobsHoursOffered: "Horas ofrecidas",
+ jobsHoursRequested: "Horas pedidas a cambio",
+ jobsExchangeSkill: "Habilidade solicitada a cambio",
+ jobTimePartial: "Parcial",
+ jobTimeComplete: "Completa",
+ jobsUpdateButton: "ACTUALIZAR",
+ jobsFilterApplied: "CANDIDATURA",
+ jobsAppliedTitle: "As miñas candidaturas",
+ jobsAppliedBadge: "Inscrito",
+ jobsSearchPlaceholder: "Buscar en Emprego...",
+ jobsMinSalaryLabel: "Salario mín.",
+ jobsMaxSalaryLabel: "Salario máx.",
+ jobsSortRecent: "Máis recentes",
+ jobsSortSalary: "Maior salario",
+ jobsSortSubscribers: "Máis candidatos",
+ jobsSearchButton: "Buscar",
+ jobsApplicants: "Candidatos",
+ jobsUpdatedAt: "Actualizado",
+ jobSetOpen: "Marcar como aberta",
+ jobsTagsLabel: "Etiquetas",
+ noJobsMatch: "Non hai ofertas que coincidan coa túa busca.",
+ industrySearchPlaceholder: "Buscar en Industria...",
+ industryAllSectors: "Todos os sectores",
+ industryVisitButton: "Visitar Industria",
+ industryAdvanceTo: "Cambiar a",
+ industryAmount: "Cantidade",
+ industryApproveBuild: "Aprobar",
+ industryBlueprint: "Plano",
+ industryBlueprints: "Planos",
+ industryBuild: "Produción",
+ industryBuildNotes: "Notas",
+ industryBuildStart: "Data de inicio",
+ industryVoteUpdateButton: "Votar a actualización",
+ industryVoteDeleteButton: "Votar o borrado",
+ industryRevokeVote: "Revogar",
+ industryTimeLeft: "Tempo restante",
+ industryBuildEnd: "Data de fin",
+ industryBuilds: "Producións",
+ industryBuildTitle: "Título",
+ industryContribute: "Contribuír",
+ industryContributeButton: "Contribuír",
+ industryContributions: "Contribucións",
+ industryCreateBlueprintButton: "Crear un plano",
+ industryDistribute: "Distribuír",
+ industryDistributeButton: "Distribuír por cotas",
+ industryDistribution: "Distribución",
+ industryEcoAmount: "Cantidade (ECO)",
+ industryEditBlueprint: "Editar o plano",
+ industryFacility: "Fábrica",
+ industryKindLabel: "Tipo",
+ industryKind_labor: "Man de obra",
+ industryKind_material: "Material",
+ industryKind_eco: "Fondos",
+ industryLaborHours: "Man de obra (horas)",
+ industryHours: "Horas",
+ industryMaterialItem: "Material",
+ industryMaterials: "Materiais",
+ industryEstMaterials: "Total de materiais",
+ industryEstLabor: "Total de man de obra",
+ industryEstTotal: "Prezo estimado",
+ industryBuildingPrice: "Prezo de construción",
+ industryFinalPrice: "Prezo final",
+ industryBlueprintDescPlaceholder: "Especificacións, dimensións, peso, documentación…",
+ industryMaterialValue: "Valor (ECO)",
+ industryMember: "Membro",
+ industryNewBlueprint: "Novo plano",
+ industryNewBuild: "Propoñer unha produción",
+ industryEditBuild: "Editar a produción",
+ industryNeedBlueprint: "Crea primeiro un plano: cada produción fabrica un.",
+ industryNoBlueprints: "Aínda non hai planos.",
+ industryNoBuilds: "Aínda non hai producións.",
+ industryNote: "Nota",
+ industryOutput: "Saída",
+ industryOutputKind: "Tipo de produto",
+ industryOutputValue: "Valor de saída (ECO, p. ex. da venda)",
+ industryPostJob: "Crear un emprego",
+ industryPot: "Bote",
+ industryProposeBuildButton: "Propoñer a produción",
+ industryProposer: "Proponente",
+ industryAuthor: "Autor",
+ industrySellOnMarket: "Enviar ao mercado",
+ industrySendToProjects: "Crear un proxecto",
+ industrySkills: "Habilidades",
+ industryTreasury: "Tesouraría",
+ industryKind_physical: "Físico",
+ industryKind_digital: "Dixital",
+ industryBuildStatus_PROPOSED: "PROPOSTA",
+ industryBuildStatus_REJECTED: "REXEITADA",
+ industryBuildStatus_APPROVED: "APROBADA",
+ industryBuildStatus_STOCKING: "ABASTECÉNDOSE",
+ industryBuildStatus_IN_PRODUCTION: "EN PRODUCIÓN",
+ industryBuildStatus_COMPLETED: "COMPLETADA",
+ industryBuildStatus_FAILED: "FALLIDA",
+ pmBotIndustry: "IndustryBot",
+ pmBotHousing: "HousingBot",
+ jobsBotMatchTitle: "Un emprego encaixa co teu currículo",
+ jobsBotMatchIntro: "Un emprego encaixa co teu currículo.",
+ jobsBotMatchJob: "Emprego",
+ jobsBotMatchHint: "Recibes isto porque o teu currículo está xestionado por IA. Podes desactivalo no teu CV.",
+ cvAiManaged: "Xestionado por IA",
+ switchOn: "ACTIVADO",
+ switchOff: "DESACTIVADO",
+ cvAiManagedHint: "Se está activo, JobsBot avísate por mensaxe privada cando un emprego encaixa co teu currículo.",
+ cvMatchThreshold: "Avisarme a partir deste nivel de coincidencia",
+ housingBotRequestedTitle: "Alguén solicitou un dos teus lugares.",
+ housingBotCancelledTitle: "Cancelouse unha solicitude sobre un dos teus lugares.",
+ housingBotYouRequestedTitle: "Solicitaches un lugar.",
+ housingBotYouCancelledTitle: "Cancelaches unha solicitude.",
+ housingBotUnavailableTitle: "Un lugar que solicitaches xa non está dispoñible.",
+ housingBotUnavailableSentTitle: "Avisaches a quen solicitou este lugar.",
+ industryBotAdmittedTitle: "Admitíronte nunha fábrica.",
+ industryBotApplicationTitle: "Nova solicitude de ingreso na túa fábrica.",
+ industryBotInvitedTitle: "Convidáronte a unha fábrica.",
+ industryBotDissolvedTitle: "Disolveuse unha fábrica á que pertences.",
+ industryBotBuildApprovedTitle: "Aprobouse unha produción.",
+ industryBotDistributedTitle: "Distribuíuse a saída dunha produción.",
+ industryFilterRules: "REGRAS",
+ industryRulesTitle: "Regras",
+ industryRulesIntro: "Industria permite aos habitantes posuír colectivamente os medios de produción: unha Fábrica é un obradoiro da rede que ninguén posúe de forma privada.",
+ industryRulesSteward: "O fundador é o mordomo — un custodio, non un dono: non pode vender, privatizar nin disolver a Fábrica pola súa conta.",
+ industryRulesMembership: "A política de pertenza define como se unen os habitantes: Aberta (entras ao instante), Por voto (admíteche o voto dos membros) ou Só por convite (un membro debe convidarte antes).",
+ industryRulesQuorum: "O quórum é o número mínimo de membros que deben votar para que unha decisión conte, para que unha Fábrica pequena non a decida un só habitante.",
+ industryRulesMajority: "A maioría é a fracción de votos necesaria para aprobar (0,5 = metade, 1 = unanimidade); unha decisión apróbase cando os SI chegan polo menos a max(quórum, membros × maioría).",
+ industryRulesDecisions: "Os membros votan para admitir novos, aprobar producións e disolver a Fábrica; o mordomo non pode saltarse estas decisións colectivas.",
+ industryRulesBlueprints: "Os planos son receitas libres (COPYLEFT) — as entradas (materiais, horas de traballo, habilidades) e a saída (un ben físico ou dixital) — e calquera pode bifurcalas.",
+ industryRulesBuilds: "Unha produción é unha orde de fabricación: PROPOSTA → APROBADA (por voto) → ABASTECÉNDOSE → EN PRODUCIÓN → COMPLETADA, e só acepta contribucións unha vez aprobada.",
+ industryRulesContributions: "Os membros achegan traballo (horas), materiais (valor declarado en ECO) ou ECO a unha produción; cada achega gaña karma.",
+ industryRulesLaborRate: "A tarifa de traballo é o valor en ECO dunha hora de traballo nesta Fábrica; converte horas en karma para comparar esforzo e capital de forma xusta: karma = horas × tarifa + valor material + ECO.",
+ industryRulesShares: "A túa cota nunha produción é o teu karma ÷ karma total, e determina canto do valor de saída recibes.",
+ industryRulesDistribution: "Cando unha produción se completa, o mordomo reparte o bote (os fondos da produción máis o valor de venda) entre quen contribuíu, en proporción á súa participación.",
+ industryRulesTreasury: "O mordomo custodia as achegas en ECO como tesouraría da produción ata o reparto; todos os movementos quedan rexistrados na rede e as disputas poden ir aos Tribunais.",
+ industryJobs: "Empregos",
+ industryReportButton: "Informar",
+ industryCreateTask: "Crear unha tarefa",
+ industryOpenDispute: "Abrir unha disputa",
+ industryMaterialsPlaceholder: "placa-solar:2:120\nbatería:1:80\nkit:1:15",
+ industryCreateInvite: "Xerar un convite",
+ industryPauseVotes: "Votos de estado",
+ industryTitle: "Industria",
+ industryDescription: "Módulo para xestionar colectivamente os medios de produción.",
+ typeIndustryBuild: "PRODUCIÓN",
+ typeIndustryBlueprint: "PLANO",
+ typeIndustryAllocation: "DISTRIBUCIÓN",
+ typeIndustry: "INDUSTRIA",
+ modulesIndustryLabel: "Industria",
+ modulesIndustryDescription: "Módulo para xestionar colectivamente os medios de produción.",
+ industryFilterAll: "TODAS",
+ industryFilterRecent: "RECENTES",
+ industryFilterMember: "MEMBRO",
+ industryFilterBlueprints: "PLANOS",
+ industryFilterBuilds: "PRODUCIÓNS",
+ industryFilterMine: "MIÑAS",
+ industryFilterActive: "EN MARCHA",
+ industryFilterPaused: "EN PAUSA",
+ industryFilterDissolved: "DISOLTAS",
+ industryAllTitle: "Industria",
+ industryRecentTitle: "Fábricas recentes",
+ industryMemberTitle: "Fábricas nas que estou",
+ industryMineTitle: "As miñas fábricas",
+ industryActiveTitle: "En marcha",
+ industryPausedTitle: "Fábricas en pausa",
+ industryDissolvedTitle: "Fábricas disoltas",
+ industryNoFacilitiesFound: "Non se atoparon fábricas.",
+ industryCreateFacility: "Crear unha fábrica",
+ industryMembers: "Membros",
+ industryMemberBadge: "MEMBRO",
+ industryName: "Nome",
+ industryNamePlaceholder: "Nome da fábrica",
+ industryDescriptionLabel: "Descrición",
+ industryDescriptionPlaceholder: "Que produce esta fábrica?",
+ industrySector: "Sector",
+ industryMembershipPolicy: "Política de pertenza",
+ industryQuorum: "Quórum",
+ industryMajority: "Maioría",
+ industryLaborRate: "Tarifa de traballo",
+ industryCreateButton: "Crear a fábrica",
+ industryUpdateButton: "Actualizar",
+ industrySteward: "Mordomo",
+ industryStatusActive: "EN MARCHA",
+ industryStatusPaused: "EN PAUSA",
+ industryStatusDissolved: "DISOLTA",
+ industryStatusLabel: "Estado",
+ industryJoinButton: "Unirse",
+ industryApplyButton: "Solicitar o ingreso",
+ industryLeaveButton: "Saír",
+ industryInviteButton: "Convidar",
+ industryInvitePlaceholder: "@...=.ed25519",
+ industryInviteNeeded: "Necesitas un convite para unirte.",
+ industryPauseButton: "Votar a pausa",
+ industryResumeButton: "Votar a reanudación",
+ industryDeleteButton: "Eliminar",
+ industryPendingApplicants: "Solicitudes pendentes",
+ industryVotesYes: "si",
+ industryVotesNo: "non",
+ industryAlreadyVoted: "votado",
+ industryAdmit: "Admitir",
+ industryReject: "Rexeitar",
+ industryDissolveTitle: "Disolver a fábrica",
+ industryDissolveVote: "Votar a disolución",
+ industryPolicy_open: "Aberta",
+ industryPolicy_vote: "Por voto",
+ industryPolicy_invite: "Só por convite",
+ projectsTitle: "Proxectos",
+ projectsDescription: "Crea, financia e segue proxectos impulsados pola comunidade na túa rede.",
+ projectSearchPlaceholder: "Buscar en Proxectos...",
+ projectCreateProject: "Crear un proxecto",
+ projectCreateButton: "Crear un proxecto",
+ projectUpdateButton: "ACTUALIZAR",
+ projectDeleteButton: "ELIMINAR",
+ projectNoProjectsFound: "Non se atoparon proxectos.",
+ projectFilterAll: "TODOS",
+ projectFilterMine: "OS MEUS PROXECTOS",
+ projectFilterActive: "ACTIVOS",
+ projectFilterPaused: "EN PAUSA",
+ projectFilterCompleted: "COMPLETADOS",
+ projectFilterFollowing: "SEGUIDOS",
+ projectFilterRecent: "RECENTES",
+ projectFilterTop: "TOP",
+ projectAllTitle: "Proxectos",
+ projectMineTitle: "Os teus proxectos",
+ projectActiveTitle: "Proxectos activos",
+ projectPausedTitle: "Proxectos en pausa",
+ projectCompletedTitle: "Proxectos completados",
+ projectFollowingTitle: "Proxectos seguidos",
+ projectRecentTitle: "Proxectos recentes",
+ projectTopTitle: "Mellor financiados",
+ projectTitlePlaceholder: "Nome do proxecto",
+ projectImage: "Subir contido multimedia (máx.: 75MB)",
+ projectDescription: "Descrición",
+ projectDescriptionPlaceholder: "Conta a historia e os obxectivos…",
+ projectGoal: "Meta (ECO)",
+ projectGoalPlaceholder: "50000",
+ projectDeadline: "Data límite",
+ projectProgress: "Progreso inicial (%)",
+ projectStatus: "Estado",
+ projectFunding: "Financiamento",
+ projectPledged: "Comprometido",
+ projectSetStatus: "Establecer o estado",
+ projectSetProgress: "Actualizar o progreso",
+ projectFollowButton: "SEGUIR",
+ projectUnfollowButton: "DEIXAR DE SEGUIR",
+ projectStatusACTIVE: "ACTIVO",
+ projectStatusPAUSED: "EN PAUSA",
+ projectStatusCOMPLETED: "COMPLETADO",
+ projectStatusCANCELLED: "CANCELADO",
+ projectPledgeTitle: "Apoia este proxecto",
+ projectPledgePlaceholder: "Cantidade en ECO",
+ projectBounties: "Recompensas",
+ projectNoBounties: "Non se atoparon recompensas.",
+ projectTitle: "Título",
+ projectMilestoneSelect: "Seleccionar unha fita",
+ projectBountyCreateButton: "Crear unha recompensa",
+ projectBountyStatus: "Estado da recompensa",
+ projectBountyOpen: "aberta",
+ projectBountyClaimed: "reclamada",
+ projectBountyDone: "completada",
+ projectBountyClaimedBy: "reclamada por",
+ projectBountyClaimButton: "reclamar",
+ projectBountyCompleteButton: "Marcar como completada",
+ projectMilestones: "Fitos",
+ projectAddMilestoneTitle: "Novo fito",
+ projectMilestoneTitle: "Título do fito",
+ projectMilestoneTargetPercent: "Porcentaxe (%)",
+ projectMilestoneDueDate: "Data",
+ projectMilestoneStatus: "Estado do fito",
+ projectMilestoneOpen: "aberto",
+ projectMilestoneDone: "completado",
+ projectMilestoneDue: "vence",
+ projectMilestoneMarkDone: "Marcar como feito",
+ projectMilestoneTitlePlaceholder: "Introduce o título do fito",
+ projectMilestoneDescriptionPlaceholder: "Introduce a descrición deste fito",
+ projectMilestoneDescription: "Descrición do fito",
+ projectBudgetAssigned: "Asignado a recompensas",
+ projectBudgetOver: "⚠ Orzamento excedido: o asignado supera o obxectivo",
+ projectFollowers: "Seguidores",
+ projectFollowersTitle: "Seguidores",
+ projectFollowersNone: "Aínda non hai seguidores.",
+ projectMore: "máis",
+ projectYouFollowHint: "Segues este proxecto",
+ projectBackers: "Patrocinadores",
+ projectBackersTitle: "Patrocinadores",
+ projectBackersTotal: "Total de patrocinadores",
+ projectBackersTotalPledged: "Total achegado",
+ projectBackersYourPledge: "A túa achega",
+ projectBackersNone: "Aínda non hai achegas.",
+ projectFilterBackers: "MECENAS",
+ projectFilterApplied: "ACHEGANDO",
+ projectAppliedTitle: "ACHEGANDO",
+ projectBackersLeaderboardTitle: "Mecenas destacados",
+ projectNoBackersFound: "Non hai mecenas.",
+ projectBackerAmount: "Total achegado",
+ projectBackerPledges: "Achegas",
+ projectBackerProjects: "Proxectos",
+ projectSelectMilestoneOrBounty: "Seleccionar un fito ou unha recompensa",
+ projectPledgeButton: "Achegar",
+ footerLicense: "GPLv3",
+ modulesModuleName: "Nome",
+ modulesModuleDescription: "Descrición",
+ modulesModuleStatus: "Estado",
+ modulesTotalModulesLabel: "Total",
+ modulesEnabledModulesLabel: "Activados",
+ modulesDisabledModulesLabel: "Desactivados",
+ modulesInvitesLabel: "Convites",
+ modulesInvitesDescription: "Módulo para xestionar e aplicar códigos de convite.",
+ modulesWalletLabel: "Carteira",
+ modulesWalletDescription: "Módulo para xestionar os teus activos dixitais (ECOin).",
+ modulesCipherLabel: "Cifrado",
+ modulesCipherDescription: "Módulo para cifrar e descifrar o teu texto de forma simétrica (cun contrasinal compartido).",
+ modulesBookmarksLabel: "Marcadores",
+ modulesBookmarksDescription: "Módulo para descubrir e xestionar marcadores.",
+ modulesVideosLabel: "Vídeos",
+ modulesVideosDescription: "Módulo para descubrir e xestionar vídeos.",
+ modulesDocsLabel: "Documentos",
+ modulesDocsDescription: "Módulo para descubrir e xestionar documentos.",
+ modulesAudiosLabel: "Audios",
+ modulesAudiosDescription: "Módulo para descubrir e xestionar audios.",
+ modulesTagsLabel: "Etiquetas",
+ modulesTagsDescription: "Módulo para descubrir e explorar patróns de taxonomía (etiquetas).",
+ modulesImagesLabel: "Imaxes",
+ modulesImagesDescription: "Módulo para descubrir e xestionar imaxes.",
+ modulesTrendingLabel: "Tendencias",
+ modulesTrendingDescription: "Módulo para explorar o contido máis popular.",
+ modulesEventsLabel: "Eventos",
+ modulesEventsDescription: "Módulo para descubrir e xestionar eventos.",
+ modulesTasksLabel: "Tarefas",
+ modulesTasksDescription: "Módulo para descubrir e xestionar tarefas.",
+ modulesMarketLabel: "Mercado",
+ modulesMarketDescription: "Módulo para intercambiar bens ou servizos.",
+ modulesShopsLabel: "Tendas",
+ modulesShopsDescription: "Módulo para xestionar e descubrir tendas.",
+ modulesTribesLabel: "Tribos",
+ modulesTribesDescription: "Módulo para explorar ou crear tribos (grupos).",
+ modulesVotationsLabel: "Votacións",
+ modulesVotationsDescription: "Módulo para descubrir e xestionar votacións.",
+ modulesParliamentLabel: "Parlamento",
+ modulesParliamentDescription: "Módulo para elixir gobernos e votar leis.",
+ modulesCourtsLabel: "Tribunais",
+ modulesCourtsDescription: "Módulo para resolver conflitos e emitir veredictos.",
+ modulesReportsLabel: "Informes",
+ modulesReportsDescription: "Módulo para xestionar e facer o seguimento de informes sobre problemas, erros, abusos e avisos de contido.",
+ modulesOpinionsLabel: "Opinións",
+ modulesOpinionsDescription: "Módulo para descubrir e votar opinións.",
+ modulesTransfersLabel: "Transferencias",
+ modulesTransfersDescription: "Módulo para descubrir e xestionar contratos intelixentes (transferencias).",
+ modulesFediverseLabel: "Multiverso",
+ modulesBlogsLabel: "Blogs",
+ modulesBlogsDescription: "Módulo para descubrir e xestionar blogs.",
+ modulesPollsLabel: "Enquisas",
+ modulesPollsDescription: "Módulo para preguntarlle á rede e contar as respostas.",
+ modulesFediverseDescription: "Xestiona as túas outras contas do multiverso, incluído enviar e recibir contido.",
+ modulesFeedLabel: "Feed",
+ modulesFeedDescription: "Módulo para descubrir e compartir textos breves (feeds).",
+ modulesPixeliaLabel: "Pixelia",
+ modulesPixeliaDescription: "Módulo para debuxar nunha grella colaborativa.",
+ modulesMelodyLabel: "Melody",
+ modulesMelodyDescription: "Módulo para xerar e compartir o \"son\" da túa blockchain.",
+ modulesAgendaLabel: "Axenda",
+ modulesAgendaDescription: "Módulo para xestionar todos os teus elementos asignados.",
+ modulesAILabel: "IA",
+ modulesAIDescription: "Módulo para falar cun LLM chamado '42'.",
+ modulesForumLabel: "Foros",
+ modulesForumDescription: "Módulo para descubrir e xestionar foros.",
+ modulesJobsLabel: "Emprego",
+ modulesJobsDescription: "Módulo para descubrir e xestionar ofertas de emprego.",
+ modulesProjectsLabel: "Proxectos",
+ modulesProjectsDescription: "Módulo para explorar, financiar e xestionar proxectos.",
+ modulesBankingLabel: "Banca",
+ modulesBankingDescription: "Módulo para xestionar o tesouro común: valor de ECOin, impostos e RBU.",
+ modulesFavoritesLabel: "Favoritos",
+ modulesFavoritesDescription: "Módulo para xestionar o teu contido favorito.",
+ fileTooLargeTitle: "Ficheiro demasiado grande",
+ fileTooLargeMessage: "O ficheiro supera o tamaño máximo permitido (75 MB). Por favor, selecciona un ficheiro máis pequeno.",
+ goBack: "Volver",
+ errorDismiss: "De acordo",
+ errorPageTitle: "Produciuse un erro",
+ errorNoAllocation: "Non se atopou ningunha asignación para esta reclamación.",
+ errorInvalidClaim: "Esta asignación non se pode reclamar.",
+ visibilityLabel: "Visibilidade",
+ clearnetPrivateConflict: "Un contido privado, oculto, pechado, só por invitación ou de pago non se pode publicar na CLEARNET. Escolle OASIS ou faino público.",
+ visibilityPublic: "Pública",
+ visibilityHidden: "Oculta",
+ visibilityMakePublic: "Facela pública",
+ visibilityMakeHidden: "Facela oculta",
+ invitesInhabitantsTitle: "Habitantes",
+ aiNavPlaceholder: "Describe o que necesitas...",
+ aiNavDisabled: "A navegación con IA está desactivada.",
+ aiNavResultsTitle: "Suxestións de AINav",
+ aiNavQueryLabel: "Consulta",
+ aiNavResultMatch: "Coincidencia",
+ aiNavResultsEmpty: "Non hai rutas coincidentes. Proba con /search.",
+ modulesAINavLabel: "AINav",
+ modulesAINavDescription: "Módulo para facer peticións en linguaxe natural sobre o contido da rede.",
+ directConnectDescription: "Conéctate directamente a un nodo introducindo o seu enderezo IP, porto e chave pública. O nodo engadirase como conexión seguida.",
+ peerHost: "IP",
+ peerPort: "Porto",
+ peerPublicKey: "Chave pública (@...ed25519)",
+ connectAndFollow: "Conectar",
+ modulesPresetTitle: "Configuracións comúns",
+ workflowsTitle: "Fluxos de traballo",
+ workflowsDescription: "Un fluxo de traballo fixa o tema e que módulos están activos.",
+ workflowsSet: "Aplicar o fluxo de traballo",
+ workflow_default: "Por defecto",
+ workflow_jobs: "Emprego",
+ workflow_social: "Social",
+ workflow_business: "Negocios",
+ workflow_night: "Noite",
+ workflow_kids: "Nenos",
+ workflow_activists: "Activismo",
+ workflow_mobile: "Móbil",
+ statsCarbonFootprintTitle: "Pegada de carbono",
+ statsCarbonTombstone: "Pegada dos borrados (tombstoning)",
+ uploadMedia: "Subir contido multimedia (máx.: 75MB)",
+ invitesUnfollow: "Deixar de seguir",
+ invitesFollow: "Seguir",
+ invitesUnfollowedInvites: "Non federadas",
+ invitesNoUnfollowed: "Non hai pubs non federados.",
+ reportsWhyInappropriateLabel: "Por que é inadecuado?",
+ blockchainContentDeleted: "Este contido foi eliminado",
+ visitContent: "Visitar o contido",
+ favoriteAdd: "Fixar en favoritos",
+ pmContentTooltip: "Enviar unha mensaxe privada",
+ phoneCallTooltip: "Facer unha chamada",
+ favoriteRemove: "Quitar de favoritos",
+ reportContent: "Denunciar o contido",
+ bankEcoinHours: "Equivalencia de ECOin en tempo (1 ECO)",
+ mapsLabel: "Mapas",
+ mapTitle: "Mapas",
+ mapDescription: "Xestiona e comparte mapas sen conexión na túa rede.",
+ mapMineSectionTitle: "Os teus mapas",
+ mapCreateSectionTitle: "Crear un mapa",
+ mapUpdateSectionTitle: "Actualizar o mapa",
+ mapAllSectionTitle: "Mapas",
+ mapRecentSectionTitle: "Mapas recentes",
+ mapFavoritesSectionTitle: "Favoritos",
+ mapFilterAll: "TODOS",
+ mapFilterMine: "MEUS",
+ mapFilterRecent: "RECENTES",
+ mapFilterFavorites: "FAVORITOS",
+ mapUploadButton: "Crear un mapa",
+ mapCreateButton: "Crear un mapa",
+ mapUpdateButton: "Actualizar",
+ mapDeleteButton: "Eliminar",
+ mapAddFavoriteButton: "Engadir a favoritos",
+ mapRemoveFavoriteButton: "Quitar de favoritos",
+ mapLatLabel: "Latitude",
+ mapLatPlaceholder: "p. ex. 42.8782",
+ mapLngLabel: "Lonxitude",
+ mapLngPlaceholder: "p. ex. -8.5448",
+ mapDescriptionLabel: "Descrición",
+ mapDescriptionPlaceholder: "Describe o mapa ou a localización...",
+ mapTypeLabel: "Tipo de mapa",
+ mapInviteMode: "Convite",
+ mapTypeSingle: "ÚNICO",
+ mapTypeOpen: "ABERTO",
+ mapTypeClosed: "PECHADO",
+ mapTagsLabel: "Etiquetas",
+ mapTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ mapUrlLabel: "URL do mapa",
+ mapMarkersTitle: "Marcadores",
+ mapMarkerDefault: "Marcador",
+ mapMarkerLatLabel: "Latitude do marcador",
+ mapMarkerLngLabel: "Lonxitude do marcador",
+ mapMarkerLabelField: "Etiqueta do marcador",
+ mapMarkerLabelPlaceholder: "Describe este marcador...",
+ markerImageLabel: "Imaxe do marcador",
+ mapAddMarkerTitle: "Engadir un marcador",
+ mapAddMarkerButton: "Engadir un marcador",
+ mapCleanMarkerButton: "Limpar o marcador",
+ mapApplyZoom: "Aplicar o zoom",
+ mapPlaceSearchPlaceholder: "Buscar un lugar ou país...",
+ mapNoPlaces: "Non se atoparon lugares.",
+ mapClusterTitle: "marcadores aquí, preme para achegar",
+ mapDeleteMarker: "Eliminar marcador",
+ mapZoomIn: "Achegar",
+ mapZoomOut: "Afastar",
+ mapFitMarkers: "Axustar a todos os marcadores",
+ mapPanLabel: "Mover o mapa",
+ mapCenterHere: "Centrar aquí",
+ mapNear: "preto de",
+ mapPickedSpot: "Punto escollido",
+ mapPickHint: "Preme no mapa para escoller un punto.",
+ mapClearPick: "Limpar",
+ mapSearchPlaceholder: "Buscar en Mapas...",
+ mapSearchButton: "Buscar",
+ mapUpdatedAt: "Actualizado",
+ mapNoMatch: "Ningún mapa coincide coa túa busca.",
+ noMaps: "Non hai mapas dispoñibles.",
+ mapLocationTitle: "Localización",
+ mapVisitLabel: "Visitar o mapa",
+ typeMap: "MAPAS",
+ typeMapMarker: "MARCADOR DE MAPA",
+ modulesMapLabel: "Mapas",
+ modulesMapDescription: "Módulo para xestionar e compartir mapas sen conexión.",
+ emergenciesTitle: "Emerxencias",
+ modulesEmergenciesLabel: "Emerxencias",
+ modulesEmergenciesDescription: "Módulo para lanzar, confirmar e seguir emerxencias na rede.",
+ emergenciesDescription: "Módulo para lanzar, confirmar e seguir emerxencias na rede.",
+ emergencyCreate: "Crear unha emerxencia",
+ emergencyUpdate: "Actualizar",
+ emergencyDelete: "Borrar",
+ emergencyTitleLabel: "Título",
+ emergencyTitlePlaceholder: "Que está a pasar?",
+ emergencyTextLabel: "Detalles",
+ emergencyTextPlaceholder: "Onde, desde cando, que facer...",
+ emergencyCategoryLabel: "Categoría",
+ emergencyCategoryWeather: "METEOROLOXÍA",
+ emergencyCategoryInfrastructure: "INFRAESTRUTURA",
+ emergencyCategoryHealth: "SAÚDE",
+ emergencyCategorySecurity: "SEGURIDADE",
+ emergencyCategoryLost: "PERDIDOS",
+ emergencyCategoryNeighborhood: "VECIÑANZA",
+ emergencyExpiresLabel: "Caduca en",
+ emergencyExpires1d: "1 día",
+ emergencyExpires3d: "3 días",
+ emergencyExpires7d: "1 semana",
+ emergencyExpires30d: "1 mes",
+ emergencyExpiresNone: "Indefinido",
+ emergencyExpiresKeep: "Manter a data actual",
+ emergencyTagsLabel: "Etiquetas",
+ emergencyTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ emergencyFilterAll: "TODAS",
+ emergencyFilterMine: "MIÑAS",
+ emergencyFilterRecent: "RECENTES",
+ emergencySeverityUnverified: "SEN VERIFICAR",
+ emergencySeverityLow: "BAIXA",
+ emergencySeverityMedium: "MEDIA",
+ emergencySeverityHigh: "ALTA",
+ emergencyStatusActive: "ACTIVA",
+ emergencyStatusResolved: "RESOLTA",
+ emergencyStatusExpired: "CADUCADA",
+ emergencyConfirmations: "Confirmacións",
+ emergencyConfirmButton: "Confirmar",
+ emergencyConfirmed: "Confirmaches esta emerxencia",
+ emergencyResolveButton: "Resolver",
+ emergencyReopenButton: "Reabrir",
+ emergencyGenerateReport: "Xerar un informe",
+ emergencyUpdateEdited: "Editada",
+ emergencyLastUpdate: "ÚLTIMA ACTUALIZACIÓN",
+ emergencyUpdatesTitle: "Últimas actualizacións:",
+ emergencyNoUpdates: "Aínda non hai actualizacións.",
+ emergencyAddUpdate: "Publicar unha actualización",
+ emergencyUpdatePlaceholder: "Que cambiou?",
+ emergencyNoItems: "Non se atoparon emerxencias.",
+ emergencyExpiresAt: "Caduca",
+ emergencyBannerLabel: "Emerxencia activa",
+ emergencyCreateSectionTitle: "Crear unha emerxencia",
+ emergencyUpdateSectionTitle: "Actualizar a emerxencia",
+ emergencySearchPlaceholder: "Buscar en emerxencias...",
+ typeEmergency: "EMERXENCIAS",
+ typeEmergencyConfirm: "CONFIRMACIÓN DE EMERXENCIA",
+ typeEmergencyUpdate: "ACTUALIZACIÓN DE EMERXENCIA",
+ statsEmergency: "Emerxencias",
+ statsEmergencyConfirm: "Confirmacións de emerxencias",
+ statsEmergencyUpdate: "Actualizacións de emerxencias",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Unha emerxencia que segues ten unha actualización.",
+ emergencyBotResolvedTitle: "Unha emerxencia que segues resolveuse.",
+ dataKindEmergencies: "EMERXENCIAS",
+ mailingTitle: "Listas de correo",
+ modulesMailingLabel: "Listas de correo",
+ modulesMailingDescription: "Descobre e xestiona listas de correo na túa rede.",
+ modulesPhoneLabel: "Teléfono",
+ modulesPhoneDescription: "Módulo para chamar a outros habitantes con videochamadas cifradas de extremo a extremo.",
+ mailingDescription: "Descobre e xestiona listas de correo na túa rede.",
+ mailingCreate: "Crear unha lista de correo",
+ mailingUpdate: "Actualizar",
+ mailingArchive: "Arquivar",
+ mailingActivate: "Activar",
+ mailingCreateSectionTitle: "Crear unha lista de correo",
+ mailingUpdateSectionTitle: "Actualizar a lista de correo",
+ mailingTitleLabel: "Título",
+ mailingTitlePlaceholder: "Nome da lista de correo",
+ mailingDescriptionLabel: "Descrición",
+ mailingDescriptionPlaceholder: "De que trata esta lista?",
+ mailingTypeLabel: "Tipo de lista de correo",
+ mailingTypeOpen: "ABERTA",
+ mailingTypeClosed: "PECHADA",
+ mailingStatusLabel: "Estado",
+ mailingStatusActive: "ACTIVA",
+ mailingStatusArchived: "ARQUIVADA",
+ mailingMembersLabel: "Convidar habitantes",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Subscritores",
+ mailingTagsLabel: "Etiquetas",
+ mailingTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ mailingFilterAll: "TODAS",
+ mailingFilterMine: "MIÑAS",
+ mailingFilterSubscribed: "SUBSCRITAS",
+ mailingFilterRecent: "RECENTES",
+ mailingHistoryDate: "DATA",
+ mailingHistoryThreads: "FÍOS",
+ mailingHistoryInhabitants: "HABITANTES",
+ mailingHistorySearchPlaceholder: "Buscar no historial...",
+ mailingNoMessages: "Aínda non hai mensaxes.",
+ mailingNoItems: "Non se atoparon listas de correo.",
+ mailingSearchPlaceholder: "Buscar en listas de correo...",
+ mailingWriteButton: "Escribir unha mensaxe",
+ mailingWriteTitle: "Escribir á lista",
+ mailingReplyTitle: "Responder á lista",
+ mailingSend: "Enviar",
+ mailingTextPlaceholder: "A túa mensaxe chega a todos os participantes da lista.",
+ mailingParticipants: "Participantes",
+ inboxFilterMailing: "Listas de correo",
+ mailingReplyPlaceholder: "Responder á lista...",
+ mailingReplyToList: "Responder á lista",
+ typeMailingList: "LISTA DE CORREO",
+ statsMailingList: "Listas de correo",
+ mailingListLabel: "LISTA DE CORREO",
+ logisticsTitle: "Loxística",
+ modulesLogisticsLabel: "Loxística",
+ modulesLogisticsDescription: "Descobre e xestiona plans loxísticos na túa rede.",
+ logisticsDescription: "Descobre e xestiona plans loxísticos na túa rede.",
+ logisticsCreate: "Crear unha ruta",
+ logisticsUpdate: "Actualizar",
+ logisticsClose: "Pechar",
+ logisticsReopen: "Reabrir",
+ logisticsCreateSectionTitle: "Crear unha ruta",
+ logisticsUpdateSectionTitle: "Actualizar a ruta",
+ logisticsTitleLabel: "Título",
+ logisticsTitlePlaceholder: "Viaxe ao mercado, furgoneta dispoñible...",
+ logisticsKindLabel: "Tipo de loxística",
+ logisticsKindTrip: "VIAXE",
+ logisticsKindShipment: "ENVÍO",
+ logisticsKindTrips: "VIAXES",
+ logisticsKindShipments: "ENVÍOS",
+ logisticsModeLabel: "Modo",
+ logisticsModeOffer: "OFREZO",
+ logisticsModeRequest: "BUSCO",
+ logisticsModeOffers: "OFERTAS",
+ logisticsModeRequests: "PETICIÓNS",
+ logisticsDescriptionLabel: "Descrición",
+ logisticsDescriptionPlaceholder: "Punto de encontro, que levas, condicións...",
+ logisticsOriginLabel: "Orixe",
+ logisticsOriginPlaceholder: "Onde comeza",
+ logisticsDestinationLabel: "Destino",
+ logisticsDestinationPlaceholder: "Onde remata",
+ logisticsDateLabel: "Data e hora",
+ logisticsRecurrenceLabel: "Recorrencia",
+ logisticsFrequencyLabel: "Frecuencia",
+ logisticsRecurrenceNone: "ÚNICO",
+ logisticsRecurrenceDaily: "DIARIO",
+ logisticsRecurrenceWeekly: "SEMANAL",
+ logisticsRecurrenceMonthly: "MENSUAL",
+ logisticsSeatsLabel: "Prazas",
+ logisticsSizeLabel: "Tamaño",
+ logisticsSizePlaceholder: "p. ex. 2m x 1m",
+ logisticsWeightLabel: "Peso",
+ logisticsWeightPlaceholder: "p. ex. 40kg",
+ logisticsPriceFree: "GRATIS",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TEMPO",
+ logisticsPriceLabel: "Prezo",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Ligazón ao pedido",
+ logisticsOrderRefPlaceholder: "/shops/... ou /market/... do pedido que se vai entregar",
+ logisticsOrderLink: "Pedido ligado",
+ logisticsTagsLabel: "Etiquetas",
+ logisticsTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ logisticsFilterAll: "TODAS",
+ logisticsFilterMine: "MIÑAS",
+ logisticsFilterBooked: "RESERVADAS",
+ logisticsFilterRecent: "RECENTES",
+ logisticsFilterHistory: "HISTORIAL",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "ABERTA",
+ logisticsStatusUpcoming: "PRÓXIMAS",
+ logisticsStatusPast: "PASADAS",
+ logisticsStatusClosed: "PECHADAS",
+ logisticsZoneLabel: "Zona",
+ logisticsSearchPlaceholder: "Buscar en loxística...",
+ logisticsNoItems: "Non se atoparon rutas.",
+ logisticsBookingPending: "PENDENTE",
+ logisticsBookingConfirmed: "CONFIRMADA",
+ logisticsBookingRejected: "REXEITADA",
+ logisticsBookingCancelled: "CANCELADA",
+ logisticsBookingDelivered: "ENTREGADA",
+ logisticsConfirm: "Confirmar",
+ logisticsReject: "Rexeitar",
+ logisticsDeliver: "Entregar",
+ logisticsReceiptLabel: "Recibo",
+ logisticsReceiptPlaceholder: "Nota de entrega (opcional)",
+ logisticsCancelBooking: "Cancelar a reserva",
+ logisticsBookTitle: "Reservar esta ruta",
+ logisticsNotesLabel: "Notas",
+ logisticsNotesPlaceholder: "O que deba saber a persoa responsable",
+ logisticsBook: "Reservar",
+ logisticsBookingsTitle: "Reservas",
+ logisticsMyBookingTitle: "A túa reserva",
+ logisticsRatingsTitle: "Valoracións",
+ logisticsNoRatings: "Aínda non hai valoracións.",
+ logisticsRatingsWhenClosed: "As valoracións ábrense ao pechar a ruta.",
+ logisticsScoreLabel: "Puntuación",
+ logisticsRatingPlaceholder: "Que tal foi?",
+ logisticsRate: "Valorar",
+ typeLogisticsRoute: "RUTA",
+ typeLogisticsRating: "VALORACIÓN DE RUTA",
+ statsLogisticsRoute: "Rutas",
+ statsLogisticsRating: "Valoracións de rutas",
+ logisticsRouteLabel: "RUTA",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Módulo para publicar canles de podcast.",
+ podcastsDescription: "Módulo para publicar canles de podcast.",
+ podcastCreate: "Crear un podcast",
+ podcastUpdate: "Actualizar",
+ podcastDelete: "Borrar",
+ podcastCreateSectionTitle: "Crear un podcast",
+ podcastUpdateSectionTitle: "Actualizar o podcast",
+ podcastTitleLabel: "Título",
+ podcastTitlePlaceholder: "Nome da canle",
+ podcastDescriptionLabel: "Descrición",
+ podcastDescriptionPlaceholder: "De que trata este podcast?",
+ podcastCategoryLabel: "Categoría",
+ podcastCategoryNews: "NOVAS",
+ podcastCategoryMusic: "MÚSICA",
+ podcastCategoryTalk: "CHARLA",
+ podcastCategoryEducation: "EDUCACIÓN",
+ podcastCategoryTech: "TECNOLOXÍA",
+ podcastCategoryCulture: "CULTURA",
+ podcastCategoryCommunity: "COMUNIDADE",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "OUTROS",
+ podcastTagsLabel: "Etiquetas",
+ podcastCoverLabel: "Portada (imaxe ou vídeo)",
+ podcastEpisodeAudioLabel: "Ficheiro de audio ou vídeo (máx.: 75MB)",
+ podcastTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ podcastFilterAll: "TODOS",
+ podcastFilterMine: "MEUS",
+ podcastFilterRecent: "RECENTES",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "OÍNTES",
+ podcastSearchPlaceholder: "Buscar en podcasts...",
+ podcastNoItems: "Non se atoparon podcasts.",
+ podcastEpisodesLabel: "Episodios",
+ podcastPlaysLabel: "Reproducións",
+ podcastLastEpisode: "Último episodio",
+ podcastEpisodesTitle: "Episodios",
+ podcastNoEpisodes: "Aínda non hai episodios.",
+ podcastEpisodeAdd: "Engadir un episodio",
+ podcastEpisodeCreateTitle: "Publicar un episodio",
+ podcastEpisodeUpdateTitle: "Actualizar o episodio",
+ podcastEpisodeTitleLabel: "Título do episodio",
+ podcastEpisodeTitlePlaceholder: "Título do episodio",
+ podcastEpisodeDescriptionLabel: "Notas",
+ podcastEpisodeDescriptionPlaceholder: "Que pasa neste episodio, ligazóns, créditos...",
+ podcastEpisodePublish: "Publicar",
+ podcastPlayed: "Reproducido",
+ podcastMarkPlayed: "Marcar como reproducido",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISODIO",
+ typePodcastOpinion: "OPINIÓN DE EPISODIO",
+ typePodcastPlay: "REPRODUCIÓN",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Episodios",
+ statsPodcastPlay: "Reproducións",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Un blog que segues ten unha entrada nova.",
+ podcastBotEpisodeTitle: "Un podcast que segues ten un episodio novo.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISODIO",
+ campaignsTitle: "Campañas",
+ modulesCampaignsLabel: "Campañas",
+ modulesCampaignsDescription: "Descobre e xestiona campañas na túa rede.",
+ campaignsDescription: "Descobre e xestiona campañas na túa rede.",
+ campaignCreate: "Crear unha campaña",
+ campaignUpdate: "Actualizar",
+ campaignDelete: "Borrar",
+ campaignClose: "Pechar",
+ campaignReopen: "Reabrir",
+ campaignCreateSectionTitle: "Crear unha campaña",
+ campaignUpdateSectionTitle: "Actualizar a campaña",
+ campaignTitleLabel: "Título",
+ campaignTitlePlaceholder: "Que queres conseguir?",
+ campaignTextLabel: "Texto",
+ campaignTextPlaceholder: "Explica a causa, quen decide e que pides...",
+ campaignCategoryLabel: "Categoría",
+ campaignCategoryEnvironment: "MEDIO AMBIENTE",
+ campaignCategoryRights: "DEREITOS",
+ campaignCategoryHealth: "SAÚDE",
+ campaignCategoryEducation: "EDUCACIÓN",
+ campaignCategoryInfrastructure: "INFRAESTRUTURA",
+ campaignCategoryCulture: "CULTURA",
+ campaignCategoryEconomy: "ECONOMÍA",
+ campaignCategoryOther: "OUTROS",
+ campaignGoalLabel: "Obxectivo de sinaturas",
+ campaignDeadlineLabel: "Prazo",
+ campaignTagsLabel: "Etiquetas",
+ campaignTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ campaignFilterAll: "TODAS",
+ campaignFilterMine: "MIÑAS",
+ campaignFilterSigned: "ASINADAS",
+ campaignFilterRecent: "RECENTES",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "ABERTA",
+ campaignStatusAchieved: "LOGRADA",
+ campaignStatusUnachieved: "NON LOGRADA",
+ campaignStatusClosed: "PECHADA",
+ campaignSearchPlaceholder: "Buscar en campañas...",
+ campaignNoItems: "Non se atoparon campañas.",
+ campaignSignaturesLabel: "Sinaturas",
+ campaignSignaturesTitle: "Apoios",
+ campaignNoSignatures: "Aínda non hai sinaturas.",
+ campaignSignTitle: "Asinar esta campaña",
+ campaignSignPlaceholder: "Por que a apoias? (opcional)",
+ campaignSign: "Asinar",
+ campaignSigned: "Xa a asinaches!",
+ campaignNotSigned: "Aínda falta a túa sinatura",
+ campaignElevate: "Elevar ao Parlamento",
+ campaignElevated: "Elevada ao Parlamento",
+ campaignUpdatesTitle: "Actualizacións",
+ campaignNoUpdates: "Aínda non hai actualizacións.",
+ campaignUpdatePlaceholder: "Que pasou?",
+ campaignAddUpdate: "Publicar unha actualización",
+ campaignQrAlt: "QR para asinar esta campaña",
+ campaignQrCaption: "Escanea para asinar",
+ typeCampaign: "CAMPAÑA",
+ typeCampaignSignature: "SINATURA",
+ typeCampaignUpdate: "ACTUALIZACIÓN DE CAMPAÑA",
+ statsCampaign: "Campañas",
+ statsCampaignSignature: "Sinaturas de campañas",
+ statsCampaignUpdate: "Actualizacións de campañas",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Unha campaña que segues ten unha actualización.",
+ campaignBotAchievedTitle: "Unha campaña que segues alcanzou o seu obxectivo.",
+ campaignBotRaisedTitle: "Unha campaña que asinaches elevouse ao Parlamento.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Unha ruta que reservaches cambiou.",
+ logisticsBotClosedTitle: "Unha ruta que reservaches pechouse.",
+ logisticsBotBookedTitle: "Alguén reservou a túa ruta.",
+ logisticsBotCancelledTitle: "Cancelouse unha reserva da túa ruta.",
+ logisticsBotConfirmedTitle: "A túa reserva confirmouse: o paquete está en camiño.",
+ logisticsBotRejectedTitle: "A túa reserva foi rexeitada.",
+ logisticsBotDeliveredTitle: "O teu paquete chegou.",
+ campaignLabel: "CAMPAÑA",
+ campaignGenerateReport: "Xerar un informe",
+ logisticsGenerateReport: "Xerar un informe",
+ mailingGenerateReport: "Xerar un informe",
+ campaignUpdateEdited: "Editada",
+ mailingMessagesLabel: "Mensaxes",
+ logisticsBookingsLabel: "Reservas",
+ backupTitle: "Copia de seguranza",
+ modulesBackupLabel: "Copia de seguranza",
+ modulesBackupDescription: "Módulo para exportar e importar as túas chaves e facer copias de seguranza cifradas.",
+ backupDescription: "Módulo para exportar e importar as túas chaves e facer copias de seguranza cifradas.",
+ backupTypeRecovery: "RECUPERACIÓN",
+ backupTypeKeys: "EXPORTAR CHAVES",
+ backupTypeFull: "COPIA COMPLETA",
+ backupTypeRestore: "RESTAURAR UNHA COPIA",
+ backupTypeInstant: "INSTANTÁNEA",
+ backupInstantDescription: "Un .zip simple con todo o teu rexistro e os teus ficheiros, sen a túa chave secreta e sen contrasinal. Rápida, pero ",
+ backupInstantRisk: "quen teña o ficheiro pode lelo todo.",
+ backupKitPageDescription: "O kit de recuperación só se pode abrir desde este dispositivo.",
+ backupKitId: "ID de Oasis",
+ backupKitDate: "Xerado",
+ backupKitQrAlt: "Código QR da túa chave secreta",
+ backupKitStep1: "Imprímeo ou cópiao a man e gárdao nun lugar seguro e sen conexión.",
+ backupKitStep2: "Para recuperalo, instala Oasis nun dispositivo novo e importa este segredo desde Copia de seguranza › Chaves.",
+ backupKitStep3: "Destrúe esta páxina se algunha vez queda exposta.",
+ backupKitPdfButton: "Xerar PDF",
+ backupScopeLabel: "Alcance",
+ backupScopeAll: "TODO",
+ backupScopeMine: "SÓ O MEU CONTIDO",
+ backupSinceLabel: "Desde",
+ backupEstimateTitle: "Estimación",
+ backupFileInfo: "A túa copia cifrada descargarase no teu dispositivo (nome: oasis-backup-DATA.oasisbk)",
+ backupExportButton: "Descargar a copia",
+ backupRestorePassword: "Escribe o contrasinal que usaches ao facer a copia",
+ backupRestoreButton: "Restaurar a copia",
+ backupRestoredLine: "Copia restaurada.",
+ backupRestoredMessages: "Mensaxes engadidas",
+ backupRestoredSkipped: "Xa existentes",
+ backupRestoredBlobs: "Ficheiros engadidos",
+ backupRestoredState: "Configuración restaurada",
+ backupRestoredFailed: "Fallidos",
+ backupRestoredForked: "Diverxentes",
+ backupRestoreRunning: "Estase restaurando a copia. Esta páxina actualízase soa; mentres tanto podes seguir usando Oasis.",
+ backupRestoreElapsed: "Transcorrido",
+ backupRestoreFailedLine: "Non se puido restaurar a copia.",
+ backupRestoreForkMine: "Este dispositivo xa publicou mensaxes coa túa identidade que non están na copia, así que non se puido aplicar enriba delas. Restáuraa nunha instalación limpa xusto despois de importar as túas chaves, antes de facer nada máis.",
+ verificationTitle: "Verificación",
+ verificationDescription: "Comproba a cadea do teu feed, detecta bifurcacións e revisa ficheiros orfos ou ausentes.",
+ verificationRun: "Executar a verificación",
+ verificationTotalMessages: "mensaxes no rexistro",
+ verificationFeed: "O teu feed",
+ verificationMessages: "mensaxes",
+ verificationLastSequence: "última secuencia",
+ verificationGaps: "Ocos",
+ verificationBrokenLinks: "Ligazóns rotas",
+ verificationBadHashes: "Hashes incorrectos",
+ verificationBadSignatures: "Sinaturas incorrectas",
+ verificationDuplicates: "Secuencias duplicadas",
+ verificationForks: "Bifurcacións",
+ verificationBlobs: "Ficheiros",
+ verificationBlobsPresent: "presentes",
+ verificationBlobsReferenced: "referenciados",
+ verificationBlobsOrphan: "orfos",
+ verificationBlobsMissing: "ausentes",
+ verificationBlobsMissingOwn: "Ficheiros teus que faltan neste dispositivo",
+ verificationBlobsMissingOthers: "Ficheiros doutros habitantes aínda sen descargar",
+ verificationBlobsUnavailable: "Non se puideron listar os ficheiros deste dispositivo.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Módulo para descubrir e xestionar wikis.",
+ wikiDescription: "Módulo para descubrir e xestionar wikis.",
+ wikiCreate: "Crear unha wiki",
+ wikiUpdate: "Actualizar",
+ wikiDelete: "Borrar",
+ wikiEdit: "Editar",
+ wikiTitleLabel: "Título",
+ wikiTitlePlaceholder: "Título da wiki...",
+ wikiBodyLabel: "Contido",
+ wikiBodyPlaceholder: "Liga outras wikis con [[Título da wiki]] ou [[Título da wiki|un texto propio]].\n\nMenciona un habitante con @id.\n\nEtiqueta con #oasis.\n\nPega ligazóns como https://solarnethub.com\n\nUnha liña en branco abre un parágrafo novo; os saltos de liña simples consérvanse.\n\nAnexa calquera medio compatible e incrustarase aquí.",
+ formatBarLabel: "Formato",
+ wikiStatusLabel: "Tipo de wiki",
+ wikiStatusOpen: "ABERTA",
+ wikiStatusClosed: "PECHADA",
+ wikiTagsLabel: "Etiquetas",
+ wikiTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ wikiSummaryLabel: "Resumo do cambio",
+ wikiSummaryPlaceholder: "Que cambiou?",
+ wikiFilterAll: "TODAS",
+ wikiFilterMine: "MIÑAS",
+ wikiFilterRecent: "RECENTES",
+ wikiFilterLinked: "LIGADAS",
+ wikiChanges: "Cambios recentes",
+ wikiNoPages: "Non se atoparon wikis.",
+ wikiNoChanges: "Aínda non hai cambios.",
+ wikiHistory: "Historial",
+ wikiVersion: "Versión",
+ wikiVersions: "versións",
+ wikiRestore: "Restaurar",
+ wikiDiff: "Cambios",
+ wikiViewVersion: "Ver",
+ wikiLinkedPages: "Páxinas ligadas",
+ wikiNoLinkedPages: "Esta páxina aínda non se liga con ningunha outra.",
+ wikiMissingLink: "A páxina aínda non existe",
+ wikiDuplicateTitle: "Xa existe unha páxina con este título. Cambia o título para crear unha páxina distinta.",
+ wikiCreateSectionTitle: "Crear unha wiki",
+ wikiUpdateSectionTitle: "Actualizar a wiki",
+ wikiSearchPlaceholder: "Buscar na Wiki...",
+ wikiCurrentVersion: "Versión actual",
+ wikiViewingVersion: "Estás vendo unha versión antiga",
+ wikiBackToPage: "Volver á páxina",
+ wikiLinkedChip: "Ligada",
+ wikiRestoredSummary: "Versión restaurada",
+ wikiExportPdf: "Xerar a páxina",
+ wikiPreview: "Vista previa",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Crear unha wiki",
+ tribeWikiEmpty: "Aínda non hai wikis.",
+ typeWiki: "WIKI",
+ padsTitle: "Pads",
+ padTitle: "Pad",
+ modulesPadsLabel: "Pads",
+ modulesPadsDescription: "Módulo para xestionar editores de texto colaborativos.",
+ padCreate: "Crear un pad",
+ padUpdate: "Actualizar",
+ padDelete: "Eliminar",
+ padTitleLabel: "Título",
+ padTitlePlaceholder: "Escribe o título do pad...",
+ padStatusLabel: "Estado",
+ padTypeLabel: "Tipo de pad",
+ padStatusOpen: "ABERTO",
+ padStatusInviteOnly: "SÓ CONVIDADOS",
+ padStatusClosed: "PECHADO",
+ padDeadlineLabel: "Data límite",
+ padTagsLabel: "Etiquetas",
+ padTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ padMembersLabel: "Membros",
+ padCreated: "Creado",
+ padStartEditing: "Editar",
+ padEditorPlaceholder: "Comeza a escribir...",
+ padSubmitEntry: "Enviar",
+ padNoEntries: "Aínda non hai entradas.",
+ padAllSectionTitle: "Todos os pads",
+ padMineSectionTitle: "Os meus pads",
+ padsDescription: "Xestiona editores de texto cifrados e colaborativos na túa rede.",
+ roomsTitle: "Salas",
+ roomsDescription: "Descobre e únete a salas de videoconferencia cifradas na túa rede.",
+ modulesRoomsLabel: "Salas",
+ modulesRoomsDescription: "Módulo para descubrir e unirse a salas de videoconferencia cifradas.",
+ roomFilterRecent: "RECENTES",
+ roomFilterMine: "MIÑAS",
+ roomFilterAll: "TODAS",
+ roomFilterLive: "EN DIRECTO",
+ roomFilterOpen: "ABERTAS",
+ roomFilterInvite: "SÓ CONVIDADOS",
+ roomFilterClosed: "PECHADAS",
+ roomCreate: "Crear sala",
+ roomUpdate: "Actualizar",
+ roomDelete: "Eliminar",
+ roomClose: "Pechar",
+ roomCreateSectionTitle: "Crear sala",
+ roomUpdateSectionTitle: "Actualizar sala",
+ roomTitlePlaceholder: "Título da sala",
+ roomDescriptionLabel: "Descrición",
+ roomDescriptionPlaceholder: "De que ides falar?",
+ roomTypeLabel: "Tipo de sala",
+ roomTagsLabel: "Etiquetas",
+ roomStatusOpen: "ABERTA",
+ roomStatusInviteOnly: "SÓ CONVIDADOS",
+ roomStatusClosed: "PECHADA",
+ roomParticipants: "Participantes",
+ roomJoin: "Entrar",
+ roomLeave: "Saír",
+ roomFull: "Sala chea",
+ roomLiveChip: "EN DIRECTO",
+ roomMuted: "silenciado",
+ roomRec: "Gravar audio",
+ roomRecStop: "Parar a gravación",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} entrou na sala",
+ roomEventLeft: "{name} saíu da sala",
+ roomEventRecStart: "{name} comezou a gravar",
+ roomEventRecStop: "{name} deixou de gravar",
+ roomEventMuted: "{name} silenciouse",
+ roomEventUnmuted: "{name} quitou o silencio",
+ roomEventHand: "{name} ergueu a man",
+ roomRaiseHand: "Erguer a man",
+ roomLowerHand: "Baixar a man",
+ confirmActionTitle: "Confirma esta acción",
+ confirmActionButton: "Confirmar",
+ confirmJoinText: "Vas unirte usando esta invitación.",
+ confirmFollowText: "Vas apoiar a este habitante.",
+ confirmSignText: "Vas asinar esta campaña.",
+ confirmDownloadText: "Vas descargar este ficheiro ao teu dispositivo.",
+ roomRecordings: "Gravacións",
+ roomClearNotices: "Limpar",
+ roomLineSwitchboard: "Centraliña",
+ roomLineDndError: "O número desta sala non acepta chamadas.",
+ roomNumberHint: "Marca este número desde Teléfono para entrar na sala.",
+ liveRefresh: "Refrescar",
+ roomNobody: "Agora mesmo non hai ninguén na sala.",
+ roomSomeone: "{n} na sala agora mesmo.",
+ roomYou: "ti",
+ roomYouAreIn: "Estás dentro",
+ roomNobodyInside: "Agora mesmo non hai ninguén nesta sala.",
+ roomErrorFull: "A sala está chea. Poderás entrar cando alguén saia.",
+ roomErrorUnreachable: "Agora mesmo non se pode chegar á sala. Téntao máis tarde.",
+ roomErrorBusy: "Xa estás nunha chamada ou noutra sala.",
+ roomErrorClosed: "Esta sala está pechada.",
+ roomAccessDenied: "Esta sala é só con convite. Precisas un convite para entrar.",
+ roomsNoItems: "Non se atoparon salas.",
+ roomSearchPlaceholder: "Buscar salas...",
+ roomInviteMode: "Convite",
+ tribeSectionRooms: "SALAS",
+ tribeRoomCreate: "Crear sala",
+ tribeRoomsEmpty: "Aínda non hai salas.",
+ typeRoom: "SALAS",
+ typeRoomMember: "PARTICIPANTE DE SALA",
+ statsRoom: "Salas",
+ statsRoomMember: "Participantes de salas",
+ favoritesFilterRooms: "SALAS",
+ invitesRoomsTitle: "Salas",
+ inviteCodeInvalid: "Este código de convite non é válido ou xa se usou.",
+ inviteAlreadyMember: "Xa formas parte. Podes abrilo desde o seu módulo.",
+ actionFailed: "Non se puido facer. Téntao de novo.",
+ publishTooShort: "A túa publicación é demasiado curta.",
+ walletSendFailed: "Non se puido enviar o pagamento: {reason}",
+ pixeliaCoordsError: "Esas coordenadas están fóra da grella.",
+ courtsErrTitle: "Cómpre un título.",
+ courtsErrRespondent: "Indica contra quen é o caso.",
+ courtsErrRespondentId: "Ese non é un Oasis ID válido.",
+ courtsErrMethod: "Escolle como se resolverá o caso.",
+ courtsErrCaseNotFound: "Non se atopou ese caso.",
+ courtsErrBrief: "Escribe a túa resposta.",
+ courtsErrStance: "Escolle a túa postura.",
+ courtsErrResult: "Escribe o resultado.",
+ courtsErrTerms: "Escribe os termos do acordo.",
+ courtsErrMediator: "Engade polo menos un mediador.",
+ courtsErrSelfMediator: "Non podes ser mediador no teu propio caso.",
+ courtsErrJudge: "Escolle un xuíz.",
+ courtsErrSelfJudge: "Non podes ser xuíz do teu propio caso.",
+ courtsErrVisibility: "Escolle quen pode ver o caso.",
+ courtsErrNomination: "Non se atopou esa nominación.",
+ opinionAlreadyGiven: "Xa deches a túa opinión.",
+ cipherPasswordShort: "O contrasinal debe ter polo menos 32 caracteres.",
+ errorForbidden: "Non tes acceso a isto.",
+ errorNotFound: "Non se atopou.",
+ errorClosed: "Está pechado.",
+ errorInviteOnly: "Isto é só con convite. Precisas un convite.",
+ errorTooLong: "Ese texto é demasiado longo.",
+ errorRequired: "Falta información obrigatoria.",
+ errorInvalid: "Parte da información non é válida.",
+ errorNotAuthor: "Só quen o creou pode facer isto.",
+ panicRemoved: "A túa blockchain eliminouse.",
+ padRecentSectionTitle: "Pads recentes",
+ padOpenSectionTitle: "Pads abertos",
+ padClosedSectionTitle: "Pads pechados",
+ padCreateSectionTitle: "Crear un pad novo",
+ padUpdateSectionTitle: "Actualizar o pad",
+ typePad: "PADS",
+ padNew: "NOVO",
+ padAddFavorite: "Engadir a favoritos",
+ padRemoveFavorite: "Quitar de favoritos",
+ padClose: "Pechar",
+ padBackToEditor: "Volver ao editor",
+ padSearchPlaceholder: "Buscar en Pads...",
+
+ calendarsTitle: "Calendarios",
+ calendarTitle: "Calendario",
+ modulesCalendarsLabel: "Calendarios",
+ modulesCalendarsDescription: "Módulo para descubrir e xestionar calendarios.",
+ typeCalendar: "CALENDARIOS",
+ calendarCreate: "Crear un calendario",
+ calendarUpdate: "Actualizar",
+ calendarTitleLabel: "Título",
+ calendarTitlePlaceholder: "Título do calendario...",
+ calendarStatusLabel: "Estado",
+ calendarTypeLabel: "Tipo de calendario",
+ calendarStatusOpen: "ABERTO",
+ calendarStatusClosed: "PECHADO",
+ calendarDeadlineLabel: "Data límite",
+ calendarTagsLabel: "Etiquetas",
+ calendarTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ calendarParticipantsLabel: "Participantes",
+ calendarCreated: "Creado",
+ calendarJoin: "Unirse ao calendario",
+ calendarGenerateInvite: "Xerar un convite",
+ calendarDateLabel: "Data",
+ calendarDatePlaceholder: "Describe esta data...",
+ calendarNoteLabel: "Notas",
+ calendarNotePlaceholder: "Engadir unha nota...",
+ calendarFirstDateLabel: "Data",
+ calendarFirstNoteLabel: "Notas",
+ calendarIntervalLabel: "Intervalo",
+ calendarIntervalNone: "Sen repetición",
+ calendarIntervalWeekly: "Semanal",
+ calendarIntervalMonthly: "Mensual",
+ calendarIntervalYearly: "Anual",
+ calendarFormDescription: "Descrición",
+ calendarNoDates: "Non hai datas engadidas.",
+ calendarNoNotes: "Sen notas.",
+ calendarsNoItems: "Non se atoparon calendarios.",
+ calendarsDescription: "Descobre e xestiona calendarios na túa rede.",
+ calendarMonthPrev: "← Anterior",
+ calendarMonthNext: "Seguinte →",
+ calendarMonthNames: "Xaneiro,Febreiro,Marzo,Abril,Maio,Xuño,Xullo,Agosto,Setembro,Outubro,Novembro,Decembro",
+ calendarDayInitials: "L,M,M,X,V,S,D",
+ calendarAllSectionTitle: "Calendarios",
+ calendarRecentSectionTitle: "Calendarios recentes",
+ calendarFavoritesSectionTitle: "Favoritos",
+ calendarMineSectionTitle: "Os teus calendarios",
+ calendarOpenSectionTitle: "Calendarios abertos",
+ calendarClosedSectionTitle: "Calendarios pechados",
+ calendarCreateSectionTitle: "Crear un calendario novo",
+ calendarUpdateSectionTitle: "Actualizar o calendario",
+ calendarAddFavorite: "Engadir a favoritos",
+ calendarDeleteNote: "Eliminar",
+ calendarRemoveFavorite: "Quitar de favoritos",
+ calendarSearchPlaceholder: "Buscar no calendario...",
+ calendarAddEntry: "Engadir unha entrada",
+ statsCalendar: "Calendarios",
+ statsCalendarDate: "Datas de calendario",
+ statsCalendarNote: "Notas de calendario",
+
+ modulesChatsLabel: "Chats",
+ modulesChatsDescription: "Módulo para descubrir e xestionar chats.",
+ typeChat: "CHATS",
+ typeChatMessage: "MENSAXE DE CHAT",
+ chatsTitle: "Chats",
+ chatMineSectionTitle: "Os teus chats",
+ chatRecentTitle: "Chats recentes",
+ chatFavoritesTitle: "Favoritos",
+ chatOpenTitle: "Chats abertos",
+ chatClosedTitle: "Chats pechados",
+ chatDescription: "Descrición",
+ chatCategory: "Categoría",
+ chatStatus: "ESTADO",
+ chatCreate: "Crear un chat",
+ chatUpdate: "Actualizar",
+ chatDelete: "Borrar",
+ chatClose: "Pechar o chat",
+ chatVisitChat: "VER O CHAT",
+ chatUntitled: "Chat sen título",
+ chatNoItems: "Non se atoparon chats.",
+ chatParticipants: "Participantes",
+ chatMessagesLabel: "Mensaxes",
+ chatThreadsLabel: "Fíos",
+ chatCreatedAt: "CREADO",
+ chatSearchPlaceholder: "Buscar en Chats...",
+ chatStatusOpen: "ABERTO",
+ chatStatusInviteOnly: "SÓ CONVIDADOS",
+ chatStatusClosed: "PECHADO",
+ chatSendMessage: "Enviar",
+ chatJumpLatest: "Última mensaxe",
+ chatReply: "Responder",
+ chatReplyCancel: "Cancelar a resposta",
+ chatPin: "Fixar",
+ chatUnpin: "Desfixar",
+ chatPinned: "Fixadas",
+ chatPickChat: "Escolle un chat para abrilo",
+ chatNoneYet: "Aínda non hai ningún chat dispoñible.",
+ activitySearchPlaceholder: "Buscar en Actividade...",
+ trendingSearchPlaceholder: "Buscar en Tendencias...",
+ opinionsSearchPlaceholder: "Buscar en Opinións...",
+ votesSearchPlaceholder: "Buscar en Votacións...",
+ gamesSearchPlaceholder: "Buscar en Xogos...",
+ schoolTitle: "Escola",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Editouse unha páxina wiki que segues.",
+ wikiBotRestoredTitle: "Restaurouse unha versión anterior dunha páxina wiki que segues.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Un estudante novo apuntouse ao teu curso.",
+ schoolBotInvitedTitle: "Convidáronte a un curso.",
+ schoolBotAdmittedTitle: "Admitíronte nun curso.",
+ schoolBotCertificateTitle: "Recibiches un certificado.",
+ schoolBotPassedTitle: "Un estudante aprobou o teu curso.",
+ schoolBotLessonTitle: "Publicouse unha lección nova.",
+ invitesSchoolTitle: "Escola",
+ schoolEnrollLabel: "Unirse ao curso",
+ schoolExamRetryLater: "Poderás volver intentalo pasadas 24 horas.",
+ schoolApproved: "APROBADO",
+ schoolExamPassMark: "Nota de aprobado (0-10)",
+ schoolExamPassed: "APROBADO",
+ schoolExamPending: "Pendente",
+ schoolExamFailed: "SUSPENSO",
+ schoolExamAddQuestion: "Engadir unha pregunta",
+ schoolExamCreateQuestion: "Crear unha pregunta",
+ schoolExamOption: "Opción",
+ schoolExamCorrect: "Opción correcta",
+ schoolExamPoints: "Puntos",
+ schoolMaterialTextPlaceholder: "Notas para esta lección...",
+ schoolMaterials: "Materiais",
+ schoolAddMaterial: "Engadir material",
+ schoolNoMaterials: "Aínda non hai materiais.",
+ bankYourSchoolBalance: "Os teus ingresos da escola",
+ schoolProgress: "Progreso",
+ schoolProgressMark: "Marcar como completada",
+ schoolProgressDone: "Completada",
+ schoolExams: "Exames",
+ schoolExamCreate: "Crear un exame",
+ schoolExamTitlePlaceholder: "Título do exame",
+ schoolExamHelp: "Unha pregunta por liña: Pregunta? ; opción ; opción correcta* ; opción",
+ schoolExamQuestionsPlaceholder: "Que é SSB? ; Unha base de datos ; Un protocolo P2P* ; Un navegador",
+ schoolExamSubmit: "Enviar as respostas",
+ schoolExamScore: "A túa nota",
+ schoolNoScoresYet: "Aínda non hai resultados.",
+ schoolLessonUnit: "Unidade / fase",
+ schoolLessonUnitPlaceholder: "p. ex. Fase 1",
+ schoolLessonOrder: "Orde",
+ profileClearnetSchoolLabel: "Escola",
+ schoolStartDate: "Data de inicio",
+ schoolSessionDate: "Data da sesión",
+ schoolCourseChat: "Chat do curso",
+ agendaFilterSchool: "ESCOLA",
+ agendaFilterCampaigns: "CAMPAÑAS",
+ agendaFilterLogistics: "LOXÍSTICA",
+ schoolCourseType: "Tipo de curso",
+ schoolTypeOpen: "ABERTO",
+ schoolTypePaid: "DE PAGAMENTO",
+ schoolTypeInvite: "SÓ POR CONVITE",
+ schoolLessonLocked: "Lección cifrada — pídelle a chave do curso ao profesor.",
+ schoolGrantAccess: "Enviar a chave do curso",
+ schoolKeySent: "Chave enviada",
+ schoolOngoing: "En curso",
+ schoolFilterApplied: "APUNTADO",
+ schoolFilterOpen: "ABERTOS",
+ schoolFilterFavorites: "FAVORITOS",
+ schoolPendingPayment: "Pagamento pendente",
+ schoolPendingStudents: "Inscricións pendentes",
+ schoolViewBill: "Ver a factura",
+ schoolPaymentNote: "Ao inscribirte xérase unha factura en ECO (unha transferencia). A túa inscrición confírmase cando a transferencia queda asinada.",
+ schoolCloseCourse: "Pechar o curso",
+ schoolReopenCourse: "Reabrir o curso",
+ schoolDescription: "Ensina e aprende cursos na túa rede.",
+ schoolFilterAll: "TODOS",
+ schoolFilterMine: "MEUS",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RECENTES",
+ schoolCreateButton: "Crear un curso",
+ schoolCreateSectionTitle: "Crear un curso",
+ schoolUpdateSectionTitle: "Actualizar o curso",
+ schoolCourseTitlePlaceholder: "Nome do teu curso",
+ schoolCourseDescriptionPlaceholder: "Que vas ensinar neste curso?",
+ schoolCourseImage: "Imaxe do curso (tamaño máx.: 75MB)",
+ schoolTags: "Etiquetas",
+ schoolTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ schoolPrice: "Prezo (ECO)",
+ schoolVisibility: "Visibilidade",
+ schoolVisibilityPublic: "Público",
+ schoolVisibilityInvite: "Por convite",
+ schoolStatus: "Estado",
+ schoolClosed: "Pechado",
+ schoolFree: "Gratis",
+ schoolCreate: "Crear o curso",
+ schoolUpdate: "Actualizar o curso",
+ schoolSearchPlaceholder: "Buscar na Escola...",
+ schoolSortTitle: "Título",
+ schoolNoCourses: "Non se atoparon cursos.",
+ schoolStudents: "Estudantes",
+ schoolTeacher: "Profesor",
+ schoolCreatedAt: "CREADO",
+ schoolLessons: "Leccións",
+ schoolNoLessons: "Aínda non hai leccións.",
+ schoolEnrollToSee: "Inscríbete para ver as leccións deste curso.",
+ schoolEnrollButton: "INSCRIBIRSE",
+ schoolUnenrollButton: "Abandonar o curso",
+ schoolInviteRequired: "Este curso é por convite.",
+ schoolTeacherPanel: "Panel do profesor",
+ schoolStudentPanel: "Panel do estudante",
+ schoolAddLesson: "Crear unha lección",
+ schoolLessonTitlePlaceholder: "Título da lección",
+ schoolLessonTextPlaceholder: "Describe as nocións que cobre esta lección...",
+ schoolInviteStudents: "Convidar estudantes",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "CONVIDAR",
+ schoolInvited: "Convidados",
+ schoolIssueCertificate: "Crear un certificado",
+ schoolCertified: "Certificado",
+ schoolCertificateTextPlaceholder: "Nota do certificado (opcional)",
+ schoolLessonOpen: "Abrir a lección",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificados",
+ schoolNoCertificates: "Aínda non se emitiron certificados.",
+ schoolEditButton: "Editar",
+ schoolDeleteButton: "Borrar",
+ typeSchool: "ESCOLA",
+ schoolCourseLabel: "CURSO",
+ emergencyLabel: "EMERXENCIA",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Cursos",
+ statsSchoolLesson: "Leccións",
+ statsSchoolEnroll: "Inscricións",
+ statsSchoolCertificate: "Certificados da escola",
+ modulesSchoolLabel: "Escola",
+ modulesSchoolDescription: "Módulo para intercambiar coñecemento.",
+ welcomeStepUxAction: "Gardar vista",
+ welcomeStepWorkflowTitle: "Que uso de OASIS tes en mente?",
+ welcomeStepWorkflowText: "Oasis ten moitos módulos. Escolle a configuración que encaixe contigo e só quedarán activados os útiles. Podes axustalo cando queiras en Módulos.",
+ welcomeStepWorkflowAction: "Gardar configuración",
+ welcomeWorkflow_full: "Por defecto",
+ chatRateLimitTitle: "Demasiadas mensaxes",
+ chatRateLimitMessage: "Alcanzaches o límite de mensaxes que esta sala acepta nunha hora. Téntao máis tarde.",
+ chatMessagePlaceholder: "Escribe a túa mensaxe...",
+ chatNoMessages: "Aínda non hai mensaxes.",
+ chatTitlePlaceholder: "Título do chat",
+ chatDescriptionPlaceholder: "Descrición do chat",
+ chatTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ chatImageLabel: "Selecciona un ficheiro de imaxe (.jpeg, .jpg, .png, .gif)",
+ chatAuthor: "Autor",
+ chatAddFavorite: "Engadir a favoritos",
+ chatRemoveFavorite: "Quitar de favoritos",
+ chatPM: "MP",
+ chatStatusLabel: "Estado",
+ chatTypeLabel: "Tipo de chat",
+ chatCategoryLabel: "Categoría",
+ gamesTitle: "Xogos",
+ gamesDescription: "Descobre e xoga algúns xogos.",
+ gamesFilterAll: "TODOS",
+ gamesPlayButton: "XOGAR!",
+ modulesGamesLabel: "Xogos",
+ modulesGamesDescription: "Módulo para descubrir e xogar algúns xogos.",
+ modulesGraphosLabel: "Graphos",
+ modulesGraphosDescription: "Módulo para explorar a rede como un mapa interactivo de nodos.",
+ gamesCocolandTitle: "Cocoland",
+ gamesCocolandDesc: "Un coco con ollos que salta palmeiras e colecciona ECOins. Ata onde podes chegar?",
+ gamesTheFlowTitle: "ECOinflow",
+ gamesTheFlowDesc: "Conecta PUBs con habitantes mediante validadores, tendas e acumuladores. Sobrevive á ameaza CBDC!",
+ gamesNeonInfiltratorTitle: "Neon Infiltrator",
+ gamesNeonInfiltratorDesc: "Infíltrate na grella, recolle datos confidenciais, esquiva os drons de seguridade e escapa. Cantos niveis podes superar?",
+ gamesSpaceInvadersTitle: "Space Invaders",
+ gamesSpaceInvadersDesc: "Detén a invasión alieníxena! Destrúe vagas de invasores antes de que cheguen ao chan.",
+ gamesArkanoidTitle: "Arkanoid",
+ gamesArkanoidDesc: "Rompe todos os ladrillos coa túa pa e a pelota. Un clásico desafío arcade.",
+ gamesPingPongTitle: "PingPong",
+ gamesPingPongDesc: "Ping-pong clásico contra unha IA. Gaña quen chegue primeiro a 5 puntos.",
+ gamesAsteroidsTitle: "Asteroids",
+ gamesAsteroidsDesc: "Pilota a túa nave por un campo de asteroides mortal. Dispáralles antes de que te alcancen.",
+ gamesRockPaperScissorsTitle: "Pedra, papel, tesoiras",
+ gamesRockPaperScissorsDesc: "Pedra, papel ou tesoiras contra unha IA. Gaña quen leve dúas de tres roldas.",
+ gamesTikTakToeTitle: "TikTakToe",
+ gamesTikTakToeDesc: "Tres en raia clásico contra a IA. Consegue tres en liña para gañar.",
+ gamesFlipFlopTitle: "FlipFlop",
+ gamesFlipFlopDesc: "Lanza unha moeda e aposta cara ou cruz. Canta sorte tes?",
+ games8BallTitle: "8Ball Pool",
+ games8BallDesc: "Billar visto desde arriba. Preme para apuntar e mantén premido para cargar a potencia. Mete todas as bólas co menor número de tiros.",
+ gamesArtilleryTitle: "Artillaría",
+ gamesArtilleryDesc: "Apunta o canón, ten en conta o vento e acerta no branco. 5 roldas: gaña quen faga menos tiros.",
+ gamesLabyrinthTitle: "Labirinto",
+ gamesLabyrinthDesc: "Sae do labirinto antes de que se esgoten os movementos. Cada nivel é máis grande e máis difícil.",
+ gamesCocomanTitle: "Cocoman",
+ gamesCocomanDesc: "Come todos os puntos e esquiva as pantasmas. As pantasmas móvense en tempo real: non te deteñas!",
+ gamesTetrisTitle: "Tetris",
+ gamesAudioPendulumTitle: "Péndulo sonoro",
+ gamesAudioPendulumDesc: "Simulador de física caótica con síntese de audio en tempo real. As velocidades angulares convértense en frecuencias e os picos, en golpes de percusión. Non hai dúas simulacións que soen igual.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Pincha visuais en directo con dous pratos: escolle un patrón para cada un, axusta velocidade, cor e zoom, mestura entre ambos e lanza escintileos ao ritmo. Marca o tempo ou deixa que o micrófono leve o pulso.",
+ gamesTetrisDesc: "Os clásicos bloques que caen. Completa liñas para puntuar. Canto tempo aguantarás?",
+ gamesMinesweeperTitle: "Buscaminas",
+ gamesMinesweeperDesc: "A clásica caza de minas. Limpa o taboleiro para subir de nivel — grellas máis grandes, máis minas, máis puntuación.",
+ gamesFilterScoring: "PUNTUACIÓNS",
+ gamesHallOfFame: "Salón da fama",
+ gamesHallPlayer: "Xogador",
+ gamesHallScore: "Puntuación",
+ gamesNoScores: "Aínda non hai puntuacións.",
+ chatAccessDenied: "Non tes acceso a este chat. Solicita un convite para acceder ao contido.",
+ padAccessDenied: "Non tes acceso a este pad. Solicita un convite para acceder ao contido.",
+ contentAccessDenied: "Non tes acceso a este contido.",
+ blockAccessRestricted: "Acceso restrinxido",
+ tribeContentAccessDenied: "Acceso denegado",
+ tribeContentAccessDeniedMsg: "Este contido pertence a unha tribo. Debes ser membro para acceder.",
+ tribeViewTribes: "Ver as tribos",
+ tribeFilesEmpty: "Aínda non hai ficheiros.",
+ filesLabel: "Ficheiros",
+ profileClearnetFilesLabel: "Ficheiros",
+ filesTitle: "Ficheiros",
+ filesDescription: "Explora e xestiona ficheiros na túa rede.",
+ fileAllSectionTitle: "Ficheiros",
+ fileMineSectionTitle: "Os teus ficheiros",
+ fileRecentSectionTitle: "Ficheiros recentes",
+ fileTopSectionTitle: "Ficheiros destacados",
+ fileFavoritesSectionTitle: "Favoritos",
+ fileFilterAll: "TODOS",
+ fileFilterMine: "MEUS",
+ fileFilterRecent: "RECENTES",
+ fileFilterTop: "DESTACADOS",
+ fileFilterFavorites: "FAVORITOS",
+ fileCreateSectionTitle: "Subir un ficheiro",
+ fileUpdateSectionTitle: "Actualizar o ficheiro",
+ fileCreateButton: "Subir un ficheiro",
+ fileUpdateButton: "Actualizar",
+ fileAddFavoriteButton: "Engadir a favoritos",
+ fileRemoveFavoriteButton: "Quitar de favoritos",
+ fileFileLabel: "Selecciona un ficheiro (máx.: 75MB)",
+ calendarFilterRecent: "RECENTES",
+ calendarFilterAll: "TODOS",
+ calendarFilterMine: "MEUS",
+ calendarFilterFavorites: "FAVORITOS",
+ calendarFilterOpen: "ABERTOS",
+ calendarFilterClosed: "PECHADOS",
+ padFilterRecent: "RECENTES",
+ padFilterAll: "TODOS",
+ padFilterMine: "MEUS",
+ padFilterOpen: "ABERTOS",
+ padFilterClosed: "PECHADOS",
+ chatFilterRecent: "RECENTES",
+ chatFilterAll: "TODOS",
+ chatFilterMine: "MEUS",
+ chatFilterFavorites: "FAVORITOS",
+ chatFilterOpen: "ABERTOS",
+ chatFilterClosed: "PECHADOS",
+ licenseLabel: "Licenza",
+ phoneTitle: "Teléfono",
+ phoneDescription: "Xestiona as túas videochamadas cifradas de extremo a extremo.",
+ phoneUnavailable: "As chamadas non están dispoñibles neste dispositivo.",
+ phoneCallButton: "Chamar",
+ profileVisibilityPhone: "Número de teléfono",
+ phoneNumberUnknown: "Ninguén na túa rede ten o número {number}.",
+ phoneNumberChoose: "Comproba a quen queres chamar ao {number}:",
+ phoneAnswer: "Contestar",
+ phoneSpeaker: "Altofalante",
+ phoneEarpiece: "Auricular",
+ phoneReject: "Rexeitar",
+ phoneHangup: "Colgar",
+ phoneMute: "Silenciar",
+ phoneUnmute: "Activar micrófono",
+ phoneCameraOn: "Cámara on",
+ phoneCameraOff: "Cámara off",
+ settingsPhoneVideo: "Vídeo",
+ settingsPhoneVideoOn: "Permitido en chamadas e salas",
+ settingsPhoneVideoOff: "Só audio",
+ phoneSilence: "Non oír",
+ phoneUnsilence: "Volver oír",
+ phoneCalling: "Chamando a",
+ phoneIsCalling: "está a chamarte",
+ notifyNewPmFrom: "Nova MP de",
+ notifyNewPamFrom: "Novo PaM de",
+ notifyUpdateLabel: "Actualización",
+ updateInstalledLabel: "Versión instalada",
+ updateAvailableLabel: "Versión dispoñible",
+ updateChangesLabel: "Cambios",
+ updateFilesLabel: "Ficheiros",
+ updateOriginLabel: "Orixe",
+ phoneRecording: "Gravando PaM para",
+ phoneLeaveMessage: "Ninguén contesta: deixa a túa mensaxe despois do sinal.",
+ phoneLeaveMessageBusy: "Está noutra chamada: deixa a túa mensaxe despois do sinal.",
+ phoneLeaveMessageUnreachable: "Non se puido contactar: deixa a túa mensaxe despois do sinal.",
+ phoneConnecting: "Conectando con",
+ phoneSendPam: "Enviar PaM",
+ phoneCancel: "Cancelar",
+ phoneSearchPlaceholder: "Buscar en Teléfono...",
+ phonePamTitle: "Gravacións de audio",
+ phoneNew: "Novo",
+ phoneDelete: "Borrar",
+ phoneNoPams: "Non tes gravacións de audio.",
+ phoneHistoryTitle: "Historial",
+ phoneLatestTitle: "Últimas chamadas",
+ phoneCreateButton: "Nova chamada",
+ phoneLimitsHint: "Ata 7 habitantes por chamada; con máis dun é unha chamada conxunta.",
+ phoneErrorPub: "Non se pode chamar a un pub.",
+ phoneJointCall: "Chamada conxunta",
+ phoneWith: "Con",
+ phoneResult: "Resultado",
+ phoneWhen: "Cando",
+ phoneDuration: "Duración",
+ phoneOutgoing: "Saínte",
+ phoneIncoming: "Entrante",
+ phoneNoHistory: "Aínda non hai rexistros.",
+ phoneOutcomeEnded: "Atendida",
+ phoneOutcomeMissed: "Perdida",
+ phoneOutcomeRejected: "Rexeitada",
+ phoneOutcomeNoanswer: "Sen resposta",
+ phoneOutcomeCancelled: "Cancelada",
+ phoneOutcomePam: "PaM enviado",
+ phoneOutcomeFailed: "Fallida",
+ phoneDialAdd: "Engadir",
+ phoneDialBack: "Borrar",
+ phoneDialClear: "Limpar",
+ phoneDialPlaceholder: "Número ou Oasis ID",
+ phoneDialInhabitants: "Habitantes",
+ phoneDialRemove: "Quitar",
+ phoneOwnNumber: "Ese é o teu propio número.",
+ phoneSettingsDesc: "Escolle quen pode chamarte.",
+ phoneDnd: "Non molestar",
+ phoneOpen: "Aberto",
+ phoneRecipientRefuses: "O habitante ao que intentas chamar non permite recibir chamadas.",
+ phoneRefusedNotice: "Estes habitantes non permiten recibir chamadas e non se lles chamou:",
+ fileEmptyError: "O ficheiro está baleiro. Escolle outro ficheiro.",
+ fileTitleLabel: "Título",
+ fileTitlePlaceholder: "Título",
+ fileDescriptionLabel: "Descrición",
+ fileDescriptionPlaceholder: "Descrición",
+ fileTagsLabel: "Etiquetas",
+ fileTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ fileSizeLabel: "Tamaño",
+ fileDownloadButton: "DESCARGA",
+ fileDetailsButton: "DETALLES",
+ fileNoFile: "Sen ficheiro ficheiro",
+ fileSearchPlaceholder: "Buscar en Ficheiros...",
+ fileSearchButton: "Buscar",
+ fileSortRecent: "Máis recentes",
+ fileSortOldest: "Máis antigos",
+ fileSortTop: "Máis votados",
+ fileNoMatch: "Non se atoparon ficheiros coincidentes.",
+ fileUpdatedAt: "Actualizado",
+ typeFile: "FICHEIROS",
+ modulesFilesLabel: "Ficheiros",
+ modulesFilesDescription: "Módulo para descubrir e xestionar ficheiros.",
+ tribeSectionFiles: "FICHEIROS",
+ fileDescription: "Descrición",
+ fileDownload: "Descargar",
+ fileTypeLabel: "Tipo",
+ torrentsTitle: "Torrents",
+ torrentsDescription: "Explora e xestiona torrents na túa rede.",
+ torrentAllSectionTitle: "Torrents",
+ torrentMineSectionTitle: "Os teus torrents",
+ torrentRecentSectionTitle: "Torrents recentes",
+ torrentTopSectionTitle: "Torrents destacados",
+ torrentFavoritesSectionTitle: "Favoritos",
+ torrentFilterAll: "TODOS",
+ torrentFilterMine: "MEUS",
+ torrentFilterRecent: "RECENTES",
+ torrentFilterTop: "DESTACADOS",
+ torrentFilterFavorites: "FAVORITOS",
+ torrentCreateSectionTitle: "Subir un torrent",
+ torrentUpdateSectionTitle: "Actualizar o torrent",
+ torrentCreateButton: "Subir un torrent",
+ torrentUpdateButton: "Actualizar",
+ torrentDeleteButton: "Eliminar",
+ torrentAddFavoriteButton: "Engadir a favoritos",
+ torrentRemoveFavoriteButton: "Quitar de favoritos",
+ torrentFileLabel: "Seleccionar un ficheiro torrent (.torrent)",
+ torrentTitleLabel: "Título",
+ torrentTitlePlaceholder: "Título",
+ torrentDescriptionLabel: "Descrición",
+ torrentDescriptionPlaceholder: "Descrición",
+ torrentTagsLabel: "Etiquetas",
+ torrentTagsPlaceholder: "Introduce etiquetas separadas por comas",
+ torrentSizeLabel: "Tamaño",
+ torrentFromContent: "Xerar torrent",
+ torrentFromContentMissing: "O ficheiro aínda non está dispoñible neste nodo. Téntao máis tarde.",
+ torrentDownloads: "Descargas",
+ torrentFetchOasis: "Descargar en Oasis",
+ torrentSaveFile: "Gardar ficheiro",
+ torrentSeeds: "sementes",
+ seedsLabel: "Sementes",
+ seedAction: "Apoiar",
+ torrentSourceFile: "Ficheiro",
+ torrentStateQueued: "En cola",
+ torrentStateProbing: "Buscando sementes",
+ torrentStateDownloading: "Descargando",
+ torrentStateDone: "Completada",
+ torrentStateFailed: "Fallida",
+ torrentStateNoSource: "Sen sementes conectadas, agardando",
+ torrentStateCancelled: "Cancelada",
+ torrentNoDownloads: "Aínda non hai descargas.",
+ torrentOriginalSection: "Orixinal",
+ torrentCancel: "Cancelar",
+ torrentDownloadButton: "DESCARGA",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETALLES",
+ torrentNoFile: "Sen ficheiro torrent",
+ noTorrents: "Non se atoparon torrents.",
+ noFiles: "Non se atoparon ficheiros.",
+ torrentSearchPlaceholder: "Buscar en Torrents...",
+ torrentSearchButton: "Buscar",
+ torrentSortRecent: "Máis recentes",
+ torrentSortOldest: "Máis antigos",
+ torrentSortTop: "Máis votados",
+ torrentNoMatch: "Non se atoparon torrents coincidentes.",
+ torrentUpdatedAt: "Actualizado",
+ statsTorrent: "Torrents",
+ statsFile: "Ficheiros",
+ typeTorrent: "TORRENTS",
+ modulesTorrentsLabel: "Torrents",
+ modulesTorrentsDescription: "Módulo para descubrir e xestionar torrents.",
+ favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "FICHEIROS",
+ favoritesFilterMarket: "MERCADO",
+ favoritesFilterEvents: "EVENTOS",
+ favoritesFilterForum: "FORO",
+ favoritesFilterHousing: "VIVENDA",
+ favoritesFilterJobs: "EMPREGOS",
+ favoritesFilterProjects: "PROXECTOS",
+ favoritesFilterReports: "INFORMES",
+ favoritesFilterTasks: "TAREFAS",
+ favoritesFilterTransfers: "TRANSFERENCIAS",
+ favoritesFilterVotes: "VOTACIÓNS",
+ favoritesFilterShopProducts: "ARTIGOS DE TENDA",
+ tribeSectionTorrents: "TORRENTS",
+ tribeCreateTorrent: "Subir un torrent",
+ tribeCreateFile: "Subir ficheiro",
+ settingsWishTitle: "Desexo",
+ settingsWishDesc: "Determina como accedes a todo o contido e a túa experiencia na rede Oasis.",
+ settingsWishWhole: "Multiverso",
+ settingsWishMutuals: "Só apoio mutuo",
+ settingsWishOnlyLan: "Só LAN",
+ settingsWishLocal: "Local",
+ settingsPmVisibilityTitle: "Mensaxes privadas",
+ settingsPmVisibilityDesc: "Configura o nivel de exposición a mensaxes privadas que queres ter na rede.",
+ settingsPmVisibilityWhole: "Multiverso",
+ settingsPmVisibilityMutuals: "Só apoio mutuo",
+ pmMutualNotice: "O envío é unha barreira de UX. A recepción é un filtro de atención (o cifrado xa está replicado).",
+ inhabitantsPendingFollowsTitle: "Solicitudes de apoio pendentes",
+ inhabitantsPendingAccept: "Aceptar",
+ inhabitantsPendingReject: "Rexeitar",
+ tribeSectionGovernance: "GOBERNO",
+ tribePadInviteRequired: "Non tes acceso ao pad. Pide un convite para acceder ao contido.",
+ tribeChatInviteRequired: "Non tes acceso ao chat. Pide un convite para acceder ao contido.",
+ tribeGovernanceDesc: "Goberno interno desta tribo.",
+ tribeGovernanceNoGov: "Sen goberno activo",
+ tribeGovernanceNoGovDesc: "Esta tribo aínda non ten goberno. Propón candidaturas para iniciar o proceso.",
+ tribeGovCardTitle: "Goberno actual",
+ tribeGovCycleSince: "INICIO DO CICLO",
+ tribeGovCycleEnd: "FIN DO CICLO",
+ tribeGovTimeRemaining: "TEMPO RESTANTE",
+ tribeGovPopulation: "POBOACIÓN",
+ tribeGovMethod: "MÉTODO",
+ tribeGovVotesReceived: "VOTOS RECIBIDOS",
+ tribeGovLeader: "LÍDER",
+ tribeGovFilterGovernment: "GOBERNO",
+ tribeGovFilterCandidatures: "CANDIDATURAS",
+ tribeGovFilterLaws: "LEIS",
+ tribeGovCandidatureId: "Candidatura",
+ tribeGovCandidatureMethod: "Método",
+ tribeGovCandidatureProposeBtn: "Publicar a candidatura",
+ tribeGovRuleTitle: "Título da regra",
+ tribeGovRuleBody: "Corpo da regra",
+ tribeGovProposals: "PROPOSTAS",
+ tribeGovRevocations: "REVOGACIÓNS",
+ tribeGovHistorical: "HISTÓRICO",
+ tribeGovRules: "REGRAS",
+ tribeGovernanceAlreadyPublished: "Esta tribo xa ten unha candidatura aberta no ciclo actual do parlamento global.",
+ tribeGovernanceProposeInternal: "Propoñer unha candidatura interna",
+ tribeGovernanceInternalCandidatures: "Candidaturas internas",
+ tribeGovernanceNoCandidatures: "Non hai candidaturas abertas.",
+ tribeGovernanceAddRule: "Engadir unha regra",
+ tribeGovernanceNoRules: "Aínda non hai regras.",
+ tribeGovernanceNoLeaders: "Aínda non hai líderes elixidos.",
+ tribeGovernanceComingSoon: "Proximamente no módulo de goberno desta tribo.",
+ tribeGovNoProposals: "Aínda non hai ningunha proposta",
+ tribeGovNoLaws: "Aínda non hai ningunha lei",
+ tribeGovNoRevocations: "Aínda non hai ningunha revogación",
+ tribeGovNoHistorical: "Aínda non hai ningún rexistro",
+ logsTitle: "Bitácora",
+ logsDescription: "Leva un diario privado das túas experiencias.",
+ logsViewTitle: "Bitácora",
+ logsColumnType: "Tipo",
+ logsView: "Ver",
+ logsUpdateButton: "Actualizar",
+ logsEditTitle: "Actualizar o rexistro",
+ logsCreateTitle: "Crear unha entrada",
+ logsWriteButton: "Escribir",
+ logsTextPlaceholder: "Describe as túas experiencias...",
+ logsModeAIWritten: "Asistente de IA",
+ logsModeManual: "Manual",
+ logsModeAI: "IA",
+ logsColumnLog: "Bitácora",
+ logsColumnDate: "Data",
+ logsDelete: "Eliminar",
+ logsEdit: "Actualizar",
+ logsFilterAlways: "SEMPRE",
+ logsFilterYear: "ÚLTIMO ANO",
+ logsFilterMonth: "ÚLTIMO MES",
+ logsFilterWeek: "ÚLTIMA SEMANA",
+ logsFilterToday: "HOXE",
+ logsComments: "Comentarios",
+ logsAuthorEntries: "Entradas",
+ logsCreate: "Crear unha entrada",
+ logsExport: "Exportar a bitácora",
+ logsExportOne: "Exportar o rexistro",
+ logsViewDetails: "Ver os detalles",
+ logsGenerateButton: "Xerar o texto",
+ logsSearchText: "Buscar na Bitácora...",
+ logsSearchAnyType: "Calquera tipo",
+ logsSearchButton: "Buscar",
+ logsEmpty: "Aínda non hai entradas.",
+ logsNothingNew: "Non hai accións novas que rexistrar.",
+ modulesLogsLabel: "Bitácora",
+ modulesLogsDescription: "Módulo para levar un diario privado das túas experiencias.",
+ statsLogsTitle: "Bitácora",
+ typeLog: "BITÁCORA",
+
+ larpTitle: "L.A.R.P.",
+ larpDescription: "Unha capa de xogo de rol en vivo para a experimentación colaborativa.",
+ larpNoHousesMatch: "Ningunha casa coincide coa túa busca.",
+ larpSearchPlaceholder: "Buscar en L.A.R.P....",
+ larpAllHouses: "Casas:",
+ larpFilterRuling: "GOBERNA",
+ larpFilterHouses: "CASAS",
+ larpFilterRules: "FAQ",
+ larpRulesTitle: "FAQ do L.A.R.P.",
+ larpRulesEntryText: "Todo habitante comeza por defecto en ACADEMIA. Desde ACADEMIA, escolle unha casa no panel \"Unirse a unha casa\": isto abre o seu test de entrada. Responde as 10 preguntas e envía. Se superas o limiar (7/10), serás admitido automaticamente nesa casa; se non, serás rexeitado e permanecerás en ACADEMIA. En calquera caso o sistema rexistra o teu OasisID e o ciclo do intento, e impide outro intento ata que pase o período de espera de 30 ciclos.",
+ larpRulesGovernanceText: "Durante o seu ciclo, a casa gobernante luce a insignia \"Goberna\" e é a única cuxo Muro se amosa publicamente na lapela GOBERNA.",
+ larpRulesWallText: "Cada casa ten un Muro onde escriben os seus membros. O Muro dunha casa é privado para a casa, agás o da casa gobernante e o da ACADEMIA, que pode ler calquera.",
+ larpRulesSignText: "Os habitantes poden activalo (en /profile/edit > Sensores) para amosar a imaxe da súa casa actual como un selo no seu perfil, na súa tarxeta de autor e de habitante. O selo liga á páxina da casa.",
+ larpPostsTitle: "Muro",
+ larpPostsEmpty: "Aínda non hai publicacións.",
+ larpPostPlaceholder: "Que ten que dicir esta casa?",
+ larpPostSubmit: "Publicar",
+ larpCycleLabel: "Ciclo:",
+ bankRulesArchTaxFormula: "Taxa ARCH(usuario) = max(0, (newestBlockTs − userFirstBlockTs) / 86400000) × ecoinPerDayOfHistory",
+ bankRulesArchTaxNote: "O imposto ARCH reflicte o custo a longo prazo de facer medrar e manter o arquivo da rede: canto máis antigos sexan os teus datos na rede, maior será a túa parte do custo de mantemento.",
+ bankRulesChipFormula: "band = ratio / reducer, onde ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). alto ≥ 0.66, medio ≥ 0.33, noutro caso baixo.",
+ bankRulesChipNote: "O chip de cada elemento colórese respecto á mensaxe máis grande vista na rede e suavízase segundo o número de habitantes activos — unha rede máis grande reparte a carga e empuxa máis elementos cara á banda verde.",
+ bankRulesEcoTaxFormula: "Taxa ECO(usuario) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
+ bankRulesEcoTaxNote: "O imposto ECO dedúcese da RBU bruta cando se calcula a asignación da época. Os ECO deducidos non se redistribúen nesta época — quedan no saldo do pub e alimentan o fondo da próxima época a través dos límites reserveMin / alpha.",
+ bankRulesKarmaFormula: "karma = log10(1 + actions) + reputation",
+ bankRulesKarmaNote: "O karma derívase das túas accións (publicacións, votos, participación no parlamento/tribunais, etc.) cun factor de decaemento temporal, menos os gramos de carbono que xera o teu feed.",
+ bankRulesNetFormula: "net_UBI = floor + max(0, gross_UBI − floor) − ECO Tax − ARCH Tax",
+ bankRulesPoolFormula: "pool = min(pubBal − reserveMin, capPerEpoch, alpha · pubBal)",
+ bankRulesShareFormula: "share = clamp(1 + karma/100, w_min, w_max) / sum(weights)",
+ bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
+ bankTaxesArchTaxFootprintNote: "O imposto ARCH reflicte o custo de facer medrar e manter o arquivo da rede. Calcúlase a partir do tempo transcorrido entre o primeiro bloque que publicaches e o bloque máis novo da rede — canto máis tempo viva a túa historia no arquivo, maior será a túa parte do custo de mantemento.",
+ bankTaxesArchTaxNoteBold: "reducir directamente o imposto ARCH",
+ bankTaxesArchTaxNoteIntro: "O teu imposto ARCH dedúcese do excedente que a rede xera por riba da túa RBU; o valor base da RBU é un mínimo inamovible. O imposto nunca se deduce do importe fixo que lle corresponde a cada habitante como RBU. Os fondos deducidos alimentan o algoritmo de redistribución da riqueza e canalízanse cara a outros habitantes a través das súas reclamacións de RBU. Os habitantes máis novos e os que se dediquen especificamente a tarefas de arquivo, replicación e mantemento probablemente teñan algunha tarefa dedicada a manter san o arquivo da rede no teu nome. Ou poden dedicarse a ",
+ bankTaxesArchTaxNoteOutro: " mediante acordos de poda, deduplicación de datos redundantes e infraestrutura de mantemento compartida, e o consenso da rede pode requirir a súa contribución continua.",
+ bankTaxesUserNoteChips: "O chip de imposto ECO que se amosa xunto a cada elemento cambia de cor (verde / amarelo / vermello) segundo o tamaño do elemento en relación co bloque máis grande visto na rede, suavizado polo número de habitantes activos — unha rede solar-punk máis grande reparte a carga e empuxa máis elementos cara á banda verde.",
+ bankTaxesUserNoteOtherParams: "Polo de agora o imposto ECO derívase da pegada de carbono de cada bloque, pero co tempo pode incorporar outros parámetros — enerxía gastada na replicación, almacenamento redundante entre nodos, largo de banda dos blobs, custo computacional do descifrado, pegada de minaría das transaccións asociadas ou calquera outra carga medible que a rede acorde valorar.",
+ gamesHallDate: "Data",
+ gamesNewRecord: "Novo récord!",
+ indexingRefreshNote: "Esta páxina recárgase cada 10 segundos.",
+ indexingMessage: "Oasis está sincronizando a rede de nodos distribuída. Por favor, agarda.",
+ indexingTitle: "Sincronizando",
+ padsNoItems: "Aínda non hai pads.",
+ padVersionHistory: "Historial",
+ padAttributionView: "Por autora",
+ padVersionView: "Ver a versión",
+ statsChat: "Chats",
+ statsChatMessage: "Mensaxes de chat",
+ statsGameScore: "Xogos",
+ statsWiki: "Páxinas wiki",
+ statsPad: "Pads",
+ statsPadEntry: "Entradas de pad",
+ typeGameScore: "PUNTUACIÓNS",
+ bankTaxesLookupNote: "Introduce un ID de bloque para buscalo no teu feed local.",
+ bankTaxesUserNoteChipsClick: "Preme en calquera chip para inspeccionar o seu bloque no blockexplorer.",
+ mapUrlPlaceholder: "/maps/MAP_ID",
+ larpRulesInviteEntryText: "Os membros das casas poden xerar códigos de convite que dan acceso directo á casa.",
+ larpRulesOneHouseText: "Só podes pertencer a unha casa á vez. Se non pertences a ningunha, estás en ACADEMIA. Cada páxina de casa (agás ACADEMIA) amosa aos seus membros un botón \"Saír da casa\" que devolve a pertenza a ACADEMIA. Saír NON anula o período de espera do test.",
+ larpRulesTestEntryText: "No test WILL cada opción pondera unha ou máis casas; ao envialo, o sistema suma as puntuacións e admíteche automaticamente na casa con máis puntos.",
+ larpWillTestHint: "Unha vez completado, asignaráseche a casa que máis se axuste ás túas respostas. As túas respostas individuais procésanse localmente e nunca se almacenan — só se publica no teu feed a asignación de casa resultante.",
+ larpWillTestTitle: "Test WILL",
+ settingsLanDesc: "Anuncia periodicamente este nodo a outras instancias de Oasis na mesma rede local. Desactívao para deter as difusións UDP.",
+ settingsLanEnable: "Activar a difusión LAN",
+ settingsLanTitle: "Difusión LAN",
+ settingsReplicationTitle: "Replicación",
+ settingsReplicationDesc: "Configura o número de saltos que o teu nodo segue desde o teu propio feed ao replicar contido.",
+ settingsReplicationHopsLabel: "Saltos",
+ settingsBlobCacheTitle: "Caché de medios",
+ settingsBlobCacheDesc: "O contido doutros habitantes gárdase neste dispositivo. Escolle canto espazo pode ocupar.",
+ settingsBlobCacheUsage: "Uso actual",
+ settingsBlobCacheFiles: "ficheiros",
+ settingsBlobCacheLimit: "Límite",
+ settingsBlobCacheUnlimited: "Sen límite",
+ settingsBlobCacheCleanNow: "Limpar agora",
+ settingsBlobCacheCleaned: "{n} ficheiros eliminados, {size} liberados.",
+ aiApproveTagsLabel: "Etiquetas (separadas por comas)",
+ aiApproveTagsPlaceholder: "p. ex. oasis, gobernanza, ecoloxía",
+ aiApproveRatingLabel: "Valoración",
+ aiExchangeLang: "Idioma",
+ aiExchangeTags: "Etiquetas",
+ aiExchangeRating: "Valoración",
+ aiExchangeHelpful: "Útil",
+ aiExchangeMarkHelpful: "+1 útil",
+ larpCyclesUntilRuling: "Próximo ciclo de goberno",
+ larpVisitTribe: "Visitar a tribo",
+ larpStartJourney: "Comezar a viaxe",
+ larpGoverning: "Goberna:",
+ larpStartHere: "Comeza aquí:",
+ larpMyHouse: "A miña casa:",
+ larpMembersCount: "Membros",
+ larpRolesLabel: "Roles",
+ larpFunctionLabel: "Función",
+ larpMonthLabel: "Ciclo de goberno",
+ larpLeaveToAcademia: "Volver á ACADEMIA",
+ larpAcademiaJoinTitle: "Casas L.A.R.P.",
+ larpInviteRedeem: "Unirse á casa",
+ larpInviteCreate: "Xerar un código de convite",
+ larpInvitePlaceholder: "Código de convite",
+ larpInviteBannerTitle: "Novo código de convite",
+ larpInviteBannerHint: "Comparte este código con alguén que estea en ACADEMIA. Caduca en 30 ciclos ou tras un uso.",
+ larpTestRankingTitle: "Puntuación por casa",
+ invitesHousesTitle: "L.A.R.P.",
+ ecoTaxLabel: "Taxa ECO",
+ bankTaxes: "Impostos",
+ bankOverviewYourTaxes: "Impostos totais",
+ bankTaxesEcoTaxTitle: "Taxa ECO",
+ bankTaxesArchTaxTitle: "Taxa ARCH",
+ bankTaxesUserAmount: "A túa taxa ECO (importe que devolver)",
+ bankTaxesArchTaxUserAmount: "A túa taxa ARCH (importe que devolver)",
+ bankTaxesArchTaxFirstBlock: "Idade do teu primeiro bloque",
+ bankTaxesArchTaxRate: "Tipo",
+ bankTaxesTotalBlocks: "Bloques totais",
+ bankTaxesTotalBytes: "Bytes totais",
+ bankTaxesTotalCarbon: "Carbono total",
+ bankTaxesTotalEcoin: "Taxa ECO total (toda a vida)",
+ bankTaxesEcoTaxLifetime: "Taxa ECO (toda a vida)",
+ bankTaxesAnnualEcoin: "Taxa ECO (anual)",
+ bankTaxesMonthlyEcoin: "Taxa ECO (mensual)",
+ bankTaxesArchTaxLifetime: "Taxa ARCH (toda a vida)",
+ bankTaxesArchTaxAnnual: "Taxa ARCH (anual)",
+ bankTaxesArchTaxMonthly: "Taxa ARCH (mensual)",
+ bankTaxesTotalLifetime: "Total (toda a vida)",
+ bankTaxesTotalAnnual: "Total (anual)",
+ bankTaxesTotalMonthly: "Total (mensual)",
+ bankTaxesRate: "Tipo",
+ bankTaxesSpan: "Período de mostraxe",
+ bankTaxesLookupTitle: "Inspeccionar un bloque",
+ bankTaxesLookupPlaceholder: "ID do bloque (p. ex. %abc...=.sha256)",
+ bankTaxesLookupButton: "Inspeccionar",
+ bankTaxesLookupNotFound: "Non se atopou ningún bloque con ese ID no teu feed local.",
+ bankTaxesLookupAuthor: "Autor",
+ bankTaxesLookupType: "Tipo",
+ bankTaxesLookupSize: "Tamaño",
+ bankTaxesLookupCarbon: "Pegada de carbono",
+ bankTaxesLookupEcoin: "Taxa ECO",
+ bankExchangeEcoTaxAnnual: "Impostos de ECOin (anual)",
+ bankExchangeEcoTaxMonthly: "Impostos de ECOin (mensual)",
+ bankTaxesTypesLabel: "Selecciona que impostos queres pagar",
+ bankTaxesTypesApply: "Establecer os meus impostos",
+ bankRulesPoolTitle: "Fondo mensual",
+ bankRulesShareTitle: "Reparto por usuario",
+ bankRulesKarmaTitle: "Karma (puntuación de implicación)",
+ bankRulesEcoTaxTitle: "Taxa ECO",
+ bankRulesArchTaxTitle: "Taxa ARCH",
+ bankRulesChipTitle: "Banda de cor do chip da taxa ECO",
+ bankRulesEpochKind: "Granularidade da época",
+ bankRulesAlpha: "Alpha (cota máx. do saldo do pub por época)",
+ bankRulesReserveMin: "Reserva mínima (mantense no saldo do pub)",
+ bankRulesCapPerEpoch: "Límite por época (absoluto)",
+ bankRulesGraceDays: "Período de graza da reclamación",
+ bankRulesWMin: "Peso mínimo (w_min)",
+ bankRulesWMax: "Peso máximo (w_max)",
+ bankRulesFloor: "Mínimo por usuario (bruto)",
+ bankRulesCapUser: "Límite por usuario e época",
+ bankRulesEcoTaxRate: "Tipo",
+ bankRulesArchTaxRate: "Tipo",
+ bankRulesCarbonFactor: "Factor de carbono",
+ statsTombstoneEmpty: "Aínda non hai borrados (tombstones) na rede.",
+ blockchainBlockNotAvailable: "Este bloque non está no teu feed local. Pode pertencer a un nodo que aínda non replicas.",
+ blockchainBackToBlockexplorer: "Volver a Blockexplorer",
+ audioFilterBcs: "BCS",
+ audioTranscodeButton: "TRANSCODIFICAR",
+ audioTranscodeDetailTitle: "Transcodificar",
+ audioTranscodeDetailDescription: "Descodifica a carga útil incrustada e o mapa de composición orixinal da blockchain.",
+ audioTranscodeStegoTimestamp: "Xerado o",
+ audioTranscodeStegoMessage: "TEXTO",
+ audioTranscodeStegoEmpty: "(ningún)",
+ audioTranscodeStegoUnknown: "—",
+ audioTranscodeStegoNotFound: "Non se puido descodificar ningunha carga esteganográfica neste audio.",
+ audioTranscodeCompositionEmpty: "Este audio non inclúe ningunha composición de blockchain gardada.",
+ audioBackToBcs: "Volver a BCS",
+ melodyCompositionTitle: "Mapa de composición da blockchain",
+ melodyFilterMine: "MIÑAS",
+ melodyAllEmpty: "Aínda non hai composicións BCS doutros habitantes.",
+ melodyNoteUnavailable: "o bloque non está no teu feed local",
+ melodyUploadBcsTitle: "Publicar",
+ melodyUploadBcsButton: "Publicar",
+ melodyUploadStegoLabel: "Mensaxe oculta (esteganografía)",
+ melodyUploadStegoMaxLabel: "máx. 280 caracteres",
+ melodyUploadStegoPlaceholder: "Opcional.",
+ melodyUploadBcsNameNote: "O audio publicarase co nome xerado automaticamente",
+ larpLastAttemptTitle: "O teu último intento",
+ larpLastAttemptHouse: "Casa",
+ larpLastAttemptWhen: "Cando",
+ larpLastAttemptCooldown: "Próximo intento en",
+ larpTestTitle: "Test de entrada",
+ larpTestIntro: "Responde as 10 preguntas. Necesitas polo menos 7 respostas correctas para seres admitido. Podes intentar un test cada 30 ciclos sexa cal sexa o resultado.",
+ larpTestSubmit: "Unirse á casa",
+ larpTestCooldownActive: "Próximo test dispoñible en",
+ larpTestCooldownDays: "ciclos",
+ larpTestResultTitle: "Resultado do test",
+ larpTestScore: "Puntuación",
+ larpTestNextAttempt: "Podes intentar outro test en 30 ciclos.",
+ larpGoToHouse: "Ir á túa casa",
+ larpBackToAcademia: "Volver á ACADEMIA",
+ larpBadgeYou: "Ti",
+ larpBadgeRuling: "Goberna",
+ modulesLarpLabel: "L.A.R.P.",
+ modulesLarpDescription: "Módulo para a capa de xogo de rol en vivo.",
+ larpProfileQ1: "Cando te enfrontas a un problema complexo, que fas primeiro?",
+ larpProfileQ1O1: "Falar con outras persoas para buscar consenso",
+ larpProfileQ1O2: "Construír un prototipo para probalo",
+ larpProfileQ1O3: "Investigar a bibliografía",
+ larpProfileQ1O4: "Sabotear o sistema que o provoca",
+ larpProfileQ2: "Que lle dá sentido ao teu traballo diario?",
+ larpProfileQ2O1: "Defender os habitantes que quero",
+ larpProfileQ2O2: "Crear algo tanxible",
+ larpProfileQ2O3: "Sandar ou coidar a vida",
+ larpProfileQ2O4: "Traballar con palabras e ideas",
+ larpProfileQ2O5: "Facer rir os demais",
+ larpProfileQ3: "Cando xorde un conflito no teu grupo, ti…",
+ larpProfileQ3O1: "Lideras o diálogo",
+ larpProfileQ3O2: "Tomas partido e mantéñeste firme",
+ larpProfileQ3O3: "Soltas unha broma para rebaixar a tensión",
+ larpProfileQ3O4: "Cuestionas se o conflito é real",
+ larpProfileQ3O5: "Buscas as causas ecolóxicas de raíz",
+ larpProfileQ4: "O teu proxecto favorito a longo prazo sería…",
+ larpProfileQ4O1: "Construír unha cidade",
+ larpProfileQ4O2: "Restaurar un bosque",
+ larpProfileQ4O3: "Redactar unha constitución",
+ larpProfileQ4O4: "Organizar un festival",
+ larpProfileQ4O5: "Montar unha rede de defensa",
+ larpProfileQ4O6: "Deseñar unha máquina nova",
+ larpProfileQ4O7: "Coidar un arquivo",
+ larpProfileQ4O8: "Desmontar unha orde inxusta",
+ larpProfileQ5: "Que fai unha boa líder?",
+ larpProfileQ5O1: "Alguén que escoita e media",
+ larpProfileQ5O2: "Alguén capaz de loitar e protexer",
+ larpProfileQ5O3: "Alguén que coñece a historia",
+ larpProfileQ5O4: "Alguén que te fai sorrir",
+ larpProfileQ6: "A túa relación coas regras:",
+ larpProfileQ6O1: "As regras xorden do diálogo e da lei",
+ larpProfileQ6O2: "As regras débense cumprir estritamente",
+ larpProfileQ6O3: "As regras hai que rompelas a miúdo",
+ larpProfileQ6O4: "As regras deben servir á vida",
+ larpProfileQ6O5: "As regras erguen infraestruturas sólidas",
+ larpProfileQ7: "Como xestionas a información?",
+ larpProfileQ7O1: "Coido dela e presérvoa",
+ larpProfileQ7O2: "Compártoa a través de historias",
+ larpProfileQ7O3: "Cuestiono as súas orixes",
+ larpProfileQ7O4: "Extraio o útil",
+ larpProfileQ7O5: "Úsoa para sandar",
+ larpProfileQ8: "A túa idea de éxito é…",
+ larpProfileQ8O1: "Unha máquina que funciona",
+ larpProfileQ8O2: "Unha comunidade en paz",
+ larpProfileQ8O3: "Un festival animado",
+ larpProfileQ8O4: "Unha familia segura",
+ larpProfileQ8O5: "Un arquivo intacto",
+ larpProfileQ8O6: "Un dogma resgado",
+ larpProfileQ8O7: "Unha colleita próspera",
+ larpProfileQ8O8: "Un edificio rematado",
+ larpProfileQ9: "Ao erguerte, o que queres é…",
+ larpProfileQ9O1: "Adestrar o corpo",
+ larpProfileQ9O2: "Ler ou escribir",
+ larpProfileQ9O3: "Cultivar ou cociñar",
+ larpProfileQ9O4: "Argallar con algo",
+ larpProfileQ9O5: "Cuestionar a autoridade",
+ larpProfileQ9O6: "Planificar un proxecto",
+ larpProfileQ9O7: "Falar coas túas amigas",
+ larpProfileQ9O8: "Facer arte",
+ larpProfileQ10: "A túa debilidade podería ser:",
+ larpProfileQ10O1: "Falar demasiado",
+ larpProfileQ10O2: "Ser demasiado pragmática",
+ larpProfileQ10O3: "Ser demasiado idealista",
+ larpProfileQ10O4: "Ser demasiado disruptiva",
+ larpProfileQ10O5: "Ser demasiado ríxida",
+ larpProfileQ10O6: "Ser demasiado despreocupada",
+ larpProfileQ10O7: "Ser demasiado cautelosa",
+ larpProfileQ10O8: "Ser demasiado ambiciosa",
+ uxModeTitle: "UX",
+ uxModeDescription: "Selecciona que modo de navegación UX queres para a túa interface.",
+ uxModeMenus: "Bloques",
+ uxModeChats: "Conversas",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Etiquetas en tendencia",
+ feedActiveTitle: "Habitantes activos",
+ cnBrandSub: "Libre · P2P · Federada",
+ cnSyncedPeers: "Nodos sincronizados",
+ cnLicense: "Licenza",
+ cnNotAccessible: "O contido non está accesible neste momento.",
+ cnUntitled: "Sen título",
+ cnSearchPlaceholder: "Buscar…",
+ cnHubTitle: "HUB Clearnet",
+ cnHubDescription: "Contido público compartido polos habitantes desta rede Oasis.",
+ cnHubEmpty: "Aínda non se compartiu contido público na Clearnet.",
+ cnPublicContent: "Contido",
+ cnTribesContent: "Tribos",
+ cnNetworkContent: "Rede",
+ cnCategoryEmpty: "Non hai contido nesta categoría.",
+ cnInhabitantEmpty: "Este habitante aínda non publicou contido na Clearnet.",
+ cnPrevPage: "← Anterior",
+ cnNextPage: "Seguinte →",
+ cnPageOf: "Páxina {page} de {pages}",
+ cnMoreInfo: "Máis información →",
+ cnOpenCourse: "Curso aberto",
+ cnAuction: "POXA",
+ cnExchange: "INTERCAMBIO",
+ cnRssDescription: "publicados polos habitantes deste HUB",
+ cnKindAudio: "Audio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Marcador",
+ cnKindDocument: "Documento",
+ cnKindEvent: "Evento",
+ cnKindFeed: "Feed",
+ cnKindImage: "Imaxe",
+ cnKindJob: "Emprego",
+ cnKindMarket: "Mercado",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Proxecto",
+ cnKindCourse: "Curso",
+ cnKindShop: "Tenda",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "Ficheiro",
+ cnKindVideo: "Vídeo",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Sala",
+ cnKindMap: "Mapa",
+ uxModeAINav: "IA",
+
+ }
+};
diff --git a/src/client/assets/translations/oasis_hi.js b/src/client/assets/translations/oasis_hi.js
index 062769c..91474e7 100644
--- a/src/client/assets/translations/oasis_hi.js
+++ b/src/client/assets/translations/oasis_hi.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "खरीद",
shopMyOrdersDescription: "आपके खरीद ऑर्डर।",
shopMyOrdersEmpty: "आपके पास अभी कोई खरीद नहीं है।",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM विक्रेता",
shopOrderSeller: "विक्रेता",
shopOrderInvoice: "चालान",
shopOrderInvoiceConcept: "चालान",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "स्वीकार करें",
shopOrderReject: "अस्वीकार करें",
shopOrderMarkShipped: "भेजा गया चिह्नित करें",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM खरीदार",
shopOrderContractConcept: "दुकान ऑर्डर",
shopOrdersPending: "लंबित ऑर्डर",
all: "सभी",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "सामग्री चेतावनी",
invalidPost: "अमान्य सामग्री",
invalidPostHint: "इस संदेश में अमान्य/खाली पाठ है।",
- spreadBy: "द्वारा",
spreadChron: "प्रसार",
spreaded: "प्रसारित",
spreadContentUnavailable: "सामग्री अभी उपलब्ध नहीं (प्रतिकृति लंबित)",
filteredByTag: "टैग द्वारा फ़िल्टर",
filteredByTagTitle: "टैग द्वारा फ़िल्टर",
feedPublishedSuccess: "फ़ीड सफलतापूर्वक प्रकाशित!",
+ feedMastodonFailed: "Oasis में प्रकाशित हुआ, लेकिन Mastodon पर नहीं भेजा जा सका।",
tribeFeedSent: "संदेश सफलतापूर्वक भेजा गया!",
tribeContentEncrypted: "एन्क्रिप्टेड सामग्री",
tribeTorrentsEmpty: "अभी तक कोई टोरेंट नहीं।",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "अंतिम विज़िट",
profileClearnetBookmarksLabel: "बुकमार्क",
invitesPort: "पोर्ट",
- currentlyUnrecheable: "त्रुटि!",
- peerHostValidation: "मान्य IPv4 (जैसे 192.168.1.100) या होस्टनाम (जैसे pub.example.com)",
+ peerHostValidation: "मान्य IPv4 (जैसे 192.168.1.100) या होस्टनाम (जैसे pub.solarnethub.com)",
peerPortValidation: "पोर्ट 1-65535",
peerKeyValidation: "SSB ed25519 सार्वजनिक कुंजी (@<44 वर्ण base64>=.ed25519)",
inboxJobUnsubscribedTitle: "आपकी नौकरी से सदस्यता समाप्त",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "कार्य विवरण",
exportPasswordLabel: "निर्यात पासवर्ड",
importPasswordPlaceholder: "पासवर्ड दर्ज करें",
- searchCasesPlaceholder: "मामले खोजें…",
+ searchCasesPlaceholder: "न्यायालय में खोजें...",
shopBuyDeliveryAddressPlaceholder: "डिलीवरी पता",
shopBuyNotesPlaceholder: "नोट्स",
bankTaxesUserNoteBold: "ECO कर को सीधे कम करना",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "मामले का समर्थन करें",
courtsSettlementAcceptBtn: "समझौता स्वीकारें",
courtsSupportCount: "समर्थक",
- courtsVerdictVoteTitle: "फैसले पर मतदान",
- courtsVerdictVoteLabel: "फैसला मतदान",
- courtsVerdictVoteAccept: "स्वीकार करें",
- courtsVerdictVoteReject: "अस्वीकार करें",
- courtsVerdictVoteSubmit: "मत भेजें",
reportsSetStatus: "स्थिति निर्धारित करें",
reportsStatusClosed: "बंद",
statsAvgPerInhabitant: "प्रति निवासी औसत",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "अवतार",
inhabitants: "निवासी",
- peersReplicatedFeeds: "प्रतिकृत फ़ीड",
+ peersReplicatedFeeds: "प्रतिकृत",
+ peersTorColumn: "TOR",
+ peersTorYes: "Tor से पहुंचा जा सकता है",
+ peersTorNo: "Tor से नहीं पहुंचा जा सकता",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "संस्करण",
graphos: "ग्राफोस",
graphosDescription: "आपके आसपास के नेटवर्क का इंटरैक्टिव मानचित्र।",
+ graphosFederation: "फ़ेडरेशन",
+ graphosFedPubs: "PUB",
+ graphosFedUnreachable: "पहुँच से बाहर",
+ graphosFedLinks: "पारस्परिक कड़ियाँ",
+ graphosFedIsolated: "अलग-थलग",
+ graphosFedNoData: "कोई डेटा नहीं",
+ graphosFedMutual: "पारस्परिक",
+ graphosFedOneWay: "एकतरफ़ा",
+ graphosFedTransport: "नेटवर्क",
+ graphosFedWith: "इनके साथ फ़ेडरेटेड",
+ graphosZoom: "बड़ा करें",
+ graphosFedInhabitants: "निवासी",
+ graphosFedClearnet: "इंटरनेट",
+ graphosFedBoth: "इंटरनेट + TOR",
+ graphosFedEmpty: "आपका नोड अभी किसी PUB को नहीं जानता।",
graphosViewingGraphOf: "देख रहे",
graphosBackToMine: "← मेरा नेटवर्क",
graphosShowing: "दिखा रहे",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "आपको अभी तक कोई @उल्लेख नहीं मिला है।",
- mentionsSearchPlaceholder: "उल्लेख खोजें...",
+ mentionsSearchPlaceholder: "उल्लेख में खोजें...",
privateReminders: "रिमाइंडर",
+ inboxFilterPms: "निजी संदेश",
+ inboxFilterNotifications: "सूचनाएँ",
+ inboxMarkRead: "पढ़ा हुआ चिह्नित करें",
+ inboxMarkUnread: "अपठित चिह्नित करें",
+ inboxUnreadChip: "अपठित",
+ inboxMarkAllRead: "सभी को पठित चिह्नित करें",
+ inboxDeleteShown: "सभी हटाएँ",
+ inboxArchive: "संग्रहित करें",
+ inboxUnarchive: "संग्रह से निकालें",
+ inboxFilterArchived: "संग्रहित",
+ inboxEarlierMessages: "पिछले संदेश",
+ inboxSortThread: "थ्रेड के अनुसार",
+ inboxSortRecent: "नवीनतम पहले",
+ inboxAllBots: "बॉट",
+ settingsInboxBotsTitle: "इनबॉक्स सूचनाएँ",
+ settingsInboxBotsDesc: "चुनें कि कौन से बॉट आपके इनबॉक्स में सूचित कर सकते हैं। अचयनित बॉट छिपा दिए जाते हैं और उनकी सूचनाएँ गिनी नहीं जातीं।",
inboxFiltersLabel: "फ़िल्टर:",
inboxToggleToMutuals: "पारस्परिक पर स्विच करें",
inboxToggleToWhole: "सभी पर स्विच करें",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "उत्तर दें",
pmReplies: "उत्तर",
inReplyTo: "के उत्तर में",
+ forumInThread: "थ्रेड में",
pmPreview: "पूर्वावलोकन",
pmPreviewTitle: "संदेश पूर्वावलोकन",
peers: "पीयर",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "से",
searchToLabel: "तक",
searchQueryLabel: "क्वेरी",
- searchPerPageLabel: "प्रति पृष्ठ परिणाम",
+ searchPerPageLabel: "परिणाम",
settings: "सेटिंग्स",
+ settingsDescription: "अपने नेटवर्क का परिवेश सेट करें।",
continueReading: "पढ़ना जारी रखें",
moreComments: "और टिप्पणी",
readThread: "बाकी थ्रेड पढ़ें",
@@ -241,7 +273,6 @@ module.exports = {
profileClearnetHelp: 'Oasis के बाहर से एक्सेस किए जा सकने वाले मॉड्यूल।',
profileHubAll: 'सभी',
footerLicenseLabel: 'लाइसेंस',
- profileSwitchToOasis: 'Oasis पर वापस जाएँ',
profileVisibilityFediverse: "मल्टीवर्स",
contributorsTitle: "योगदानकर्ता",
colorLabel: 'रंग चुनें',
@@ -251,6 +282,7 @@ module.exports = {
modulesViewTitle: "मॉड्यूल",
modulesViewDescription: "मॉड्यूल सक्षम या अक्षम करके अपना वातावरण सेट करें।",
inbox: "इनबॉक्स",
+ inboxSearchPlaceholder: "इनबॉक्स में खोजें...",
multiverse: "मल्टीवर्स",
fediverse: "मल्टीवर्स",
fediverseDescription: "अपने अन्य मल्टीवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।",
@@ -259,9 +291,17 @@ module.exports = {
fediverseSettingsTitle: "मल्टीवर्स",
fediverseInstanceLabel: "पता",
fediverseTokenLabel: "एक्सेस टोकन",
- fediverseTokenHelp: "अपना एक्सेस टोकन सेट करें। इसका उपयोग Oasis के भीतर से आपके Mastodon खाते को प्रबंधित करने के लिए किया जाएगा।",
fediverseConnect: "कनेक्ट करें",
fediverseConnectedAs: "इस रूप में कनेक्टेड",
+ nextcloudServerLabel: "सर्वर",
+ nextcloudUserLabel: "उपयोगकर्ता",
+ nextcloudFolderLabel: "फ़ोल्डर",
+ nextcloudUploadButton: "अपलोड",
+ nextcloudFileLabel: "एक फ़ाइल चुनें",
+ fileExternalLink: "बाहरी लिंक",
+ nextcloudErrConnect: "इन विवरणों से Nextcloud तक नहीं पहुँचा जा सका।",
+ nextcloudErrUpload: "Nextcloud पर अपलोड विफल रहा।",
+ nextcloudErrShare: "Nextcloud ने फ़ाइल के लिए सार्वजनिक लिंक नहीं दिया।",
fediverseDisconnect: "डिस्कनेक्ट करें",
fediverseEmptyLink: "सेटिंग्स",
fediverseComposePlaceholder: "आप क्या सोच रहे हैं?",
@@ -290,6 +330,76 @@ module.exports = {
fediverseErrPost: "प्रकाशित नहीं हो सका।",
fediverseErrMedia: "फ़ाइल अपलोड नहीं हो सकी।",
fediverseErrEmpty: "कुछ लिखें या फ़ाइल जोड़ें।",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "फ़ोन नंबर",
+ telegramSendCode: "कोड भेजें",
+ telegramCodeHelp: "Telegram द्वारा अभी भेजा गया कोड दर्ज करें (ऐप या SMS)।",
+ telegramCodeLabel: "कोड",
+ telegramPasswordHelp: "इस खाते में दो-चरणीय सत्यापन है। अपना पासवर्ड दर्ज करें।",
+ telegramPasswordLabel: "पासवर्ड",
+ telegramVerify: "सत्यापित करें",
+ telegramCancel: "रद्द करें",
+ telegramChats: "चैट",
+ telegramUnread: "अपठित",
+ telegramOpen: "खोलें",
+ telegramSend: "भेजें",
+ telegramYou: "आप",
+ telegramNoChats: "अभी कोई चैट नहीं।",
+ telegramNoMessages: "अभी कोई संदेश नहीं।",
+ telegramComposePlaceholder: "संदेश लिखें…",
+ telegramChannel: "चैनल",
+ telegramGroup: "समूह",
+ telegramPrivate: "निजी",
+ telegramErrConnect: "Telegram से संपर्क नहीं हो सका।",
+ telegramErrTimeout: "Telegram ने जवाब देने में बहुत समय लिया।",
+ telegramErrAuth: "Telegram सत्र अमान्य या समाप्त। फिर से जोड़ें।",
+ telegramErrFetch: "चैट लोड नहीं हो सकीं।",
+ telegramErrSend: "संदेश नहीं भेजा जा सका।",
+ telegramErrMissing: "API ID, API hash और फ़ोन नंबर आवश्यक हैं।",
+ telegramErrCode: "अमान्य कोड। पुनः प्रयास करें।",
+ telegramErrCodeExpired: "कोड समाप्त हो गया। फिर से शुरू करें।",
+ telegramErrPassword: "गलत पासवर्ड।",
+ telegramErrPhone: "अमान्य फ़ोन नंबर।",
+ telegramErrApi: "अमान्य API ID या API hash।",
+ telegramErrFlood: "बहुत अधिक प्रयास। थोड़ी देर बाद पुनः प्रयास करें।",
+ telegramErrNoLogin: "कोई लॉगिन प्रगति में नहीं। फिर से शुरू करें।",
+ peertubeUsernameLabel: "उपयोगकर्ता नाम",
+ peertubePasswordLabel: "पासवर्ड",
+ peertubeSubscriptions: "सदस्यताएँ",
+ peertubeMyVideos: "मेरे वीडियो",
+ peertubeVideos: "वीडियो",
+ peertubeFollowers: "फ़ॉलोअर",
+ peertubeViews: "बार देखा गया",
+ peertubeLikes: "पसंद",
+ peertubeQuota: "कोटा",
+ peertubeUpload: "वीडियो अपलोड करें",
+ peertubeUploadHelp: "एक वीडियो फ़ाइल चुनें। यह आपके चैनल पर अपलोड होती है और बाद में PeerTube उसे प्रोसेस करता है।",
+ peertubeTitleLabel: "शीर्षक",
+ peertubeDescriptionLabel: "विवरण",
+ peertubePrivacyLabel: "गोपनीयता",
+ peertubePrivacyPublic: "सार्वजनिक",
+ peertubePrivacyUnlisted: "असूचीबद्ध",
+ peertubePrivacyPrivate: "निजी",
+ peertubeNoVideos: "अभी कोई वीडियो नहीं।",
+ peertubeComments: "टिप्पणियाँ",
+ peertubeComment: "टिप्पणी करें",
+ peertubeCommentPlaceholder: "टिप्पणी लिखें…",
+ peertubeNoComments: "अभी कोई टिप्पणी नहीं।",
+ peertubeOpen: "PeerTube पर खोलें",
+ peertubeWatch: "देखें",
+ peertubeChannel: "चैनल",
+ peertubeNoStream: "यह वीडियो अभी यहाँ नहीं चल सकता। इसे PeerTube पर खोलें।",
+ peertubeUploaded: "वीडियो अपलोड हो गया। PeerTube इसे प्रोसेस कर रहा है।",
+ peertubeErrConnect: "PeerTube से संपर्क नहीं हो सका।",
+ peertubeErrAuth: "उपयोगकर्ता नाम या पासवर्ड गलत है, या सत्र समाप्त हो गया। फिर से जोड़ें।",
+ peertubeErrInstance: "अमान्य इंस्टेंस URL।",
+ peertubeErrMissing: "इंस्टेंस, उपयोगकर्ता नाम और पासवर्ड आवश्यक हैं।",
+ peertubeErrFetch: "वीडियो लोड नहीं हो सके।",
+ peertubeErrUpload: "वीडियो अपलोड नहीं हो सका।",
+ peertubeErrTitle: "शीर्षक आवश्यक है।",
+ peertubeErrComment: "टिप्पणी प्रकाशित नहीं हो सकी।",
+ peertubeErrNoFile: "एक वीडियो फ़ाइल चुनें।",
bookmarksLabel: "बुकमार्क",
videosLabel: "वीडियो",
torrentsLabel: "टोरेंट",
@@ -312,7 +422,6 @@ module.exports = {
comment: "टिप्पणी",
subtopic: "उपविषय",
json: "JSON",
- createdBy: "द्वारा",
unfollow: "समर्थन वापस लें",
follow: "समर्थन करें",
block: "ब्लॉक करें",
@@ -328,12 +437,15 @@ module.exports = {
relationshipNone: "आप समर्थन नहीं कर रहे हैं",
relationshipBlockingPost: "ब्लॉक की गई पोस्ट",
viewLikes: "प्रसार देखें",
+ viewSupporters: "समर्थक देखें",
spreadedDescription: "निवासी द्वारा प्रसारित पोस्ट की सूची।",
preview: "पूर्वावलोकन",
publish: "लिखें",
contentWarningPlaceholder: "पोस्ट में विषय जोड़ें (वैकल्पिक)",
- publishWarningPlaceholder: "मुख्य पाठ 7000 वर्णों तक सीमित।",
+ publishWarningPlaceholder: "अपनी प्रविष्टि का मुख्य पाठ लिखें।",
publishTooLong: "आपकी पोस्ट बहुत लंबी है। कृपया इसे छोटा करें।",
+ keepTextRetry: "फिर से भेजें",
+ dateInPastError: "तारीख़ बीते समय की नहीं हो सकती",
publishCustomDescription: [
"याद रखें: ब्लॉकचेन तकनीक के कारण, एक बार पोस्ट प्रकाशित होने के बाद इसे संपादित या हटाया नहीं जा सकता।",
],
@@ -363,9 +475,8 @@ module.exports = {
mentionsMatching: "मिलते-जुलते उल्लेख",
mentionsName: "नाम",
mentionsRelationship: "संबंध",
- updateit: "अपडेट प्राप्त करें!",
updateBannerText: "Oasis का एक नया संस्करण उपलब्ध है।",
- updateBannerAction: "अभी अपडेट करें →",
+ updateBannerAction: "अभी अपडेट करें!",
info: "जानकारी",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -373,16 +484,14 @@ module.exports = {
timeAgo: "पहले",
sendTime: "लगभग ",
theme: "थीम",
- legacy: "कुंजियाँ",
- legacyTitle: "कुंजियाँ",
- legacyDescription: "अपनी गुप्त कुंजी (निजी कुंजी) को जल्दी और सुरक्षित रूप से प्रबंधित करें।",
- legacyExportButton: "निर्यात",
- legacyImportButton: "आयात",
+ backupKeysExportButton: "निर्यात",
+ backupKeysImportButton: "आयात",
ssbLogStream: "ब्लॉकचेन",
ssbLogStreamDescription: "ब्लॉकचेन स्ट्रीम के लिए संदेश सीमा कॉन्फ़िगर करें।",
+ logWindowChip: "अंतिम {n} ब्लॉकचेन स्ट्रीम",
saveSettings: "सेटिंग्स सहेजें",
exportDescription: "अपनी कुंजी एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)",
- exportDataTitle: "बैकअप",
+ exportDataTitle: "तत्काल बैकअप",
exportDataDescription: "अपना डेटा डाउनलोड करें (गुप्त कुंजी शामिल नहीं!)",
exportDataButton: "डेटाबेस डाउनलोड करें",
importDescription: "अपना अवतार सक्रिय करने के लिए अपनी एन्क्रिप्टेड गुप्त कुंजी (निजी कुंजी) आयात करें",
@@ -391,38 +500,33 @@ module.exports = {
fileInfo: "आपकी एन्क्रिप्टेड गुप्त कुंजी आपके डिवाइस पर डाउनलोड की जाएगी (नाम: oasis.enc)",
developer: "विकास",
devTitle: "विकास",
- welcomeBannerText: "OASIS में स्वागत है। अपना अवतार सेट करने के लिए इन आसान चरणों का पालन करें।",
+ welcomeBannerText: "आपका अवतार अभी सेट नहीं हुआ है।",
aiSuggestionBanner: "सुझाव:",
aiSuggestionsEnable: "AI सुझाव",
- welcomeBannerAction: "शुरू करें!",
+ welcomeBannerAction: "शुरू करें",
welcomeTitle: "स्वागत है",
+ welcomeStepIdentity: "पहचान",
+ welcomeStepType: "प्रकार",
+ welcomeStepUse: "उपयोग",
+ welcomeStepLook: "रूप",
+ welcomeStepCommunity: "समुदाय",
+ welcomeStepIntro: "स्वागत",
+ welcomeHintIdentity: "आपका नाम और चित्र।",
+ welcomeHintType: "Oasis आपके लिए कैसे खुलता है।",
+ welcomeHintUse: "कौन से मॉड्यूल चालू रहते हैं।",
+ welcomeHintLook: "Oasis की थीम।",
+ welcomeHintCommunity: "दूसरे निवासियों से मिलने के लिए किसी PUB से जुड़ें।",
+ welcomeHintIntro: "समुदाय को पहला अभिवादन भेजें।",
+ welcomeStepThemeAction: "यह थीम इस्तेमाल करें",
+ welcomeJoinPubs: "PUB से जुड़ें",
+ welcomeNoFederation: "बिना संघ के",
welcomeStepGreetingAction: "भेजें",
- welcomeJoinPubButton: "pub से जुड़ें",
- welcomeStepLarpAction: "\"अकादमी\" में शामिल हों",
- welcomeStepLarpText: "हमारे लाइव एक्शन रोल प्लेइंग खेल में शामिल हों।",
- welcomeStepLarpTitle: "L.A.R.P. में शामिल हों",
- welcomeStepGreetingTitle: "एक \"Hello world!\" भेजें",
- welcomeStepGreetingText: "एक संदेश भेजें ताकि दूसरे निवासी आपको खोज सकें।",
- welcomeJoinPub: "जुड़ें:",
welcomeDescription: "शुरू करने से पहले कुछ ज़रूरी बातें।",
- welcomeProgress: "पूर्ण",
- welcomeStepDone: "हो गया",
- welcomeStepPending: "बाकी",
welcomeSkip: "अभी नहीं",
- welcomeStepLanguageTitle: "अपनी भाषा चुनें",
- welcomeStepLanguageText: "Oasis कई भाषाएँ बोलता है। आप इसे कभी भी बदल सकते हैं।",
- welcomeStepProfileTitle: "अपनी प्रोफ़ाइल संपादित करें",
- welcomeStepProfileText: "एक नाम चुनें, विवरण जोड़ें और तस्वीर लगाएँ ताकि दूसरे निवासी आपको पहचान सकें।",
welcomeStepProfileAction: "प्रोफ़ाइल सहेजें",
- welcomeStepFederationTitle: "मुख्य नेटवर्क से जुड़ें",
- welcomeStepFederationText: "दूसरे निवासियों से मिलने और सिंक शुरू करने के लिए हमारे pub से जुड़ें।",
- welcomeStepFederationAction: "आमंत्रण देखें",
- welcomeStepBackupTitle: "अपनी ID का बैकअप लें",
- welcomeStepBackupText: "आपकी पहचान इस डिवाइस पर एक कुंजी फ़ाइल है।",
- welcomeStepBackupWarning: "यदि यह खो गई, तो कोई भी इसे वापस नहीं ला सकता।",
- welcomeStepBackupAction: "बैकअप!",
+ welcomeBootstrapRunning: "पब का स्नैपशॉट लोड हो रहा है। पूरा होते ही पब से अपने आप जुड़ जाएगा; इस बीच आप Oasis इस्तेमाल करते रह सकते हैं।",
welcomeCompleteTitle: "सब तैयार है।",
- welcomeCompleteText: "आपका नोड तैयार है। यहाँ से नेटवर्क उन लोगों के साथ बढ़ता है जिन्हें आप फ़ॉलो करते हैं।",
+ welcomeCompleteText: "आपका नोड तैयार है। यहाँ से नेटवर्क उन निवासियों के साथ बढ़ता है जिनका आप समर्थन करते हैं।",
welcomeFindPeople: "निवासी खोजें",
devFilterFiles: "फ़ाइलें",
devFilterSearch: "खोज",
@@ -432,7 +536,7 @@ module.exports = {
devFilterTests: "टेस्ट",
devVersion: "संस्करण",
devNodeVersion: "Node",
- devStatsTests: "टेस्ट सूट",
+ devStatsTests: "टेस्ट",
devParentFolder: "मूल फ़ोल्डर",
devOpenFolder: "खोलें",
devDescription: "इस नोड पर चल रहे स्रोत कोड का अन्वेषण करें।",
@@ -476,6 +580,27 @@ module.exports = {
"यदि आप दूसरी भाषा उपयोग करना चाहते हैं, तो यहाँ चुनें।",
setLanguage: "भाषा सेट करें",
peerConnectionsIntro: "अन्य पीयर के साथ अपने सभी कनेक्शन प्रबंधित करें।",
+ peersConnectFailed: "कनेक्ट नहीं हो सका: {reason}।",
+ peerStateLabel: "स्थिति",
+ peerAddressLabel: "पता",
+ peerLastChangeLabel: "अंतिम बदलाव",
+ peerStateConnected: "जुड़ा हुआ",
+ peerStateConnecting: "जुड़ रहा है",
+ peerStateStaged: "उपलब्ध",
+ peerErrSilent: "कोई गतिविधि नहीं",
+ peerErrTimeout: "जवाब नहीं दे रहा",
+ peerErrRefused: "कनेक्शन अस्वीकार करता है",
+ peerErrNotFound: "अज्ञात पता",
+ peerErrUnreachable: "नेटवर्क पहुँच से बाहर",
+ peerErrKeys: "अलग कुंजियाँ इस्तेमाल कर रहा है",
+ peerErrIdentity: "आपका कनेक्शन स्वीकार नहीं करता",
+ peerErrTor: "केवल TOR",
+ peerErrDropped: "कनेक्शन टूट गया",
+ peerErrPaused: "नेटवर्क रुका हुआ है",
+ peerErrOther: "कनेक्शन त्रुटि",
+ peerOutdated: "पुराना संस्करण",
+ peerVersionUnannounced: "अपना संस्करण घोषित नहीं करता: पुराना Oasis",
+ peersTorMissing: "यह PUB केवल TOR से कनेक्शन की अनुमति देता है।",
peerConnectionsTitle: "कनेक्शन",
online: "ऑनलाइन",
offline: "ऑफ़लाइन",
@@ -494,22 +619,25 @@ module.exports = {
noConnections: "कोई पीयर कनेक्ट नहीं है।",
noDiscovered: "कोई पीयर नहीं मिला।",
noUnknownPeers: "मित्र-ग्राफ में कोई अज्ञात पीयर नहीं।",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "अभी तक कोई पीयर पंजीकृत नहीं है।",
+ peerConnect: "कनेक्ट करें",
+ peerDisconnect: "डिस्कनेक्ट करें",
peerRefresh: "ताज़ा करें",
peerPruneIdle: "निष्क्रिय हटाएँ",
+ peersPause: "रोकें",
+ peersResume: "फिर शुरू करें",
+ peersPausedNote: "रुका हुआ: Oasis किसी से नहीं जुड़ता और कोई उससे नहीं जुड़ सकता।",
+ peersPauseHint: "सभी कनेक्शन रोक देता है: जब तक आप फिर से शुरू नहीं करते, Oasis न अन्य नोड्स से जुड़ता है न उन्हें स्वीकार करता है।",
peerExport: "निर्यात",
peerImport: "आयात",
peerImportTitle: "पीयर सूची आयात करें",
peerImportPlaceholder: "प्रति पंक्ति एक multiserver पता पेस्ट करें, या एक .txt फ़ाइल अपलोड करें…",
connectionActionIntro:
"",
- startNetworking: "नेटवर्किंग शुरू करें",
- stopNetworking: "नेटवर्किंग बंद करें",
- restartNetworking: "नेटवर्किंग पुनः आरंभ करें",
- sync: "नेटवर्क सिंक करें",
indexes: "इंडेक्स",
+ indexesRebuilt: "सूचकांक पुनर्निर्मित",
+ indexesRebuildFailed: "सूचकांक पुनर्निर्मित नहीं हो सके",
+ indexesFiles: "सूचकांक फ़ाइलें",
indexesDescription:
"अपने इंडेक्स पुनर्निर्माण करना सुरक्षित है, और कुछ प्रकार की त्रुटियों को ठीक कर सकता है।",
homePageTitle: "होम",
@@ -519,44 +647,33 @@ module.exports = {
invitesDescription: "अपने नेटवर्क में आमंत्रण कोड प्रबंधित करें और लागू करें।",
invitesPubsHint: "किसी पब का आमंत्रण कोड चिपकाएँ ताकि उससे संघ बने और उसके निवासियों की प्रतिकृति शुरू हो।",
invitesFederationsHint: "जिन पब से आप जुड़े हैं: उन्हें ताज़ा करें, अनुपलब्ध हटाएँ या सूची निर्यात करें।",
- invitesHousesHint: "LARP के किसी घर में शामिल होने और उसकी अर्थव्यवस्था में भाग लेने के लिए घर का कोड डालें।",
- invitesTribesHint: "सदस्य बनने और निजी सामग्री तक पहुँचने के लिए ट्राइब का कोड डालें।",
- invitesChatsHint: "बातचीत और उसके थ्रेड में शामिल होने के लिए चैट का कोड डालें।",
- invitesPadsHint: "साझा दस्तावेज़ पर साथ लिखने के लिए पैड का कोड डालें।",
- invitesCalendarsHint: "तारीख़ें और अनुस्मारक साझा करने के लिए कैलेंडर का कोड डालें।",
- invitesEventsHint: "निजी आयोजन में शामिल होने के लिए इवेंट का कोड डालें।",
- invitesForumsHint: "निजी फ़ोरम में पढ़ने और उत्तर देने के लिए फ़ोरम का कोड डालें।",
- invitesMapsHint: "साझा नक़्शे पर जगहें देखने और जोड़ने के लिए मानचित्र का कोड डालें।",
- invitesShopsHint: "किसी दुकान और उसके कैटलॉग में शामिल होने के लिए दुकान का कोड डालें।",
- invitesInhabitantsHint: "एक-दूसरे को फ़ॉलो करने और सामग्री साझा करने के लिए निवासी का कोड डालें।",
invitesTribesTitle: "जनजातियाँ",
- invitesTribeInviteCodePlaceholder: "जनजाति आमंत्रण कोड दर्ज करें",
- invitesTribeJoinButton: "जनजाति में शामिल हों",
invitesChatsTitle: "चैट्स",
- invitesChatInviteCodePlaceholder: "चैट आमंत्रण कोड दर्ज करें",
- invitesChatJoinButton: "चैट में शामिल हों",
invitesPadsTitle: "पैड्स",
- invitesPadInviteCodePlaceholder: "पैड आमंत्रण कोड दर्ज करें",
- invitesPadJoinButton: "पैड में शामिल हों",
invitesCalendarsTitle: "कैलेंडर",
- invitesCalendarInviteCodePlaceholder: "कैलेंडर आमंत्रण कोड दर्ज करें",
- invitesCalendarJoinButton: "कैलेंडर में शामिल हों",
invitesEventsTitle: "कार्यक्रम",
- invitesEventInviteCodePlaceholder: "कार्यक्रम आमंत्रण कोड दर्ज करें",
- invitesEventJoinButton: "कार्यक्रम में शामिल हों",
invitesForumsTitle: "मंच",
- invitesForumInviteCodePlaceholder: "मंच आमंत्रण कोड दर्ज करें",
- invitesForumJoinButton: "मंच में शामिल हों",
invitesMapsTitle: "मानचित्र",
- invitesMapInviteCodePlaceholder: "मानचित्र आमंत्रण कोड दर्ज करें",
- invitesMapJoinButton: "मानचित्र में शामिल हों",
invitesShopsTitle: "दुकानें",
- invitesShopInviteCodePlaceholder: "दुकान आमंत्रण कोड दर्ज करें",
- invitesShopJoinButton: "दुकान में शामिल हों",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "सुझाए गए PUB",
+ invitesFilterOthers: "अन्य",
+ invitesJoinTitle: "आमंत्रण",
+ invitesJoinHint: "कोई भी आमंत्रण कोड चिपकाएँ, चाहे वह किसी के लिए भी हो, या किसी निवासी का Oasis ID।",
+ invitesJoinPlaceholder: "आमंत्रण कोड या Oasis ID",
+ invitesJoinButton: "जुड़ें",
+ invitesUsedTitle: "हाल के आमंत्रण",
+ invitesUsedEmpty: "आपने अभी तक कोई आमंत्रण उपयोग नहीं किया है।",
+ invitesUsedType: "प्रकार",
+ invitesUsedName: "नाम",
+ invitesUsedDate: "तारीख",
invitesPubInviteCodePlaceholder: "PUB आमंत्रण कोड दर्ज करें",
invitesAcceptInvite: "PUB में शामिल हों",
+ invitesPubUses: "उपयोग किए गए निमंत्रण",
+ invitesPubExhausted: "इस PUB के पास कोई निमंत्रण नहीं बचा है।",
invitesAlreadyFederated: "आप पहले से ही इस पब के साथ फेडरेटेड हैं।",
+ invitesJoinPubMode: "यह Oasis एक PUB के रूप में, केवल-पढ़ने वाले मोड में चल रहा है। इसे किसी दूसरे PUB से जोड़ने के लिए टर्मिनल में चलाएँ: ./oasis.sh join <कोड>",
+ invitesJoinLocalOnly: "निमंत्रण केवल उसी डिवाइस से स्वीकार किए जा सकते हैं जिस पर Oasis चल रहा है, या शुरू होने पर दिखने वाले व्यवस्थापक लिंक से।",
invitesFederationsTitle: "संघ",
invitesAcceptedInvites: "संघीय",
invitesUnfollow: "अनफ़ॉलो करें",
@@ -564,16 +681,12 @@ module.exports = {
invitesUnfollowedInvites: "असंघीय",
invitesNoFederatedPubs: "कोई संघीय pub नहीं।",
invitesNoUnfollowed: "कोई असंघीय pub नहीं।",
- invitesUnreachablePubs: "अगम्य",
- invitesNoUnreachablePubs: "कोई अगम्य pub नहीं।",
invitesPubsRefresh: "ताज़ा करें",
- invitesPubsClearUnreachable: "अगम्य हटाएँ",
+ invitesPubsClearUnreachable: "साफ़ करें",
invitesPubsExport: "निर्यात",
invitesPubsImport: "आयात",
invitesPubsImportTitle: "Pubs आयात करें",
invitesPubsImportPlaceholder: "प्रति पंक्ति एक multiserver पता या निमंत्रण कोड पेस्ट करें, या एक .txt फ़ाइल अपलोड करें…",
- currentlyUnreachable: "त्रुटि!",
- errorDetails: "त्रुटि विवरण",
genericError: "एक त्रुटि हुई।",
panicMode: "आपातकालीन मोड!",
encryptData: "अपनी ब्लॉकचेन एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)",
@@ -600,7 +713,6 @@ module.exports = {
votesOptionNoLabel:"नहीं",
votesOptionAbstentionLabel:"तटस्थता",
votesQuestionLabel:"प्रश्न",
- votesCreatedByLabel:"द्वारा बनाया गया",
voteStatusOpen:"खुला",
voteStatusClosed:"बंद",
commentDescription: ({ parentUrl }) => [
@@ -617,22 +729,22 @@ module.exports = {
searchSubmit: "खोजें...",
votesLabel: "मतदान",
pdfFallbackLabel: "PDF दस्तावेज़",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "दुकानें",
+ voteLabel: "वोट",
submit: "जमा करें",
editProfile: "अवतार संपादित करें",
oasisIdLabel: "OasisID",
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- /multiverse — अपने अन्य मल्टीवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।\n\nयह संदेश आपके द्वारा निजी रूप से स्वयं को भेजा गया था, इसलिए इसे प्राप्त करने के लिए किसी कनेक्शन की आवश्यकता नहीं थी।",
+ welcomePmBody: "Oasis में आपका स्वागत है — एक स्वतंत्र, पीयर-टू-पीयर, फ़ेडरेटेड और एन्क्रिप्टेड सोशल नेटवर्क, जिसकी वास्तुकला वितरित और केवल-आमंत्रण आधारित है।\n\nशुरुआत के लिए कुछ रोचक स्थान:\n\n- [/avatar](/profile) — अपना अवतार, नाम, विवरण और कौन से मॉड्यूल आपके सार्वजनिक पक्ष पर दिखेंगे, संपादित करें।\n- /settings — अपना स्थानीय इंस्टेंस समायोजित करें: भाषा, थीम, मॉड्यूल, गोपनीयता और सिंक।\n- /invites — व्यापक नेटवर्क के साथ फेडरेट करने के लिए एक pub जोड़ें।\n- /peers — देखें कौन जुड़ा है, अपनी LAN फिर से स्कैन करें, पीयर सूचियाँ निर्यात या आयात करें।\n- /inhabitants — दूसरे निवासियों के अवतार खोजें और देखें।\n- /tribes — एंड-टू-एंड एन्क्रिप्शन वाले निजी समूह बनाएँ या उनमें शामिल हों।\n- /search — नेटवर्क की सामग्री को प्रकार के अनुसार खोजें।\n\nकनेक्ट करने के लिए कुछ दिलचस्प जगहें:\n\n- /multiverse — अपने अन्य मल्टीवर्स खातों को प्रबंधित करें, जिसमें सामग्री भेजना और प्राप्त करना शामिल है।\n\nयह संदेश आपके द्वारा निजी रूप से स्वयं को भेजा गया था, इसलिए इसे प्राप्त करने के लिए किसी कनेक्शन की आवश्यकता नहीं थी।",
profileSensorsSectionTitle: "सेंसर",
profileVisibilityActivity: "गतिविधि स्तर",
profileDeviceLockedHint: "यह सेंसर हमेशा चालू रहता है: यह दूसरों को दिखाता है कि आप किस डिवाइस से कनेक्ट होते हैं और इसे अक्षम नहीं किया जा सकता।",
profileVisibilityKarma: "KARMA स्कोर",
profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "ECOIN वॉलेट",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityWallet: "ECOin वॉलेट",
+ profileVisibilityEcoTax: "ECO कर",
+ profileVisibilityLarpSign: "L.A.R.P. मुहर",
profileVisibilityGpg: "GPG कुंजी",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "दुकानें",
@@ -645,6 +757,10 @@ module.exports = {
profileClearnetImagesLabel: "चित्र",
profileClearnetDocumentsLabel: "दस्तावेज़",
profileClearnetTorrentsLabel: "टॉरेंट",
+ profileClearnetPodcastsLabel: "पॉडकास्ट",
+ profileClearnetMarketLabel: "बाज़ार",
+ profileClearnetFeedLabel: "फ़ीड",
+ profileClearnetWikiLabel: "विकी",
editProfileDescription:
"",
profileName: "नाम",
@@ -670,7 +786,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "पुष्टि",
walletConfirm: "पुष्टि करें",
- walletDescription: "अपनी डिजिटल संपत्तियाँ प्रबंधित करें, जिसमें ECOin भेजना और प्राप्त करना, अपना शेष देखना और अपना लेनदेन इतिहास शामिल है।",
+ walletDescription: "अपना ECOin वॉलेट प्रबंधित करें।",
walletDate: "दिनांक",
walletFee: "शुल्क (शुल्क जितना अधिक होगा, आपका लेनदेन उतनी तेज़ी से संसाधित होगा)",
walletFeeLine: ({ fee }) => `शुल्क: ECO ${fee}`,
@@ -678,6 +794,86 @@ module.exports = {
walletReceive: "प्राप्त करें",
walletReset: "रीसेट",
walletSend: "भेजें",
+ walletPayingTransfer: "ट्रांसफ़र का भुगतान",
+ walletCreateTransferLabel: "स्मार्ट कॉन्ट्रैक्ट बनाएँ (ट्रांसफर)",
+ walletTransferNotifiedNote: "दूसरे पक्ष को इस भुगतान की सूचना दी गई",
+ walletTransferCreatedNote: "इस भुगतान के लिए एक ट्रांसफ़र (रसीद) बनाया गया",
+ walletTransferNoPayeeNote: "किसी निवासी ने यह पता प्रकाशित नहीं किया, इसलिए ट्रांसफ़र नहीं बना",
+ walletTransferReceiptConcept: "वॉलेट से भुगतान",
+ walletPaymentPmText: "ने आपको भुगतान भेजा",
+ walletPayeeLabel: "प्राप्तकर्ता",
+ walletConceptLabel: "विवरण",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "आपको अपना UBI मिल गया है।",
+ bankingBotPaymentTitle: "आपको एक भुगतान मिला है।",
+ bankingBotUbiPaidText: "आपकी सार्वभौमिक बुनियादी आय का भुगतान कर दिया गया है",
+ bankUbiPubThisNode: "यह नोड UBI का भुगतान करता है",
+ bankUbiPubConnected: "UBI PUB",
+ bankUbiPubNone: "आपके नेटवर्क में अभी कोई PUB UBI की घोषणा नहीं कर रहा",
+ bankUbiAddressPublished: "ECOin पता प्रकाशित",
+ bankUbiAddressMissing: "UBI पाने के लिए अपना ECOin पता प्रकाशित करें",
+ bankUbiClaimedThisMonth: "इस महीने दावा किया गया",
+ bankUbiPubBalance: "UBI के लिए उपलब्ध PUB वॉलेट",
+ bankNoPubAddress: "UBI PUB ने अभी तक ECOin पता प्रकाशित नहीं किया है।",
+ bankUbiTab: "UBI",
+ bankDonateEco: "दान करें!",
+ donateTooltip: "ECOin दान करें",
+ bankNoUserAddress: "इस निवासी ने ECOin पता साझा नहीं किया है।",
+ bankUbiPubDefault: "डिफ़ॉल्ट",
+ bankUbiPool: "निधि",
+ bankUbiLastSeen: "अंतिम बार देखा गया",
+ bankUbiLastPayout: "अंतिम कार्रवाई",
+ bankUbiPaidOut: "वितरित",
+ bankRangeToday: "आज",
+ bankRangeWeek: "सप्ताह",
+ bankRangeMonth: "महीना",
+ bankRangeYear: "वर्ष",
+ bankRangeFiveYears: "5 वर्ष",
+ bankRangeAll: "सभी",
+ bankChartValueTitle: "ECOin मूल्य का विकास",
+ bankChartValueHours: "समय में समतुल्य (घं)",
+ bankChartWealthTitle: "ECOin धन का पुनर्वितरण",
+ bankChartDistributed: "वितरित UBI (ECO)",
+ bankChartRebalanceTitle: "PUBs के बीच धन का पुनर्वितरण",
+ bankChartRebalanced: "PUBs के बीच भेजे गए ECO",
+ bankChartTaxes: "रोके गए कर (ECO)",
+ bankChartNoDataRange: "इस अवधि में कोई डेटा नहीं।",
+ bankChartNoDataYet: "अभी कोई डेटा नहीं",
+ bankChartPerHour: "प्रति घंटा",
+ bankChartPerDay: "प्रति दिन",
+ bankChartPerMonth: "प्रति माह",
+ bankTotalUbiDistributed: "कुल पुनर्वितरित UBI (नेटवर्क)",
+ bankTotalTaxesWithheld: "कुल रोके गए कर (नेटवर्क)",
+ bankInflationIssuance: "जारी करने की दर (वार्षिक, ब्लॉक इनाम से)",
+ bankRulesEligibilityTitle: "UBI कौन प्राप्त कर सकता है",
+ bankRulesEligibility1: "प्रोफ़ाइल में प्रकाशित ECOin पता (प्रोफ़ाइल → सेंसर → ECOin वॉलेट)।",
+ bankRulesEligibility2: "30 दिन से पुरानी फ़ीड जिसमें नेटवर्क में गतिविधि हो: कर्म शून्य से ऊपर।",
+ bankRulesEligibility3: "प्रति माह (एपॉक) एक दावा, Banking से UBI दावा करें बटन द्वारा। चालू माह को UBI अस्वीकार करें से मना किया जा सकता है।",
+ bankRulesEligibility4: "1 ECO की न्यूनतम राशि हमेशा दी जाती है; कर केवल उससे ऊपर के हिस्से को घटाते हैं और कभी अलग से नहीं लिए जाते।",
+ bankRulesEligibility5: "PUB अगले चक्र में भुगतान करता है और एक UBI ट्रांसफर प्रकाशित करता है जिसे आप पुष्टि कर सकते हैं।",
+ bankRulesEligibility6: "यदि पता नहीं है, फ़ीड बहुत नई है, आपने माह अस्वीकार किया या PUB के पास धन नहीं है, तो दावा छोड़ दिया जाता है और PUB पर लॉग किया जाता है।",
+ copyLinkTitle: "लिंक कॉपी करें",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "UBI अस्वीकार करें",
+ bankUbiRefusedThisMonth: "आपने इस महीने का UBI अस्वीकार किया।",
+ bankingBotUbiAvailableTitle: "आप अपना UBI दावा कर सकते हैं।",
+ bankingBotUbiAvailableText: "इस महीने का आपका UBI उपलब्ध है",
+ bankingBotConfirmTitle: "आपके पास पुष्टि की प्रतीक्षा में एक स्मार्ट-कॉन्ट्रैक्ट है",
+ bankingBotConfirmText: "आपकी पुष्टि की प्रतीक्षा में स्मार्ट-कॉन्ट्रैक्ट",
+ bankChartZoomHint: "बड़ा करने के लिए क्लिक करें",
+ bankChartPoolTitle: "UBI निधि (समय के साथ)",
+ bankChartNetworkUbiTitle: "कुल पुनर्वितरित UBI (नेटवर्क)",
+ bankChartSupplyTitle: "ECOin परिचालित आपूर्ति (समय के साथ)",
+ bankChartInflationTitle: "ECOin मुद्रास्फीति (समय के साथ)",
+ bankChartInflationSeries: "वार्षिक दर (%)",
+ bankChartPool: "कुल निधि (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (समय के साथ)",
+ bankChartFundsTitle: "आपकी ECOin निधि (समय के साथ)",
+ bankChartKarma: "कर्म",
+ bankWalletReady: "ECOin कनेक्टेड",
+ bankWalletNotConfigured: "ECOin डिस्कनेक्ट",
+ transfersPayWithWallet: "भुगतान करें!",
walletStatus: "स्थिति",
walletDisconnected: [
"ECOin ",
@@ -687,8 +883,11 @@ module.exports = {
" या कनेक्शन स्थिति।",
],
walletSentToLine: ({ destination, amount }) => `ECO ${amount} भेजा गया ${destination} को`,
+ walletNotConfigured: "आपका ECOin वॉलेट अभी कॉन्फ़िगर नहीं है।",
walletSettingsDescription: "Oasis को अपने ECOin वॉलेट के साथ एकीकृत करें।",
- walletSettingsDocLink: "ECOin स्थापना मार्गदर्शिका",
+ walletSettingsMobileDescription: "Oasis को इस डिवाइस के ECOin Wallet ऐप से जोड़ें।",
+ walletDownloadEcoin: "ECOin डाउनलोड करें!",
+ walletRpcUrl: "RPC URL",
walletStatusMessages: {
invalid_amount: "अमान्य राशि",
invalid_dest: "अमान्य गंतव्य पता",
@@ -704,6 +903,7 @@ module.exports = {
walletUser: "उपयोगकर्ता नाम",
walletPass: "पासवर्ड",
walletConfiguration: "वॉलेट सेट करें",
+ walletDisconnectButton: "वॉलेट डिस्कनेक्ट करें",
cipher: "क्रिप्टर",
cipherTitle: "क्रिप्टर",
cipherDescription: "अपने टेक्स्ट को सममित रूप से एन्क्रिप्ट और डिक्रिप्ट करें (साझा पासवर्ड का उपयोग करके)।",
@@ -737,17 +937,16 @@ module.exports = {
bookmarkFilterRecent: "हाल के",
bookmarkCreateButton: "बुकमार्क बनाएँ",
bookmarkUpdateButton: "अपडेट",
- bookmarkDeleteButton: "हटाएँ",
bookmarkAddFavoriteButton: "पसंदीदा जोड़ें",
bookmarkRemoveFavoriteButton: "पसंदीदा हटाएँ",
bookmarkUrlLabel: "लिंक",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "विवरण",
bookmarkDescriptionPlaceholder: "वैकल्पिक",
bookmarkTagsLabel: "टैग",
bookmarkTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
bookmarkLastVisitLabel: "अंतिम विज़िट",
- bookmarkSearchPlaceholder: "URL, टैग, श्रेणी, लेखक खोजें...",
+ bookmarkSearchPlaceholder: "बुकमार्क में खोजें...",
bookmarkSortRecent: "सबसे हाल का",
bookmarkSortOldest: "सबसे पुराना",
bookmarkSortTop: "सर्वाधिक मतदान",
@@ -786,7 +985,7 @@ module.exports = {
videoDescriptionPlaceholder: "वैकल्पिक",
videoNoFile: "कोई वीडियो फ़ाइल प्रदान नहीं की गई",
noVideos: "कोई वीडियो उपलब्ध नहीं।",
- videoSearchPlaceholder: "शीर्षक, टैग, लेखक खोजें...",
+ videoSearchPlaceholder: "वीडियो में खोजें...",
videoSortRecent: "सबसे हाल का",
videoSortOldest: "सबसे पुराना",
videoSortTop: "सर्वाधिक मतदान",
@@ -809,7 +1008,6 @@ module.exports = {
documentFilterFavorites: "पसंदीदा",
documentCreateButton: "दस्तावेज़ अपलोड करें",
documentUpdateButton: "अपडेट",
- documentDeleteButton: "हटाएँ",
documentAddFavoriteButton: "पसंदीदा जोड़ें",
documentRemoveFavoriteButton: "पसंदीदा से हटाएँ",
documentMessageAuthorButton: "PM",
@@ -822,7 +1020,7 @@ module.exports = {
documentDescriptionPlaceholder: "वैकल्पिक",
documentNoFile: "कोई फ़ाइल नहीं।",
noDocuments: "कोई दस्तावेज़ उपलब्ध नहीं।",
- documentSearchPlaceholder: "शीर्षक, टैग, विवरण, लेखक खोजें...",
+ documentSearchPlaceholder: "दस्तावेज़ में खोजें...",
documentSortRecent: "सबसे हाल का",
documentSortOldest: "सबसे पुराना",
documentSortTop: "सर्वाधिक मतदान",
@@ -843,19 +1041,19 @@ module.exports = {
audioFilterTop: "शीर्ष",
audioCreateButton: "ऑडियो अपलोड करें",
audioUpdateButton: "अपडेट",
- audioDeleteButton: "हटाएँ",
audioAddFavoriteButton: "पसंदीदा जोड़ें",
audioRemoveFavoriteButton: "पसंदीदा हटाएँ",
audioFileLabel: "ऑडियो फ़ाइल चुनें (.mp3, .wav, .ogg)",
audioTagsLabel: "टैग",
audioTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ tagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
audioTitleLabel: "शीर्षक",
audioTitlePlaceholder: "वैकल्पिक",
audioDescriptionLabel: "विवरण",
audioDescriptionPlaceholder: "वैकल्पिक",
audioNoFile: "कोई ऑडियो फ़ाइल प्रदान नहीं की गई",
noAudios: "कोई ऑडियो उपलब्ध नहीं।",
- audioSearchPlaceholder: "शीर्षक, टैग, लेखक खोजें...",
+ audioSearchPlaceholder: "ऑडियो में खोजें...",
audioSortRecent: "सबसे हाल का",
audioSortOldest: "सबसे पुराना",
audioSortTop: "सर्वाधिक मतदान",
@@ -867,7 +1065,7 @@ module.exports = {
audioFilterFavorites: "पसंदीदा",
favoritesTitle: "पसंदीदा",
favoritesDescription: "आपकी सभी पसंदीदा सामग्री एक ही स्थान पर।",
- favoritesSearchPlaceholder: "पसंदीदा खोजें...",
+ favoritesSearchPlaceholder: "पसंदीदा में खोजें...",
favoritesFilterAll: "सभी",
favoritesFilterRecent: "हाल के",
favoritesFilterAudios: "ऑडियो",
@@ -879,13 +1077,12 @@ module.exports = {
favoritesFilterChats: "चैट्स",
favoritesFilterCalendars: "कैलेंडर",
favoritesFilterVideos: "वीडियो",
- favoritesRemoveButton: "पसंदीदा से हटाएँ",
favoritesNoItems: "अभी तक कोई पसंदीदा नहीं।",
yourContacts: "आपके संपर्क",
allInhabitants: "निवासी",
allCVs: "CVs",
discoverPeople: "अपने नेटवर्क में निवासियों को खोजें।",
- searchInhabitantsPlaceholder: "नाम से निवासी फ़िल्टर करें …",
+ searchInhabitantsPlaceholder: "निवासी में खोजें...",
filterLocation: "स्थान से निवासी फ़िल्टर करें …",
filterLanguage: "भाषा से निवासी फ़िल्टर करें …",
filterSkills: "कौशल से निवासी फ़िल्टर करें …",
@@ -909,7 +1106,6 @@ module.exports = {
topSectionTitle: "शीर्ष",
blockedLabel: "ब्लॉक किया गया उपयोगकर्ता",
inhabitantviewDetails: "विवरण देखें",
- cvVisitButton: "CV देखें",
keepReading: "पढ़ते रहें...",
oasisId: "ID",
noInhabitantsFound: "अभी तक कोई निवासी नहीं मिला।",
@@ -927,6 +1123,18 @@ module.exports = {
parliamentFilterLeaders: "नेता",
parliamentFilterRules: "नियम",
parliamentGovernmentCard: "वर्तमान सरकार",
+ parliamentSeatsGovernment: "सरकार",
+ parliamentSeatsOpposition: "विपक्ष",
+ parliamentSeatsAbstention: "अनुपस्थित",
+ parliamentSeatsQuorum: "चुनाव कोरम",
+ parliamentSeatsPass: "अनुमोदन सीमा",
+ parliamentSeatsByElection: "चुनाव के अनुसार",
+ parliamentSeatsByHouses: "LARP हाउस के अनुसार",
+ parliamentSeatsSeats: "सीटें",
+ parliamentSeatsSeat: "सीट",
+ parliamentSeatsLeader: "नेता",
+ parliamentSeatsVotesFor: "के लिए वोट",
+ parliamentSeatsNoHouse: "कोई हाउस नहीं",
parliamentActorInPowerInhabitant: 'सत्तारूढ़ निवासी',
parliamentActorInPowerTribe: 'सत्तारूढ़ जनजाति',
parliamentHistoricalGovernmentsTitle: 'सरकारें',
@@ -994,6 +1202,7 @@ module.exports = {
parliamentTimeRemaining: "शेष समय",
parliamentElectionsStatusTitle: "अगली सरकार",
parliamentProposalDeadlineLabel: "समय सीमा",
+ parliamentViewReport: "रिपोर्ट देखें",
parliamentProposalTimeLeft: "शेष समय",
parliamentRulesTitle: "संसद कैसे काम करती है",
parliamentRulesIntro: "चुनाव हर 2 महीने में हल होते हैं; उम्मीदवारी निरंतर होती है और सरकार चुने जाने पर रीसेट हो जाती है।",
@@ -1008,6 +1217,7 @@ module.exports = {
parliamentRulesLaws: "जब कोई प्रस्ताव अपनी सीमा पूरी करता है, तो वह कानून बन जाता है और कानून टैब में लागू होने की तिथि के साथ दिखाई देता है।",
parliamentRulesHistorical: "ऐतिहासिक टैब में आप हर सरकारी चक्र और उसके प्रबंधन का डेटा देख सकते हैं।",
parliamentRulesLeaders: "नेता टैब में आप उन निवासियों/जनजातियों की रैंकिंग देख सकते हैं जिन्होंने शासन किया है (या उम्मीदवार रहे हैं), दक्षता के अनुसार क्रमबद्ध।",
+ parliamentRulesHemicycle: "अर्धवृत्त प्रत्येक निवासी को एक सीट देता है: सरकार का खंड (विजयी उम्मीदवारी के मतदाता और नेता), चक्र की हर अन्य उम्मीदवारी के लिए एक विपक्षी खंड, और अनुपस्थिति। बिंदीदार निशान चुनाव कोरम (जनगणना का 25%) और वर्तमान पद्धति की अनुमोदन सीमा दिखाते हैं। \"LARP हाउस के अनुसार\" उन्हीं सीटों को हाउस के अनुसार रंगता है।",
parliamentProposalVoteStatusLabel: "मत स्थिति",
parliamentProposalOnTrackYes: "सीमा पूरी हुई",
parliamentProposalOnTrackNo: "सीमा से नीचे",
@@ -1021,6 +1231,7 @@ module.exports = {
courtsCaseFormTitle: "मामला खोलें",
courtsCaseRespondent: "आरोपी / प्रतिवादी",
courtsCaseRespondentPh: "Oasis ID (@...) या जनजाति का नाम",
+ courtsCaseSubjectPlaceholder: "विषय या संक्षिप्त विवरण",
courtsCaseMethod: "समाधान पद्धति",
courtsCaseSubmit: "मामला दायर करें",
courtsNominateJudge: "न्यायाधीश नामांकित करें",
@@ -1054,15 +1265,30 @@ module.exports = {
courtsMethodDICTATOR: "तानाशाह",
courtsMethodPOPULAR: "लोकप्रिय",
courtsMethodKARMATOCRACY: "कर्मतंत्र",
+ courtsCaseType: "मामले का प्रकार",
+ courtsPresetMinorConflict: "मामूली विवाद",
+ courtsPresetModerateConflict: "मध्यम विवाद",
+ courtsPresetSevereConflict: "गंभीर विवाद",
+ courtsPresetHarassment: "उत्पीड़न या दुर्व्यवहार",
+ courtsPresetContentModeration: "सामग्री मॉडरेशन",
+ courtsPresetBanRestriction: "प्रतिबंध या सीमा",
+ courtsPresetGovernanceDispute: "शासन विवाद",
+ courtsStatusOPEN: "खुला",
+ courtsStatusIN_PROGRESS: "प्रगति में",
+ courtsStatusDECIDED: "निर्णीत",
+ courtsStatusCLOSED: "बंद",
+ courtsStatusSOLVED: "सुलझा",
+ courtsStatusUNSOLVED: "अनसुलझा",
+ courtsStatusDISCARDED: "खारिज",
courtsRulesTitle: "न्यायालय कैसे काम करते हैं",
courtsRulesIntro: "न्यायालय विवादों को हल करने और पुनर्स्थापनात्मक न्याय को बढ़ावा देने की एक सामुदायिक प्रक्रिया है। संवाद, स्पष्ट साक्ष्य और आनुपातिक उपायों को प्राथमिकता दी जाती है।",
courtsRulesLifecycle: "प्रक्रिया: 1) मामला खोलें 2) पद्धति चुनें 3) साक्ष्य प्रस्तुत करें 4) सुनवाई और विचार-विमर्श 5) फैसला और उपाय 6) अनुपालन और समापन 7) अपील (यदि लागू हो)।",
- courtsRulesRoles: "वादी: मामला खोलता है। बचाव: आरोपित व्यक्ति या जनजाति। पद्धति: समुदाय द्वारा चुनी गई व्यवस्था जो सुविधा प्रदान करती है, साक्ष्य का मूल्यांकन करती है, और फैसला जारी करती है। गवाह: गवाही या साक्ष्य प्रदान करता है। मध्यस्थ: वादी और/या बचाव द्वारा आमंत्रित तटस्थ लोग, जिनकी सभी विवरणों तक पहुँच है, जो विवाद को शांत करने और समझौते सह-निर्माण करने में मदद करते हैं।",
+ courtsRulesRoles: "वादी: मामला खोलता है। बचाव: आरोपित निवासी या जनजाति। पद्धति: समुदाय द्वारा चुनी गई व्यवस्था जो सुविधा प्रदान करती है, साक्ष्य का मूल्यांकन करती है, और फैसला जारी करती है। गवाह: गवाही या साक्ष्य प्रदान करता है। मध्यस्थ: वादी और/या बचाव द्वारा आमंत्रित तटस्थ निवासी, जिनकी सभी विवरणों तक पहुँच है, जो विवाद को शांत करने और समझौते सह-निर्माण करने में मदद करते हैं।",
courtsRulesEvidence: "विवरण अधिकतम 1000 अक्षर। प्रासंगिक और वैध छवियाँ, ऑडियो, वीडियो और PDF दस्तावेज़ संलग्न करें। सहमति के बिना संवेदनशील निजी डेटा साझा न करें।",
courtsRulesDeliberation: "सुनवाई सार्वजनिक या निजी हो सकती है। न्यायाधीश सम्मान सुनिश्चित करते हैं, स्पष्टीकरण का अनुरोध करते हैं, और अप्रासंगिक या गैरकानूनी सामग्री को हटा सकते हैं।",
courtsRulesVerdict: "पुनर्स्थापना को प्राथमिकता दी जाती है: क्षमा याचना, मध्यस्थता समझौते, सामग्री मॉडरेशन, अस्थायी प्रतिबंध, या अन्य आनुपातिक उपाय। तर्क दर्ज किया जाना चाहिए।",
courtsRulesAppeals: "अपील: नए साक्ष्य या स्पष्ट प्रक्रियात्मक त्रुटि होने पर अनुमति है। अन्यथा कहा न जाए तो 7 दिनों के भीतर दायर की जानी चाहिए।",
- courtsRulesPrivacy: "गोपनीयता और सुरक्षा का सम्मान करें। डॉक्सिंग, घृणा, या धमकियाँ हटा दी जाती हैं। न्यायाधीश जोखिम वाले लोगों की सुरक्षा के लिए रिकॉर्ड के भागों को संपादित या सील कर सकते हैं।",
+ courtsRulesPrivacy: "गोपनीयता और सुरक्षा का सम्मान करें। डॉक्सिंग, घृणा, या धमकियाँ हटा दी जाती हैं। न्यायाधीश जोखिम वाले निवासियों की सुरक्षा के लिए रिकॉर्ड के भागों को संपादित या सील कर सकते हैं।",
courtsRulesMisconduct: "उत्पीड़न, हेरफेर, या मनगढ़ंत साक्ष्य तत्काल नकारात्मक समाधान का कारण बन सकते हैं।",
courtsRulesGlossary: "मामला: विवाद का रिकॉर्ड। साक्ष्य: दावों का समर्थन करने वाली सामग्री। फैसला: उपाय के साथ निर्णय। अपील: फैसले की समीक्षा का अनुरोध।",
courtsFilterActions: "कार्रवाई",
@@ -1078,12 +1304,16 @@ module.exports = {
exploreTrending: "अपने नेटवर्क में सबसे लोकप्रिय सामग्री खोजें।",
votesButton: "मतदान",
shopProductButton: "दुकान",
+ podcastButton: "पॉडकास्ट",
+ podcastEpisodeButton: "एपिसोड",
+ campaignButton: "अभियान",
+ logisticsRouteButton: "मार्ग",
trendingTotalOpinions: "कुल राय",
trendingNoContentMessage: "अभी तक कोई ट्रेंडिंग नहीं है।",
trendingTotalCount: "कुल संख्या",
tasksTitle: "कार्य",
tasksDescription: "अपने नेटवर्क में कार्य खोजें और प्रबंधित करें।",
- taskSearchPlaceholder: "कार्य खोजें...",
+ taskSearchPlaceholder: "कार्य में खोजें...",
taskTitleLabel: "शीर्षक",
taskDescriptionLabel: "विवरण",
taskStartTimeLabel: "प्रारंभ समय",
@@ -1102,7 +1332,7 @@ module.exports = {
taskStatusOpen: "खुला",
taskStatusInProgress: "प्रगति में",
taskStatusClosed: "बंद",
- taskAssignedTo: "को सौंपा गया",
+ taskAssignedTo: "सौंपा गया",
taskAssignedChip: "सौंपा गया",
taskUnassignedChip: "असौंपा",
taskAssignees: "सौंपे गए",
@@ -1112,6 +1342,7 @@ module.exports = {
taskUpdateButton: "अपडेट",
taskDeleteButton: "हटाएँ",
taskFilterAll: "सभी",
+ taskFilterRecent: "हाल के",
taskFilterMine: "मेरे",
taskFilterOpen: "खुले",
taskFilterInProgress: "प्रगति में",
@@ -1139,14 +1370,13 @@ module.exports = {
eventUpcomingDates: "आगामी तिथियाँ",
eventsTitle: "कार्यक्रम",
eventsDescription: "अपने नेटवर्क में कार्यक्रम खोजें और प्रबंधित करें।",
- eventSearchPlaceholder: "कार्यक्रम खोजें...",
+ eventSearchPlaceholder: "कार्यक्रम में खोजें...",
eventPrice: "मूल्य",
eventStatus: "स्थिति",
eventAllSectionTitle: "कार्यक्रम",
eventMineSectionTitle: "आपके कार्यक्रम",
eventCreateSectionTitle: "कार्यक्रम बनाएँ",
eventUpdateSectionTitle: "कार्यक्रम अपडेट करें",
- eventDeleteButton: "हटाएँ",
eventCreateButton: "कार्यक्रम बनाएँ",
eventAddToCalendar: "कैलेंडर में जोड़ें",
eventVisitCalendar: "कैलेंडर देखें",
@@ -1164,11 +1394,11 @@ module.exports = {
viewPlace: "स्थान देखें",
generatePdf: "PDF बनाएँ",
sharePm: "PM से साझा करें",
- galleryImages: "छवियाँ (अधिकतम आकार: 50MB प्रत्येक)",
+ galleryImages: "छवियाँ (अधिकतम आकार: 75MB प्रत्येक)",
galleryPhotos: "छवियाँ",
galleryAddPhoto: "छवि जोड़ें",
galleryRemovePhoto: "हटाएँ",
- galleryVideo: "वीडियो (अधिकतम आकार: 50MB)",
+ galleryVideo: "वीडियो (अधिकतम आकार: 75MB)",
galleryAddVideo: "वीडियो जोड़ें",
galleryRemoveVideo: "वीडियो हटाएँ",
viewVotation: "मतदान देखें",
@@ -1188,6 +1418,7 @@ module.exports = {
eventDate: "दिनांक",
eventAttendButton: "कार्यक्रम में शामिल हों",
eventFilterAll: "सभी",
+ eventFilterRecent: "हाल के",
eventFilterMine: "मेरे",
eventFilterToday: "आज",
eventFilterWeek: "इस सप्ताह",
@@ -1214,7 +1445,7 @@ module.exports = {
tagsFilterTop: "शीर्ष",
tagsFilterCloud: "क्लाउड",
tagsNoItems: "कोई टैग उपलब्ध नहीं।",
- tagsSearchPlaceholder: "टैग खोजें...",
+ tagsSearchPlaceholder: "टैग में खोजें...",
tagsTableHeaderTag: "टैग/लिंक:",
tagsTableHeaderCount: "गणना:",
transfersTitle: "स्थानांतरण",
@@ -1222,7 +1453,10 @@ module.exports = {
transfersFrom: "से",
transfersTo: "को",
transfersFilterAll: "सभी",
+ transfersFilterRecent: "हाल के",
transfersFilterMine: "मेरे",
+ transfersFilterMinePending: "लंबित",
+ transfersFilterMineConfirmed: "हस्ताक्षरित",
transfersFilterUBI: "UBI",
transfersFilterMarket: "बाज़ार",
transfersFilterTop: "शीर्ष",
@@ -1237,7 +1471,6 @@ module.exports = {
transfersCategoryEconomic: "आर्थिक",
transfersCategoryTime: "समय",
transfersCategoryTrust: "भरोसा",
- transfersCategoryApply: "लागू करें",
transfersUnitEco: "ECO",
transfersUnitHours: "घं",
transfersUnitTrust: "भरोसा",
@@ -1267,7 +1500,7 @@ module.exports = {
transfersDiscardedSectionTitle: "निरस्त स्थानांतरण",
transfersCreateSectionTitle: "स्थानांतरण बनाएँ",
transfersAllSectionTitle: "स्थानांतरण",
- transfersSearchPlaceholder: "अवधारणा, टैग, उपयोगकर्ता खोजें...",
+ transfersSearchPlaceholder: "स्थानांतरण में खोजें...",
transfersMinAmountLabel: "न्यूनतम राशि",
transfersMaxAmountLabel: "अधिकतम राशि",
transfersSortRecent: "सबसे हाल का",
@@ -1289,6 +1522,7 @@ module.exports = {
voteErrorTitle: "फ़ॉर्म जाँचें",
voteErrorDeadlineMin: "समय-सीमा अभी से कम से कम {days} दिन आगे होनी चाहिए।",
voteErrorGeneric: "वोट सहेजा नहीं जा सका।",
+ voteLocked: "इस मतदान पर पहले ही वोट या राय आ चुकी है, या यह संसद या न्यायालयों का है: अब इसे संपादित या हटाया नहीं जा सकता।",
voteUpdateButton: "अपडेट",
voteDeleteButton: "हटाएँ",
voteOptionYes: "हाँ",
@@ -1298,6 +1532,7 @@ module.exports = {
voteFollowMajority: "बहुमत का पालन करें",
voteNotInterested: "रुचि नहीं",
voteFilterAll: "सभी",
+ voteFilterRecent: "हाल के",
voteFilterMine: "मेरे",
voteFilterOpen: "खुले",
voteFilterClosed: "बंद",
@@ -1313,7 +1548,6 @@ module.exports = {
voteTags: "टैग",
voteOpinions: "राय",
novotes: "कोई मतदान प्रस्ताव उपलब्ध नहीं।",
- voteBy: "द्वारा",
voteCreatedAt: "बनाया गया",
voteNoQuestion: "कोई प्रश्न प्रदान नहीं किया गया",
voteUnknownCreator: "अज्ञात निर्माता",
@@ -1323,6 +1557,7 @@ module.exports = {
voteCommentsForumButton: 'चर्चा खोलें',
voteCommentsSectionTitle: 'चर्चा खोलें',
voteNoCommentsYet: 'अभी तक कोई टिप्पणी नहीं है। पहले उत्तर देने वाले बनें।',
+ commentsGoToLast: "अंतिम टिप्पणी पर जाएँ",
voteNewCommentPlaceholder: 'अपनी टिप्पणी यहाँ लिखें…',
voteNewCommentButton: 'टिप्पणी पोस्ट करें',
voteNewCommentLabel: 'टिप्पणी जोड़ें',
@@ -1333,6 +1568,8 @@ module.exports = {
cvNameLabel: "पूरा नाम",
cvDescriptionLabel: "सारांश",
cvPhotoLabel: "फ़ोटो",
+ cvPdfLabel: "सीवी (PDF)",
+ cvVisitButton: "CV देखें",
cvPersonalExperiencesLabel: "व्यक्तिगत अनुभव",
cvPersonalSkillsLabel: "व्यक्तिगत कौशल (अल्पविराम से अलग)",
cvOasisExperiencesLabel: "Oasis योगदान अनुभव",
@@ -1362,9 +1599,9 @@ module.exports = {
cvNoCV: "कोई CV नहीं मिला।",
blogSubject: "विषय",
blogMessage: "संदेश",
- blogImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)",
+ blogImage: "मीडिया अपलोड करें (अधिकतम-आकार: 75MB)",
blogMedia: "अनुलग्नक (8 चित्र और एक वीडियो तक)",
- blogPublish: "पूर्वावलोकन",
+ blogPublish: "प्रकाशित करें",
pollsTitle: "सर्वेक्षण",
dataTitle: "मिलान",
dataDescription: "अपने नेटवर्क के मेल खोजें और देखें।",
@@ -1383,12 +1620,23 @@ module.exports = {
dataKindTasks: "कार्य",
dataKindReports: "रिपोर्ट्स",
dataKindVotes: "मतदान",
- dataSearchPlaceholder: "क्रॉस-डेटा में खोजें...",
+ dataSearchPlaceholder: "मिलान में खोजें...",
dataCohesionTitle: "संसक्ति गुणांक (CC)",
dataCcShort: "CC",
dataCohesionHint: "नेटवर्क ने जो कुछ प्रकाशित किया है, उसके बीच औसत समानता।",
dataAffinity: "समानता",
dataCommonTerms: "कीवर्ड",
+ dataReasonFollowing: "आप इस निवासी का समर्थन करते हैं",
+ dataReasonTribe: "आपके साथ एक जनजाति साझा करता है",
+ dataReasonPinned: "आपके पिन किए गए कंटेंट से मेल खाता है",
+ dataReasonCv: "आपके CV के कौशल से मेल खाता है",
+ dataReasonContent: "आपके प्रकाशित कंटेंट से संबंधित",
+ dataReasonRelated: "आपकी रुचियों से संबंधित",
+ dataReasonAlike: "आपके जैसे निवासी द्वारा प्रकाशित",
+ dataReasonSupportsYou: "आपका समर्थन करता है",
+ dataReasonMutual: "पारस्परिक समर्थन",
+ dataReasonRated: "नेटवर्क द्वारा अच्छी रेटिंग",
+ dataReasonNear: "आपके पास",
dataStatPeople: "CVs",
dataStatConnected: "जुड़े हुए",
dataStatSkills: "कौशल",
@@ -1441,7 +1689,7 @@ module.exports = {
pollStatusLabel: "स्थिति",
pollStatusOpen: "खुला",
pollStatusClosed: "बंद",
- pollSearchPlaceholder: "सर्वेक्षण खोजें...",
+ pollSearchPlaceholder: "सर्वेक्षण में खोजें...",
pollsNoItems: "कोई सर्वेक्षण नहीं मिला।",
viewPoll: "सर्वेक्षण देखें",
pollChatCreate: "सर्वेक्षण बनाएँ",
@@ -1454,7 +1702,7 @@ module.exports = {
blogFilterFavorites: "पसंदीदा",
blogFilterTop: "शीर्ष",
blogCreateButton: "ब्लॉग बनाएँ",
- blogSearchPlaceholder: "ब्लॉग खोजें...",
+ blogSearchPlaceholder: "ब्लॉग में खोजें...",
blogComments: "टिप्पणियाँ",
blogAllowComments: "टिप्पणियाँ अनुमति दें",
blogCommentsClosed: "लेखक ने इस ब्लॉग की टिप्पणियाँ बंद कर दी हैं।",
@@ -1467,12 +1715,11 @@ module.exports = {
forumCreateButton: "मंच बनाएँ",
forumCreateSectionTitle: "मंच बनाएँ",
forumDescription: "अपने नेटवर्क के अन्य निवासियों से खुलकर बात करें।",
- forumSearchPlaceholder: "फ़ोरम खोजें...",
+ forumSearchPlaceholder: "मंच में खोजें...",
forumFilterAll: "सभी",
forumFilterMine: "मेरे",
forumFilterRecent: "हाल के",
forumFilterTop: "शीर्ष",
- forumDeleteButton: "हटाएँ",
forumParticipants: "प्रतिभागी",
forumMessages: "संदेश",
forumMessageLabel: "संदेश",
@@ -1499,7 +1746,6 @@ module.exports = {
imageFilterGallery: "गैलरी",
imageCreateButton: "छवि अपलोड करें",
imageUpdateButton: "अपडेट",
- imageDeleteButton: "हटाएँ",
imageAddFavoriteButton: "पसंदीदा जोड़ें",
imageRemoveFavoriteButton: "पसंदीदा हटाएँ",
imageFileLabel: "छवि फ़ाइल चुनें (.jpeg, .jpg, .png, .gif)",
@@ -1511,13 +1757,14 @@ module.exports = {
imageDescriptionPlaceholder: "वैकल्पिक",
imageNoFile: "कोई छवि फ़ाइल प्रदान नहीं की गई",
noImages: "कोई छवि उपलब्ध नहीं।",
- imageSearchPlaceholder: "शीर्षक, टैग, विवरण, लेखक खोजें...",
+ imageSearchPlaceholder: "छवियाँ में खोजें...",
imageSortRecent: "सबसे हाल का",
imageSortOldest: "सबसे पुराना",
imageSortTop: "सर्वाधिक मतदान",
imageSearchButton: "खोजें",
imageUpdatedAt: "अपडेट किया गया",
imageNoMatch: "आपकी खोज से कोई छवि मेल नहीं खाती।",
+ feedSearchPlaceholder: "फ़ीड में खोजें...",
feedTitle: "फ़ीड",
createFeedTitle: "फ़ीड बनाएँ",
createFeedButton: "फ़ीड भेजें!",
@@ -1532,7 +1779,7 @@ module.exports = {
alreadyRefeeded: "आपने इसे पहले ही रीफ़ीड कर दिया है।",
activityTitle: "गतिविधि",
yourActivity: "आपकी गतिविधि",
- globalActivity: "वैश्विक गतिविधि",
+ globalActivity: "गतिविधि",
activityList: "गतिविधि",
activityDesc: "अपने नेटवर्क में नवीनतम गतिविधि देखें।",
allButton: "सभी",
@@ -1547,7 +1794,8 @@ module.exports = {
meme: "मीम",
typeRecent: "हाल के",
typeTop: "शीर्ष",
- typePost: "ब्लॉग्स",
+ typePost: "ब्लॉग",
+ activityUpdateLabel: "अपडेट",
typeTribe: "जनजातियाँ",
typeLarp: "L.A.R.P.",
typeInhabitants: "निवासी",
@@ -1682,7 +1930,7 @@ module.exports = {
courtsNoCases: 'कोई मामला नहीं।',
reportsTitle: "रिपोर्ट",
reportsDescription: "अपने नेटवर्क की रिपोर्टों को प्रबंधित करें और उन पर नज़र रखें।",
- reportsSearchPlaceholder: "रिपोर्ट खोजें...",
+ reportsSearchPlaceholder: "रिपोर्ट में खोजें...",
reportsFilterAll: "सभी",
reportsFilterRecent: "हाल के",
reportsFilterTop: "शीर्ष",
@@ -1730,7 +1978,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "समीक्षाधीन रिपोर्ट",
reportsResolvedSectionTitle: "हल की गई रिपोर्ट",
reportsInvalidSectionTitle: "अमान्य रिपोर्ट",
- reportsTemplateSectionTitle: 'रिपोर्ट टेम्पलेट',
reportsBugTemplateTitle: 'पुनरुत्पादन विवरण (बग)',
reportsFeatureTemplateTitle: 'विवरण (सुविधाएँ)',
reportsAbuseTemplateTitle: 'विवरण (दुरुपयोग)',
@@ -1790,17 +2037,15 @@ module.exports = {
tribeGallerySectionTitle: "जनजाति गैलरी",
tribeRecentSectionTitle: "हाल की जनजातियाँ",
tribeTopSectionTitle: "लोकप्रिय जनजातियाँ",
- tribeviewTribeButton: "जनजाति देखें",
- tribeviewSubTribeButton: "उप-जनजाति देखें",
tribeRootLabel: "मूल",
tribeDescription: "अपने नेटवर्क में जनजातियाँ खोजें या बनाएँ।",
tribeMainTribeLabel: "मुख्य जनजाति",
tribeCreateButton: "जनजाति बनाएँ",
tribeUpdateButton: "अपडेट",
tribeDeleteButton: "हटाएँ",
- tribeImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)",
+ tribeImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 75MB)",
tribeTitleLabel: "शीर्षक",
- searchTribesPlaceholder: "नाम से जनजातियाँ फ़िल्टर करें …",
+ searchTribesPlaceholder: "जनजातियाँ में खोजें...",
tribeTitlePlaceholder: "जनजाति का नाम",
tribeDescriptionLabel: "विवरण",
tribeDescriptionPlaceholder: "इस जनजाति का वर्णन करें",
@@ -1813,6 +2058,15 @@ module.exports = {
tribeIsAnonymousLabel: "स्थिति",
tribeMembersCount: "सदस्य",
tribeEnterInvite: "कोड दर्ज करें",
+ subscriptionTitle: "सदस्यताएँ",
+ subscriptionOn: "सदस्यता ली गई",
+ subscriptionOff: "सदस्यता नहीं",
+ subscriptionSubscribe: "सदस्यता लें",
+ subscriptionUnsubscribe: "सदस्यता रद्द करें",
+ subscriptionSubscribers: "सदस्य",
+ pmListLabel: "भेजें",
+ pmListNone: "— कोई सूची नहीं —",
+ pmListNoSubscribers: "कोई सदस्य नहीं",
tribeLeaveButton: "छोड़ें",
tribePublic: "सार्वजनिक",
tribePrivate: "निजी",
@@ -1845,16 +2099,16 @@ module.exports = {
tribeSectionVideos: "वीडियो",
tribeSectionDocuments: "दस्तावेज़",
tribeSectionBookmarks: "बुकमार्क",
- tribeSectionMaps: "MAPS",
- tribeSectionPads: "PADS",
- tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionMaps: "मानचित्र",
+ tribeSectionPads: "पैड्स",
+ tribeSectionChats: "चैट्स",
+ tribeSectionCalendars: "कैलेंडर",
+ tribePadCreate: "पैड बनाएँ",
+ tribeChatCreate: "चैट बनाएँ",
+ tribeCalendarCreate: "कैलेंडर बनाएँ",
+ tribePadsEmpty: "अभी तक कोई पैड नहीं।",
+ tribeChatsEmpty: "अभी तक कोई चैट नहीं।",
+ tribeCalendarsEmpty: "अभी तक कोई कैलेंडर नहीं।",
tribeInhabitantsEmpty: "इस जनजाति में अभी तक कोई निवासी नहीं।",
tribeEventCreate: "कार्यक्रम बनाएँ",
tribeEventsEmpty: "अभी तक कोई कार्यक्रम नहीं।",
@@ -1909,9 +2163,14 @@ module.exports = {
tribeMediaTypeDocument: "दस्तावेज़",
tribeMediaTypeBookmark: "बुकमार्क",
tribeContentDelete: "हटाएँ",
+ tribeReachTribe: "जनजाति",
+ tribeReachNotice: "OASIS इसे सभी निवासियों को दिखाता है और CLEARNET खुले वेब पर भी। इसे खोलने से जनजाति के बाहर एक पढ़ने योग्य प्रति रह जाती है: जनजाति में वापस करने से यह छिप जाता है, पर पहले साझा की गई प्रतियाँ मिटाई नहीं जा सकतीं।",
+ tribeReachPrivate: "निजी जनजाति की सामग्री केवल जनजाति के भीतर ही रह सकती है।",
+ tribeReachOpenedBy: "खोलने वाले",
+ tribeReachChange: "कहाँ प्रकाशित है",
tribeInviteCodeText: "आमंत्रण कोड: ",
oasisVersionLabel: "Oasis संस्करण",
- tribeInviteCodeHint: "इस कोड को साझा करें जिसे आप आमंत्रित करना चाहते हैं। वे /invites → Tribes से शामिल हो सकते हैं।",
+ tribeInviteCodeHint: "इस कोड को साझा करें जिसे आप आमंत्रित करना चाहते हैं। वे /invites से शामिल हो सकते हैं।",
tribeStatusOpen: "खुला",
tribeStatusClosed: "बंद",
tribeStatusInProgress: "प्रगति में",
@@ -1951,7 +2210,7 @@ module.exports = {
tribeSearchMinChars: "खोजने के लिए कम से कम 2 अक्षर दर्ज करें।",
agendaTitle: "एजेंडा",
agendaDescription: "यहाँ आप अपने सभी सौंपे गए आइटम पा सकते हैं।",
- agendaSearchPlaceholder: "एजेंडा खोजें...",
+ agendaSearchPlaceholder: "एजेंडा में खोजें...",
agendaFilterAll: "सभी",
agendaFilterToday: "आज",
agendaFilterUpcoming: "आगामी",
@@ -1972,6 +2231,7 @@ module.exports = {
agendaNoItems: "कोई सौंपे गए आइटम नहीं मिले।",
agendaDiscardButton: "निरस्त करें",
agendaRestoreButton: "पुनर्स्थापित करें",
+ agendaRemoveButton: "हटाएँ",
agendaMembersCount: "सदस्य",
agendaLocationLabel: "स्थान",
agendaYes: "हाँ",
@@ -2038,8 +2298,8 @@ module.exports = {
pmComposeTitle: "संदेश भेजें",
pmRecipients: "प्राप्तकर्ता",
pmRecipientsHint: "अल्पविराम से अलग Oasis IDs दर्ज करें",
- pmLimitsHint: "प्रति संदेश अधिकतम 7 प्राप्तकर्ता।",
- pmTextPlaceholder: "मुख्य पाठ 7000 वर्णों तक सीमित।",
+ pmLimitsHint: "प्रति संदेश अधिकतम 7 निवासी।",
+ pmTextPlaceholder: "अपना संदेश लिखें।",
pmSubject: "विषय",
pmSubjectHint: "संदेश विषय दर्ज करें",
pmText: "संदेश",
@@ -2061,8 +2321,8 @@ module.exports = {
pmCrypterCharsLabel: "अक्षर",
pmInvalidRecipients: "अमान्य Oasis ID (यह @…=.ed25519 जैसा होना चाहिए)।",
pmEncryptionLabel: "एन्क्रिप्शन",
- private: "निजी",
- privateDescription: "आपके एन्क्रिप्टेड संदेश।",
+ private: "इनबॉक्स",
+ privateDescription: "अपने निजी संदेश प्रबंधित करें।",
privateInbox: "इनबॉक्स",
privateSent: "भेजे गए",
privateDelete: "हटाएँ",
@@ -2097,7 +2357,7 @@ module.exports = {
inboxProjectPledgedTitle: "आपकी परियोजना के लिए नई प्रतिज्ञा",
pmHasPledged: "ने प्रतिज्ञा की है",
pmToYourProject: "आपकी परियोजना को",
- blockchain: 'BlockExplorer',
+ blockchain: "ब्लॉक एक्सप्लोरर",
blockchainDescription: 'ब्लॉकचेन में ब्लॉक खोजें और विज़ुअलाइज़ करें।',
blockchainNoBlocks: 'ब्लॉकचेन में कोई ब्लॉक नहीं मिला।',
blockchainStatsTitle: 'आँकड़े',
@@ -2118,24 +2378,24 @@ module.exports = {
visitContent: "सामग्री देखें",
favoriteAdd: "पसंदीदा में पिन करें",
pmContentTooltip: "निजी संदेश भेजें",
+ phoneCallTooltip: "फ़ोन कॉल करें",
favoriteRemove: "पसंदीदा से हटाएँ",
reportContent: "सामग्री की रिपोर्ट करें",
banking: 'बैंकिंग',
bankingTitle: 'बैंकिंग',
- bankingDescription: "ECOin अर्थव्यवस्था: शेष, यूबीआई, कर और उद्योग मूल्य।",
+ bankingDescription: "ECOin की सामूहिक अर्थव्यवस्था।",
bankOverview: 'अवलोकन',
bankEpochs: 'युग',
bankRules: 'नियम',
pending: 'लंबित',
closed: 'बंद',
- bankViewTx: 'Tx देखें',
bankClaimNow: 'अभी दावा करें',
- bankClaimUBI: 'UBI का दावा करें!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: 'UBI का दावा करें',
+ bankClaimAndPay: "दावा करें और भुगतान करें",
+ bankClaimedPending: "दावा लंबित...",
+ bankStatusClaimed: "दावा किया गया",
+ bankStatusExpired: "समाप्त",
+ bankPubOnly: "केवल PUB के लिए कार्य",
bankEpoch: 'युग',
bankPool: 'पूल (यह युग)',
bankWeightsSum: 'भारों का योग',
@@ -2154,8 +2414,8 @@ module.exports = {
bankViewEpoch: 'युग देखें',
bankYourIndustryBalance: "आपका औद्योगिक हिस्सा",
bankYourUbiMonth: "आपकी UBI (इस माह)",
- bankYourFundsMonth: "आपकी निधि (इस माह)",
- bankIndustryBalance: "औद्योगिक उत्पादन (अनुमानित)",
+ bankYourFundsMonth: "कुल निधि",
+ bankIndustryBalance: "औद्योगिक उत्पादन",
bankUserBalance: 'आपका शेष',
bankAddresses: 'पते',
bankNoAddresses: 'कोई पता नहीं मिला।',
@@ -2163,6 +2423,10 @@ module.exports = {
bankAddress: 'पता',
bankAddAddressTitle: 'ECOIN पता जोड़ें',
bankAddAddressUser: 'Oasis ID',
+ bankAddAddressLabel: "लेबल (वैकल्पिक)",
+ bankAddAddressLabelPlaceholder: "बॉब का वॉलेट, ऐलिस की दुकान…",
+ bankAddAddressUserOptional: "Oasis ID (वैकल्पिक)",
+ bankAddressUnnamed: "बिना नाम का पता",
bankAddAddressAddress: 'ECOIN पता',
bankAddAddressSave: 'सहेजें',
bankAddressAdded: 'पता जोड़ा गया',
@@ -2180,11 +2444,11 @@ module.exports = {
bankAddressDeleteConfirm: 'यह पता हटाएँ?',
search: 'खोजें!',
bankLocal: 'स्थानीय',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "नेटवर्क",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "कोई धन नहीं!",
bankUbiAvailableOk: "उपलब्ध!",
- bankUbiAvailability: "UBI (नेटवर्क)",
+ bankUbiAvailability: "UBI",
bankAlreadyClaimedThisMonth: "इस महीने पहले ही दावा किया गया",
bankUbiThisMonth: "UBI (इस महीने)",
bankUbiLastClaimed: "UBI (अंतिम दावा)",
@@ -2214,6 +2478,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "ट्रांज़िट में एन्क्रिप्टेड",
shopAddFavorite: "पसंदीदा जोड़ें",
shopRemoveFavorite: "पसंदीदा हटाएं",
shopOpen: "खुली",
@@ -2221,6 +2486,13 @@ module.exports = {
shopMakePrivate: "निजी बनाएं (E2E)",
shopMakePublic: "सार्वजनिक बनाएं",
shopProducts: "उत्पाद",
+ shopFilterAll: "सभी",
+ shopFilterRecent: "हाल के",
+ shopFilterMine: "मेरे",
+ shopFilterTop: "टॉप",
+ shopFilterProducts: "उत्पाद",
+ shopFilterPrices: "मूल्य",
+ shopFilterFavorites: "पसंदीदा",
shopProductAdd: "उत्पाद जोड़ें",
shopProductTitle: "उत्पाद",
shopProductUpdate: "उत्पाद अपडेट",
@@ -2248,7 +2520,7 @@ module.exports = {
marketVisitItem: "आइटम देखें",
shopStatus: "स्थिति",
shopCreatedAt: "बनाया गया",
- shopSearchPlaceholder: "दुकानें खोजें...",
+ shopSearchPlaceholder: "दुकानें में खोजें...",
shopUrl: "URL",
shopLocation: "स्थान",
shopTags: "टैग",
@@ -2258,37 +2530,40 @@ module.exports = {
shopTitlePlaceholder: "आपकी दुकान का नाम",
shopDescriptionPlaceholder: "आपकी दुकान का विस्तृत विवरण",
shopLocationPlaceholder: "शहर, देश",
- shopTagsPlaceholder: "टैग1, टैग2, टैग3",
+ shopTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
mapTitlePlaceholder: "मानचित्र शीर्षक",
shopProductFeatured: "विशेष उत्पाद",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "बाज़ार में भेजें",
typeShop: "दुकानें",
typeShopProduct: "दुकान उत्पाद",
bankExchange: 'विनिमय',
bankExchangeCurrentValue: 'ECOin मूल्य (1h)',
- bankTotalSupply: 'ECOin कुल आपूर्ति',
- bankEcoinHours: "ECOin समय समतुल्यता",
+ bankTotalSupply: "ECOin कुल आपूर्ति",
+ bankPubsSupply: "PUBs पूल की ECOin आपूर्ति",
+ bankHoldingSupply: "UBI से बाहर ECOin आपूर्ति",
+ bankEcoinHours: "ECOin समय समतुल्यता (1 ECO)",
bankHoursOfWork: 'घंटे',
bankUnitMs: "मि.से.",
bankUnitSeconds: "सेकंड",
bankUnitMinutes: "मिनट",
bankUnitDays: "दिन",
bankExchangeNoData: 'कोई डेटा उपलब्ध नहीं',
- bankInflation: 'ECOin मुद्रास्फीति (anual)',
- bankInflationMonthly: 'ECOin मुद्रास्फीति (mensual)',
+ bankInflation: "ECOin मुद्रास्फीति (वार्षिक)",
+ bankInflationMonthly: "ECOin मुद्रास्फीति (मासिक)",
bankExchangeChartTitle: 'समय के साथ ECOin मूल्य की प्रगति',
bankExchangeChartValue: 'मूल्य (ECO/घंटा)',
bankExchangeChartSupply: 'आपूर्ति',
bankExchangeChartInflation: 'मुद्रास्फीति %',
bankExchangeChartEmpty: 'अभी पर्याप्त नमूने नहीं — बाद में लौटें',
- bankCurrentSupply: 'ECOin वर्तमान आपूर्ति',
+ bankCurrentSupply: "ECOin वर्तमान आपूर्ति",
bankingSyncStatus: 'ECOin स्थिति',
bankingSyncStatusSynced: 'सिंक किया गया',
- bankingSyncStatusOutdated: 'पुराना',
+ bankingSyncStatusOutdated: "असिंक",
statsTitle: 'सांख्यिकी',
statistics: "सांख्यिकी",
statsDescription: "अपने नेटवर्क के बारे में सांख्यिकी खोजें।",
ALLButton: "सभी",
+ RECENTButton: "हाल के",
MINEButton: "मेरे",
TOMBSTONEButton: "टॉम्बस्टोन",
statsCreatedAt: "बनाया गया",
@@ -2296,7 +2571,8 @@ module.exports = {
statsYourOpinions: "राय",
statsNetworkContent: "सामग्री",
statsNetworkOpinions: "राय",
- statsEcoWalletLabel: "ECOIN वॉलेट",
+ statsEcoWalletLabel: "ECOin वॉलेट",
+ walletAddressCopyHint: "चुनने के लिए क्लिक करें, फिर कॉपी करें",
statsEcoWalletNotConfigured: "कॉन्फ़िगर नहीं!",
statsBookmark: "बुकमार्क",
statsEvent: "कार्यक्रम",
@@ -2318,6 +2594,8 @@ module.exports = {
statsTransfer: "स्थानांतरण",
statsAiExchange: "AI",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "पीयर",
+ statsTotalLabel: "कुल",
statsPost: "पोस्ट",
statsSize: "कुल (आकार)",
statsBlockchainSize: "ब्लॉकचेन (आकार)",
@@ -2369,8 +2647,14 @@ module.exports = {
aiPrompt: "एक सूचनाप्रद और सटीक प्रतिक्रिया प्रदान करें।",
aiConfiguration: "प्रॉम्प्ट सेट करें",
aiPromptUsed: "प्रॉम्प्ट",
- aiClearHistory: "चैट इतिहास साफ़ करें",
- aiServerError: "AI उत्तर नहीं दे सका। कृपया पुनः प्रयास करें।",
+ aiClearHistory: "इतिहास साफ़ करें",
+ aiServerError: "मैं ठीक से उत्तर नहीं दे पा रहा हूँ। कृपया फिर से प्रयास करें।",
+ aiStatusLoading: "42 मॉडल लोड कर रहा है। थोड़ी देर में फिर पूछें।",
+ aiThinking: "सोच रहा है",
+ aiWaiting: "प्रतीक्षा में",
+ aiStatusMissingModel: "AI मॉडल स्थापित नहीं है: src/AI/oasis-42-1-chat.Q4_K_M.gguf नहीं मिला।",
+ aiExportFineTuning: "Fine-Tuning निर्यात करें",
+ aiFactsTitle: "आपके नेटवर्क का डेटा",
aiInputPlaceholder: "Oasis क्या है?",
typeAiExchange: "AI",
aiApproveTrain: "सामूहिक प्रशिक्षण में जोड़ें",
@@ -2399,7 +2683,7 @@ module.exports = {
marketFilterDiscarded: "निरस्त",
marketFilterRecent: "हाल के",
marketFilterMyBids: "बोलियाँ",
- marketCreateButton: "आइटम बनाएँ",
+ marketCreateButton: "कुछ बेचें",
marketItemType: "प्रकार",
marketItemTitle: "शीर्षक",
marketItemAvailable: "समय सीमा",
@@ -2426,8 +2710,8 @@ module.exports = {
marketItemSeller: "विक्रेता",
marketNoItems: "अभी तक कोई आइटम उपलब्ध नहीं।",
marketYourBid: "आपकी बोली",
- marketCreateFormImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)",
- marketSearchPlaceholder: "शीर्षक या टैग खोजें",
+ marketCreateFormImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 75MB)",
+ marketSearchPlaceholder: "बाज़ार में खोजें...",
marketMinPriceLabel: "न्यूनतम मूल्य",
marketMaxPriceLabel: "अधिकतम मूल्य",
marketSortRecent: "सबसे हाल का",
@@ -2493,8 +2777,7 @@ module.exports = {
housingSetClosed: "अनुपलब्ध करें",
housingCreateButton: "जगह बनाएं",
housingUpdateButton: "अपडेट",
- housingDeleteButton: "हटाएं",
- housingSearchPlaceholder: "जगहें खोजें...",
+ housingSearchPlaceholder: "आवास में खोजें...",
housingSearchButton: "खोजें",
housingMinPrice: "न्यूनतम कीमत",
housingMaxPrice: "अधिकतम कीमत",
@@ -2550,7 +2833,7 @@ module.exports = {
jobLocationPresencial: "स्थानीय",
jobLocationRemote: "दूरस्थ",
jobVacantsPlaceholder: "पदों की संख्या",
- jobImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)",
+ jobImage: "मीडिया अपलोड करें (अधिकतम-आकार: 75MB)",
jobTasks: "कार्य",
jobType: "नौकरी प्रकार",
jobTime: "नौकरी समय",
@@ -2572,12 +2855,11 @@ module.exports = {
jobsExchangeSkill: "बदले में चाहिए कौशल",
jobTimePartial: "अंशकालिक",
jobTimeComplete: "पूर्णकालिक",
- jobsDeleteButton: "हटाएँ",
jobsUpdateButton: "अपडेट",
jobsFilterApplied: "आवेदित",
jobsAppliedTitle: "मेरे आवेदन",
jobsAppliedBadge: "आवेदित",
- jobsSearchPlaceholder: "शीर्षक, टैग, विवरण खोजें...",
+ jobsSearchPlaceholder: "नौकरियाँ में खोजें...",
jobsMinSalaryLabel: "न्यूनतम वेतन",
jobsMaxSalaryLabel: "अधिकतम वेतन",
jobsSortRecent: "सबसे हाल का",
@@ -2589,7 +2871,7 @@ module.exports = {
jobSetOpen: "खुली सेट करें",
jobsTagsLabel: "टैग",
noJobsMatch: "आपकी खोज से कोई नौकरी मेल नहीं खाती।",
- industrySearchPlaceholder: "फैक्टरियाँ खोजें…",
+ industrySearchPlaceholder: "उद्योग में खोजें...",
industryAllSectors: "सभी क्षेत्र",
industryVisitButton: "उद्योग देखें",
industryAdvanceTo: "पर सेट करें",
@@ -2663,7 +2945,6 @@ module.exports = {
industryBuildStatus_FAILED: "विफल",
pmBotIndustry: "IndustryBot",
pmBotHousing: "HousingBot",
- pmBotJobs: "JobsBot",
jobsBotMatchTitle: "एक नौकरी आपके CV से मेल खाती है",
jobsBotMatchIntro: "एक नौकरी आपके CV से मेल खाती है।",
jobsBotMatchJob: "नौकरी",
@@ -2690,7 +2971,7 @@ module.exports = {
industryRulesIntro: "Industry निवासियों को उत्पादन के साधनों का सामूहिक स्वामित्व देता है: एक फैक्टरी नेटवर्क-स्वामित्व वाली कार्यशाला है जिसे कोई निजी रूप से नहीं रखता।",
industryRulesSteward: "संस्थापक प्रबंधक होता है — संरक्षक, मालिक नहीं: वह फैक्टरी को अकेले बेच, निजीकृत या विघटित नहीं कर सकता।",
industryRulesMembership: "सदस्यता नीति तय करती है कि कैसे जुड़ें: खुला (तुरंत), मतदान द्वारा (सदस्यों के वोट से स्वीकृत) या केवल आमंत्रण (पहले किसी सदस्य को आमंत्रित करना होगा)।",
- industryRulesQuorum: "कोरम वह न्यूनतम सदस्य संख्या है जिन्हें किसी निर्णय के गिनने के लिए मतदान करना चाहिए, ताकि छोटी फैक्टरी एक व्यक्ति द्वारा तय न हो।",
+ industryRulesQuorum: "कोरम वह न्यूनतम सदस्य संख्या है जिन्हें किसी निर्णय के गिनने के लिए मतदान करना चाहिए, ताकि छोटी फैक्टरी एक निवासी द्वारा तय न हो।",
industryRulesMajority: "बहुमत पारित होने के लिए आवश्यक मतों का अंश है (0.5 = आधा, 1 = सर्वसम्मति); निर्णय तब पारित होता है जब हाँ वोट कम से कम max(कोरम, सदस्य × बहुमत) तक पहुँचें।",
industryRulesDecisions: "सदस्य नए लोगों को स्वीकारने, बिल्ड स्वीकृत करने और फैक्टरी विघटित करने के लिए मतदान करते हैं; प्रबंधक इन सामूहिक निर्णयों को नहीं टाल सकता।",
industryRulesBlueprints: "ब्लूप्रिंट स्वतंत्र (COPYLEFT) व्यंजन हैं — इनपुट (सामग्री, श्रम घंटे, कौशल) और आउटपुट (एक भौतिक या डिजिटल वस्तु) — और कोई भी इन्हें फोर्क कर सकता है।",
@@ -2716,6 +2997,7 @@ module.exports = {
modulesIndustryLabel: "उद्योग",
modulesIndustryDescription: "उत्पादन के साधनों को सामूहिक रूप से प्रबंधित करने का मॉड्यूल।",
industryFilterAll: "सभी",
+ industryFilterRecent: "हाल के",
industryFilterMember: "सदस्य",
industryFilterBlueprints: "ब्लूप्रिंट",
industryFilterBuilds: "उत्पादन",
@@ -2724,6 +3006,7 @@ module.exports = {
industryFilterPaused: "रोकी गई",
industryFilterDissolved: "विघटित",
industryAllTitle: "उद्योग",
+ industryRecentTitle: "हाल की फैक्टरियाँ",
industryMemberTitle: "जिन फैक्टरियों में मैं हूँ",
industryMineTitle: "मेरी फैक्टरियाँ",
industryActiveTitle: "चालू",
@@ -2771,7 +3054,7 @@ module.exports = {
industryPolicy_invite: "केवल आमंत्रण",
projectsTitle: "परियोजनाएँ",
projectsDescription: "अपने नेटवर्क में समुदाय-संचालित परियोजनाएँ बनाएँ, वित्तपोषित करें और अनुसरण करें।",
- projectSearchPlaceholder: "परियोजनाएँ खोजें...",
+ projectSearchPlaceholder: "परियोजनाएँ में खोजें...",
projectCreateProject: "परियोजना बनाएँ",
projectCreateButton: "परियोजना बनाएँ",
projectUpdateButton: "अपडेट",
@@ -2794,7 +3077,7 @@ module.exports = {
projectRecentTitle: "हाल की परियोजनाएँ",
projectTopTitle: "शीर्ष वित्तपोषित",
projectTitlePlaceholder: "परियोजना का नाम",
- projectImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)",
+ projectImage: "मीडिया अपलोड करें (अधिकतम-आकार: 75MB)",
projectDescription: "विवरण",
projectDescriptionPlaceholder: "कहानी और लक्ष्य बताएँ…",
projectGoal: "लक्ष्य (ECO)",
@@ -2866,15 +3149,13 @@ module.exports = {
modulesModuleName: "नाम",
modulesModuleDescription: "विवरण",
modulesModuleStatus: "स्थिति",
- modulesTotalModulesLabel: "लोड किए गए मॉड्यूल",
+ modulesTotalModulesLabel: "कुल",
modulesEnabledModulesLabel: "सक्षम",
modulesDisabledModulesLabel: "अक्षम",
modulesInvitesLabel: "आमंत्रण",
modulesInvitesDescription: "आमंत्रण कोड प्रबंधित और लागू करने का मॉड्यूल।",
modulesWalletLabel: "वॉलेट",
modulesWalletDescription: "अपनी डिजिटल संपत्तियाँ (ECOin) प्रबंधित करने का मॉड्यूल।",
- modulesLegacyLabel: "विरासत",
- modulesLegacyDescription: "अपनी गुप्त कुंजी (निजी कुंजी) को जल्दी और सुरक्षित रूप से प्रबंधित करने का मॉड्यूल।",
modulesCipherLabel: "सिफर",
modulesCipherDescription: "अपने टेक्स्ट को सममित रूप से एन्क्रिप्ट और डिक्रिप्ट करने का मॉड्यूल (साझा पासवर्ड का उपयोग करके)।",
modulesBookmarksLabel: "बुकमार्क",
@@ -2936,20 +3217,23 @@ module.exports = {
modulesProjectsLabel: "परियोजनाएँ",
modulesProjectsDescription: "परियोजनाएँ खोजने, क्राउड-फंडिंग करने और प्रबंधित करने का मॉड्यूल।",
modulesBankingLabel: "बैंकिंग",
- modulesBankingDescription: "ECOIN का वास्तविक मूल्य निर्धारित करने और सामान्य कोषागार का उपयोग करके UBI वितरित करने का मॉड्यूल।",
+ modulesBankingDescription: "साझा कोष प्रबंधन मॉड्यूल: ECOIN मूल्य, कर और सार्वभौमिक बुनियादी आय।",
modulesFavoritesLabel: "पसंदीदा",
modulesFavoritesDescription: "अपनी पसंदीदा सामग्री प्रबंधित करने का मॉड्यूल।",
fileTooLargeTitle: "फ़ाइल बहुत बड़ी",
- fileTooLargeMessage: "फ़ाइल अधिकतम अनुमत आकार (50 MB) से अधिक है। कृपया एक छोटी फ़ाइल चुनें।",
+ fileTooLargeMessage: "फ़ाइल अधिकतम अनुमत आकार (75 MB) से अधिक है। कृपया एक छोटी फ़ाइल चुनें।",
goBack: "वापस जाएँ",
+ errorDismiss: "ठीक",
errorPageTitle: "कुछ गलत हो गया",
+ errorNoAllocation: "इस दावे के लिए कोई आवंटन नहीं मिला।",
+ errorInvalidClaim: "इस आवंटन का दावा नहीं किया जा सकता।",
visibilityLabel: "दृश्यता",
+ clearnetPrivateConflict: "निजी, छिपी, बंद, केवल आमंत्रण वाली या सशुल्क सामग्री CLEARNET पर प्रकाशित नहीं की जा सकती। OASIS चुनें या इसे सार्वजनिक करें।",
visibilityPublic: "सार्वजनिक",
visibilityHidden: "छिपा हुआ",
visibilityMakePublic: "सार्वजनिक करें",
visibilityMakeHidden: "छिपाएँ",
invitesInhabitantsTitle: "निवासी",
- invitesInhabitantsFollow: "फॉलो करें",
aiNavPlaceholder: "बताएँ आपको क्या चाहिए...",
aiNavDisabled: "AI नेविगेशन अक्षम है।",
aiNavResultsTitle: "AINav सुझाव",
@@ -2960,7 +3244,7 @@ module.exports = {
modulesAINavDescription: "नेटवर्क की सामग्री पर प्राकृतिक भाषा में प्रश्न करने का मॉड्यूल।",
directConnectDescription: "किसी पीयर से सीधे कनेक्ट करने के लिए उनका IP पता, पोर्ट और सार्वजनिक कुंजी दर्ज करें। पीयर को एक अनुसरित कनेक्शन के रूप में जोड़ा जाएगा।",
peerHost: "IP",
- peerPort: "पोर्ट (डिफ़ॉल्ट: 8008)",
+ peerPort: "पोर्ट",
peerPublicKey: "सार्वजनिक कुंजी (@...ed25519)",
connectAndFollow: "कनेक्ट करें",
modulesPresetTitle: "सामान्य कॉन्फ़िगरेशन",
@@ -2969,15 +3253,15 @@ module.exports = {
workflowsSet: "वर्कफ़्लो लागू करें",
workflow_default: "डिफ़ॉल्ट",
workflow_jobs: "रोज़गार",
- workflow_ruling: "शासन",
- workflow_politics: "राजनीति",
workflow_social: "सामाजिक",
workflow_business: "व्यापार",
workflow_night: "रात",
+ workflow_kids: "बच्चे",
+ workflow_activists: "कार्यकर्ता",
workflow_mobile: "मोबाइल",
statsCarbonFootprintTitle: "कार्बन फुटप्रिंट",
statsCarbonTombstone: "टॉम्बस्टोनिंग फुटप्रिंट",
- uploadMedia: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)",
+ uploadMedia: "मीडिया अपलोड करें (अधिकतम-आकार: 75MB)",
feedOpenDiscussion: "चर्चा खोलें",
feedDetailTitle: "फ़ीड",
feedPostComment: "टिप्पणी पोस्ट करें",
@@ -2985,7 +3269,7 @@ module.exports = {
noComments: "अभी तक कोई टिप्पणी नहीं",
mapsLabel: "मानचित्र",
mapTitle: "मानचित्र",
- mapDescription: "अपने नेटवर्क में ऑफ़लाइन मानचित्र खोजें और प्रबंधित करें।",
+ mapDescription: "अपने नेटवर्क में ऑफ़लाइन मानचित्र प्रबंधित और साझा करें।",
mapMineSectionTitle: "आपके मानचित्र",
mapCreateSectionTitle: "मानचित्र बनाएं",
mapUpdateSectionTitle: "मानचित्र अपडेट करें",
@@ -3014,7 +3298,7 @@ module.exports = {
mapTypeOpen: "खुला",
mapTypeClosed: "बंद",
mapTagsLabel: "टैग",
- mapTagsPlaceholder: "अल्पविराम से अलग टैग दर्ज करें",
+ mapTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
mapUrlLabel: "मानचित्र URL",
mapMarkersTitle: "मार्कर",
mapMarkerDefault: "मार्कर",
@@ -3025,9 +3309,22 @@ module.exports = {
markerImageLabel: "मार्कर छवि",
mapAddMarkerTitle: "मार्कर जोड़ें",
mapAddMarkerButton: "मार्कर जोड़ें",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "मार्कर साफ़ करें",
mapApplyZoom: "ज़ूम लागू करें",
- mapSearchPlaceholder: "विवरण, टैग, लेखक खोजें...",
+ mapPlaceSearchPlaceholder: "कोई स्थान या देश खोजें...",
+ mapNoPlaces: "कोई स्थान नहीं मिला।",
+ mapClusterTitle: "मार्कर यहाँ, ज़ूम करने के लिए क्लिक करें",
+ mapDeleteMarker: "मार्कर हटाएँ",
+ mapZoomIn: "ज़ूम इन",
+ mapZoomOut: "ज़ूम आउट",
+ mapFitMarkers: "सभी मार्कर दिखाएँ",
+ mapPanLabel: "मानचित्र हिलाएँ",
+ mapCenterHere: "यहाँ केंद्रित करें",
+ mapNear: "के पास",
+ mapPickedSpot: "चुना गया स्थान",
+ mapPickHint: "स्थान चुनने के लिए मानचित्र पर क्लिक करें।",
+ mapClearPick: "साफ़ करें",
+ mapSearchPlaceholder: "मानचित्र में खोजें...",
mapSearchButton: "खोजें",
mapUpdatedAt: "अपडेट किया गया",
mapNoMatch: "आपकी खोज से मेल खाने वाला कोई मानचित्र नहीं।",
@@ -3038,31 +3335,602 @@ module.exports = {
typeMapMarker: "मानचित्र मार्कर",
modulesMapLabel: "मानचित्र",
modulesMapDescription: "ऑफ़लाइन मानचित्रों को प्रबंधित और साझा करने का मॉड्यूल।",
+ emergenciesTitle: "आपातकाल",
+ modulesEmergenciesLabel: "आपातकाल",
+ modulesEmergenciesDescription: "नेटवर्क में आपातकाल घोषित करने, पुष्टि करने और फ़ॉलो करने का मॉड्यूल।",
+ emergenciesDescription: "नेटवर्क में आपातकाल घोषित करने, पुष्टि करने और फ़ॉलो करने का मॉड्यूल।",
+ emergencyCreate: "आपातकाल बनाएँ",
+ emergencyUpdate: "अपडेट",
+ emergencyDelete: "हटाएँ",
+ emergencyTitleLabel: "शीर्षक",
+ emergencyTitlePlaceholder: "क्या हो रहा है?",
+ emergencyTextLabel: "विवरण",
+ emergencyTextPlaceholder: "कहाँ, कब से, क्या करें...",
+ emergencyCategoryLabel: "श्रेणी",
+ emergencyCategoryWeather: "मौसम",
+ emergencyCategoryInfrastructure: "बुनियादी ढाँचा",
+ emergencyCategoryHealth: "स्वास्थ्य",
+ emergencyCategorySecurity: "सुरक्षा",
+ emergencyCategoryLost: "खोया-पाया",
+ emergencyCategoryNeighborhood: "पड़ोस",
+ emergencyExpiresLabel: "समाप्ति",
+ emergencyExpires1d: "1 दिन",
+ emergencyExpires3d: "3 दिन",
+ emergencyExpires7d: "1 सप्ताह",
+ emergencyExpires30d: "1 महीना",
+ emergencyExpiresNone: "अनिश्चित",
+ emergencyExpiresKeep: "वर्तमान तारीख रखें",
+ emergencyTagsLabel: "टैग",
+ emergencyTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ emergencyFilterAll: "सभी",
+ emergencyFilterMine: "मेरे",
+ emergencyFilterRecent: "हाल के",
+ emergencySeverityUnverified: "असत्यापित",
+ emergencySeverityLow: "कम",
+ emergencySeverityMedium: "मध्यम",
+ emergencySeverityHigh: "उच्च",
+ emergencyStatusActive: "सक्रिय",
+ emergencyStatusResolved: "हल हो गया",
+ emergencyStatusExpired: "समाप्त",
+ emergencyConfirmations: "पुष्टियाँ",
+ emergencyConfirmButton: "पुष्टि करें",
+ emergencyConfirmed: "आपने इस आपातकाल की पुष्टि की",
+ emergencyResolveButton: "हल करें",
+ emergencyReopenButton: "फिर से खोलें",
+ emergencyGenerateReport: "रिपोर्ट बनाएँ",
+ emergencyUpdateEdited: "संपादित",
+ emergencyLastUpdate: "अंतिम अपडेट",
+ emergencyUpdatesTitle: "अंतिम अपडेट:",
+ emergencyNoUpdates: "अभी कोई अपडेट नहीं।",
+ emergencyAddUpdate: "अपडेट पोस्ट करें",
+ emergencyUpdatePlaceholder: "क्या बदला?",
+ emergencyNoItems: "कोई आपातकाल नहीं मिला।",
+ emergencyExpiresAt: "समाप्ति",
+ emergencyBannerLabel: "सक्रिय आपातकाल",
+ emergencyCreateSectionTitle: "आपातकाल बनाएँ",
+ emergencyUpdateSectionTitle: "आपातकाल अपडेट करें",
+ emergencySearchPlaceholder: "आपातकाल में खोजें...",
+ typeEmergency: "आपातकाल",
+ typeEmergencyConfirm: "आपातकाल पुष्टि",
+ typeEmergencyUpdate: "आपातकाल अपडेट",
+ statsEmergency: "आपातकाल",
+ statsEmergencyConfirm: "आपातकाल पुष्टियाँ",
+ statsEmergencyUpdate: "आपातकाल अपडेट",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "आपके द्वारा फ़ॉलो किए गए आपातकाल में अपडेट है।",
+ emergencyBotResolvedTitle: "आपके द्वारा फ़ॉलो किया गया आपातकाल हल हो गया है।",
+ dataKindEmergencies: "आपातकाल",
+ mailingTitle: "मेलिंग सूचियाँ",
+ modulesMailingLabel: "मेलिंग सूचियाँ",
+ modulesMailingDescription: "अपने नेटवर्क में मेलिंग सूचियाँ खोजें और प्रबंधित करें।",
+ modulesPhoneLabel: "फ़ोन",
+ modulesPhoneDescription: "अन्य निवासियों को एंड-टू-एंड एन्क्रिप्टेड वीडियो कॉल करने का मॉड्यूल।",
+ mailingDescription: "अपने नेटवर्क में मेलिंग सूचियाँ खोजें और प्रबंधित करें।",
+ mailingCreate: "मेलिंग सूची बनाएँ",
+ mailingUpdate: "अपडेट करें",
+ mailingArchive: "संग्रहित करें",
+ mailingActivate: "सक्रिय करें",
+ mailingCreateSectionTitle: "मेलिंग सूची बनाएँ",
+ mailingUpdateSectionTitle: "मेलिंग सूची अपडेट करें",
+ mailingTitleLabel: "शीर्षक",
+ mailingTitlePlaceholder: "मेलिंग सूची का नाम",
+ mailingDescriptionLabel: "विवरण",
+ mailingDescriptionPlaceholder: "यह सूची किस बारे में है?",
+ mailingTypeLabel: "मेलिंग सूची का प्रकार",
+ mailingTypeOpen: "खुली",
+ mailingTypeClosed: "बंद",
+ mailingStatusLabel: "स्थिति",
+ mailingStatusActive: "सक्रिय",
+ mailingStatusArchived: "संग्रहित",
+ mailingMembersLabel: "निवासियों को आमंत्रित करें",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "सदस्य",
+ mailingTagsLabel: "टैग",
+ mailingTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ mailingFilterAll: "सभी",
+ mailingFilterMine: "मेरी",
+ mailingFilterSubscribed: "सदस्यता ली गई",
+ mailingFilterRecent: "हाल की",
+ mailingHistoryDate: "तारीख",
+ mailingHistoryThreads: "थ्रेड",
+ mailingHistoryInhabitants: "निवासी",
+ mailingHistorySearchPlaceholder: "इतिहास में खोजें...",
+ mailingNoMessages: "अभी कोई संदेश नहीं।",
+ mailingNoItems: "कोई मेलिंग सूची नहीं मिली।",
+ mailingSearchPlaceholder: "मेलिंग सूचियों में खोजें...",
+ mailingWriteButton: "संदेश लिखें",
+ mailingWriteTitle: "सूची को लिखें",
+ mailingReplyTitle: "सूची को उत्तर दें",
+ mailingSend: "भेजें",
+ mailingTextPlaceholder: "आपका संदेश सूची के हर प्रतिभागी तक पहुँचता है।",
+ mailingParticipants: "प्रतिभागी",
+ inboxFilterMailing: "मेलिंग सूचियाँ",
+ mailingReplyPlaceholder: "सूची को उत्तर दें...",
+ mailingReplyToList: "सूची को उत्तर दें",
+ typeMailingList: "मेलिंग सूची",
+ statsMailingList: "मेलिंग सूचियाँ",
+ mailingListLabel: "मेलिंग सूची",
+ logisticsTitle: "लॉजिस्टिक्स",
+ modulesLogisticsLabel: "लॉजिस्टिक्स",
+ modulesLogisticsDescription: "अपने नेटवर्क में लॉजिस्टिक योजनाएँ खोजें और प्रबंधित करें।",
+ logisticsDescription: "अपने नेटवर्क में लॉजिस्टिक योजनाएँ खोजें और प्रबंधित करें।",
+ logisticsCreate: "मार्ग बनाएँ",
+ logisticsUpdate: "अपडेट करें",
+ logisticsClose: "बंद करें",
+ logisticsReopen: "फिर से खोलें",
+ logisticsCreateSectionTitle: "मार्ग बनाएँ",
+ logisticsUpdateSectionTitle: "मार्ग अपडेट करें",
+ logisticsTitleLabel: "शीर्षक",
+ logisticsTitlePlaceholder: "बाज़ार तक सवारी, वैन उपलब्ध...",
+ logisticsKindLabel: "लॉजिस्टिक्स प्रकार",
+ logisticsKindTrip: "यात्रा",
+ logisticsKindShipment: "शिपमेंट",
+ logisticsKindTrips: "यात्राएँ",
+ logisticsKindShipments: "शिपमेंट",
+ logisticsModeLabel: "मोड",
+ logisticsModeOffer: "पेशकश",
+ logisticsModeRequest: "अनुरोध",
+ logisticsModeOffers: "पेशकशें",
+ logisticsModeRequests: "अनुरोध",
+ logisticsDescriptionLabel: "विवरण",
+ logisticsDescriptionPlaceholder: "मिलने की जगह, आप क्या ले जाते हैं, शर्तें...",
+ logisticsOriginLabel: "प्रारंभ",
+ logisticsOriginPlaceholder: "कहाँ से शुरू",
+ logisticsDestinationLabel: "गंतव्य",
+ logisticsDestinationPlaceholder: "कहाँ समाप्त",
+ logisticsDateLabel: "तारीख और समय",
+ logisticsRecurrenceLabel: "पुनरावृत्ति",
+ logisticsFrequencyLabel: "आवृत्ति",
+ logisticsRecurrenceNone: "एक बार",
+ logisticsRecurrenceDaily: "रोज़",
+ logisticsRecurrenceWeekly: "साप्ताहिक",
+ logisticsRecurrenceMonthly: "मासिक",
+ logisticsSeatsLabel: "सीटें",
+ logisticsSizeLabel: "आकार",
+ logisticsSizePlaceholder: "जैसे 2m x 1m",
+ logisticsWeightLabel: "वज़न",
+ logisticsWeightPlaceholder: "जैसे 40kg",
+ logisticsPriceFree: "मुफ़्त",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "समय",
+ logisticsPriceLabel: "मूल्य",
+ logisticsHours: "घं",
+ logisticsOrderRefLabel: "ऑर्डर लिंक",
+ logisticsOrderRefPlaceholder: "डिलीवर किए जाने वाले ऑर्डर का /shops/... या /market/...",
+ logisticsOrderLink: "जुड़ा ऑर्डर",
+ logisticsTagsLabel: "टैग",
+ logisticsTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ logisticsFilterAll: "सभी",
+ logisticsFilterMine: "मेरे",
+ logisticsFilterBooked: "बुक किए गए",
+ logisticsFilterRecent: "हाल के",
+ logisticsFilterHistory: "इतिहास",
+ logisticsFilterTop: "टॉप",
+ logisticsStatusOpen: "खुला",
+ logisticsStatusUpcoming: "आगामी",
+ logisticsStatusPast: "बीते",
+ logisticsStatusClosed: "बंद",
+ logisticsZoneLabel: "क्षेत्र",
+ logisticsSearchPlaceholder: "लॉजिस्टिक्स में खोजें...",
+ logisticsNoItems: "कोई मार्ग नहीं मिला।",
+ logisticsBookingPending: "लंबित",
+ logisticsBookingConfirmed: "पुष्टि",
+ logisticsBookingRejected: "अस्वीकृत",
+ logisticsBookingCancelled: "रद्द",
+ logisticsBookingDelivered: "डिलीवर",
+ logisticsConfirm: "पुष्टि करें",
+ logisticsReject: "अस्वीकार करें",
+ logisticsDeliver: "डिलीवर करें",
+ logisticsReceiptLabel: "रसीद",
+ logisticsReceiptPlaceholder: "डिलीवरी नोट (वैकल्पिक)",
+ logisticsCancelBooking: "बुकिंग रद्द करें",
+ logisticsBookTitle: "यह मार्ग बुक करें",
+ logisticsNotesLabel: "नोट्स",
+ logisticsNotesPlaceholder: "जो मालिक को पता होना चाहिए",
+ logisticsBook: "बुक करें",
+ logisticsBookingsTitle: "बुकिंग",
+ logisticsMyBookingTitle: "आपकी बुकिंग",
+ logisticsRatingsTitle: "रेटिंग",
+ logisticsNoRatings: "अभी कोई रेटिंग नहीं।",
+ logisticsRatingsWhenClosed: "मार्ग बंद होने पर रेटिंग खुलती है।",
+ logisticsScoreLabel: "स्कोर",
+ logisticsRatingPlaceholder: "कैसा रहा?",
+ logisticsRate: "रेट करें",
+ typeLogisticsRoute: "मार्ग",
+ typeLogisticsRating: "मार्ग रेटिंग",
+ statsLogisticsRoute: "मार्ग",
+ statsLogisticsRating: "मार्ग रेटिंग",
+ logisticsRouteLabel: "मार्ग",
+ podcastsTitle: "पॉडकास्ट",
+ modulesPodcastsLabel: "पॉडकास्ट",
+ modulesPodcastsDescription: "पॉडकास्ट चैनल प्रकाशित करने का मॉड्यूल।",
+ podcastsDescription: "पॉडकास्ट चैनल प्रकाशित करने का मॉड्यूल।",
+ podcastCreate: "पॉडकास्ट बनाएँ",
+ podcastUpdate: "अपडेट करें",
+ podcastDelete: "हटाएँ",
+ podcastCreateSectionTitle: "पॉडकास्ट बनाएँ",
+ podcastUpdateSectionTitle: "पॉडकास्ट अपडेट करें",
+ podcastTitleLabel: "शीर्षक",
+ podcastTitlePlaceholder: "चैनल का नाम",
+ podcastDescriptionLabel: "विवरण",
+ podcastDescriptionPlaceholder: "यह पॉडकास्ट किस बारे में है?",
+ podcastCategoryLabel: "श्रेणी",
+ podcastCategoryNews: "समाचार",
+ podcastCategoryMusic: "संगीत",
+ podcastCategoryTalk: "बातचीत",
+ podcastCategoryEducation: "शिक्षा",
+ podcastCategoryTech: "तकनीक",
+ podcastCategoryCulture: "संस्कृति",
+ podcastCategoryCommunity: "समुदाय",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "अन्य",
+ podcastTagsLabel: "टैग",
+ podcastCoverLabel: "कवर (छवि या वीडियो)",
+ podcastEpisodeAudioLabel: "ऑडियो या वीडियो फ़ाइल (अधिकतम: 75MB)",
+ podcastTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ podcastFilterAll: "सभी",
+ podcastFilterMine: "मेरे",
+ podcastFilterRecent: "हाल के",
+ podcastFilterTop: "टॉप",
+ podcastFilterViewers: "श्रोता",
+ podcastSearchPlaceholder: "पॉडकास्ट में खोजें...",
+ podcastNoItems: "कोई पॉडकास्ट नहीं मिला।",
+ podcastEpisodesLabel: "एपिसोड",
+ podcastPlaysLabel: "व्यूज़",
+ podcastLastEpisode: "अंतिम एपिसोड",
+ podcastEpisodesTitle: "एपिसोड",
+ podcastNoEpisodes: "अभी कोई एपिसोड नहीं।",
+ podcastEpisodeAdd: "एपिसोड जोड़ें",
+ podcastEpisodeCreateTitle: "एपिसोड प्रकाशित करें",
+ podcastEpisodeUpdateTitle: "एपिसोड अपडेट करें",
+ podcastEpisodeTitleLabel: "एपिसोड शीर्षक",
+ podcastEpisodeTitlePlaceholder: "एपिसोड का शीर्षक",
+ podcastEpisodeDescriptionLabel: "शो नोट्स",
+ podcastEpisodeDescriptionPlaceholder: "इस एपिसोड में क्या होता है, लिंक, श्रेय...",
+ podcastEpisodePublish: "प्रकाशित करें",
+ podcastPlayed: "सुना गया",
+ podcastMarkPlayed: "सुना हुआ चिह्नित करें",
+ typePodcast: "पॉडकास्ट",
+ typePodcastEpisode: "एपिसोड",
+ typePodcastOpinion: "एपिसोड राय",
+ typePodcastPlay: "एपिसोड प्ले",
+ statsPodcast: "पॉडकास्ट",
+ statsPodcastEpisode: "एपिसोड",
+ statsPodcastPlay: "एपिसोड प्ले",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "आपके द्वारा फ़ॉलो किए गए ब्लॉग में नई प्रविष्टि है।",
+ podcastBotEpisodeTitle: "आपके द्वारा फ़ॉलो किए गए पॉडकास्ट में नया एपिसोड है।",
+ podcastLabel: "पॉडकास्ट",
+ podcastEpisodeLabel: "एपिसोड",
+ campaignsTitle: "अभियान",
+ modulesCampaignsLabel: "अभियान",
+ modulesCampaignsDescription: "अपने नेटवर्क में अभियान खोजें और प्रबंधित करें।",
+ campaignsDescription: "अपने नेटवर्क में अभियान खोजें और प्रबंधित करें।",
+ campaignCreate: "अभियान बनाएँ",
+ campaignUpdate: "अपडेट करें",
+ campaignDelete: "हटाएँ",
+ campaignClose: "बंद करें",
+ campaignReopen: "फिर से खोलें",
+ campaignCreateSectionTitle: "अभियान बनाएँ",
+ campaignUpdateSectionTitle: "अभियान अपडेट करें",
+ campaignTitleLabel: "शीर्षक",
+ campaignTitlePlaceholder: "आप क्या हासिल करना चाहते हैं?",
+ campaignTextLabel: "पाठ",
+ campaignTextPlaceholder: "कारण समझाएँ, कौन तय करता है और आप क्या माँगते हैं...",
+ campaignCategoryLabel: "श्रेणी",
+ campaignCategoryEnvironment: "पर्यावरण",
+ campaignCategoryRights: "अधिकार",
+ campaignCategoryHealth: "स्वास्थ्य",
+ campaignCategoryEducation: "शिक्षा",
+ campaignCategoryInfrastructure: "बुनियादी ढाँचा",
+ campaignCategoryCulture: "संस्कृति",
+ campaignCategoryEconomy: "अर्थव्यवस्था",
+ campaignCategoryOther: "अन्य",
+ campaignGoalLabel: "हस्ताक्षर लक्ष्य",
+ campaignDeadlineLabel: "समय सीमा",
+ campaignTagsLabel: "टैग",
+ campaignTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ campaignFilterAll: "सभी",
+ campaignFilterMine: "मेरे",
+ campaignFilterSigned: "हस्ताक्षरित",
+ campaignFilterRecent: "हाल के",
+ campaignFilterTop: "टॉप",
+ campaignStatusOpen: "खुला",
+ campaignStatusAchieved: "प्राप्त",
+ campaignStatusUnachieved: "अप्राप्त",
+ campaignStatusClosed: "बंद",
+ campaignSearchPlaceholder: "अभियानों में खोजें...",
+ campaignNoItems: "कोई अभियान नहीं मिला।",
+ campaignSignaturesLabel: "हस्ताक्षर",
+ campaignSignaturesTitle: "समर्थक",
+ campaignNoSignatures: "अभी कोई हस्ताक्षर नहीं।",
+ campaignSignTitle: "इस अभियान पर हस्ताक्षर करें",
+ campaignSignPlaceholder: "आप इसका समर्थन क्यों करते हैं? (वैकल्पिक)",
+ campaignSign: "हस्ताक्षर करें",
+ campaignSigned: "आप पहले ही हस्ताक्षर कर चुके हैं!",
+ campaignNotSigned: "आपके हस्ताक्षर अभी बाकी हैं",
+ campaignElevate: "संसद तक ले जाएँ",
+ campaignElevated: "संसद तक ले जाया गया",
+ campaignUpdatesTitle: "अपडेट",
+ campaignNoUpdates: "अभी कोई अपडेट नहीं।",
+ campaignUpdatePlaceholder: "क्या हुआ?",
+ campaignAddUpdate: "अपडेट पोस्ट करें",
+ campaignQrAlt: "इस अभियान पर हस्ताक्षर के लिए QR",
+ campaignQrCaption: "हस्ताक्षर के लिए स्कैन करें",
+ typeCampaign: "अभियान",
+ typeCampaignSignature: "हस्ताक्षर",
+ typeCampaignUpdate: "अभियान अपडेट",
+ statsCampaign: "अभियान",
+ statsCampaignSignature: "अभियान हस्ताक्षर",
+ statsCampaignUpdate: "अभियान अपडेट",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "आपके द्वारा फ़ॉलो किए गए अभियान में अपडेट है।",
+ campaignBotAchievedTitle: "आपके द्वारा फ़ॉलो किया गया अभियान अपने लक्ष्य तक पहुँच गया।",
+ campaignBotRaisedTitle: "आपके द्वारा हस्ताक्षरित एक अभियान संसद में उठाया गया है।",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "आपके द्वारा बुक किया गया मार्ग बदल गया है।",
+ logisticsBotClosedTitle: "आपके द्वारा बुक किया गया मार्ग बंद हो गया है।",
+ logisticsBotBookedTitle: "किसी ने आपका मार्ग बुक किया है।",
+ logisticsBotCancelledTitle: "आपके मार्ग की एक बुकिंग रद्द कर दी गई।",
+ logisticsBotConfirmedTitle: "आपकी बुकिंग पुष्ट हुई: पैकेज रास्ते में है।",
+ logisticsBotRejectedTitle: "आपकी बुकिंग अस्वीकृत हुई।",
+ logisticsBotDeliveredTitle: "आपका पैकेज पहुँच गया है।",
+ campaignLabel: "अभियान",
+ campaignGenerateReport: "रिपोर्ट बनाएँ",
+ logisticsGenerateReport: "रिपोर्ट बनाएँ",
+ mailingGenerateReport: "रिपोर्ट बनाएँ",
+ campaignUpdateEdited: "संपादित",
+ mailingMessagesLabel: "संदेश",
+ logisticsBookingsLabel: "बुकिंग",
+ backupTitle: "बैकअप",
+ modulesBackupLabel: "बैकअप",
+ modulesBackupDescription: "अपनी कुंजियाँ निर्यात/आयात करने और एन्क्रिप्टेड बैकअप बनाने का मॉड्यूल।",
+ backupDescription: "अपनी कुंजियाँ निर्यात/आयात करने और एन्क्रिप्टेड बैकअप बनाने का मॉड्यूल।",
+ backupTypeRecovery: "रिकवरी",
+ backupTypeKeys: "कुंजियाँ निर्यात करें",
+ backupTypeFull: "पूर्ण बैकअप",
+ backupTypeRestore: "बैकअप पुनर्स्थापित करें",
+ backupTypeInstant: "तत्काल",
+ backupInstantDescription: "आपके पूरे लॉग और फ़ाइलों का सादा .zip, बिना आपकी गुप्त कुंजी और बिना पासवर्ड के। तेज़, पर ",
+ backupInstantRisk: "जिसे फ़ाइल मिले वह सब पढ़ सकता है।",
+ backupKitPageDescription: "रिकवरी किट केवल इसी डिवाइस से खोली जा सकती है।",
+ backupKitId: "Oasis ID",
+ backupKitDate: "बनाया गया",
+ backupKitQrAlt: "आपकी गुप्त कुंजी का QR कोड",
+ backupKitStep1: "इसे प्रिंट करें या हाथ से लिखें और सुरक्षित, ऑफ़लाइन जगह रखें।",
+ backupKitStep2: "पुनर्प्राप्ति के लिए नए डिवाइस पर Oasis इंस्टॉल करें और बैकअप › कुंजियाँ से यह सीक्रेट आयात करें।",
+ backupKitStep3: "यदि यह पृष्ठ कभी उजागर हो जाए तो इसे नष्ट कर दें।",
+ backupKitPdfButton: "PDF बनाएँ",
+ backupScopeLabel: "दायरा",
+ backupScopeAll: "सब कुछ",
+ backupScopeMine: "केवल मेरी सामग्री",
+ backupSinceLabel: "इस तारीख से",
+ backupEstimateTitle: "अनुमान",
+ backupFileInfo: "आपकी एन्क्रिप्टेड प्रति आपके डिवाइस पर डाउनलोड होगी (नाम: oasis-backup-तारीख.oasisbk)",
+ backupExportButton: "बैकअप डाउनलोड करें",
+ backupRestorePassword: "बैकअप बनाते समय उपयोग किया गया पासवर्ड लिखें",
+ backupRestoreButton: "बैकअप पुनर्स्थापित करें",
+ backupRestoredLine: "बैकअप पुनर्स्थापित हुआ।",
+ backupRestoredMessages: "संदेश जोड़े गए",
+ backupRestoredSkipped: "पहले से मौजूद",
+ backupRestoredBlobs: "फ़ाइलें जोड़ी गईं",
+ backupRestoredState: "सेटिंग्स बहाल",
+ backupRestoredFailed: "विफल",
+ backupRestoredForked: "भिन्न",
+ backupRestoreRunning: "बैकअप पुनर्स्थापित हो रहा है। यह पेज अपने आप ताज़ा होता है; इस बीच आप Oasis का उपयोग जारी रख सकते हैं।",
+ backupRestoreElapsed: "बीता समय",
+ backupRestoreFailedLine: "बैकअप पुनर्स्थापित नहीं हो सका।",
+ backupRestoreForkMine: "इस डिवाइस ने पहले ही आपकी पहचान से ऐसे संदेश प्रकाशित किए हैं जो बैकअप में नहीं हैं, इसलिए उन पर बैकअप लागू नहीं हो सका। कुंजियाँ आयात करने के तुरंत बाद, कुछ और करने से पहले, एक साफ़ इंस्टॉलेशन पर पुनर्स्थापित करें।",
+ verificationTitle: "सत्यापन",
+ verificationDescription: "अपनी फ़ीड की श्रृंखला जाँचें, फोर्क पहचानें और अनाथ या गायब फ़ाइलों की समीक्षा करें।",
+ verificationRun: "सत्यापन चलाएँ",
+ verificationTotalMessages: "लॉग में संदेश",
+ verificationFeed: "आपकी फ़ीड",
+ verificationMessages: "संदेश",
+ verificationLastSequence: "अंतिम क्रम",
+ verificationGaps: "अंतराल",
+ verificationBrokenLinks: "टूटी कड़ियाँ",
+ verificationBadHashes: "गलत हैश",
+ verificationBadSignatures: "गलत हस्ताक्षर",
+ verificationDuplicates: "दोहराए गए क्रम",
+ verificationForks: "फोर्क",
+ verificationBlobs: "फ़ाइलें",
+ verificationBlobsPresent: "मौजूद",
+ verificationBlobsReferenced: "संदर्भित",
+ verificationBlobsOrphan: "अनाथ",
+ verificationBlobsMissing: "गायब",
+ verificationBlobsMissingOwn: "इस उपकरण पर आपकी गायब फ़ाइलें",
+ verificationBlobsMissingOthers: "अन्य निवासियों की फ़ाइलें अभी डाउनलोड नहीं हुईं",
+ verificationBlobsUnavailable: "इस डिवाइस पर फ़ाइलें सूचीबद्ध नहीं की जा सकीं।",
+ wikiTitle: "विकी",
+ modulesWikiLabel: "विकी",
+ modulesWikiDescription: "विकी खोजने और प्रबंधित करने का मॉड्यूल।",
+ wikiDescription: "विकी खोजने और प्रबंधित करने का मॉड्यूल।",
+ wikiCreate: "विकी बनाएँ",
+ wikiUpdate: "अपडेट",
+ wikiDelete: "हटाएँ",
+ wikiEdit: "संपादित करें",
+ wikiTitleLabel: "शीर्षक",
+ wikiTitlePlaceholder: "विकी का शीर्षक...",
+ wikiBodyLabel: "सामग्री",
+ wikiBodyPlaceholder: "अन्य विकी को [[विकी का शीर्षक]] या [[विकी का शीर्षक|अपना लेबल]] से जोड़ें।\n\n@id से किसी निवासी का उल्लेख करें।\n\n#oasis से टैग करें।\n\nhttps://solarnethub.com जैसे लिंक चिपकाएँ\n\nखाली पंक्ति नया अनुच्छेद शुरू करती है; एकल लाइन ब्रेक बने रहते हैं।\n\nकोई भी समर्थित मीडिया जोड़ें और वह यहाँ एम्बेड हो जाएगा।",
+ formatBarLabel: "फ़ॉर्मैट",
+ wikiStatusLabel: "विकी प्रकार",
+ wikiStatusOpen: "खुली",
+ wikiStatusClosed: "बंद",
+ wikiTagsLabel: "टैग",
+ wikiTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ wikiSummaryLabel: "बदलाव का सारांश",
+ wikiSummaryPlaceholder: "क्या बदला?",
+ wikiFilterAll: "सभी",
+ wikiFilterMine: "मेरे",
+ wikiFilterRecent: "हाल के",
+ wikiFilterLinked: "जुड़े हुए",
+ wikiChanges: "हाल के बदलाव",
+ wikiNoPages: "कोई विकी नहीं मिली।",
+ wikiNoChanges: "अभी कोई बदलाव नहीं।",
+ wikiHistory: "इतिहास",
+ wikiVersion: "संस्करण",
+ wikiVersions: "संस्करण",
+ wikiRestore: "पुनर्स्थापित करें",
+ wikiDiff: "बदलाव",
+ wikiViewVersion: "देखें",
+ wikiLinkedPages: "जुड़े हुए पृष्ठ",
+ wikiNoLinkedPages: "यह पृष्ठ अभी किसी अन्य से नहीं जुड़ा है।",
+ wikiMissingLink: "पृष्ठ अभी मौजूद नहीं है",
+ wikiDuplicateTitle: "इस शीर्षक वाला पृष्ठ पहले से मौजूद है। दूसरा पृष्ठ बनाने के लिए शीर्षक बदलें।",
+ wikiCreateSectionTitle: "विकी बनाएँ",
+ wikiUpdateSectionTitle: "विकी अपडेट करें",
+ wikiSearchPlaceholder: "विकी में खोजें...",
+ wikiCurrentVersion: "वर्तमान संस्करण",
+ wikiViewingVersion: "आप एक पुराना संस्करण देख रहे हैं",
+ wikiBackToPage: "पृष्ठ पर वापस",
+ wikiLinkedChip: "जुड़ा",
+ wikiRestoredSummary: "पुनर्स्थापित संस्करण",
+ wikiExportPdf: "पृष्ठ बनाएँ",
+ wikiPreview: "पूर्वावलोकन",
+ tribeSectionWiki: "विकी",
+ tribeWikiCreate: "विकी बनाएँ",
+ tribeWikiEmpty: "अभी कोई विकी नहीं।",
+ typeWiki: "विकी",
padsTitle: "पैड्स",
padTitle: "पैड",
modulesPadsLabel: "पैड्स",
- modulesPadsDescription: "सहयोगी पाठ संपादकों को प्रबंधित करने का मॉड्यूल।",
+ modulesPadsDescription: "सहयोगी टेक्स्ट एडिटर प्रबंधित करने का मॉड्यूल।",
padCreate: "पैड बनाएं",
padUpdate: "अपडेट करें",
padDelete: "हटाएं",
padTitleLabel: "शीर्षक",
padTitlePlaceholder: "पैड का शीर्षक दर्ज करें...",
padStatusLabel: "स्थिति",
+ padTypeLabel: "पैड प्रकार",
padStatusOpen: "खुला",
padStatusInviteOnly: "केवल आमंत्रण",
padStatusClosed: "बंद",
padDeadlineLabel: "समय सीमा",
padTagsLabel: "टैग",
- padTagsPlaceholder: "टैग1, टैग2, ...",
+ padTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
padMembersLabel: "सदस्य",
padCreated: "बनाया गया",
- padStartEditing: "संपादन शुरू करें!",
+ padStartEditing: "संपादित करें",
padEditorPlaceholder: "लिखना शुरू करें...",
padSubmitEntry: "सबमिट करें",
padNoEntries: "अभी कोई प्रविष्टि नहीं।",
padAllSectionTitle: "सभी पैड्स",
padMineSectionTitle: "मेरे पैड्स",
padsDescription: "अपने नेटवर्क में सहयोगी एन्क्रिप्टेड टेक्स्ट संपादक प्रबंधित करें।",
+ roomsTitle: "रूम्स",
+ roomsDescription: "अपने नेटवर्क में एन्क्रिप्टेड वीडियो कॉन्फ्रेंस रूम खोजें और उनमें शामिल हों।",
+ modulesRoomsLabel: "रूम्स",
+ modulesRoomsDescription: "एन्क्रिप्टेड वीडियो कॉन्फ्रेंस रूम खोजने और उनमें शामिल होने का मॉड्यूल।",
+ roomFilterRecent: "हाल के",
+ roomFilterMine: "मेरे",
+ roomFilterAll: "सभी",
+ roomFilterLive: "लाइव",
+ roomFilterOpen: "खुले",
+ roomFilterInvite: "केवल आमंत्रण",
+ roomFilterClosed: "बंद",
+ roomCreate: "रूम बनाएं",
+ roomUpdate: "अपडेट करें",
+ roomDelete: "हटाएं",
+ roomClose: "बंद करें",
+ roomCreateSectionTitle: "रूम बनाएं",
+ roomUpdateSectionTitle: "रूम अपडेट करें",
+ roomTitlePlaceholder: "रूम का शीर्षक",
+ roomDescriptionLabel: "विवरण",
+ roomDescriptionPlaceholder: "आप किस बारे में बात करेंगे?",
+ roomTypeLabel: "रूम का प्रकार",
+ roomTagsLabel: "टैग",
+ roomStatusOpen: "खुला",
+ roomStatusInviteOnly: "केवल आमंत्रण",
+ roomStatusClosed: "बंद",
+ roomParticipants: "प्रतिभागी",
+ roomJoin: "शामिल हों",
+ roomLeave: "छोड़ें",
+ roomFull: "रूम भरा हुआ है",
+ roomLiveChip: "लाइव",
+ roomMuted: "म्यूट",
+ roomRec: "ऑडियो रिकॉर्ड करें",
+ roomRecStop: "रिकॉर्डिंग रोकें",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} कमरे में आए",
+ roomEventLeft: "{name} कमरे से गए",
+ roomEventRecStart: "{name} ने रिकॉर्डिंग शुरू की",
+ roomEventRecStop: "{name} ने रिकॉर्डिंग रोकी",
+ roomEventMuted: "{name} ने खुद को म्यूट किया",
+ roomEventUnmuted: "{name} ने म्यूट हटाया",
+ roomEventHand: "{name} ने हाथ उठाया",
+ roomRaiseHand: "हाथ उठाएँ",
+ roomLowerHand: "हाथ नीचे करें",
+ confirmActionTitle: "इस कार्रवाई की पुष्टि करें",
+ confirmActionButton: "पुष्टि करें",
+ confirmJoinText: "आप इस निमंत्रण से शामिल होने वाले हैं।",
+ confirmFollowText: "आप इस निवासी का समर्थन करने वाले हैं।",
+ confirmSignText: "आप इस अभियान पर हस्ताक्षर करने वाले हैं।",
+ confirmDownloadText: "आप यह फ़ाइल अपने डिवाइस पर डाउनलोड करने वाले हैं।",
+ roomRecordings: "रिकॉर्डिंग",
+ roomClearNotices: "साफ़ करें",
+ roomLineSwitchboard: "स्विचबोर्ड",
+ roomLineDndError: "इस रूम का नंबर कॉल स्वीकार नहीं कर रहा है।",
+ roomNumberHint: "रूम में शामिल होने के लिए फ़ोन से यह नंबर डायल करें।",
+ liveRefresh: "ताज़ा करें",
+ roomNobody: "अभी रूम में कोई नहीं है।",
+ roomSomeone: "अभी रूम में {n}।",
+ roomYou: "आप",
+ roomYouAreIn: "आप अंदर हैं",
+ roomNobodyInside: "इस समय इस कक्ष में कोई नहीं है।",
+ roomErrorFull: "रूम भरा हुआ है। किसी के जाने पर आप शामिल हो सकते हैं।",
+ roomErrorUnreachable: "अभी रूम तक पहुंचा नहीं जा सकता। बाद में फिर से प्रयास करें।",
+ roomErrorBusy: "आप पहले से किसी कॉल या दूसरे रूम में हैं।",
+ roomErrorClosed: "यह रूम बंद है।",
+ roomAccessDenied: "यह रूम केवल आमंत्रण पर है। शामिल होने के लिए आपको आमंत्रण चाहिए।",
+ roomsNoItems: "कोई रूम नहीं मिला।",
+ roomSearchPlaceholder: "रूम खोजें...",
+ roomInviteMode: "आमंत्रण",
+ tribeSectionRooms: "रूम्स",
+ tribeRoomCreate: "रूम बनाएं",
+ tribeRoomsEmpty: "अभी तक कोई रूम नहीं।",
+ typeRoom: "रूम्स",
+ typeRoomMember: "रूम प्रतिभागी",
+ statsRoom: "रूम्स",
+ statsRoomMember: "रूम प्रतिभागी",
+ favoritesFilterRooms: "रूम्स",
+ invitesRoomsTitle: "रूम्स",
+ inviteCodeInvalid: "यह आमंत्रण कोड मान्य नहीं है या पहले ही इस्तेमाल हो चुका है।",
+ inviteAlreadyMember: "आप पहले से शामिल हैं। आप इसे इसके मॉड्यूल से खोल सकते हैं।",
+ actionFailed: "यह नहीं हो सका। कृपया फिर से प्रयास करें।",
+ publishTooShort: "आपकी पोस्ट बहुत छोटी है।",
+ walletSendFailed: "भुगतान नहीं भेजा जा सका: {reason}",
+ pixeliaCoordsError: "ये निर्देशांक ग्रिड से बाहर हैं।",
+ courtsErrTitle: "शीर्षक आवश्यक है।",
+ courtsErrRespondent: "बताएं कि मामला किसके विरुद्ध है।",
+ courtsErrRespondentId: "यह मान्य Oasis ID नहीं है।",
+ courtsErrMethod: "चुनें कि मामला कैसे सुलझाया जाएगा।",
+ courtsErrCaseNotFound: "वह मामला नहीं मिला।",
+ courtsErrBrief: "अपना जवाब लिखें।",
+ courtsErrStance: "अपना पक्ष चुनें।",
+ courtsErrResult: "परिणाम लिखें।",
+ courtsErrTerms: "समझौते की शर्तें लिखें।",
+ courtsErrMediator: "कम से कम एक मध्यस्थ जोड़ें।",
+ courtsErrSelfMediator: "आप अपने ही मामले में मध्यस्थ नहीं हो सकते।",
+ courtsErrJudge: "एक न्यायाधीश चुनें।",
+ courtsErrSelfJudge: "आप अपने ही मामले के न्यायाधीश नहीं हो सकते।",
+ courtsErrVisibility: "चुनें कि मामला कौन देख सकता है।",
+ courtsErrNomination: "वह नामांकन नहीं मिला।",
+ opinionAlreadyGiven: "आप पहले ही अपनी राय दे चुके हैं।",
+ cipherPasswordShort: "पासवर्ड कम से कम 32 अक्षरों का होना चाहिए।",
+ errorForbidden: "आपको इसकी पहुंच नहीं है।",
+ errorNotFound: "यह नहीं मिला।",
+ errorClosed: "यह बंद है।",
+ errorInviteOnly: "यह केवल आमंत्रण पर है। आपको आमंत्रण चाहिए।",
+ errorTooLong: "यह पाठ बहुत लंबा है।",
+ errorRequired: "कुछ आवश्यक जानकारी नहीं है।",
+ errorInvalid: "कुछ जानकारी मान्य नहीं है।",
+ errorNotAuthor: "केवल लेखक ही ऐसा कर सकता है।",
+ panicRemoved: "आपकी ब्लॉकचेन हटा दी गई है।",
padRecentSectionTitle: "हालिया पैड्स",
padOpenSectionTitle: "खुले पैड्स",
padClosedSectionTitle: "बंद पैड्स",
@@ -3074,18 +3942,18 @@ module.exports = {
padRemoveFavorite: "पसंदीदा से हटाएं",
padClose: "बंद करें",
padBackToEditor: "संपादक पर वापस",
- padSearchPlaceholder: "पैड खोजें...",
+ padSearchPlaceholder: "पैड्स में खोजें...",
modulesChatsLabel: "चैट्स",
- modulesChatsDescription: "एन्क्रिप्टेड चैट खोजने और प्रबंधित करने का मॉड्यूल।",
+ modulesChatsDescription: "चैट खोजने और प्रबंधित करने का मॉड्यूल।",
typeChat: "चैट्स",
typeChatMessage: "चैट संदेश",
chatsTitle: "चैट्स",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "आपकी चैट्स",
+ chatRecentTitle: "हाल की चैट्स",
chatFavoritesTitle: "पसंदीदा",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "खुली चैट्स",
+ chatClosedTitle: "बंद चैट्स",
chatDescription: "विवरण",
chatCategory: "श्रेणी",
chatStatus: "स्थिति",
@@ -3100,34 +3968,172 @@ module.exports = {
chatMessagesLabel: "संदेश",
chatThreadsLabel: "थ्रेड",
chatCreatedAt: "बनाया गया",
- chatSearchPlaceholder: "चैट खोजें...",
+ chatSearchPlaceholder: "चैट्स में खोजें...",
chatStatusOpen: "खुला",
chatStatusInviteOnly: "केवल आमंत्रण",
chatStatusClosed: "बंद",
chatSendMessage: "भेजें",
chatJumpLatest: "नवीनतम संदेश",
+ chatReply: "उत्तर दें",
+ chatReplyCancel: "उत्तर रद्द करें",
+ chatPin: "पिन करें",
+ chatUnpin: "अनपिन करें",
+ chatPinned: "पिन किए गए",
chatPickChat: "खोलने के लिए एक चैट चुनें",
chatNoneYet: "अभी तक कोई चैट उपलब्ध नहीं है।",
activitySearchPlaceholder: "गतिविधि में खोजें...",
trendingSearchPlaceholder: "ट्रेंडिंग में खोजें...",
opinionsSearchPlaceholder: "राय में खोजें...",
votesSearchPlaceholder: "मतदान में खोजें...",
- welcomeStepUxTitle: "अपना इंटरफ़ेस चुनें",
- welcomeStepUxText: "तय करें Oasis कैसा दिखे। बाद में सेटिंग्स में बदल सकते हैं।",
- welcomeStepUxAction: "यह दृश्य उपयोग करें",
+ gamesSearchPlaceholder: "खेल में खोजें...",
+ schoolTitle: "विद्यालय",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "आपके द्वारा फ़ॉलो किया गया विकी पृष्ठ संपादित किया गया है।",
+ wikiBotRestoredTitle: "आपके द्वारा फ़ॉलो किए गए विकी पृष्ठ का पुराना संस्करण पुनर्स्थापित किया गया है।",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "एक नए छात्र ने आपके पाठ्यक्रम में नामांकन किया है।",
+ schoolBotInvitedTitle: "आपको एक पाठ्यक्रम में आमंत्रित किया गया है।",
+ schoolBotAdmittedTitle: "आपको एक पाठ्यक्रम में प्रवेश मिला है।",
+ schoolBotCertificateTitle: "आपको एक प्रमाणपत्र मिला है।",
+ schoolBotPassedTitle: "एक छात्र ने आपका पाठ्यक्रम उत्तीर्ण किया है।",
+ schoolBotLessonTitle: "एक नया पाठ प्रकाशित हुआ है।",
+ invitesSchoolTitle: "विद्यालय",
+ schoolEnrollLabel: "पाठ्यक्रम से जुड़ें",
+ schoolExamRetryLater: "आप 24 घंटे बाद फिर से प्रयास कर सकते हैं।",
+ schoolApproved: "उत्तीर्ण",
+ schoolExamPassMark: "उत्तीर्ण अंक (0-10)",
+ schoolExamPassed: "उत्तीर्ण",
+ schoolExamPending: "लंबित",
+ schoolExamFailed: "अनुत्तीर्ण",
+ schoolExamAddQuestion: "प्रश्न जोड़ें",
+ schoolExamCreateQuestion: "प्रश्न बनाएँ",
+ schoolExamOption: "विकल्प",
+ schoolExamCorrect: "सही विकल्प",
+ schoolExamPoints: "अंक",
+ schoolMaterialTextPlaceholder: "इस पाठ के लिए नोट्स...",
+ schoolMaterials: "सामग्री",
+ schoolAddMaterial: "सामग्री जोड़ें",
+ schoolNoMaterials: "अभी तक कोई सामग्री नहीं।",
+ bankYourSchoolBalance: "आपकी विद्यालय आय",
+ schoolProgress: "प्रगति",
+ schoolProgressMark: "पूर्ण के रूप में चिह्नित करें",
+ schoolProgressDone: "पूर्ण",
+ schoolExams: "परीक्षाएं",
+ schoolExamCreate: "परीक्षा बनाएं",
+ schoolExamTitlePlaceholder: "परीक्षा शीर्षक",
+ schoolExamHelp: "प्रति पंक्ति एक प्रश्न: प्रश्न? ; विकल्प ; सही विकल्प* ; विकल्प",
+ schoolExamQuestionsPlaceholder: "SSB क्या है? ; एक डेटाबेस ; एक P2P प्रोटोकॉल* ; एक ब्राउज़र",
+ schoolExamSubmit: "उत्तर भेजें",
+ schoolExamScore: "आपका स्कोर",
+ schoolNoScoresYet: "अभी तक कोई परिणाम नहीं।",
+ schoolLessonUnit: "इकाई / चरण",
+ schoolLessonUnitPlaceholder: "जैसे चरण 1",
+ schoolLessonOrder: "क्रम",
+ profileClearnetSchoolLabel: "विद्यालय",
+ schoolStartDate: "आरंभ तिथि",
+ schoolSessionDate: "सत्र तिथि",
+ schoolCourseChat: "पाठ्यक्रम चैट",
+ agendaFilterSchool: "विद्यालय",
+ agendaFilterCampaigns: "अभियान",
+ agendaFilterLogistics: "लॉजिस्टिक्स",
+ schoolCourseType: "पाठ्यक्रम प्रकार",
+ schoolTypeOpen: "खुला",
+ schoolTypePaid: "सशुल्क",
+ schoolTypeInvite: "केवल आमंत्रण",
+ schoolLessonLocked: "पाठ एन्क्रिप्टेड है — शिक्षक से पाठ्यक्रम की कुंजी मांगें।",
+ schoolGrantAccess: "पाठ्यक्रम कुंजी भेजें",
+ schoolKeySent: "कुंजी भेजी गई",
+ schoolOngoing: "जारी",
+ schoolFilterApplied: "नामांकित",
+ schoolFilterOpen: "खुले",
+ schoolFilterFavorites: "पसंदीदा",
+ schoolPendingPayment: "भुगतान लंबित",
+ schoolPendingStudents: "लंबित नामांकन",
+ schoolViewBill: "बिल देखें",
+ schoolPaymentNote: "नामांकन एक ECO बिल (एक ट्रांसफर) बनाता है। ट्रांसफर पर हस्ताक्षर होने पर आपका नामांकन पक्का होता है।",
+ schoolCloseCourse: "पाठ्यक्रम बंद करें",
+ schoolReopenCourse: "पाठ्यक्रम फिर खोलें",
+ schoolDescription: "अपने नेटवर्क में पाठ्यक्रम पढ़ाएं और सीखें।",
+ schoolFilterAll: "सभी",
+ schoolFilterMine: "मेरे",
+ schoolFilterTop: "शीर्ष",
+ schoolFilterRecent: "हाल के",
+ schoolCreateButton: "पाठ्यक्रम बनाएं",
+ schoolCreateSectionTitle: "पाठ्यक्रम बनाएं",
+ schoolUpdateSectionTitle: "पाठ्यक्रम अपडेट करें",
+ schoolCourseTitlePlaceholder: "आपके पाठ्यक्रम का नाम",
+ schoolCourseDescriptionPlaceholder: "इस पाठ्यक्रम में आप क्या पढ़ाएंगे?",
+ schoolCourseImage: "पाठ्यक्रम छवि (अधिकतम आकार: 75MB)",
+ schoolTags: "टैग",
+ schoolTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ schoolPrice: "मूल्य (ECO)",
+ schoolVisibility: "दृश्यता",
+ schoolVisibilityPublic: "सार्वजनिक",
+ schoolVisibilityInvite: "आमंत्रण द्वारा",
+ schoolStatus: "स्थिति",
+ schoolClosed: "बंद",
+ schoolFree: "मुफ़्त",
+ schoolCreate: "पाठ्यक्रम बनाएं",
+ schoolUpdate: "पाठ्यक्रम अपडेट करें",
+ schoolSearchPlaceholder: "विद्यालय में खोजें...",
+ schoolSortTitle: "शीर्षक",
+ schoolNoCourses: "कोई पाठ्यक्रम नहीं मिला।",
+ schoolStudents: "छात्र",
+ schoolTeacher: "शिक्षक",
+ schoolCreatedAt: "निर्मित",
+ schoolLessons: "पाठ",
+ schoolNoLessons: "अभी तक कोई पाठ नहीं।",
+ schoolEnrollToSee: "इस पाठ्यक्रम के पाठ देखने के लिए नामांकन करें।",
+ schoolEnrollButton: "नामांकन करें",
+ schoolUnenrollButton: "पाठ्यक्रम छोड़ें",
+ schoolInviteRequired: "यह पाठ्यक्रम आमंत्रण द्वारा है।",
+ schoolTeacherPanel: "शिक्षक पैनल",
+ schoolStudentPanel: "छात्र पैनल",
+ schoolAddLesson: "पाठ बनाएँ",
+ schoolLessonTitlePlaceholder: "पाठ का शीर्षक",
+ schoolLessonTextPlaceholder: "इस पाठ में शामिल अवधारणाओं का वर्णन करें...",
+ schoolInviteStudents: "छात्रों को आमंत्रित करें",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "आमंत्रित करें",
+ schoolInvited: "आमंत्रित",
+ schoolIssueCertificate: "प्रमाणपत्र बनाएँ",
+ schoolCertified: "प्रमाणित",
+ schoolCertificateTextPlaceholder: "प्रमाणपत्र नोट (वैकल्पिक)",
+ schoolLessonOpen: "पाठ खोलें",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "प्रमाणपत्र",
+ schoolNoCertificates: "अभी तक कोई प्रमाणपत्र जारी नहीं हुआ।",
+ schoolEditButton: "संपादित करें",
+ schoolDeleteButton: "हटाएं",
+ typeSchool: "विद्यालय",
+ schoolCourseLabel: "पाठ्यक्रम",
+ emergencyLabel: "आपातकाल",
+ wikiPageLabel: "विकी",
+ statsSchoolCourse: "पाठ्यक्रम",
+ statsSchoolLesson: "पाठ",
+ statsSchoolEnroll: "नामांकन",
+ statsSchoolCertificate: "विद्यालय प्रमाणपत्र",
+ modulesSchoolLabel: "विद्यालय",
+ modulesSchoolDescription: "ज्ञान के आदान-प्रदान के लिए मॉड्यूल।",
+ welcomeStepUxAction: "दृश्य सहेजें",
+ welcomeStepWorkflowTitle: "आप OASIS का किस तरह उपयोग करना चाहते हैं?",
+ welcomeStepWorkflowText: "Oasis में कई मॉड्यूल हैं। अपने लिए सही कॉन्फ़िगरेशन चुनें और केवल उपयोगी मॉड्यूल चालू रहेंगे। आप इसे कभी भी मॉड्यूल में बदल सकते हैं।",
+ welcomeStepWorkflowAction: "कॉन्फ़िगरेशन सहेजें",
+ welcomeWorkflow_full: "डिफ़ॉल्ट",
chatRateLimitTitle: "बहुत अधिक संदेश",
chatRateLimitMessage: "आप इस कक्ष की प्रति घंटा संदेश सीमा तक पहुँच गए हैं। बाद में पुनः प्रयास करें।",
chatMessagePlaceholder: "संदेश लिखें...",
chatNoMessages: "अभी तक कोई संदेश नहीं।",
chatTitlePlaceholder: "चैट का शीर्षक",
chatDescriptionPlaceholder: "चैट का विवरण",
- chatTagsPlaceholder: "टैग1, टैग2",
+ chatTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
chatImageLabel: "छवि फ़ाइल चुनें (.jpeg, .jpg, .png, .gif)",
chatAuthor: "लेखक",
chatAddFavorite: "पसंदीदा में जोड़ें",
chatRemoveFavorite: "पसंदीदा से हटाएं",
chatPM: "PM",
chatStatusLabel: "स्थिति",
+ chatTypeLabel: "चैट प्रकार",
chatCategoryLabel: "श्रेणी",
gamesTitle: "खेल",
gamesDescription: "कुछ खेल खोजें और खेलें।",
@@ -3158,22 +4164,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "एक सिक्का उछालें और हेड या टेल पर दांव लगाएं। आप कितने भाग्यशाली हैं?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "ऊपर से दिखने वाला पूल। निशाना लगाने के लिए क्लिक करें, ताकत भरने के लिए दबाए रखें। कम से कम शॉट में सभी गेंदें पॉकेट करें।",
+ gamesArtilleryTitle: "तोपखाना",
+ gamesArtilleryDesc: "अपनी तोप से निशाना लगाएँ, हवा का ध्यान रखें और लक्ष्य पर वार करें। 5 राउंड, सबसे कम शॉट वाला जीतता है।",
+ gamesLabyrinthTitle: "भूलभुलैया",
+ gamesLabyrinthDesc: "चालें ख़त्म होने से पहले भूलभुलैया से निकलें। हर स्तर बड़ा और कठिन होता जाता है।",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "सारे बिंदु खाएँ और भूतों से बचें। भूत रियल टाइम में चलते हैं — चलते रहें!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "ध्वनि पेंडुलम",
+ gamesAudioPendulumDesc: "रियल-टाइम ऑडियो संश्लेषण वाला अराजक भौतिकी सिम्युलेटर। कोणीय वेग आवृत्तियाँ बन जाते हैं और शिखर ढोल की थाप। कोई भी दो सिमुलेशन एक जैसे नहीं सुनाई देते।",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "दो डेक पर लाइव विज़ुअल मिक्स करें: हर एक के लिए पैटर्न चुनें, गति, रंग और ज़ूम सेट करें, दोनों के बीच क्रॉसफ़ेड करें और ताल पर फ़्लैश चलाएँ। टेम्पो टैप करें या माइक्रोफ़ोन को धड़कन चलाने दें।",
+ gamesTetrisDesc: "क्लासिक गिरते ब्लॉक। अंक पाने के लिए पंक्तियाँ साफ़ करें। आप कितनी देर टिक पाएँगे?",
+ gamesMinesweeperTitle: "माइनस्वीपर",
+ gamesMinesweeperDesc: "क्लासिक माइन खोज। स्तर बढ़ाने के लिए बोर्ड साफ़ करें — बड़े ग्रिड, ज़्यादा माइन, ऊँचा स्कोर।",
+ gamesFilterScoring: "अंक",
+ gamesHallOfFame: "हॉल ऑफ़ फ़ेम",
+ gamesHallPlayer: "खिलाड़ी",
+ gamesHallScore: "स्कोर",
+ gamesNoScores: "अभी तक कोई स्कोर नहीं।",
calendarsTitle: "कैलेंडर",
calendarTitle: "कैलेंडर",
modulesCalendarsLabel: "कैलेंडर",
@@ -3181,15 +4191,15 @@ module.exports = {
typeCalendar: "कैलेंडर",
calendarCreate: "कैलेंडर बनाएं",
calendarUpdate: "अपडेट करें",
- calendarDelete: "हटाएं",
calendarTitleLabel: "शीर्षक",
calendarTitlePlaceholder: "कैलेंडर शीर्षक...",
calendarStatusLabel: "स्थिति",
+ calendarTypeLabel: "कैलेंडर प्रकार",
calendarStatusOpen: "खुला",
calendarStatusClosed: "बंद",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "अंतिम तिथि",
calendarTagsLabel: "टैग",
- calendarTagsPlaceholder: "टैग1, टैग2...",
+ calendarTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
calendarParticipantsLabel: "प्रतिभागी",
calendarCreated: "बनाया गया",
calendarJoin: "जुड़ें",
@@ -3200,11 +4210,11 @@ module.exports = {
calendarNotePlaceholder: "नोट जोड़ें...",
calendarFirstDateLabel: "तारीख",
calendarFirstNoteLabel: "नोट्स",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "अंतराल",
calendarIntervalNone: "कोई पुनरावृत्ति नहीं",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "साप्ताहिक",
+ calendarIntervalMonthly: "मासिक",
+ calendarIntervalYearly: "वार्षिक",
calendarFormDescription: "विवरण",
calendarNoDates: "कोई तारीख नहीं जोड़ी गई।",
calendarNoNotes: "कोई नोट नहीं।",
@@ -3212,6 +4222,8 @@ module.exports = {
calendarsDescription: "अपने नेटवर्क में कैलेंडर खोजें और प्रबंधित करें।",
calendarMonthPrev: "← पिछला",
calendarMonthNext: "अगला →",
+ calendarMonthNames: "जनवरी,फ़रवरी,मार्च,अप्रैल,मई,जून,जुलाई,अगस्त,सितंबर,अक्टूबर,नवंबर,दिसंबर",
+ calendarDayInitials: "सो,मं,बु,गु,शु,श,र",
calendarAllSectionTitle: "कैलेंडर",
calendarRecentSectionTitle: "हाल के कैलेंडर",
calendarFavoritesSectionTitle: "पसंदीदा",
@@ -3221,9 +4233,9 @@ module.exports = {
calendarCreateSectionTitle: "नया कैलेंडर बनाएं",
calendarUpdateSectionTitle: "कैलेंडर अपडेट करें",
calendarAddFavorite: "पसंदीदा में जोड़ें",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "हटाएँ",
calendarRemoveFavorite: "पसंदीदा से हटाएं",
- calendarSearchPlaceholder: "कैलेंडर खोजें...",
+ calendarSearchPlaceholder: "कैलेंडर में खोजें...",
calendarAddEntry: "प्रविष्टि जोड़ें",
statsCalendar: "कैलेंडर",
statsCalendarDate: "कैलेंडर तारीखें",
@@ -3235,6 +4247,146 @@ module.exports = {
tribeContentAccessDenied: "पहुंच अस्वीकृत",
tribeContentAccessDeniedMsg: "यह सामग्री एक जनजाति की है। इसे देखने के लिए आपको सदस्य होना चाहिए।",
tribeViewTribes: "जनजातियाँ देखें",
+ tribeFilesEmpty: "अभी तक कोई टोरेंट नहीं।",
+ filesLabel: "टोरेंट",
+ profileClearnetFilesLabel: "टॉरेंट",
+ filesTitle: "टॉरेंट",
+ filesDescription: "अपने नेटवर्क में टॉरेंट खोजें और प्रबंधित करें।",
+ fileAllSectionTitle: "टॉरेंट",
+ fileMineSectionTitle: "आपके टॉरेंट",
+ fileRecentSectionTitle: "हालिया टॉरेंट",
+ fileTopSectionTitle: "शीर्ष टॉरेंट",
+ fileFavoritesSectionTitle: "पसंदीदा",
+ fileFilterAll: "सभी",
+ fileFilterMine: "मेरे",
+ fileFilterRecent: "हालिया",
+ fileFilterTop: "शीर्ष",
+ fileFilterFavorites: "पसंदीदा",
+ fileCreateSectionTitle: "टॉरेंट अपलोड करें",
+ fileUpdateSectionTitle: "टॉरेंट अपडेट करें",
+ fileCreateButton: "टॉरेंट अपलोड करें",
+ fileUpdateButton: "अपडेट करें",
+ fileAddFavoriteButton: "पसंदीदा में जोड़ें",
+ fileRemoveFavoriteButton: "पसंदीदा से हटाएं",
+ fileFileLabel: "एक फ़ाइल चुनें (अधिकतम-आकार: 75MB)",
+ calendarFilterRecent: "हाल के",
+ calendarFilterAll: "सभी",
+ calendarFilterMine: "मेरे",
+ calendarFilterFavorites: "पसंदीदा",
+ calendarFilterOpen: "खुले",
+ calendarFilterClosed: "बंद",
+ padFilterRecent: "हाल के",
+ padFilterAll: "सभी",
+ padFilterMine: "मेरे",
+ padFilterOpen: "खुले",
+ padFilterClosed: "बंद",
+ chatFilterRecent: "हाल के",
+ chatFilterAll: "सभी",
+ chatFilterMine: "मेरे",
+ chatFilterFavorites: "पसंदीदा",
+ chatFilterOpen: "खुले",
+ chatFilterClosed: "बंद",
+ licenseLabel: "लाइसेंस",
+ phoneTitle: "फ़ोन",
+ phoneDescription: "अपनी एंड-टू-एंड एन्क्रिप्टेड वीडियो कॉल प्रबंधित करें।",
+ phoneUnavailable: "इस डिवाइस पर कॉल उपलब्ध नहीं हैं।",
+ phoneCallButton: "कॉल करें",
+ profileVisibilityPhone: "फ़ोन नंबर",
+ phoneNumberUnknown: "आपके नेटवर्क में किसी के पास {number} नंबर नहीं है।",
+ phoneNumberChoose: "जाँचें कि आप {number} पर किसे कॉल करना चाहते हैं:",
+ phoneAnswer: "उत्तर दें",
+ phoneSpeaker: "स्पीकर",
+ phoneEarpiece: "ईयरपीस",
+ phoneReject: "अस्वीकार करें",
+ phoneHangup: "कॉल समाप्त करें",
+ phoneMute: "म्यूट करें",
+ phoneUnmute: "अनम्यूट करें",
+ phoneCameraOn: "कैमरा चालू",
+ phoneCameraOff: "कैमरा बंद",
+ settingsPhoneVideo: "वीडियो",
+ settingsPhoneVideoOn: "कॉल और कमरों में अनुमति",
+ settingsPhoneVideoOff: "केवल ऑडियो",
+ phoneSilence: "न सुनें",
+ phoneUnsilence: "फिर से सुनें",
+ phoneCalling: "कॉल कर रहे हैं:",
+ phoneIsCalling: "आपको कॉल कर रहे हैं",
+ notifyNewPmFrom: "नया PM:",
+ notifyNewPamFrom: "नया PaM:",
+ notifyUpdateLabel: "अपडेट",
+ updateInstalledLabel: "इंस्टॉल किया गया संस्करण",
+ updateAvailableLabel: "उपलब्ध संस्करण",
+ updateChangesLabel: "बदलाव",
+ updateFilesLabel: "फ़ाइलें",
+ updateOriginLabel: "स्रोत",
+ phoneRecording: "इनके लिए PaM रिकॉर्ड हो रहा है:",
+ phoneLeaveMessage: "किसी ने जवाब नहीं दिया: बीप के बाद अपना संदेश छोड़ें।",
+ phoneLeaveMessageBusy: "दूसरी कॉल पर हैं: बीप के बाद अपना संदेश छोड़ें।",
+ phoneLeaveMessageUnreachable: "संपर्क नहीं हो सका: बीप के बाद अपना संदेश छोड़ें।",
+ phoneConnecting: "कनेक्ट हो रहा है:",
+ phoneSendPam: "PaM भेजें",
+ phoneCancel: "रद्द करें",
+ phoneSearchPlaceholder: "फ़ोन में खोजें...",
+ phonePamTitle: "ऑडियो रिकॉर्ड",
+ phoneNew: "नया",
+ phoneDelete: "हटाएँ",
+ phoneNoPams: "आपके पास कोई ऑडियो रिकॉर्ड नहीं है।",
+ phoneHistoryTitle: "इतिहास",
+ phoneLatestTitle: "हाल की कॉल",
+ phoneCreateButton: "नई कॉल",
+ phoneLimitsHint: "प्रति कॉल अधिकतम 7 निवासी; एक से अधिक होने पर यह संयुक्त कॉल है।",
+ phoneErrorPub: "पब को कॉल नहीं किया जा सकता।",
+ phoneJointCall: "संयुक्त कॉल",
+ phoneWith: "किसके साथ",
+ phoneResult: "परिणाम",
+ phoneWhen: "कब",
+ phoneDuration: "अवधि",
+ phoneOutgoing: "आउटगोइंग",
+ phoneIncoming: "इनकमिंग",
+ phoneNoHistory: "अभी तक कोई लॉग नहीं।",
+ phoneOutcomeEnded: "उत्तर दिया",
+ phoneOutcomeMissed: "छूटी",
+ phoneOutcomeRejected: "अस्वीकृत",
+ phoneOutcomeNoanswer: "कोई जवाब नहीं",
+ phoneOutcomeCancelled: "रद्द",
+ phoneOutcomePam: "PaM भेजा गया",
+ phoneOutcomeFailed: "विफल",
+ phoneDialAdd: "जोड़ें",
+ phoneDialBack: "मिटाएं",
+ phoneDialClear: "साफ़ करें",
+ phoneDialPlaceholder: "नंबर या Oasis ID",
+ phoneDialInhabitants: "निवासी",
+ phoneDialRemove: "हटाएं",
+ phoneOwnNumber: "यह आपका अपना नंबर है।",
+ phoneSettingsDesc: "चुनें कि कौन आपको कॉल कर सकता है।",
+ phoneDnd: "परेशान न करें",
+ phoneOpen: "खुला",
+ phoneRecipientRefuses: "जिस निवासी को आप कॉल करना चाहते हैं, वह कॉल स्वीकार नहीं करता।",
+ phoneRefusedNotice: "ये निवासी कॉल स्वीकार नहीं करते और इन्हें कॉल नहीं किया गया:",
+ fileEmptyError: "फ़ाइल खाली है। कोई दूसरी फ़ाइल चुनें।",
+ fileTitleLabel: "शीर्षक",
+ fileTitlePlaceholder: "शीर्षक",
+ fileDescriptionLabel: "विवरण",
+ fileDescriptionPlaceholder: "विवरण",
+ fileTagsLabel: "टैग",
+ fileTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
+ fileSizeLabel: "आकार",
+ fileDownloadButton: "डाउनलोड",
+ fileDetailsButton: "विवरण",
+ fileNoFile: "कोई टॉरेंट फ़ाइल नहीं",
+ fileSearchPlaceholder: "टॉरेंट में खोजें...",
+ fileSearchButton: "खोजें",
+ fileSortRecent: "सबसे हालिया",
+ fileSortOldest: "सबसे पुराने",
+ fileSortTop: "सबसे अधिक वोट",
+ fileNoMatch: "कोई मिलान टॉरेंट नहीं।",
+ fileUpdatedAt: "अपडेट किया गया",
+ typeFile: "टॉरेंट",
+ modulesFilesLabel: "फ़ाइलें",
+ modulesFilesDescription: "फ़ाइलें खोजने और प्रबंधित करने का मॉड्यूल।",
+ tribeSectionFiles: "टॉरेंट",
+ fileDescription: "विवरण",
+ fileDownload: "डाउनलोड",
+ fileTypeLabel: "प्रकार",
torrentsTitle: "टॉरेंट",
torrentsDescription: "अपने नेटवर्क में टॉरेंट खोजें और प्रबंधित करें।",
torrentAllSectionTitle: "टॉरेंट",
@@ -3262,10 +4414,33 @@ module.exports = {
torrentTagsLabel: "टैग",
torrentTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें",
torrentSizeLabel: "आकार",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "टोरेंट बनाएँ",
+ torrentFromContentMissing: "फ़ाइल अभी इस नोड पर उपलब्ध नहीं है। थोड़ी देर बाद फिर कोशिश करें।",
+ torrentDownloads: "डाउनलोड",
+ torrentFetchOasis: "Oasis में डाउनलोड करें",
+ torrentSaveFile: "फ़ाइल सहेजें",
+ torrentSeeds: "सीड",
+ seedsLabel: "सीड",
+ seedAction: "समर्थन करें",
+ torrentSourceFile: "फ़ाइल",
+ torrentStateQueued: "कतार में",
+ torrentStateProbing: "सीड खोजे जा रहे हैं",
+ torrentStateDownloading: "डाउनलोड हो रहा है",
+ torrentStateDone: "पूरा हुआ",
+ torrentStateFailed: "विफल",
+ torrentStateNoSource: "अभी कोई सीड ऑनलाइन नहीं, प्रतीक्षा में",
+ torrentStateCancelled: "रद्द",
+ torrentNoDownloads: "अभी कोई डाउनलोड नहीं।",
+ torrentOriginalSection: "मूल",
+ torrentCancel: "रद्द करें",
+ torrentDownloadButton: "डाउनलोड",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "विवरण",
torrentNoFile: "कोई टॉरेंट फ़ाइल नहीं",
noTorrents: "कोई टॉरेंट नहीं मिला।",
- torrentSearchPlaceholder: "शीर्षक, टैग, लेखक खोजें...",
+ noFiles: "कोई टॉरेंट नहीं मिला।",
+ torrentSearchPlaceholder: "टॉरेंट में खोजें...",
torrentSearchButton: "खोजें",
torrentSortRecent: "सबसे हालिया",
torrentSortOldest: "सबसे पुराने",
@@ -3273,10 +4448,12 @@ module.exports = {
torrentNoMatch: "कोई मिलान टॉरेंट नहीं।",
torrentUpdatedAt: "अपडेट किया गया",
statsTorrent: "टॉरेंट",
+ statsFile: "फ़ाइलें",
typeTorrent: "टॉरेंट",
modulesTorrentsLabel: "टॉरेंट",
modulesTorrentsDescription: "टॉरेंट खोजने और प्रबंधित करने का मॉड्यूल।",
favoritesFilterTorrents: "टॉरेंट",
+ favoritesFilterFiles: "फ़ाइलें",
favoritesFilterMarket: "मार्केट",
favoritesFilterEvents: "इवेंट्स",
favoritesFilterForum: "फ़ोरम",
@@ -3290,15 +4467,17 @@ module.exports = {
favoritesFilterShopProducts: "दुकान वस्तुएं",
tribeSectionTorrents: "टॉरेंट",
tribeCreateTorrent: "टॉरेंट अपलोड करें",
+ tribeCreateFile: "फ़ाइल अपलोड करें",
settingsWishTitle: "इच्छा",
- settingsWishDesc: "अपने अवतार की इच्छा कॉन्फ़िगर करें।",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "तय करता है कि आप सारी सामग्री तक कैसे पहुँचते हैं और Oasis नेटवर्क में आपका अनुभव कैसा होता है।",
+ settingsWishWhole: "मल्टीवर्स",
+ settingsWishMutuals: "केवल पारस्परिक समर्थन",
+ settingsWishOnlyLan: "केवल LAN",
+ settingsWishLocal: "स्थानीय",
settingsPmVisibilityTitle: "निजी संदेश",
settingsPmVisibilityDesc: "नेटवर्क में निजी संदेश एक्सपोज़र स्तर कॉन्फ़िगर करें।",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "मल्टीवर्स",
+ settingsPmVisibilityMutuals: "केवल पारस्परिक समर्थन",
pmMutualNotice: "आउटबाउंड UX गार्डरेल है। इनबाउंड ध्यान फ़िल्टर है।",
inhabitantsPendingFollowsTitle: "लंबित समर्थन अनुरोध",
inhabitantsPendingAccept: "स्वीकार",
@@ -3342,7 +4521,7 @@ module.exports = {
tribeGovNoRevocations: "अभी तक कोई निरसन नहीं",
tribeGovNoHistorical: "अभी तक कोई रिकॉर्ड नहीं",
logsTitle: "लॉग",
- logsDescription: "नेटवर्क पर अपना अनुभव रिकॉर्ड करें।",
+ logsDescription: "अपने अनुभवों की निजी डायरी रखें।",
logsViewTitle: "लॉग",
logsColumnType: "प्रकार",
logsView: "देखें",
@@ -3351,7 +4530,7 @@ module.exports = {
logsCreateTitle: "प्रविष्टि बनाएँ",
logsWriteButton: "लिखें",
logsTextPlaceholder: "अपने अनुभव वर्णित करें...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "AI सहायक",
logsModeManual: "मैन्युअल",
logsModeAI: "एआई",
logsColumnLog: "लॉग",
@@ -3374,19 +4553,20 @@ module.exports = {
logsSearchAnyType: "कोई भी प्रकार",
logsSearchButton: "खोजें",
logsEmpty: "कोई प्रविष्टियाँ नहीं।",
+ logsNothingNew: "दर्ज करने के लिए कोई नई गतिविधि नहीं है।",
modulesLogsLabel: "लॉग",
- modulesLogsDescription: "(एआई सहायक के माध्यम से) अपने अनुभव रिकॉर्ड करने के लिए मॉड्यूल।",
+ modulesLogsDescription: "अपने अनुभवों की निजी डायरी रखने का मॉड्यूल।",
statsLogsTitle: "लॉग",
typeLog: "लॉग",
larpTitle: "L.A.R.P.",
larpDescription: "सहयोगात्मक प्रयोग के लिए एक लाइव-एक्शन रोल-प्लेइंग परत।",
larpNoHousesMatch: "आपकी खोज से कोई हाउस मेल नहीं खाता।",
- larpSearchPlaceholder: "हाउस खोजें...",
+ larpSearchPlaceholder: "L.A.R.P. में खोजें...",
larpAllHouses: "गृह:",
larpFilterRuling: "शासन",
larpFilterHouses: "गृह",
- larpFilterRules: "FAQ",
+ larpFilterRules: "सामान्य प्रश्न",
larpRulesTitle: "L.A.R.P. FAQ",
larpRulesEntryText: "हर निवासी डिफ़ॉल्ट रूप से ACADEMIA में शुरू होता है। ACADEMIA से, \"गृह में शामिल हों\" पैनल में कोई गृह चुनें: इससे उसका प्रवेश परीक्षण खुलता है। 10 प्रश्नों के उत्तर दें और सबमिट करें। यदि आप सीमा (7/10) पार करते हैं, तो आपको स्वचालित रूप से उस गृह में स्वीकार कर लिया जाता है; नहीं तो अस्वीकार कर ACADEMIA में रखा जाता है। दोनों ही मामलों में सिस्टम आपके OasisID और प्रयास के चक्र को दर्ज करता है और 30 चक्रों के कूलडाउन समाप्त होने तक पुनः प्रयास से रोकता है।",
larpRulesGovernanceText: "अपने चक्र के दौरान, शासक गृह \"शासन\" बैज पहनता है और एकमात्र है जिसकी दीवार शासन टैब के तहत सार्वजनिक रूप से दिखाई जाती है।",
@@ -3397,118 +4577,117 @@ module.exports = {
larpPostPlaceholder: "यह गृह क्या कहना चाहता है?",
larpPostSubmit: "प्रकाशित करें",
larpCycleLabel: "चक्र:",
- audioBackToBcs: "Back to BCS",
+ audioBackToBcs: "BCS पर वापस",
audioFilterBcs: "BCS",
- audioTranscodeButton: "TRANSCODE",
- audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.",
- audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.",
- audioTranscodeDetailTitle: "Transcode",
- audioTranscodeStegoEmpty: "(none)",
- audioTranscodeStegoMessage: "TEXT",
- audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.",
- audioTranscodeStegoOasisId: "By",
- audioTranscodeStegoTimestamp: "Generated at",
+ audioTranscodeButton: "ट्रांसकोड करें",
+ audioTranscodeCompositionEmpty: "इस ऑडियो में कोई सहेजी गई ब्लॉकचेन रचना नहीं है।",
+ audioTranscodeDetailDescription: "एम्बेड किया गया पेलोड और ब्लॉकचेन का मूल रचना-मानचित्र डिकोड करें।",
+ audioTranscodeDetailTitle: "ट्रांसकोड",
+ audioTranscodeStegoEmpty: "(कोई नहीं)",
+ audioTranscodeStegoMessage: "टेक्स्ट",
+ audioTranscodeStegoNotFound: "इस ऑडियो से कोई स्टेग्नोग्राफ़िक पेलोड डिकोड नहीं हो सका।",
+ audioTranscodeStegoTimestamp: "बनाया गया",
audioTranscodeStegoUnknown: "—",
- bankExchangeEcoTaxAnnual: "ECOin Taxes (annual)",
- bankExchangeEcoTaxMonthly: "ECOin Taxes (monthly)",
- bankOverviewYourTaxes: "Your taxes",
- bankRulesAlpha: "Alpha (max share of pub balance per epoch)",
+ bankExchangeEcoTaxAnnual: "ECOin कर (वार्षिक)",
+ bankExchangeEcoTaxMonthly: "ECOin कर (मासिक)",
+ bankOverviewYourTaxes: "कुल कर",
+ bankRulesAlpha: "Alpha (प्रति युग pub शेष का अधिकतम हिस्सा)",
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.",
- bankRulesArchTaxRate: "Rate",
- bankRulesArchTaxTitle: "ARCH Tax",
- bankRulesCapPerEpoch: "Cap per epoch (absolute)",
- bankRulesCapUser: "Cap per user per epoch",
- bankRulesCarbonFactor: "Carbon factor",
+ bankRulesArchTaxNote: "ARCH कर नेटवर्क संग्रह को बढ़ाने और बनाए रखने की दीर्घकालिक लागत दर्शाता है: नेटवर्क में आपका डेटा जितना पुराना है, रखरखाव लागत में आपका हिस्सा उतना बड़ा है।",
+ bankRulesArchTaxRate: "दर",
+ bankRulesArchTaxTitle: "ARCH कर",
+ bankRulesCapPerEpoch: "प्रति युग सीमा (निरपेक्ष)",
+ bankRulesCapUser: "प्रति उपयोगकर्ता प्रति युग सीमा",
+ bankRulesCarbonFactor: "कार्बन गुणक",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
- bankRulesChipTitle: "ECO Tax chip color band",
+ bankRulesChipNote: "हर आइटम की चिप का रंग नेटवर्क में देखे गए सबसे बड़े संदेश के सापेक्ष तय होता है और सक्रिय निवासियों की संख्या से नरम किया जाता है — बड़ा नेटवर्क भार बाँटता है और ज़्यादा आइटम को हरे दायरे में ले आता है।",
+ bankRulesChipTitle: "ECO कर चिप का रंग दायरा",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
- bankRulesEcoTaxRate: "Rate",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesEpochKind: "Epoch granularity",
- bankRulesFloor: "Floor per user (gross)",
- bankRulesGraceDays: "Claim grace period",
+ bankRulesEcoTaxNote: "युग (epoch) का आवंटन गणना करते समय ECO कर सकल UBI से काटा जाता है। काटे गए ECO इस युग में फिर से नहीं बाँटे जाते — वे pub के शेष में रहते हैं और reserveMin / alpha सीमाओं के ज़रिए अगले युग के कोष को पोषित करते हैं।",
+ bankRulesEcoTaxRate: "दर",
+ bankRulesEcoTaxTitle: "ECO कर",
+ bankRulesEpochKind: "युग की सूक्ष्मता",
+ bankRulesFloor: "प्रति उपयोगकर्ता न्यूनतम (सकल)",
+ bankRulesGraceDays: "दावे की अनुग्रह अवधि",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
- bankRulesKarmaTitle: "Karma (user engagement score)",
+ bankRulesKarmaNote: "कर्म आपकी गतिविधियों (पोस्ट, वोट, संसद/अदालतों में भागीदारी आदि) से समय के साथ घटने वाले गुणक सहित निकाला जाता है, जिसमें से आपकी फ़ीड से पैदा हुए कार्बन ग्राम घटा दिए जाते हैं।",
+ bankRulesKarmaTitle: "कर्म (उपयोगकर्ता सहभागिता स्कोर)",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
- bankRulesPoolTitle: "Monthly pool",
- bankRulesReserveMin: "Reserve minimum (kept in pub balance)",
+ bankRulesPoolTitle: "मासिक कोष",
+ bankRulesReserveMin: "न्यूनतम आरक्षित (pub शेष में रखा जाता है)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
- bankRulesShareTitle: "Per-user share",
+ bankRulesShareTitle: "प्रति उपयोगकर्ता हिस्सा",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankRulesWMax: "Maximum weight (w_max)",
- bankRulesWMin: "Minimum weight (w_min)",
- bankTaxes: "Taxes",
- bankTaxesAnnualEcoin: "ECO Tax (annual)",
- bankTaxesArchTaxAnnual: "ARCH Tax (annual)",
- bankTaxesArchTaxFirstBlock: "Your first block age",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxLifetime: "ARCH Tax (lifetime)",
- bankTaxesArchTaxMonthly: "ARCH Tax (monthly)",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, and their ongoing contribution may be required by networking consensus.",
- bankTaxesArchTaxRate: "Rate",
- bankTaxesArchTaxTitle: "ARCH Tax",
- bankTaxesArchTaxUserAmount: "Your ARCH tax (price to return)",
- bankTaxesEcoTaxLifetime: "ECO Tax (lifetime)",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesLookupAuthor: "Author",
- bankTaxesLookupButton: "Inspect",
- bankTaxesLookupCarbon: "Carbon footprint",
- bankTaxesLookupEcoin: "ECO Tax",
- bankTaxesLookupNotFound: "No block found in your local feed with that ID.",
- bankTaxesLookupPlaceholder: "Block ID (e.g. %abc...=.sha256)",
- bankTaxesLookupSize: "Size",
- bankTaxesLookupTitle: "Inspect a block",
- bankTaxesLookupType: "Type",
- bankTaxesMonthlyEcoin: "ECO Tax (monthly)",
- bankTaxesRate: "Rate",
- bankTaxesSpan: "Sampling span",
- bankTaxesTotalAnnual: "Total (annual)",
- bankTaxesTotalBlocks: "Total blocks",
- bankTaxesTotalBytes: "Total bytes",
- bankTaxesTotalCarbon: "Total carbon",
- bankTaxesTotalEcoin: "Total ECO tax (lifetime)",
- bankTaxesTotalLifetime: "Total (lifetime)",
- bankTaxesTotalMonthly: "Total (monthly)",
- bankTaxesTypesApply: "Set my taxes",
- bankTaxesTypesLabel: "Select which taxes you want to pay",
- bankTaxesUserAmount: "Your ECO tax (price to return)",
- 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.",
- 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.",
- blockchainBackToBlockexplorer: "Back to blockexplorer",
- blockchainBlockNotAvailable: "This block is not available in your local feed. It may belong to a peer you are not yet replicating from.",
- ecoTaxLabel: "ECO Tax",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- melodyAllEmpty: "No BCS compositions from other inhabitants yet.",
- melodyByLabel: "By",
- melodyNoteUnavailable: "block not in your local feed",
- melodyUploadBcsButton: "Publish",
- melodyUploadBcsNameNote: "The audio will be published with the auto-generated name",
- melodyUploadBcsTitle: "Publish",
- melodyUploadStegoLabel: "Hidden message (steganography)",
- melodyUploadStegoMaxLabel: "max 280 characters",
- melodyUploadStegoPlaceholder: "Optional.",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
- statsPad: "Pads",
- statsPadEntry: "Pad entries",
- statsTombstoneEmpty: "No tombstones in the network yet.",
- typeGameScore: "GAME SCORES",
+ bankRulesWMax: "अधिकतम भार (w_max)",
+ bankRulesWMin: "न्यूनतम भार (w_min)",
+ bankTaxes: "कर",
+ bankTaxesAnnualEcoin: "ECO कर (वार्षिक)",
+ bankTaxesArchTaxAnnual: "ARCH कर (वार्षिक)",
+ bankTaxesArchTaxFirstBlock: "आपके पहले ब्लॉक की आयु",
+ bankTaxesArchTaxFootprintNote: "ARCH कर नेटवर्क संग्रह को बढ़ाने और बनाए रखने की लागत दर्शाता है। इसकी गणना आपके पहले प्रकाशित ब्लॉक और नेटवर्क के सबसे नए ब्लॉक के बीच के समय-अंतराल से होती है — आपका इतिहास संग्रह में जितना लंबा रहा है, रखरखाव लागत में आपका हिस्सा उतना बड़ा है।",
+ bankTaxesArchTaxLifetime: "ARCH कर (आजीवन)",
+ bankTaxesArchTaxMonthly: "ARCH कर (मासिक)",
+ bankTaxesArchTaxNoteBold: "ARCH कर को सीधे घटाने",
+ bankTaxesArchTaxNoteIntro: "आपका ARCH कर उस अधिशेष से काटा जाता है जो नेटवर्क आपके UBI के ऊपर पैदा करता है; UBI का मूल मान एक अटल न्यूनतम के रूप में तय है। कर कभी भी उस निश्चित राशि से नहीं काटा जाता जो हर निवासी को UBI के रूप में मिलती है। काटी गई राशि धन-पुनर्वितरण एल्गोरिदम को पोषित करती है और दूसरे निवासियों के UBI दावों के ज़रिए उन तक वापस पहुँचती है। नए निवासी और वे जो विशेष रूप से संग्रहण, प्रतिकृति और रखरखाव के कामों में लगे हैं, संभवतः आपकी ओर से नेटवर्क संग्रह को स्वस्थ रखने का कोई काम करेंगे। या वे ख़ुद को ",
+ bankTaxesArchTaxNoteOutro: " में लगा सकते हैं, छँटाई समझौतों, अनावश्यक डेटा के दोहराव हटाने और साझा रखरखाव ढाँचे के ज़रिए, और नेटवर्क की सहमति उनके निरंतर योगदान की माँग कर सकती है।",
+ bankTaxesArchTaxRate: "दर",
+ bankTaxesArchTaxTitle: "ARCH कर",
+ bankTaxesArchTaxUserAmount: "आपका ARCH कर (लौटाने योग्य राशि)",
+ bankTaxesEcoTaxLifetime: "ECO कर (आजीवन)",
+ bankTaxesEcoTaxTitle: "ECO कर",
+ bankTaxesLookupAuthor: "लेखक",
+ bankTaxesLookupButton: "निरीक्षण करें",
+ bankTaxesLookupCarbon: "कार्बन फ़ुटप्रिंट",
+ bankTaxesLookupEcoin: "ECO कर",
+ bankTaxesLookupNotFound: "आपकी स्थानीय फ़ीड में उस ID का कोई ब्लॉक नहीं मिला।",
+ bankTaxesLookupPlaceholder: "ब्लॉक ID (जैसे %abc...=.sha256)",
+ bankTaxesLookupSize: "आकार",
+ bankTaxesLookupTitle: "ब्लॉक का निरीक्षण करें",
+ bankTaxesLookupType: "प्रकार",
+ bankTaxesMonthlyEcoin: "ECO कर (मासिक)",
+ bankTaxesRate: "दर",
+ bankTaxesSpan: "नमूना अवधि",
+ bankTaxesTotalAnnual: "कुल (वार्षिक)",
+ bankTaxesTotalBlocks: "कुल ब्लॉक",
+ bankTaxesTotalBytes: "कुल बाइट्स",
+ bankTaxesTotalCarbon: "कुल कार्बन",
+ bankTaxesTotalEcoin: "कुल ECO कर (आजीवन)",
+ bankTaxesTotalLifetime: "कुल (आजीवन)",
+ bankTaxesTotalMonthly: "कुल (मासिक)",
+ bankTaxesTypesApply: "मेरे कर तय करें",
+ bankTaxesTypesLabel: "चुनें कि आप कौन-से कर चुकाना चाहते हैं",
+ bankTaxesUserAmount: "आपका ECO कर (लौटाने योग्य राशि)",
+ bankTaxesUserNoteChips: "हर आइटम के पास दिखने वाली ECO कर चिप का रंग (हरा / पीला / लाल) आइटम के आकार के अनुसार बदलता है, जिसकी तुलना नेटवर्क पर देखे गए सबसे बड़े ब्लॉक से की जाती है और सक्रिय निवासियों की संख्या से नरम किया जाता है — बड़ा सोलर-पंक नेटवर्क भार बाँटता है और ज़्यादा आइटम को हरे दायरे में ले आता है।",
+ bankTaxesUserNoteOtherParams: "ECO कर अभी हर ब्लॉक के कार्बन फ़ुटप्रिंट से निकाला जाता है, लेकिन समय के साथ इसमें दूसरे मापदंड भी जुड़ सकते हैं — प्रतिकृति पर ख़र्च हुई ऊर्जा, पीयरों में अनावश्यक भंडारण, ब्लॉब बैंडविड्थ, डिक्रिप्शन की गणना लागत, संबंधित लेन-देन का माइनिंग फ़ुटप्रिंट, या कोई भी अन्य मापने योग्य भार जिसे नेटवर्क महत्व देने पर सहमत हो।",
+ blockchainBackToBlockexplorer: "ब्लॉक एक्सप्लोरर पर वापस",
+ blockchainBlockNotAvailable: "यह ब्लॉक आपकी स्थानीय फ़ीड में उपलब्ध नहीं है। यह किसी ऐसे पीयर का हो सकता है जिससे आप अभी प्रतिकृति नहीं करते।",
+ ecoTaxLabel: "ECO कर",
+ gamesHallDate: "तिथि",
+ gamesNewRecord: "नया रिकॉर्ड!",
+ indexingRefreshNote: "यह पृष्ठ हर 10 सेकंड में ताज़ा होता है।",
+ indexingMessage: "Oasis वितरित नोड्स के नेटवर्क को सिंक कर रहा है। कृपया प्रतीक्षा करें।",
+ indexingTitle: "समन्वयन जारी",
+ melodyAllEmpty: "अभी तक दूसरे निवासियों की कोई BCS रचना नहीं।",
+ melodyNoteUnavailable: "ब्लॉक आपकी स्थानीय फ़ीड में नहीं है",
+ melodyUploadBcsButton: "प्रकाशित करें",
+ melodyUploadBcsNameNote: "ऑडियो स्वतः बने नाम के साथ प्रकाशित होगा",
+ melodyUploadBcsTitle: "प्रकाशित करें",
+ melodyUploadStegoLabel: "छिपा संदेश (स्टेग्नोग्राफ़ी)",
+ melodyUploadStegoMaxLabel: "अधिकतम 280 अक्षर",
+ melodyUploadStegoPlaceholder: "वैकल्पिक।",
+ padsNoItems: "कोई पैड नहीं मिला।",
+ padVersionHistory: "संस्करण इतिहास",
+ padAttributionView: "लेखिका के अनुसार",
+ padVersionView: "देखें",
+ statsChat: "चैट्स",
+ statsChatMessage: "चैट संदेश",
+ statsGameScore: "खेल",
+ statsWiki: "विकी पृष्ठ",
+ statsPad: "पैड्स",
+ statsPadEntry: "पैड प्रविष्टियाँ",
+ statsTombstoneEmpty: "नेटवर्क में अभी तक कोई टॉम्बस्टोन नहीं।",
+ typeGameScore: "गेम स्कोर",
bankTaxesLookupNote: "अपने स्थानीय फ़ीड में देखने के लिए ब्लॉक ID दर्ज करें।",
bankTaxesUserNoteChipsClick: "ब्लॉकexplorer में इसके ब्लॉक का निरीक्षण करने के लिए किसी भी चिप पर क्लिक करें।",
mapUrlPlaceholder: "/maps/MAP_ID",
@@ -3523,6 +4702,14 @@ module.exports = {
settingsReplicationTitle: "प्रतिकृति",
settingsReplicationDesc: "सामग्री की प्रतिकृति बनाते समय आपके पीयर द्वारा आपके अपने फ़ीड से आगे जाने वाले हॉप की संख्या कॉन्फ़िगर करें।",
settingsReplicationHopsLabel: "हॉप",
+ settingsBlobCacheTitle: "मीडिया कैश",
+ settingsBlobCacheDesc: "दूसरे निवासियों की सामग्री इस डिवाइस पर रखी जाती है। चुनें कि वह कितनी जगह ले सकती है।",
+ settingsBlobCacheUsage: "वर्तमान उपयोग",
+ settingsBlobCacheFiles: "फ़ाइलें",
+ settingsBlobCacheLimit: "सीमा",
+ settingsBlobCacheUnlimited: "असीमित",
+ settingsBlobCacheCleanNow: "अभी साफ़ करें",
+ settingsBlobCacheCleaned: "{n} फ़ाइलें हटाई गईं, {size} खाली हुआ।",
aiApproveTagsLabel: "टैग (अल्पविराम से अलग)",
aiApproveTagsPlaceholder: "जैसे oasis, शासन, पारिस्थितिकी",
aiApproveRatingLabel: "रेटिंग",
@@ -3550,8 +4737,6 @@ module.exports = {
larpInviteBannerHint: "इस कोड को ACADEMIA में किसी के साथ साझा करें। यह 30 चक्रों या एक उपयोग के बाद समाप्त हो जाता है।",
larpTestRankingTitle: "गृह के अनुसार स्कोर",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "गृह आमंत्रण कोड",
- invitesHouseJoinButton: "गृह में शामिल हों",
larpLastAttemptTitle: "आपका पिछला प्रयास",
larpLastAttemptHouse: "गृह",
larpLastAttemptWhen: "कब",
@@ -3569,7 +4754,7 @@ module.exports = {
larpBadgeYou: "आप",
larpBadgeRuling: "शासन",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "Oasis की लाइव-एक्शन रोल-प्लेइंग परत (9 गृह) के लिए मॉड्यूल।",
+ modulesLarpDescription: "लाइव-एक्शन रोल-प्लेइंग परत का मॉड्यूल।",
larpProfileQ1: "जब आप किसी जटिल समस्या का सामना करते हैं, तो पहले क्या करते हैं?",
larpProfileQ1O1: "सहमति खोजने के लिए दूसरों से बात करना",
larpProfileQ1O2: "परीक्षण के लिए प्रोटोटाइप बनाना",
@@ -3643,6 +4828,51 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "अपने इंटरफ़ेस के लिए UX नेविगेशन मोड चुनें।",
uxModeMenus: "ब्लॉक",
+ uxModeChats: "वार्तालाप",
+ uxModeFeed: "माइक्रोब्लॉगिंग",
+ feedTrendingTitle: "ट्रेंडिंग टैग",
+ feedActiveTitle: "सक्रिय निवासी",
+ cnBrandSub: "मुक्त · P2P · संघीय",
+ cnSyncedPeers: "सिंक किए गए पीयर",
+ cnLicense: "लाइसेंस",
+ cnNotAccessible: "यह सामग्री इस समय उपलब्ध नहीं है।",
+ cnUntitled: "बिना शीर्षक",
+ cnSearchPlaceholder: "खोजें…",
+ cnHubTitle: "Clearnet हब",
+ cnHubDescription: "इस Oasis नेटवर्क के निवासियों द्वारा साझा की गई सार्वजनिक सामग्री।",
+ cnHubEmpty: "अभी तक Clearnet पर कोई सार्वजनिक सामग्री साझा नहीं की गई है।",
+ cnPublicContent: "सामग्री",
+ cnTribesContent: "जनजातियाँ",
+ cnNetworkContent: "नेटवर्क",
+ cnCategoryEmpty: "इस श्रेणी में कोई सामग्री नहीं।",
+ cnInhabitantEmpty: "इस निवासी ने अभी तक Clearnet पर कोई सामग्री प्रकाशित नहीं की है।",
+ cnPrevPage: "← पिछला",
+ cnNextPage: "अगला →",
+ cnPageOf: "पृष्ठ {page} / {pages}",
+ cnMoreInfo: "अधिक जानकारी →",
+ cnOpenCourse: "खुला कोर्स",
+ cnAuction: "नीलामी",
+ cnExchange: "विनिमय",
+ cnRssDescription: "इस हब के निवासियों द्वारा प्रकाशित",
+ cnKindAudio: "ऑडियो",
+ cnKindBlog: "ब्लॉग",
+ cnKindBookmark: "बुकमार्क",
+ cnKindDocument: "दस्तावेज़",
+ cnKindEvent: "इवेंट",
+ cnKindFeed: "फ़ीड",
+ cnKindImage: "छवि",
+ cnKindJob: "नौकरी",
+ cnKindMarket: "बाज़ार",
+ cnKindPodcast: "पॉडकास्ट",
+ cnKindProject: "प्रोजेक्ट",
+ cnKindCourse: "कोर्स",
+ cnKindShop: "दुकान",
+ cnKindTorrent: "टॉरेंट",
+ cnKindFile: "फ़ाइल",
+ cnKindVideo: "वीडियो",
+ cnKindWiki: "विकी",
+ cnKindRoom: "रूम",
+ cnKindMap: "मानचित्र",
uxModeAINav: "AI",
}
diff --git a/src/client/assets/translations/oasis_it.js b/src/client/assets/translations/oasis_it.js
index e30d008..fbe10dc 100644
--- a/src/client/assets/translations/oasis_it.js
+++ b/src/client/assets/translations/oasis_it.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "Acquisti",
shopMyOrdersDescription: "I tuoi ordini di acquisto.",
shopMyOrdersEmpty: "Non hai ancora acquisti.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM Venditore",
shopOrderSeller: "Venditore",
shopOrderInvoice: "Fattura",
shopOrderInvoiceConcept: "Fattura",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Accetta",
shopOrderReject: "Rifiuta",
shopOrderMarkShipped: "Segna spedito",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM Acquirente",
shopOrderContractConcept: "Ordine negozio",
shopOrdersPending: "Ordini in sospeso",
all: "Tutti",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Recenti",
anonymous: "Anonimo",
unnamed: "Anonimo",
- authorLabel: "AUTORE",
+ authorLabel: "Autore",
delete: "Elimina",
save: "Salva",
vote: "Vota",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "Avviso sul contenuto",
invalidPost: "Contenuto non valido",
invalidPostHint: "Questo messaggio ha testo vuoto/non valido.",
- spreadBy: "Da",
spreadChron: "Diffusione",
spreaded: "Diffuso",
spreadContentUnavailable: "Contenuto non ancora disponibile (replica in sospeso)",
filteredByTag: "Filtrato per tag",
filteredByTagTitle: "Filtrato per tag",
feedPublishedSuccess: "Feed pubblicato con successo!",
+ feedMastodonFailed: "Pubblicato in Oasis, ma non è stato possibile inviarlo a Mastodon.",
tribeFeedSent: "Messaggio inviato con successo!",
tribeContentEncrypted: "Contenuto cifrato",
tribeTorrentsEmpty: "Ancora nessun torrent.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Ultima visita",
profileClearnetBookmarksLabel: "Segnalibri",
invitesPort: "Porta",
- currentlyUnrecheable: "ERRORE!",
- peerHostValidation: "IPv4 valido (es. 192.168.1.100) o hostname (es. pub.example.com)",
+ peerHostValidation: "IPv4 valido (es. 192.168.1.100) o hostname (es. pub.solarnethub.com)",
peerPortValidation: "Porta 1-65535",
peerKeyValidation: "Chiave pubblica SSB ed25519 (@<44 caratteri base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Disiscrizione dalla tua offerta di lavoro",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Descrizione attività",
exportPasswordLabel: "Password di esportazione",
importPasswordPlaceholder: "Inserisci la password",
- searchCasesPlaceholder: "Cerca casi…",
+ searchCasesPlaceholder: "Cerca in Tribunali...",
shopBuyDeliveryAddressPlaceholder: "Indirizzo di consegna",
shopBuyNotesPlaceholder: "Note",
bankTaxesUserNoteBold: "ridurre direttamente la tassa ECO",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Sostieni il caso",
courtsSettlementAcceptBtn: "Accetta l’accordo",
courtsSupportCount: "Sostenitori",
- courtsVerdictVoteTitle: "Vota sul verdetto",
- courtsVerdictVoteLabel: "Voto sul verdetto",
- courtsVerdictVoteAccept: "Accetta",
- courtsVerdictVoteReject: "Rifiuta",
- courtsVerdictVoteSubmit: "Invia voto",
reportsSetStatus: "Imposta stato",
reportsStatusClosed: "CHIUSO",
statsAvgPerInhabitant: "Media per abitante",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Avatar",
inhabitants: "Abitanti",
- peersReplicatedFeeds: "Feed replicati",
+ peersReplicatedFeeds: "Replicati",
+ peersTorColumn: "TOR",
+ peersTorYes: "Raggiungibile tramite Tor",
+ peersTorNo: "Non raggiungibile tramite Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Versione",
graphos: "Graphos",
graphosDescription: "Mappa interattiva della rete attorno a te.",
+ graphosFederation: "Federazione",
+ graphosFedPubs: "PUB",
+ graphosFedUnreachable: "Irraggiungibili",
+ graphosFedLinks: "Collegamenti reciproci",
+ graphosFedIsolated: "Isolati",
+ graphosFedNoData: "Nessun dato",
+ graphosFedMutual: "Reciproco",
+ graphosFedOneWay: "A senso unico",
+ graphosFedTransport: "Rete",
+ graphosFedWith: "Federato con",
+ graphosZoom: "Ingrandisci",
+ graphosFedInhabitants: "Abitanti",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "Il tuo nodo non conosce ancora nessun PUB.",
graphosViewingGraphOf: "Visualizzando",
graphosBackToMine: "← La mia rete",
graphosShowing: "Mostrando",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "Non hai ancora ricevuto @menzioni.",
- mentionsSearchPlaceholder: "Cerca menzioni...",
+ mentionsSearchPlaceholder: "Cerca in Menzioni...",
privateReminders: "PROMEMORIA",
+ inboxFilterPms: "PM",
+ inboxFilterNotifications: "Notifiche",
+ inboxMarkRead: "Segna come letto",
+ inboxMarkUnread: "Segna come non letto",
+ inboxUnreadChip: "Non letto",
+ inboxMarkAllRead: "Segna tutto come letto",
+ inboxDeleteShown: "Elimina tutto",
+ inboxArchive: "Archivia",
+ inboxUnarchive: "Ripristina",
+ inboxFilterArchived: "Archiviati",
+ inboxEarlierMessages: "messaggi precedenti",
+ inboxSortThread: "Per conversazione",
+ inboxSortRecent: "Più recenti prima",
+ inboxAllBots: "Bot",
+ settingsInboxBotsTitle: "Notifiche dell'Inbox",
+ settingsInboxBotsDesc: "Scegli quali bot possono avvisarti nella tua Inbox. I bot deselezionati vengono nascosti e i loro avvisi non vengono contati.",
inboxFiltersLabel: "Filtri:",
inboxToggleToMutuals: "Passa a reciproci",
inboxToggleToWhole: "Passa a tutti",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "Rispondi",
pmReplies: "risposte",
inReplyTo: "IN RISPOSTA A",
+ forumInThread: "NEL THREAD",
pmPreview: "Anteprima",
pmPreviewTitle: "Anteprima messaggio",
peers: "Peer",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "Da",
searchToLabel: "A",
searchQueryLabel: "Ricerca",
- searchPerPageLabel: "Risultati per pagina",
+ searchPerPageLabel: "Risultati",
settings: "Impostazioni",
+ settingsDescription: "Configura l'ambiente della tua rete.",
continueReading: "Continua a leggere",
moreComments: "altri commenti",
readThread: "leggi il resto della discussione",
@@ -239,7 +271,6 @@ module.exports = {
profileClearnetHelp: 'Moduli accessibili dall’esterno di Oasis.',
profileHubAll: 'Tutto',
footerLicenseLabel: 'Licenza',
- profileSwitchToOasis: 'Torna a Oasis',
profileVisibilityFediverse: "Multiverso",
contributorsTitle: "Contributori",
colorLabel: 'Scegli un colore',
@@ -249,6 +280,7 @@ module.exports = {
modulesViewTitle: "Moduli",
modulesViewDescription: "Configura il tuo ambiente attivando o disattivando i moduli.",
inbox: "Posta in arrivo",
+ inboxSearchPlaceholder: "Cerca in Posta in arrivo...",
multiverse: "Multiverso",
fediverse: "Multiverso",
fediverseDescription: "Gestisci i tuoi altri account del multiverso, inclusi l'invio e la ricezione di contenuti.",
@@ -257,9 +289,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Server",
+ nextcloudUserLabel: "Utente",
+ nextcloudFolderLabel: "Cartella",
+ nextcloudUploadButton: "Carica",
+ nextcloudFileLabel: "Scegli un file",
+ fileExternalLink: "Link esterno",
+ nextcloudErrConnect: "Impossibile raggiungere Nextcloud con questi dati.",
+ nextcloudErrUpload: "Il caricamento su Nextcloud non è riuscito.",
+ nextcloudErrShare: "Nextcloud non ha dato un link pubblico per il file.",
fediverseDisconnect: "Disconnetti",
fediverseEmptyLink: "impostazioni",
fediverseComposePlaceholder: "A cosa stai pensando?",
@@ -288,6 +328,76 @@ module.exports = {
fediverseErrPost: "Impossibile pubblicare.",
fediverseErrMedia: "Impossibile caricare il file.",
fediverseErrEmpty: "Scrivi qualcosa o allega un file.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Numero di telefono",
+ telegramSendCode: "Invia codice",
+ telegramCodeHelp: "Inserisci il codice che Telegram ti ha appena inviato (app o SMS).",
+ telegramCodeLabel: "Codice",
+ telegramPasswordHelp: "Questo account ha la verifica in due passaggi. Inserisci la password.",
+ telegramPasswordLabel: "Password",
+ telegramVerify: "Verifica",
+ telegramCancel: "Annulla",
+ telegramChats: "Chat",
+ telegramUnread: "Non letti",
+ telegramOpen: "Apri",
+ telegramSend: "Invia",
+ telegramYou: "Tu",
+ telegramNoChats: "Nessuna chat per ora.",
+ telegramNoMessages: "Nessun messaggio per ora.",
+ telegramComposePlaceholder: "Scrivi un messaggio…",
+ telegramChannel: "Canale",
+ telegramGroup: "Gruppo",
+ telegramPrivate: "Privato",
+ telegramErrConnect: "Impossibile contattare Telegram.",
+ telegramErrTimeout: "Telegram ha impiegato troppo a rispondere.",
+ telegramErrAuth: "Sessione Telegram non valida o scaduta. Ricollegati.",
+ telegramErrFetch: "Impossibile caricare le chat.",
+ telegramErrSend: "Impossibile inviare il messaggio.",
+ telegramErrMissing: "Servono API ID, API hash e numero di telefono.",
+ telegramErrCode: "Codice non valido. Riprova.",
+ telegramErrCodeExpired: "Il codice è scaduto. Ricomincia.",
+ telegramErrPassword: "Password errata.",
+ telegramErrPhone: "Numero di telefono non valido.",
+ telegramErrApi: "API ID o API hash non validi.",
+ telegramErrFlood: "Troppi tentativi. Attendi e riprova.",
+ telegramErrNoLogin: "Nessun accesso in corso. Ricomincia.",
+ peertubeUsernameLabel: "Nome utente",
+ peertubePasswordLabel: "Password",
+ peertubeSubscriptions: "Iscrizioni",
+ peertubeMyVideos: "I miei video",
+ peertubeVideos: "Video",
+ peertubeFollowers: "Follower",
+ peertubeViews: "visualizzazioni",
+ peertubeLikes: "mi piace",
+ peertubeQuota: "Quota",
+ peertubeUpload: "Carica video",
+ peertubeUploadHelp: "Scegli un file video. Viene caricato sul tuo canale e PeerTube lo elabora in seguito.",
+ peertubeTitleLabel: "Titolo",
+ peertubeDescriptionLabel: "Descrizione",
+ peertubePrivacyLabel: "Privacy",
+ peertubePrivacyPublic: "Pubblico",
+ peertubePrivacyUnlisted: "Non in elenco",
+ peertubePrivacyPrivate: "Privato",
+ peertubeNoVideos: "Ancora nessun video.",
+ peertubeComments: "Commenti",
+ peertubeComment: "Commenta",
+ peertubeCommentPlaceholder: "Scrivi un commento…",
+ peertubeNoComments: "Ancora nessun commento.",
+ peertubeOpen: "Apri su PeerTube",
+ peertubeWatch: "Guarda",
+ peertubeChannel: "Canale",
+ peertubeNoStream: "Questo video non può ancora essere riprodotto qui. Aprilo su PeerTube.",
+ peertubeUploaded: "Video caricato. PeerTube lo sta elaborando.",
+ peertubeErrConnect: "Impossibile contattare PeerTube.",
+ peertubeErrAuth: "Nome utente o password errati, oppure la sessione è scaduta. Riconnettiti.",
+ peertubeErrInstance: "URL dell'istanza non valido.",
+ peertubeErrMissing: "Servono istanza, nome utente e password.",
+ peertubeErrFetch: "Impossibile caricare i video.",
+ peertubeErrUpload: "Impossibile caricare il video.",
+ peertubeErrTitle: "Titolo obbligatorio.",
+ peertubeErrComment: "Impossibile pubblicare il commento.",
+ peertubeErrNoFile: "Scegli un file video.",
bookmarksLabel: "Segnalibri",
videosLabel: "Video",
torrentsLabel: "Torrents",
@@ -310,7 +420,6 @@ module.exports = {
comment: "Commento",
subtopic: "Sotto-argomento",
json: "JSON",
- createdBy: "di",
unfollow: "Rimuovi supporto",
follow: "Supporta",
block: "Blocca",
@@ -326,12 +435,15 @@ module.exports = {
relationshipNone: "Non stai supportando",
relationshipBlockingPost: "Post bloccato",
viewLikes: "Vedi diffusioni",
+ viewSupporters: "Vedi sostenitori",
spreadedDescription: "Lista dei post diffusi dall'abitante.",
preview: "Anteprima",
publish: "Pubblica",
contentWarningPlaceholder: "Aggiungi un oggetto al post (opzionale)",
- publishWarningPlaceholder: "Corpo limitato a 7000 caratteri.",
+ publishWarningPlaceholder: "Scrivi il corpo del tuo articolo.",
publishTooLong: "Il tuo post è troppo lungo. Accorcialo, per favore.",
+ keepTextRetry: "Invia di nuovo",
+ dateInPastError: "La data non può essere nel passato",
publishCustomDescription: [
"RICORDA: A causa della tecnologia blockchain, una volta pubblicato un post non può essere modificato né eliminato.",
],
@@ -361,9 +473,8 @@ module.exports = {
mentionsMatching: "Menzioni corrispondenti",
mentionsName: "Nome",
mentionsRelationship: "Relazione",
- updateit: "AGGIORNAMENTI!",
updateBannerText: "È disponibile una nuova versione di Oasis.",
- updateBannerAction: "Aggiorna ora →",
+ updateBannerAction: "Aggiorna ora!",
info: "Info",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -371,16 +482,14 @@ module.exports = {
timeAgo: "fa",
sendTime: "circa ",
theme: "Tema",
- legacy: "Chiavi",
- legacyTitle: "Chiavi",
- legacyDescription: "Gestisci il tuo segreto (chiave privata) in modo rapido e sicuro.",
- legacyExportButton: "Esporta",
- legacyImportButton: "Importa",
- ssbLogStream: "Blokchain",
+ backupKeysExportButton: "Esporta",
+ backupKeysImportButton: "Importa",
+ ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Configura il limite di messaggi per i flussi della Blockchain.",
+ logWindowChip: "Ultimi {n} stream della blockchain",
saveSettings: "Salva impostazioni",
exportDescription: "Imposta una password (minimo 32 caratteri) per crittografare la tua chiave",
- exportDataTitle: "Backup",
+ exportDataTitle: "Copia istantanea",
exportDataDescription: "Scarica i tuoi dati (chiave segreta esclusa!)",
exportDataButton: "Scarica database",
importDescription: "Importa il tuo segreto crittografato (chiave privata) per attivare il tuo avatar",
@@ -389,38 +498,33 @@ module.exports = {
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.",
+ welcomeBannerText: "Il tuo avatar non è ancora configurato.",
aiSuggestionBanner: "Suggerimento:",
aiSuggestionsEnable: "Suggerimenti dell'IA",
- welcomeBannerAction: "Inizia!",
+ welcomeBannerAction: "Inizia",
welcomeTitle: "Benvenuta",
+ welcomeStepIdentity: "Identità",
+ welcomeStepType: "Tipo",
+ welcomeStepUse: "Uso",
+ welcomeStepLook: "Aspetto",
+ welcomeStepCommunity: "Comunità",
+ welcomeStepIntro: "Benvenuto",
+ welcomeHintIdentity: "Il tuo nome e la tua immagine.",
+ welcomeHintType: "Come si apre Oasis per te.",
+ welcomeHintUse: "Quali moduli restano attivi.",
+ welcomeHintLook: "Il tema che indossa Oasis.",
+ welcomeHintCommunity: "Entra in un PUB per conoscere altri abitanti.",
+ welcomeHintIntro: "Invia un primo saluto alla comunità.",
+ welcomeStepThemeAction: "Usa questo tema",
+ welcomeJoinPubs: "Entra nei PUB",
+ welcomeNoFederation: "Senza federarsi",
welcomeStepGreetingAction: "Invia",
- welcomeJoinPubButton: "Unisciti al pub",
- welcomeStepLarpAction: "Unisciti a \"L Accademia\"",
- welcomeStepLarpText: "Unisciti al nostro gioco di ruolo dal vivo.",
- welcomeStepLarpTitle: "Unisciti al L.A.R.P.",
- welcomeStepGreetingTitle: "Invia un \"Ciao mondo!\"",
- welcomeStepGreetingText: "Invia un messaggio perché gli altri abitanti possano scoprirti.",
- welcomeJoinPub: "Unisciti a",
welcomeDescription: "Alcune cose da fare prima di iniziare.",
- welcomeProgress: "Completato",
- welcomeStepDone: "fatto",
- welcomeStepPending: "in sospeso",
welcomeSkip: "Non ora",
- welcomeStepLanguageTitle: "Scegli la tua lingua",
- welcomeStepLanguageText: "Oasis parla diverse lingue. Puoi cambiarla quando vuoi.",
- welcomeStepProfileTitle: "Modifica il tuo profilo",
- welcomeStepProfileText: "Scegli un nome, aggiungi una descrizione e metti un immagine perché gli altri abitanti ti riconoscano.",
welcomeStepProfileAction: "Salva profilo",
- welcomeStepFederationTitle: "Unisciti alla rete principale",
- welcomeStepFederationText: "Collegati al nostro pub per incontrare altri abitanti e iniziare a replicare.",
- welcomeStepFederationAction: "Vai agli inviti",
- welcomeStepBackupTitle: "Fai il backup del tuo ID",
- welcomeStepBackupText: "La tua identità è un file di chiavi su questo dispositivo.",
- welcomeStepBackupWarning: "SE LO PERDI, NESSUNO POTRÀ RECUPERARLO PER TE.",
- welcomeStepBackupAction: "Backup!",
+ welcomeBootstrapRunning: "Caricamento dell'istantanea del pub. Al termine ti unisci al pub automaticamente; nel frattempo puoi continuare a usare Oasis.",
welcomeCompleteTitle: "Tutto pronto.",
- welcomeCompleteText: "Il tuo nodo è pronto. Da qui la rete cresce con le persone che segui.",
+ welcomeCompleteText: "Il tuo nodo è pronto. Da qui la rete cresce con gli abitanti che sostieni.",
welcomeFindPeople: "Trova abitanti",
devFilterFiles: "FILE",
devFilterSearch: "CERCA",
@@ -430,7 +534,7 @@ module.exports = {
devFilterTests: "TEST",
devVersion: "Versione",
devNodeVersion: "Node",
- devStatsTests: "Suite di test",
+ devStatsTests: "Test",
devParentFolder: "Cartella superiore",
devOpenFolder: "apri",
devDescription: "Esplora il codice sorgente in esecuzione su questo nodo.",
@@ -474,6 +578,27 @@ module.exports = {
"Se desideri usare un'altra lingua, selezionala qui.",
setLanguage: "Imposta lingua",
peerConnectionsIntro: "Gestisci tutte le tue connessioni con altri peer.",
+ peersConnectFailed: "Impossibile connettersi: {reason}.",
+ peerStateLabel: "Stato",
+ peerAddressLabel: "Indirizzo",
+ peerLastChangeLabel: "Ultima modifica",
+ peerStateConnected: "Connesso",
+ peerStateConnecting: "Connessione in corso",
+ peerStateStaged: "Disponibile",
+ peerErrSilent: "Nessuna attività",
+ peerErrTimeout: "Non risponde",
+ peerErrRefused: "Rifiuta la connessione",
+ peerErrNotFound: "Indirizzo sconosciuto",
+ peerErrUnreachable: "Rete irraggiungibile",
+ peerErrKeys: "Usa chiavi diverse",
+ peerErrIdentity: "Non accetta la tua connessione",
+ peerErrTor: "Solo TOR",
+ peerErrDropped: "Connessione interrotta",
+ peerErrPaused: "Rete in pausa",
+ peerErrOther: "Errore di connessione",
+ peerOutdated: "Non aggiornato",
+ peerVersionUnannounced: "Non annuncia la sua versione: un Oasis vecchio",
+ peersTorMissing: "Questo PUB accetta solo connessioni tramite TOR.",
peerConnectionsTitle: "Connessioni",
online: "Online",
offline: "Offline",
@@ -492,22 +617,25 @@ module.exports = {
noConnections: "Nessun peer connesso.",
noDiscovered: "Nessun peer scoperto.",
noUnknownPeers: "Nessun peer sconosciuto nel grafo delle amicizie.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Nessun peer registrato per ora.",
+ peerConnect: "Connetti",
+ peerDisconnect: "Disconnetti",
peerRefresh: "Aggiorna",
peerPruneIdle: "Rimuovi inattivi",
+ peersPause: "Pausa",
+ peersResume: "Riprendi",
+ peersPausedNote: "In pausa: Oasis non si connette con nessuno e nessuno può connettersi.",
+ peersPauseHint: "Ferma tutte le connessioni: Oasis non si connette ad altri nodi né li accetta finché non riprendi.",
peerExport: "Esporta",
peerImport: "Importa",
peerImportTitle: "Importa lista peer",
peerImportPlaceholder: "Incolla un indirizzo multiserver per riga, o carica un file .txt…",
connectionActionIntro:
"",
- startNetworking: "Avvia rete",
- stopNetworking: "Ferma rete",
- restartNetworking: "Riavvia rete",
- sync: "Sincronizza rete",
indexes: "Indici",
+ indexesRebuilt: "Indici ricostruiti",
+ indexesRebuildFailed: "Non è stato possibile ricostruire gli indici",
+ indexesFiles: "File di indice",
indexesDescription:
"Ricostruire gli indici è sicuro e può risolvere alcuni tipi di errori.",
homePageTitle: "Home",
@@ -517,44 +645,33 @@ module.exports = {
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ù",
invitesChatsTitle: "Chat",
- invitesChatInviteCodePlaceholder: "Inserisci codice invito chat",
- invitesChatJoinButton: "Unisciti alla chat",
invitesPadsTitle: "Pad",
- invitesPadInviteCodePlaceholder: "Inserisci codice invito pad",
- invitesPadJoinButton: "Unisciti al pad",
invitesCalendarsTitle: "Calendari",
- invitesCalendarInviteCodePlaceholder: "Inserisci codice invito calendario",
- invitesCalendarJoinButton: "Unisciti al calendario",
invitesEventsTitle: "Eventi",
- invitesEventInviteCodePlaceholder: "Inserisci codice invito evento",
- invitesEventJoinButton: "Unisciti all'evento",
invitesForumsTitle: "Forum",
- invitesForumInviteCodePlaceholder: "Inserisci codice invito forum",
- invitesForumJoinButton: "Unisciti al forum",
invitesMapsTitle: "Mappe",
- invitesMapInviteCodePlaceholder: "Inserisci codice invito mappa",
- invitesMapJoinButton: "Unisciti alla mappa",
invitesShopsTitle: "Negozi",
- invitesShopInviteCodePlaceholder: "Inserisci il codice di invito del negozio",
- invitesShopJoinButton: "Unisciti al negozio",
invitesPubsTitle: "PUB",
+ invitesSuggestedPubs: "PUB Suggeriti",
+ invitesFilterOthers: "Altre",
+ invitesJoinTitle: "Inviti",
+ invitesJoinHint: "Incolla qualsiasi codice d'invito, per qualunque cosa sia, o l'Oasis ID di un abitante.",
+ invitesJoinPlaceholder: "Codice d'invito o Oasis ID",
+ invitesJoinButton: "Entra",
+ invitesUsedTitle: "Ultimi inviti",
+ invitesUsedEmpty: "Non hai ancora utilizzato nessun invito.",
+ invitesUsedType: "Tipo",
+ invitesUsedName: "Nome",
+ invitesUsedDate: "Data",
invitesPubInviteCodePlaceholder: "Inserisci codice invito PUB",
invitesAcceptInvite: "Unisciti al PUB",
+ invitesPubUses: "Inviti usati",
+ invitesPubExhausted: "Questo PUB non ha più inviti disponibili.",
invitesAlreadyFederated: "Sei già federato con questo pub.",
+ invitesJoinPubMode: "Questo Oasis funziona come PUB, in sola lettura. Per unirlo a un altro PUB, usa il terminale: ./oasis.sh join ",
+ invitesJoinLocalOnly: "Gli inviti si accettano solo dal dispositivo su cui gira Oasis, o tramite il link di amministrazione mostrato all'avvio.",
invitesFederationsTitle: "Federazioni",
invitesAcceptedInvites: "Federate",
invitesUnfollow: "Smetti di seguire",
@@ -562,16 +679,12 @@ module.exports = {
invitesUnfollowedInvites: "Non federate",
invitesNoFederatedPubs: "Nessun pub federato.",
invitesNoUnfollowed: "Nessun pub non federato.",
- invitesUnreachablePubs: "Irraggiungibili",
- invitesNoUnreachablePubs: "Nessun pub irraggiungibile.",
invitesPubsRefresh: "Aggiorna",
- invitesPubsClearUnreachable: "Rimuovi irraggiungibili",
+ invitesPubsClearUnreachable: "Pulisci",
invitesPubsExport: "Esporta",
invitesPubsImport: "Importa",
invitesPubsImportTitle: "Importa pub",
invitesPubsImportPlaceholder: "Incolla un indirizzo multiserver o un codice invito per riga, o carica un file .txt…",
- currentlyUnreachable: "ERRORE!",
- errorDetails: "Dettagli errore",
genericError: "Si è verificato un errore.",
panicMode: "Modalità panico!",
encryptData: "Imposta una password (minimo 32 caratteri) per crittografare la tua blockchain",
@@ -598,7 +711,6 @@ module.exports = {
votesOptionNoLabel:"No",
votesOptionAbstentionLabel:"Astensione",
votesQuestionLabel:"Domanda",
- votesCreatedByLabel:"Creato da",
voteStatusOpen:"APERTO",
voteStatusClosed:"CHIUSO",
commentDescription: ({ parentUrl }) => [
@@ -615,22 +727,22 @@ module.exports = {
searchSubmit: "Cerca...",
votesLabel: "VOTAZIONI",
pdfFallbackLabel: "Documento PDF",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "NEGOZI",
+ voteLabel: "VOTI",
submit: "Invia",
editProfile: "Modifica avatar",
oasisIdLabel: "OasisID",
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- /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.",
+ 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- [/avatar](/profile) — Modifica il tuo avatar, nome, descrizione e quali moduli appaiono sul tuo lato pubblico.\n- /settings — Regola la tua istanza locale: lingua, tema, moduli, privacy e sincronizzazione.\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 altri abitanti.\n- /tribes — Crea o unisciti a gruppi privati cifrati end-to-end.\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à",
profileDeviceLockedHint: "Questo sensore è sempre attivo: mostra agli altri da quale dispositivo ti connetti e non può essere disattivato.",
profileVisibilityKarma: "Punteggio KARMA",
- profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "Portafoglio ECOIN",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "RBU",
+ profileVisibilityWallet: "Portafoglio ECOin",
+ profileVisibilityEcoTax: "Tassa ECO",
+ profileVisibilityLarpSign: "Sigillo L.A.R.P.",
profileVisibilityGpg: "Chiave GPG",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Negozi",
@@ -643,6 +755,10 @@ module.exports = {
profileClearnetImagesLabel: "Immagini",
profileClearnetDocumentsLabel: "Documenti",
profileClearnetTorrentsLabel: "Torrent",
+ profileClearnetPodcastsLabel: "Podcast",
+ profileClearnetMarketLabel: "Mercato",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wiki",
editProfileDescription:
"",
profileName: "Nome",
@@ -668,7 +784,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Conf.",
walletConfirm: "Conferma",
- walletDescription: "Gestisci i tuoi asset digitali, incluso inviare e ricevere ECOin, visualizzare il saldo e accedere alla cronologia delle transazioni.",
+ walletDescription: "Gestisci il tuo portafoglio ECOin.",
walletDate: "Data",
walletFee: "Commissione (più alta è la commissione, più veloce sarà l'elaborazione della transazione)",
walletFeeLine: ({ fee }) => `Commissione: ECO ${fee}`,
@@ -676,6 +792,86 @@ module.exports = {
walletReceive: "Ricevi",
walletReset: "Ripristina",
walletSend: "Invia",
+ walletPayingTransfer: "Pagamento del transfer",
+ walletCreateTransferLabel: "Genera contratto (trasferimento)",
+ walletTransferNotifiedNote: "L'altra parte è stata avvisata di questo pagamento",
+ walletTransferCreatedNote: "È stato creato un transfer (ricevuta) per questo pagamento",
+ walletTransferNoPayeeNote: "Nessun abitante ha pubblicato questo indirizzo, nessun transfer creato",
+ walletTransferReceiptConcept: "Pagamento dal portafoglio",
+ walletPaymentPmText: "ti ha inviato un pagamento",
+ walletPayeeLabel: "Destinatario",
+ walletConceptLabel: "Causale",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Hai ricevuto il tuo RBU.",
+ bankingBotPaymentTitle: "Hai ricevuto un pagamento.",
+ bankingBotUbiPaidText: "Il tuo Reddito di Base Universale è stato pagato",
+ bankUbiPubThisNode: "Questo nodo paga il RBU",
+ bankUbiPubConnected: "PUB del RBU",
+ bankUbiPubNone: "Nessun PUB annuncia ancora il RBU nella tua rete",
+ bankUbiAddressPublished: "Indirizzo ECOin pubblicato",
+ bankUbiAddressMissing: "Pubblica il tuo indirizzo ECOin per ricevere il RBU",
+ bankUbiClaimedThisMonth: "Richiesto questo mese",
+ bankUbiPubBalance: "Portafoglio del PUB disponibile per il RBU",
+ bankNoPubAddress: "Il PUB del RBU non ha ancora pubblicato un indirizzo ECOin.",
+ bankUbiTab: "RBU",
+ bankDonateEco: "DONA!",
+ donateTooltip: "Dona ECOin",
+ bankNoUserAddress: "Questo abitante non condivide un indirizzo ECOin.",
+ bankUbiPubDefault: "Predefinito",
+ bankUbiPool: "Dotazione",
+ bankUbiLastSeen: "Visto l'ultima volta",
+ bankUbiLastPayout: "Ultima azione",
+ bankUbiPaidOut: "Distribuito",
+ bankRangeToday: "Oggi",
+ bankRangeWeek: "Settimana",
+ bankRangeMonth: "Mese",
+ bankRangeYear: "Anno",
+ bankRangeFiveYears: "5 anni",
+ bankRangeAll: "Tutto",
+ bankChartValueTitle: "Evoluzione del valore di ECOin",
+ bankChartValueHours: "Equivalenza in tempo (h)",
+ bankChartWealthTitle: "Redistribuzione della ricchezza ECOin",
+ bankChartDistributed: "RBU distribuito (ECO)",
+ bankChartRebalanceTitle: "Redistribuzione della ricchezza tra PUB",
+ bankChartRebalanced: "ECO spostati tra PUB",
+ bankChartTaxes: "Imposte trattenute (ECO)",
+ bankChartNoDataRange: "Nessun dato in questo intervallo.",
+ bankChartNoDataYet: "Ancora nessun dato",
+ bankChartPerHour: "all'ora",
+ bankChartPerDay: "al giorno",
+ bankChartPerMonth: "al mese",
+ bankTotalUbiDistributed: "RBU totale redistribuito (rete)",
+ bankTotalTaxesWithheld: "Imposte totali trattenute (rete)",
+ bankInflationIssuance: "Tasso di emissione (annuo, dalla ricompensa di blocco)",
+ bankRulesEligibilityTitle: "Chi può ricevere il RBU",
+ bankRulesEligibility1: "Un indirizzo ECOin pubblicato nel profilo (Profilo → Sensori → Portafoglio ECOin).",
+ bankRulesEligibility2: "Un feed con più di 30 giorni e attività nella rete: karma sopra lo zero.",
+ bankRulesEligibility3: "Una richiesta al mese (epoch), da Banking con il pulsante Richiedi RBU. Il mese in corso si può rifiutare con Rifiuta il RBU.",
+ bankRulesEligibility4: "La soglia di 1 ECO si paga sempre; le imposte riducono solo la parte che la supera e non si pagano mai a parte.",
+ bankRulesEligibility5: "Il PUB paga nel ciclo successivo e pubblica un trasferimento RBU che puoi confermare.",
+ bankRulesEligibility6: "Se manca l'indirizzo, il feed è troppo giovane, hai rifiutato il mese o il PUB non ha fondi, la richiesta viene saltata e registrata sul PUB.",
+ copyLinkTitle: "Copia link",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Rifiuta il RBU",
+ bankUbiRefusedThisMonth: "Hai rifiutato il RBU di questo mese.",
+ bankingBotUbiAvailableTitle: "Puoi richiedere il tuo RBU.",
+ bankingBotUbiAvailableText: "Il tuo RBU di questo mese è disponibile",
+ bankingBotConfirmTitle: "Hai uno smart-contract in attesa di conferma",
+ bankingBotConfirmText: "Smart-contract in attesa della tua conferma",
+ bankChartZoomHint: "Clicca per ingrandire",
+ bankChartPoolTitle: "Dotazione del RBU (nel tempo)",
+ bankChartNetworkUbiTitle: "RBU totale redistribuito (rete)",
+ bankChartSupplyTitle: "Offerta circolante di ECOin (nel tempo)",
+ bankChartInflationTitle: "Inflazione di ECOin (nel tempo)",
+ bankChartInflationSeries: "Tasso annualizzato (%)",
+ bankChartPool: "Dotazione totale (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (nel tempo)",
+ bankChartFundsTitle: "I tuoi fondi ECOin (nel tempo)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin connesso",
+ bankWalletNotConfigured: "ECOin disconnesso",
+ transfersPayWithWallet: "PAGA!",
walletStatus: "Stato",
walletDisconnected: [
"Portafoglio ECOin ",
@@ -685,8 +881,11 @@ module.exports = {
" o lo stato della connessione.",
],
walletSentToLine: ({ destination, amount }) => `Inviati ECO ${amount} a ${destination}`,
+ walletNotConfigured: "Il tuo portafoglio ECOin non è ancora configurato.",
walletSettingsDescription: "Integra Oasis con il tuo portafoglio ECOin.",
- walletSettingsDocLink: "Guida all'installazione di ECOin",
+ walletSettingsMobileDescription: "Collega Oasis all'app ECOin Wallet di questo dispositivo.",
+ walletDownloadEcoin: "Scarica ECOin!",
+ walletRpcUrl: "URL RPC",
walletStatusMessages: {
invalid_amount: "Importo non valido",
invalid_dest: "Indirizzo di destinazione non valido",
@@ -702,6 +901,7 @@ module.exports = {
walletUser: "Nome utente",
walletPass: "Password",
walletConfiguration: "Imposta portafoglio",
+ walletDisconnectButton: "Disconnetti wallet",
cipher: "Crittografia",
cipherTitle: "Crittografia",
cipherDescription: "Crittografa e decifra il tuo testo simmetricamente (usando una password condivisa).",
@@ -735,17 +935,16 @@ module.exports = {
bookmarkFilterRecent: "RECENTI",
bookmarkCreateButton: "Crea segnalibro",
bookmarkUpdateButton: "Aggiorna",
- bookmarkDeleteButton: "Elimina",
bookmarkAddFavoriteButton: "Aggiungi preferito",
bookmarkRemoveFavoriteButton: "Rimuovi preferito",
bookmarkUrlLabel: "Link",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Descrizione",
bookmarkDescriptionPlaceholder: "Opzionale",
bookmarkTagsLabel: "Tag",
bookmarkTagsPlaceholder: "Inserisci tag separati da virgole",
bookmarkLastVisitLabel: "Ultima visita",
- bookmarkSearchPlaceholder: "Cerca URL, tag, categoria, autore...",
+ bookmarkSearchPlaceholder: "Cerca in Segnalibri...",
bookmarkSortRecent: "Più recenti",
bookmarkSortOldest: "Più vecchi",
bookmarkSortTop: "Più votati",
@@ -784,7 +983,7 @@ module.exports = {
videoDescriptionPlaceholder: "Opzionale",
videoNoFile: "Nessun file video fornito",
noVideos: "Nessun video disponibile.",
- videoSearchPlaceholder: "Cerca titolo, tag, autore...",
+ videoSearchPlaceholder: "Cerca in Video...",
videoSortRecent: "Più recenti",
videoSortOldest: "Più vecchi",
videoSortTop: "Più votati",
@@ -807,7 +1006,6 @@ module.exports = {
documentFilterFavorites: "PREFERITI",
documentCreateButton: "Carica documento",
documentUpdateButton: "Aggiorna",
- documentDeleteButton: "Elimina",
documentAddFavoriteButton: "Aggiungi preferito",
documentRemoveFavoriteButton: "Rimuovi dai preferiti",
documentMessageAuthorButton: "PM",
@@ -820,7 +1018,7 @@ module.exports = {
documentDescriptionPlaceholder: "Opzionale",
documentNoFile: "Nessun file.",
noDocuments: "Nessun documento disponibile.",
- documentSearchPlaceholder: "Cerca titolo, tag, descrizione, autore...",
+ documentSearchPlaceholder: "Cerca in Documenti...",
documentSortRecent: "Più recenti",
documentSortOldest: "Più vecchi",
documentSortTop: "Più votati",
@@ -841,19 +1039,19 @@ module.exports = {
audioFilterTop: "TOP",
audioCreateButton: "Carica audio",
audioUpdateButton: "Aggiorna",
- audioDeleteButton: "Elimina",
audioAddFavoriteButton: "Aggiungi preferito",
audioRemoveFavoriteButton: "Rimuovi preferito",
audioFileLabel: "Seleziona un file audio (.mp3, .wav, .ogg)",
audioTagsLabel: "Tag",
audioTagsPlaceholder: "Inserisci tag separati da virgole",
+ tagsPlaceholder: "Inserisci tag separati da virgole",
audioTitleLabel: "Titolo",
audioTitlePlaceholder: "Opzionale",
audioDescriptionLabel: "Descrizione",
audioDescriptionPlaceholder: "Opzionale",
audioNoFile: "Nessun file audio fornito",
noAudios: "Nessun audio disponibile.",
- audioSearchPlaceholder: "Cerca titolo, tag, autore...",
+ audioSearchPlaceholder: "Cerca in Audio...",
audioSortRecent: "Più recenti",
audioSortOldest: "Più vecchi",
audioSortTop: "Più votati",
@@ -865,7 +1063,7 @@ module.exports = {
audioFilterFavorites: "PREFERITI",
favoritesTitle: "Preferiti",
favoritesDescription: "Tutti i tuoi contenuti preferiti in un unico posto.",
- favoritesSearchPlaceholder: "Cerca nei preferiti...",
+ favoritesSearchPlaceholder: "Cerca in Preferiti...",
favoritesFilterAll: "TUTTI",
favoritesFilterRecent: "RECENTI",
favoritesFilterAudios: "AUDIO",
@@ -877,13 +1075,12 @@ module.exports = {
favoritesFilterChats: "CHAT",
favoritesFilterCalendars: "CALENDARI",
favoritesFilterVideos: "VIDEO",
- favoritesRemoveButton: "Rimuovi dai preferiti",
favoritesNoItems: "Nessun preferito ancora.",
yourContacts: "I tuoi contatti",
allInhabitants: "Abitanti",
allCVs: "CV",
discoverPeople: "Scopri abitanti nella tua rete.",
- searchInhabitantsPlaceholder: "FILTRA abitanti PER NOME …",
+ searchInhabitantsPlaceholder: "Cerca in Abitanti...",
filterLocation: "FILTRA abitanti PER POSIZIONE …",
filterLanguage: "FILTRA abitanti PER LINGUA …",
filterSkills: "FILTRA abitanti PER COMPETENZE …",
@@ -907,7 +1104,6 @@ module.exports = {
topSectionTitle: "TOP",
blockedLabel: "Abitante bloccato",
inhabitantviewDetails: "Vedi dettagli",
- cvVisitButton: "Visita il CV",
keepReading: "Continua a leggere...",
oasisId: "ID",
noInhabitantsFound: "Nessun abitante trovato ancora.",
@@ -925,6 +1121,18 @@ module.exports = {
parliamentFilterLeaders: "LEADER",
parliamentFilterRules: "REGOLE",
parliamentGovernmentCard: "Governo attuale",
+ parliamentSeatsGovernment: "Governo",
+ parliamentSeatsOpposition: "Opposizione",
+ parliamentSeatsAbstention: "Astensione",
+ parliamentSeatsQuorum: "Quorum elettorale",
+ parliamentSeatsPass: "Soglia di approvazione",
+ parliamentSeatsByElection: "Per elezione",
+ parliamentSeatsByHouses: "Per casa del LARP",
+ parliamentSeatsSeats: "seggi",
+ parliamentSeatsSeat: "seggio",
+ parliamentSeatsLeader: "Leader",
+ parliamentSeatsVotesFor: "voti per",
+ parliamentSeatsNoHouse: "Senza casa",
parliamentActorInPowerInhabitant: 'ABITANTE AL POTERE',
parliamentActorInPowerTribe: 'TRIBÙ AL POTERE',
parliamentHistoricalGovernmentsTitle: 'GOVERNI',
@@ -975,7 +1183,7 @@ module.exports = {
parliamentMethodKARMATOCRACY: "Karmatocrazia",
parliamentThId: "ID",
parliamentThProposalDate: "Data proposta",
- parliamentThMethod: "Method",
+ parliamentThMethod: "Metodo",
parliamentThKarma: "Karma",
parliamentThSupports: "Supporti",
parliamentThVote: "Voto",
@@ -992,6 +1200,7 @@ module.exports = {
parliamentTimeRemaining: "Tempo rimanente",
parliamentElectionsStatusTitle: "Prossimo governo",
parliamentProposalDeadlineLabel: "Scadenza",
+ parliamentViewReport: "Vedi rapporto",
parliamentProposalTimeLeft: "Tempo rimanente",
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.",
@@ -1006,6 +1215,7 @@ module.exports = {
parliamentRulesLaws: "Quando una proposta raggiunge la soglia, diventa una Legge e appare nella scheda Leggi con la data di emanazione.",
parliamentRulesHistorical: "Nella scheda Storico puoi vedere ogni ciclo di governo avvenuto e i dati sulla sua gestione.",
parliamentRulesLeaders: "Nella scheda Leader puoi vedere una classifica degli abitanti/tribù che hanno governato (o si sono candidati), ordinata per efficienza.",
+ parliamentRulesHemicycle: "L'emiciclo assegna un seggio per abitante: il blocco di governo (gli elettori della candidatura vincente e il leader), un blocco di opposizione per ogni altra candidatura del ciclo, e l'astensione. I segni tratteggiati indicano il quorum elettorale (25% del censimento) e la soglia di approvazione del metodo in vigore. \"Per casa del LARP\" colora gli stessi seggi per casa.",
parliamentProposalVoteStatusLabel: "Stato del voto",
parliamentProposalOnTrackYes: "Soglia raggiunta",
parliamentProposalOnTrackNo: "Sotto la soglia",
@@ -1019,6 +1229,7 @@ module.exports = {
courtsCaseFormTitle: "Apri caso",
courtsCaseRespondent: "Accusato / Convenuto",
courtsCaseRespondentPh: "Oasis ID (@...) o nome tribù",
+ courtsCaseSubjectPlaceholder: "Oggetto o breve descrizione",
courtsCaseMethod: "Metodo di risoluzione",
courtsCaseSubmit: "Presenta caso",
courtsNominateJudge: "Nomina giudice",
@@ -1052,15 +1263,30 @@ module.exports = {
courtsMethodDICTATOR: "Dittatore",
courtsMethodPOPULAR: "Popolare",
courtsMethodKARMATOCRACY: "Karmatocrazia",
+ courtsCaseType: "Tipo di caso",
+ courtsPresetMinorConflict: "Conflitto lieve",
+ courtsPresetModerateConflict: "Conflitto moderato",
+ courtsPresetSevereConflict: "Conflitto grave",
+ courtsPresetHarassment: "Molestie o abusi",
+ courtsPresetContentModeration: "Moderazione dei contenuti",
+ courtsPresetBanRestriction: "Espulsione o restrizione",
+ courtsPresetGovernanceDispute: "Controversia di governance",
+ courtsStatusOPEN: "Aperto",
+ courtsStatusIN_PROGRESS: "In corso",
+ courtsStatusDECIDED: "Deciso",
+ courtsStatusCLOSED: "Chiuso",
+ courtsStatusSOLVED: "Risolto",
+ courtsStatusUNSOLVED: "Irrisolto",
+ courtsStatusDISCARDED: "Scartato",
courtsRulesTitle: "Come funzionano i Tribunali",
courtsRulesIntro: "I Tribunali sono un processo gestito dalla comunità per risolvere i conflitti e promuovere la giustizia riparativa. Dialogo, prove chiare e rimedi proporzionali hanno la priorità.",
courtsRulesLifecycle: "Processo: 1) Apri caso 2) Seleziona metodo 3) Presenta prove 4) Udienza e deliberazione 5) Verdetto e rimedio 6) Adempimento e chiusura 7) Appello (se applicabile).",
- courtsRulesRoles: "Accusatore: apre il caso. Difesa: persona o tribù accusata. Metodo: meccanismo scelto dalla comunità per facilitare, valutare le prove ed emettere un verdetto. Testimone: fornisce testimonianza o prove. Mediatori: persone neutrali invitate dall'accusatore e/o dalla difesa, con accesso a tutti i dettagli, che aiutano a de-escalare il conflitto e co-creare accordi.",
+ courtsRulesRoles: "Accusatore: apre il caso. Difesa: abitante o tribù accusata. Metodo: meccanismo scelto dalla comunità per facilitare, valutare le prove ed emettere un verdetto. Testimone: fornisce testimonianza o prove. Mediatori: abitanti neutrali invitati dall'accusatore e/o dalla difesa, con accesso a tutti i dettagli, che aiutano a de-escalare il conflitto e co-creare accordi.",
courtsRulesEvidence: "Descrizione fino a 1000 caratteri. Allega immagini, audio, video e documenti PDF pertinenti e leciti. Non condividere dati privati sensibili senza consenso.",
courtsRulesDeliberation: "Le udienze possono essere pubbliche o private. I giudici assicurano il rispetto, richiedono chiarimenti e possono scartare materiale irrilevante o illecito.",
courtsRulesVerdict: "La riparazione è prioritaria: scuse, accordi di mediazione, moderazione dei contenuti, restrizioni temporanee o altre misure proporzionali. La motivazione deve essere registrata.",
courtsRulesAppeals: "Appello: consentito quando ci sono nuove prove o un chiaro errore procedurale. Deve essere presentato entro 7 giorni salvo diversa indicazione.",
- courtsRulesPrivacy: "Rispetta la privacy e la sicurezza. Doxing, odio o minacce vengono rimossi. I giudici possono modificare o sigillare parti del verbale per proteggere le persone a rischio.",
+ courtsRulesPrivacy: "Rispetta la privacy e la sicurezza. Doxing, odio o minacce vengono rimossi. I giudici possono modificare o sigillare parti del verbale per proteggere gli abitanti a rischio.",
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",
@@ -1076,12 +1302,16 @@ module.exports = {
exploreTrending: "Esplora i contenuti più popolari nella tua rete.",
votesButton: "VOTAZIONI",
shopProductButton: "NEGOZIO",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISODIO",
+ campaignButton: "CAMPAGNA",
+ logisticsRouteButton: "PERCORSO",
trendingTotalOpinions: "Opinioni totali",
trendingNoContentMessage: "Ancora nessuna tendenza.",
trendingTotalCount: "Conteggio totale",
tasksTitle: "Compiti",
tasksDescription: "Scopri e gestisci compiti nella tua rete.",
- taskSearchPlaceholder: "Cerca attività...",
+ taskSearchPlaceholder: "Cerca in Compiti...",
taskTitleLabel: "Titolo",
taskDescriptionLabel: "Descrizione",
taskStartTimeLabel: "Ora di inizio",
@@ -1100,7 +1330,7 @@ module.exports = {
taskStatusOpen: "Apri",
taskStatusInProgress: "In corso",
taskStatusClosed: "Chiuso",
- taskAssignedTo: "Assegnato a",
+ taskAssignedTo: "Assegnato",
taskAssignedChip: "Assegnata",
taskUnassignedChip: "Non assegnata",
taskAssignees: "Assegnatari",
@@ -1110,6 +1340,7 @@ module.exports = {
taskUpdateButton: "Aggiorna",
taskDeleteButton: "Elimina",
taskFilterAll: "TUTTI",
+ taskFilterRecent: "RECENTI",
taskFilterMine: "MIEI",
taskFilterOpen: "APERTI",
taskFilterInProgress: "IN CORSO",
@@ -1137,14 +1368,13 @@ module.exports = {
eventUpcomingDates: "Prossime date",
eventsTitle: "Eventi",
eventsDescription: "Scopri e gestisci eventi nella tua rete.",
- eventSearchPlaceholder: "Cerca eventi...",
+ eventSearchPlaceholder: "Cerca in Eventi...",
eventPrice: "Prezzo",
eventStatus: "Stato",
eventAllSectionTitle: "Eventi",
eventMineSectionTitle: "I tuoi eventi",
eventCreateSectionTitle: "Crea evento",
eventUpdateSectionTitle: "Aggiorna evento",
- eventDeleteButton: "Elimina",
eventCreateButton: "Crea evento",
eventAddToCalendar: "Aggiungi al calendario",
eventVisitCalendar: "Vai al calendario",
@@ -1162,11 +1392,11 @@ module.exports = {
viewPlace: "Vedi Luogo",
generatePdf: "Genera PDF",
sharePm: "Condividi via MP",
- galleryImages: "Immagini (dimensione max: 50MB ciascuna)",
+ galleryImages: "Immagini (dimensione max: 75MB ciascuna)",
galleryPhotos: "Immagini",
galleryAddPhoto: "Aggiungi Immagine",
galleryRemovePhoto: "Rimuovi",
- galleryVideo: "Video (dimensione max: 50MB)",
+ galleryVideo: "Video (dimensione max: 75MB)",
galleryAddVideo: "Aggiungi Video",
galleryRemoveVideo: "Rimuovi video",
viewVotation: "Visualizza votazione",
@@ -1186,6 +1416,7 @@ module.exports = {
eventDate: "Data",
eventAttendButton: "Partecipa all'evento",
eventFilterAll: "TUTTI",
+ eventFilterRecent: "RECENTI",
eventFilterMine: "MIEI",
eventFilterToday: "OGGI",
eventFilterWeek: "QUESTA SETTIMANA",
@@ -1212,7 +1443,7 @@ module.exports = {
tagsFilterTop: "TOP",
tagsFilterCloud: "NUVOLA",
tagsNoItems: "Nessun tag disponibile.",
- tagsSearchPlaceholder: "Cerca etichette...",
+ tagsSearchPlaceholder: "Cerca in Tag...",
tagsTableHeaderTag: "TAG/LINK:",
tagsTableHeaderCount: "CONTATORE:",
transfersTitle: "Trasferimenti",
@@ -1220,7 +1451,10 @@ module.exports = {
transfersFrom: "Da",
transfersTo: "A",
transfersFilterAll: "TUTTI",
+ transfersFilterRecent: "RECENTI",
transfersFilterMine: "MIEI",
+ transfersFilterMinePending: "IN ATTESA",
+ transfersFilterMineConfirmed: "FIRMATI",
transfersFilterUBI: "RBU",
transfersFilterMarket: "MERCATO",
transfersFilterTop: "TOP",
@@ -1235,7 +1469,6 @@ module.exports = {
transfersCategoryEconomic: "Economica",
transfersCategoryTime: "Tempo",
transfersCategoryTrust: "Fiducia",
- transfersCategoryApply: "Applica",
transfersUnitEco: "ECO",
transfersUnitHours: "h",
transfersUnitTrust: "fiducia",
@@ -1265,7 +1498,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Trasferimenti scartati",
transfersCreateSectionTitle: "Crea trasferimento",
transfersAllSectionTitle: "Trasferimenti",
- transfersSearchPlaceholder: "Cerca concetto, tag, abitanti...",
+ transfersSearchPlaceholder: "Cerca in Trasferimenti...",
transfersMinAmountLabel: "Importo minimo",
transfersMaxAmountLabel: "Importo massimo",
transfersSortRecent: "Più recenti",
@@ -1287,6 +1520,7 @@ module.exports = {
voteErrorTitle: "Controlla il modulo",
voteErrorDeadlineMin: "La scadenza deve essere di almeno {days} giorni da ora.",
voteErrorGeneric: "Non è stato possibile salvare la votazione.",
+ voteLocked: "Questa votazione ha già ricevuto voti o opinioni, o appartiene al Parlamento o ai Tribunali: non si può più modificare né eliminare.",
voteUpdateButton: "Aggiorna",
voteDeleteButton: "Elimina",
voteOptionYes: "SÌ",
@@ -1296,6 +1530,7 @@ module.exports = {
voteFollowMajority: "SEGUI MAGGIORANZA",
voteNotInterested: "NON INTERESSATO",
voteFilterAll: "TUTTI",
+ voteFilterRecent: "RECENTI",
voteFilterMine: "MIEI",
voteFilterOpen: "APERTE",
voteFilterClosed: "CHIUSE",
@@ -1311,7 +1546,6 @@ module.exports = {
voteTags: "Tag",
voteOpinions: "Opinioni",
novotes: "Nessuna proposta di voto disponibile.",
- voteBy: "Di",
voteCreatedAt: "Creato il",
voteNoQuestion: "Nessuna domanda fornita",
voteUnknownCreator: "Creatore sconosciuto",
@@ -1321,6 +1555,7 @@ module.exports = {
voteCommentsForumButton: 'Apri discussione',
voteCommentsSectionTitle: 'Apri discussione',
voteNoCommentsYet: 'Non ci sono ancora commenti. Sii il primo a rispondere.',
+ commentsGoToLast: "Vai all'ultimo commento",
voteNewCommentPlaceholder: 'Scrivi il tuo commento qui…',
voteNewCommentButton: 'Pubblica commento',
voteNewCommentLabel: 'Aggiungi un commento',
@@ -1331,6 +1566,8 @@ module.exports = {
cvNameLabel: "Nome completo",
cvDescriptionLabel: "Riepilogo",
cvPhotoLabel: "Foto",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Visita il CV",
cvPersonalExperiencesLabel: "Esperienze personali",
cvPersonalSkillsLabel: "Competenze personali (separate da virgole)",
cvOasisExperiencesLabel: "Esperienze di contributo Oasis",
@@ -1360,9 +1597,9 @@ module.exports = {
cvNoCV: "Nessun CV trovato.",
blogSubject: "Oggetto",
blogMessage: "Messaggio",
- blogImage: "Carica media (max: 50MB)",
+ blogImage: "Carica media (max: 75MB)",
blogMedia: "Allegati (fino a 8 immagini e un video)",
- blogPublish: "Anteprima",
+ blogPublish: "Pubblica",
pollsTitle: "Sondaggi",
dataTitle: "Corrispondenze",
dataDescription: "Esplora e visualizza le corrispondenze della tua rete.",
@@ -1381,12 +1618,23 @@ module.exports = {
dataKindTasks: "COMPITI",
dataKindReports: "RAPPORTI",
dataKindVotes: "VOTAZIONI",
- dataSearchPlaceholder: "Cerca nei dati incrociati...",
+ dataSearchPlaceholder: "Cerca in Corrispondenze...",
dataCohesionTitle: "Coefficiente di coesione (CC)",
dataCcShort: "CC",
dataCohesionHint: "Affinità media fra tutto ciò che la rete ha pubblicato.",
dataAffinity: "Affinità",
dataCommonTerms: "Parola chiave",
+ dataReasonFollowing: "Supporti questo abitante",
+ dataReasonTribe: "Condivide una tribù con te",
+ dataReasonPinned: "Coincide con qualcosa che hai fissato",
+ dataReasonCv: "Corrisponde alle competenze del tuo CV",
+ dataReasonContent: "Legato a ciò che pubblichi",
+ dataReasonRelated: "Legato ai tuoi interessi",
+ dataReasonAlike: "Pubblicato da un abitante affine a te",
+ dataReasonSupportsYou: "Ti supporta",
+ dataReasonMutual: "Supporto reciproco",
+ dataReasonRated: "Ben valutato dalla rete",
+ dataReasonNear: "Vicino a te",
dataStatPeople: "CV",
dataStatConnected: "Collegati",
dataStatSkills: "Competenze",
@@ -1439,7 +1687,7 @@ module.exports = {
pollStatusLabel: "Stato",
pollStatusOpen: "APERTO",
pollStatusClosed: "CHIUSO",
- pollSearchPlaceholder: "Cerca sondaggi...",
+ pollSearchPlaceholder: "Cerca in Sondaggi...",
pollsNoItems: "Nessun sondaggio trovato.",
viewPoll: "Vedi Sondaggio",
pollChatCreate: "Crea Sondaggio",
@@ -1452,7 +1700,7 @@ module.exports = {
blogFilterFavorites: "PREFERITI",
blogFilterTop: "TOP",
blogCreateButton: "Crea Blog",
- blogSearchPlaceholder: "Cerca blog...",
+ blogSearchPlaceholder: "Cerca in Blog...",
blogComments: "Commenti",
blogAllowComments: "Consenti commenti",
blogCommentsClosed: "L'autore ha chiuso i commenti di questo blog.",
@@ -1465,12 +1713,11 @@ module.exports = {
forumCreateButton: "Crea forum",
forumCreateSectionTitle: "Crea forum",
forumDescription: "Parla apertamente con altri abitanti nella tua rete.",
- forumSearchPlaceholder: "Cerca forum...",
+ forumSearchPlaceholder: "Cerca in Forum...",
forumFilterAll: "TUTTI",
forumFilterMine: "MIEI",
forumFilterRecent: "RECENTI",
forumFilterTop: "TOP",
- forumDeleteButton: "Elimina",
forumParticipants: "partecipanti",
forumMessages: "messaggi",
forumMessageLabel: "Messaggio",
@@ -1497,7 +1744,6 @@ module.exports = {
imageFilterGallery: "GALLERIA",
imageCreateButton: "Carica immagine",
imageUpdateButton: "Aggiorna",
- imageDeleteButton: "Elimina",
imageAddFavoriteButton: "Aggiungi preferito",
imageRemoveFavoriteButton: "Rimuovi preferito",
imageFileLabel: "Seleziona un file immagine (.jpeg, .jpg, .png, .gif)",
@@ -1509,13 +1755,14 @@ module.exports = {
imageDescriptionPlaceholder: "Opzionale",
imageNoFile: "Nessun file immagine fornito",
noImages: "Nessuna immagine disponibile.",
- imageSearchPlaceholder: "Cerca titolo, tag, descrizione, autore...",
+ imageSearchPlaceholder: "Cerca in Immagini...",
imageSortRecent: "Più recenti",
imageSortOldest: "Più vecchie",
imageSortTop: "Più votate",
imageSearchButton: "Cerca",
imageUpdatedAt: "Aggiornato",
imageNoMatch: "Nessuna immagine corrisponde alla ricerca.",
+ feedSearchPlaceholder: "Cerca in Feed...",
feedTitle: "Feed",
createFeedTitle: "Crea Feed",
createFeedButton: "Invia Feed!",
@@ -1530,7 +1777,7 @@ module.exports = {
alreadyRefeeded: "Hai già fatto il refeed.",
activityTitle: "Attività",
yourActivity: "La tua attività",
- globalActivity: "Attività globale",
+ globalActivity: "Attività",
activityList: "Attività",
activityDesc: "Vedi l'ultima attività nella tua rete.",
allButton: "TUTTI",
@@ -1545,7 +1792,8 @@ module.exports = {
meme: "Meme",
typeRecent: "RECENTI",
typeTop: "TOP",
- typePost: "BLOGS",
+ typePost: "BLOG",
+ activityUpdateLabel: "AGGIORNAMENTO",
typeTribe: "TRIBÙ",
typeLarp: "L.A.R.P.",
typeInhabitants: "ABITANTI",
@@ -1570,10 +1818,10 @@ module.exports = {
typeFeed: "FEEDS",
typeContact: "CONTATTO",
typePub: "PUB",
- typeTombstone: "TOMBSTONE",
+ typeTombstone: "ELIMINATO",
typeBanking: "BANCA",
typeBankWallet: "BANCA/PORTAFOGLIO",
- typeBankClaim: "BANCA/UBI",
+ typeBankClaim: "BANCA/RBU",
typeKarmaScore: "KARMA",
typeParliament: "PARLAMENTO",
typeSpread: "DIFFUSIONI",
@@ -1582,7 +1830,7 @@ module.exports = {
typeParliamentProposal:"Parlamento · Proposta",
typeParliamentRevocation:"Parlamento · Revoca",
typeParliamentLaw: "Parlamento · Nuova legge",
- typeCourts: "COURTS",
+ typeCourts: "TRIBUNALI",
typeCourtsCase: "Tribunali · Caso",
typeCourtsEvidence: "Tribunali · Prova",
typeCourtsAnswer: "Tribunali · Risposta",
@@ -1608,7 +1856,7 @@ module.exports = {
location: "Posizione",
contentWarning: "Oggetto",
bankWalletConnected: "Portafoglio ECOin",
- bankUbiReceived: "UBI ricevuto",
+ bankUbiReceived: "RBU ricevuto",
bankTx: "Tx",
bankEpochShort: "Epoca",
bankingUserEngagementScore: "Punteggio KARMA",
@@ -1620,9 +1868,9 @@ module.exports = {
unfollowing: "NON SEGUENDO",
pledged: "CONTRIBUITO",
parliamentCandidatureId: "Candidature",
- parliamentGovMethod: "Method",
- parliamentVotesReceived: "Votes received",
- parliamentMethodANARCHY: "Anarchy",
+ parliamentGovMethod: "Metodo",
+ parliamentVotesReceived: "Voti ricevuti",
+ parliamentMethodANARCHY: "Anarchia",
parliamentMethodVOTE: "Voto comunitario",
parliamentMethodRANKED: "Scelta graduata",
parliamentMethodPLURALITY: "Pluralità",
@@ -1680,7 +1928,7 @@ module.exports = {
courtsNoCases: 'Nessun caso.',
reportsTitle: "Rapporti",
reportsDescription: "Gestisci e segui le segnalazioni della tua rete.",
- reportsSearchPlaceholder: "Cerca segnalazioni...",
+ reportsSearchPlaceholder: "Cerca in Rapporti...",
reportsFilterAll: "TUTTI",
reportsFilterRecent: "RECENTI",
reportsFilterTop: "TOP",
@@ -1728,7 +1976,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Segnalazioni in revisione",
reportsResolvedSectionTitle: "Segnalazioni risolte",
reportsInvalidSectionTitle: "Segnalazioni non valide",
- reportsTemplateSectionTitle: 'Modello di segnalazione',
reportsBugTemplateTitle: 'Dettagli di riproduzione (Bug)',
reportsFeatureTemplateTitle: 'Dettagli (Funzionalità)',
reportsAbuseTemplateTitle: 'Dettagli (Abuso)',
@@ -1788,17 +2035,15 @@ module.exports = {
tribeGallerySectionTitle: "Galleria tribù",
tribeRecentSectionTitle: "Tribù recenti",
tribeTopSectionTitle: "Tribù popolari",
- tribeviewTribeButton: "Visita tribù",
- tribeviewSubTribeButton: "Visita Sotto-Tribù",
tribeRootLabel: "RADICE",
tribeDescription: "Esplora o crea tribù nella tua rete.",
tribeMainTribeLabel: "TRIBÙ PRINCIPALE",
tribeCreateButton: "Crea tribù",
tribeUpdateButton: "Aggiorna",
tribeDeleteButton: "Elimina",
- tribeImageLabel: "Carica media (max: 50MB)",
+ tribeImageLabel: "Carica media (max: 75MB)",
tribeTitleLabel: "Titolo",
- searchTribesPlaceholder: "FILTRA tribù PER NOME …",
+ searchTribesPlaceholder: "Cerca in Tribù...",
tribeTitlePlaceholder: "Nome della tribù",
tribeDescriptionLabel: "Descrizione",
tribeDescriptionPlaceholder: "Descrivi questa tribù",
@@ -1811,6 +2056,15 @@ module.exports = {
tribeIsAnonymousLabel: "STATO",
tribeMembersCount: "Membri",
tribeEnterInvite: "INSERISCI CODICE",
+ subscriptionTitle: "Iscrizioni",
+ subscriptionOn: "Iscritto",
+ subscriptionOff: "Non iscritto",
+ subscriptionSubscribe: "Iscriviti",
+ subscriptionUnsubscribe: "Annulla iscrizione",
+ subscriptionSubscribers: "Iscritti",
+ pmListLabel: "Invia a",
+ pmListNone: "— Nessuna lista —",
+ pmListNoSubscribers: "Nessun iscritto",
tribeLeaveButton: "ESCI",
tribePublic: "PUBBLICO",
tribePrivate: "PRIVATO",
@@ -1843,16 +2097,16 @@ module.exports = {
tribeSectionVideos: "VIDEO",
tribeSectionDocuments: "DOCUMENTI",
tribeSectionBookmarks: "SEGNALIBRI",
- tribeSectionMaps: "MAPS",
- tribeSectionPads: "PADS",
- tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionMaps: "MAPPE",
+ tribeSectionPads: "PAD",
+ tribeSectionChats: "CHAT",
+ tribeSectionCalendars: "CALENDARI",
+ tribePadCreate: "Crea pad",
+ tribeChatCreate: "Crea chat",
+ tribeCalendarCreate: "Crea calendario",
+ tribePadsEmpty: "Ancora nessun pad.",
+ tribeChatsEmpty: "Ancora nessuna chat.",
+ tribeCalendarsEmpty: "Ancora nessun calendario.",
tribeInhabitantsEmpty: "Nessun abitante in questa tribù.",
tribeEventCreate: "Crea evento",
tribeEventsEmpty: "Nessun evento.",
@@ -1907,9 +2161,14 @@ module.exports = {
tribeMediaTypeDocument: "Documento",
tribeMediaTypeBookmark: "Segnalibro",
tribeContentDelete: "ELIMINA",
+ tribeReachTribe: "TRIBÙ",
+ tribeReachNotice: "OASIS lo mostra a tutti gli abitanti e CLEARNET anche sul web aperto. Aprirlo lascia una copia leggibile fuori dalla tribù: tornare a TRIBÙ lo nasconde, ma le copie già condivise non possono essere cancellate.",
+ tribeReachPrivate: "Il contenuto di una tribù privata può restare solo dentro la tribù.",
+ tribeReachOpenedBy: "Aperto da",
+ tribeReachChange: "Dove viene pubblicato",
tribeInviteCodeText: "Codice invito: ",
oasisVersionLabel: "Versione di Oasis",
- tribeInviteCodeHint: "Condividi questo codice con chi vuoi invitare. Può unirsi tramite /invites → Tribes.",
+ tribeInviteCodeHint: "Condividi questo codice con chi vuoi invitare. Può unirsi tramite /invites.",
tribeStatusOpen: "APERTO",
tribeStatusClosed: "CHIUSO",
tribeStatusInProgress: "IN CORSO",
@@ -1949,7 +2208,7 @@ module.exports = {
tribeSearchMinChars: "Inserisci almeno 2 caratteri per cercare.",
agendaTitle: "Agenda",
agendaDescription: "Qui trovi tutti gli elementi assegnati a te.",
- agendaSearchPlaceholder: "Cerca nell'agenda...",
+ agendaSearchPlaceholder: "Cerca in Agenda...'agenda...",
agendaFilterAll: "TUTTI",
agendaFilterToday: "OGGI",
agendaFilterUpcoming: "PROSSIMI",
@@ -1970,6 +2229,7 @@ module.exports = {
agendaNoItems: "Nessun incarico trovato.",
agendaDiscardButton: "Scarta",
agendaRestoreButton: "Ripristina",
+ agendaRemoveButton: "Rimuovi",
agendaMembersCount: "Membri",
agendaLocationLabel: "Posizione",
agendaYes: "SÌ",
@@ -1985,7 +2245,7 @@ module.exports = {
agendaTransferDeadline: "Scadenza",
opinionsTitle: "Opinioni",
shareYourOpinions: "Scopri e vota opinioni nella tua rete.",
- author: "By",
+ author: "Di",
voteNow: "Vota ora",
alreadyVoted: "Hai già espresso un'opinione.",
noOpinionsFound: "Nessuna opinione trovata.",
@@ -2036,8 +2296,8 @@ module.exports = {
pmComposeTitle: "Invia un messaggio",
pmRecipients: "Destinatari",
pmRecipientsHint: "Inserisci Oasis ID separati da virgole",
- pmLimitsHint: "Fino a 7 destinatari per messaggio.",
- pmTextPlaceholder: "Corpo limitato a 7000 caratteri.",
+ pmLimitsHint: "Fino a 7 abitanti per messaggio.",
+ pmTextPlaceholder: "Scrivi il tuo messaggio.",
pmSubject: "Oggetto",
pmSubjectHint: "Inserisci l'oggetto del messaggio",
pmText: "Messaggio",
@@ -2059,8 +2319,8 @@ module.exports = {
pmCrypterCharsLabel: "caratteri",
pmInvalidRecipients: "Oasis ID non valido (dovrebbe essere tipo @…=.ed25519).",
pmEncryptionLabel: "Cifratura",
- private: "Privato",
- privateDescription: "I tuoi messaggi crittografati.",
+ private: "Posta in arrivo",
+ privateDescription: "Gestisci i tuoi messaggi privati.",
privateInbox: "POSTA IN ARRIVO",
privateSent: "INVIATI",
privateDelete: "Elimina",
@@ -2095,7 +2355,7 @@ module.exports = {
inboxProjectPledgedTitle: "Nuovo contributo al tuo progetto",
pmHasPledged: "ha contribuito",
pmToYourProject: "al tuo progetto",
- blockchain: 'BlockExplorer',
+ blockchain: "Esploratore di blocchi",
blockchainDescription: 'Esplora e visualizza i blocchi nella blockchain.',
blockchainNoBlocks: 'Nessun blocco trovato nella blockchain.',
blockchainStatsTitle: 'Statistiche',
@@ -2116,24 +2376,24 @@ module.exports = {
visitContent: "Visita il Contenuto",
favoriteAdd: "Aggiungi ai Preferiti",
pmContentTooltip: "Invia un Messaggio Privato",
+ phoneCallTooltip: "Fai una Chiamata",
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.",
+ banking: "Banca",
+ bankingTitle: "Banca",
+ bankingDescription: "L'economia collettiva di ECOin.",
bankOverview: 'Panoramica',
bankEpochs: 'Epoche',
bankRules: 'Regole',
pending: 'In attesa',
closed: 'Chiuso',
- bankViewTx: 'Vedi Tx',
bankClaimNow: 'Riscuoti ora',
- bankClaimUBI: 'Richiedi RBU!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: 'Richiedi RBU',
+ bankClaimAndPay: "Richiedi e paga",
+ bankClaimedPending: "Richiesta in sospeso...",
+ bankStatusClaimed: "Richiesto",
+ bankStatusExpired: "Scaduto",
+ bankPubOnly: "Operazione solo per PUB",
bankEpoch: 'Epoca',
bankPool: 'Pool (questa epoca)',
bankWeightsSum: 'Somma dei pesi',
@@ -2152,8 +2412,8 @@ module.exports = {
bankViewEpoch: 'Vedi epoca',
bankYourIndustryBalance: "La tua quota industriale",
bankYourUbiMonth: "Il tuo RBU (questo mese)",
- bankYourFundsMonth: "I tuoi fondi (questo mese)",
- bankIndustryBalance: "Produzione industriale (stimata)",
+ bankYourFundsMonth: "Fondi totali",
+ bankIndustryBalance: "Produzione industriale",
bankUserBalance: 'Il tuo saldo',
bankAddresses: 'Indirizzi',
bankNoAddresses: 'Nessun indirizzo trovato.',
@@ -2161,6 +2421,10 @@ module.exports = {
bankAddress: 'Indirizzo',
bankAddAddressTitle: 'Aggiungi indirizzo ECOIN',
bankAddAddressUser: 'Oasis ID',
+ bankAddAddressLabel: "Etichetta (facoltativa)",
+ bankAddAddressLabelPlaceholder: "Portafoglio di Bob, negozio di Alice…",
+ bankAddAddressUserOptional: "Oasis ID (facoltativo)",
+ bankAddressUnnamed: "Indirizzo senza nome",
bankAddAddressAddress: 'Indirizzo ECOIN',
bankAddAddressSave: 'Salva',
bankAddressAdded: 'Indirizzo aggiunto',
@@ -2178,11 +2442,11 @@ module.exports = {
bankAddressDeleteConfirm: 'Eliminare questo indirizzo?',
search: 'Cerca!',
bankLocal: 'Locale',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Rete",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "NESSUN FONDO!",
bankUbiAvailableOk: "DISPONIBILE!",
- bankUbiAvailability: "RBU (rete)",
+ bankUbiAvailability: "RBU",
bankAlreadyClaimedThisMonth: "Già richiesto questo mese",
bankUbiThisMonth: "RBU (questo mese)",
bankUbiLastClaimed: "RBU (ultima richiesta)",
@@ -2212,6 +2476,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Cifrato in transito",
shopAddFavorite: "Aggiungi Preferito",
shopRemoveFavorite: "Rimuovi Preferito",
shopOpen: "APERTO",
@@ -2219,6 +2484,13 @@ module.exports = {
shopMakePrivate: "RENDI PRIVATO (E2E)",
shopMakePublic: "RENDI PUBBLICO",
shopProducts: "Prodotti",
+ shopFilterAll: "TUTTI",
+ shopFilterRecent: "RECENTI",
+ shopFilterMine: "MIEI",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODOTTI",
+ shopFilterPrices: "PREZZI",
+ shopFilterFavorites: "PREFERITI",
shopProductAdd: "Aggiungi Prodotto",
shopProductTitle: "Prodotto",
shopProductUpdate: "Aggiorna Prodotto",
@@ -2246,7 +2518,7 @@ module.exports = {
marketVisitItem: "VEDI OGGETTO",
shopStatus: "STATO",
shopCreatedAt: "CREATO",
- shopSearchPlaceholder: "Cerca negozi...",
+ shopSearchPlaceholder: "Cerca in Negozi...",
shopUrl: "URL",
shopLocation: "Posizione",
shopTags: "Tag",
@@ -2256,16 +2528,18 @@ module.exports = {
shopTitlePlaceholder: "Nome del tuo negozio",
shopDescriptionPlaceholder: "Descrizione dettagliata del tuo negozio",
shopLocationPlaceholder: "Città, Paese",
- shopTagsPlaceholder: "tag1, tag2, tag3",
+ shopTagsPlaceholder: "Inserisci tag separati da virgole",
mapTitlePlaceholder: "Titolo della mappa",
shopProductFeatured: "Prodotto in Evidenza",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "Invia al mercato",
typeShop: "NEGOZI",
typeShopProduct: "PRODOTTO NEGOZIO",
bankExchange: 'Cambio',
bankExchangeCurrentValue: 'Valore ECOin (1h)',
- bankTotalSupply: 'Offerta totale ECOin',
- bankEcoinHours: "Equivalenza ECOin in tempo",
+ bankTotalSupply: "Offerta ECOin totale",
+ bankPubsSupply: "Offerta ECOin del pool dei PUB",
+ bankHoldingSupply: "Offerta ECOin fuori dal RBU",
+ bankEcoinHours: "Equivalenza ECOin in tempo (1 ECO)",
bankHoursOfWork: 'ore',
bankUnitMs: "ms",
bankUnitSeconds: "secondi",
@@ -2279,22 +2553,24 @@ module.exports = {
bankExchangeChartSupply: 'Offerta',
bankExchangeChartInflation: 'Inflazione %',
bankExchangeChartEmpty: 'Non ci sono ancora abbastanza campioni — torna più tardi',
- bankCurrentSupply: 'Offerta attuale ECOin',
+ bankCurrentSupply: "Offerta ECOin attuale",
bankingSyncStatus: 'Stato ECOin',
bankingSyncStatusSynced: 'Sincronizzato',
- bankingSyncStatusOutdated: 'Non aggiornato',
+ bankingSyncStatusOutdated: "Non sincronizzato",
statsTitle: 'Statistiche',
statistics: "Statistiche",
statsDescription: "Scopri le statistiche della tua rete.",
- ALLButton: "ALL",
- MINEButton: "MINE",
- TOMBSTONEButton: "TOMBSTONES",
+ ALLButton: "TUTTO",
+ RECENTButton: "RECENTI",
+ MINEButton: "MIEI",
+ TOMBSTONEButton: "ELIMINATI",
statsCreatedAt: "Creato il",
statsYourContent: "Contenuto",
statsYourOpinions: "Opinioni",
statsNetworkContent: "Contenuto",
statsNetworkOpinions: "Opinioni",
- statsEcoWalletLabel: "Portafoglio ECOIN",
+ statsEcoWalletLabel: "Portafoglio ECOin",
+ walletAddressCopyHint: "Clicca per selezionare, poi copia",
statsEcoWalletNotConfigured: "Non configurato!",
statsBookmark: "Segnalibri",
statsEvent: "Eventi",
@@ -2316,6 +2592,8 @@ module.exports = {
statsTransfer: "Trasferimenti",
statsAiExchange: "AI",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "Peer",
+ statsTotalLabel: "Totale",
statsPost: "Post",
statsSize: "Totale (dimensione)",
statsBlockchainSize: "Blockchain (dimensione)",
@@ -2367,8 +2645,14 @@ module.exports = {
aiPrompt: "Fornisci una risposta informativa e precisa.",
aiConfiguration: "Imposta prompt",
aiPromptUsed: "Prompt",
- aiClearHistory: "Cancella cronologia chat",
- aiServerError: "L'AI non ha potuto rispondere. Riprova.",
+ aiClearHistory: "Cancella cronologia",
+ aiServerError: "Non riesco a rispondere bene. Riprova.",
+ aiStatusLoading: "42 sta caricando il modello. Riprova tra un momento.",
+ aiThinking: "Sta pensando",
+ aiWaiting: "In attesa",
+ aiStatusMissingModel: "Il modello di IA non è installato: manca src/AI/oasis-42-1-chat.Q4_K_M.gguf.",
+ aiExportFineTuning: "Esporta Fine-Tuning",
+ aiFactsTitle: "Dati dalla tua rete",
aiInputPlaceholder: "Cos'è Oasis?",
typeAiExchange: "AI",
aiApproveTrain: "Aggiungi all'addestramento collettivo",
@@ -2397,7 +2681,7 @@ module.exports = {
marketFilterDiscarded: "SCARTATO",
marketFilterRecent: "RECENTI",
marketFilterMyBids: "OFFERTE",
- marketCreateButton: "Crea articolo",
+ marketCreateButton: "Vendi qualcosa",
marketItemType: "Tipo",
marketItemTitle: "Titolo",
marketItemAvailable: "Scadenza",
@@ -2424,8 +2708,8 @@ module.exports = {
marketItemSeller: "Venditore",
marketNoItems: "Nessun articolo disponibile ancora.",
marketYourBid: "La tua offerta",
- marketCreateFormImageLabel: "Carica media (max: 50MB)",
- marketSearchPlaceholder: "Cerca titolo o tag",
+ marketCreateFormImageLabel: "Carica media (max: 75MB)",
+ marketSearchPlaceholder: "Cerca in Mercato...",
marketMinPriceLabel: "Prezzo minimo",
marketMaxPriceLabel: "Prezzo massimo",
marketSortRecent: "Più recenti",
@@ -2491,8 +2775,7 @@ module.exports = {
housingSetClosed: "Rendi non disponibile",
housingCreateButton: "Crea luogo",
housingUpdateButton: "Aggiorna",
- housingDeleteButton: "Elimina",
- housingSearchPlaceholder: "Cerca luoghi...",
+ housingSearchPlaceholder: "Cerca in Alloggi...",
housingSearchButton: "Cerca",
housingMinPrice: "Prezzo min",
housingMaxPrice: "Prezzo max",
@@ -2522,7 +2805,7 @@ module.exports = {
jobsClosedTitle: "Lavori chiusi",
jobsCVTitle: "CV",
jobsFilterPresencial: "IN SEDE",
- jobsFilterFreelancer: "FREELANCER",
+ jobsFilterFreelancer: "FREELANCE",
jobsFilterEmployee: "DIPENDENTE",
jobsPresencialTitle: "Lavori in sede",
jobsFreelancerTitle: "Lavori freelance",
@@ -2548,7 +2831,7 @@ module.exports = {
jobLocationPresencial: "In sede",
jobLocationRemote: "Da remoto",
jobVacantsPlaceholder: "Numero di posizioni",
- jobImage: "Carica media (max: 50MB)",
+ jobImage: "Carica media (max: 75MB)",
jobTasks: "Compiti",
jobType: "Tipo lavoro",
jobTime: "Orario lavoro",
@@ -2568,14 +2851,13 @@ module.exports = {
jobsHoursOffered: "Ore offerte",
jobsHoursRequested: "Ore richieste in cambio",
jobsExchangeSkill: "Competenza richiesta in cambio",
- jobTimePartial: "Part-time",
- jobTimeComplete: "Full-time",
- jobsDeleteButton: "ELIMINA",
+ jobTimePartial: "Tempo parziale",
+ jobTimeComplete: "Tempo pieno",
jobsUpdateButton: "AGGIORNA",
jobsFilterApplied: "CANDIDATURE",
jobsAppliedTitle: "Le mie candidature",
jobsAppliedBadge: "Candidato",
- jobsSearchPlaceholder: "Cerca titolo, tag, descrizione...",
+ jobsSearchPlaceholder: "Cerca in Lavori...",
jobsMinSalaryLabel: "Stipendio minimo",
jobsMaxSalaryLabel: "Stipendio massimo",
jobsSortRecent: "Più recenti",
@@ -2587,15 +2869,15 @@ module.exports = {
jobSetOpen: "Segna come aperto",
jobsTagsLabel: "Tag",
noJobsMatch: "Nessun lavoro corrisponde alla ricerca.",
- industrySearchPlaceholder: "Cerca fabbriche…",
+ industrySearchPlaceholder: "Cerca in Industria...",
industryAllSectors: "Tutti i settori",
industryVisitButton: "Visita industria",
industryAdvanceTo: "Imposta a",
industryAmount: "Importo",
industryApproveBuild: "Approva",
- industryBlueprint: "Blueprint",
+ industryBlueprint: "Progetto",
industryBlueprints: "Blueprint",
- industryBuild: "Build",
+ industryBuild: "Produzione",
industryBuildNotes: "Note",
industryBuildStart: "Data di inizio",
industryVoteUpdateButton: "Vota aggiornamento",
@@ -2661,7 +2943,6 @@ 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",
@@ -2688,7 +2969,7 @@ module.exports = {
industryRulesIntro: "Industry permette agli abitanti di possedere collettivamente i mezzi di produzione: una Fabbrica è un'officina della rete che nessuno possiede privatamente.",
industryRulesSteward: "Il fondatore è l'amministratore — un custode, non un proprietario: non può vendere, privatizzare o sciogliere la Fabbrica da solo.",
industryRulesMembership: "La politica di adesione stabilisce come si entra: Aperta (subito), Per voto (ammessi dal voto dei membri) o Solo su invito (un membro deve invitare prima).",
- industryRulesQuorum: "Il quorum è il numero minimo di membri che devono votare perché una decisione conti, così una piccola Fabbrica non è decisa da una sola persona.",
+ industryRulesQuorum: "Il quorum è il numero minimo di membri che devono votare perché una decisione conti, così una piccola Fabbrica non è decisa da un solo abitante.",
industryRulesMajority: "La maggioranza è la frazione di voti necessaria (0,5 = metà, 1 = unanimità); una decisione passa quando i SÌ raggiungono almeno max(quorum, membri × maggioranza).",
industryRulesDecisions: "I membri votano per ammettere nuovi arrivati, approvare i build e sciogliere la Fabbrica; l'amministratore non può scavalcare queste decisioni collettive.",
industryRulesBlueprints: "I Blueprint sono ricette libere (COPYLEFT) — gli input (materiali, ore di lavoro, competenze) e l'output (un bene fisico o digitale) — e chiunque può forkarle.",
@@ -2707,13 +2988,14 @@ module.exports = {
industryPauseVotes: "Voti di stato",
industryTitle: "Industria",
industryDescription: "Modulo per gestire collettivamente i mezzi di produzione.",
- typeIndustryBuild: "BUILD",
- typeIndustryBlueprint: "BLUEPRINT",
+ typeIndustryBuild: "PRODUZIONE",
+ typeIndustryBlueprint: "PROGETTO",
typeIndustryAllocation: "DISTRIBUZIONE",
typeIndustry: "INDUSTRIA",
modulesIndustryLabel: "Industria",
modulesIndustryDescription: "Modulo per gestire collettivamente i mezzi di produzione.",
industryFilterAll: "TUTTE",
+ industryFilterRecent: "RECENTI",
industryFilterMember: "MEMBRO",
industryFilterBlueprints: "PROGETTI",
industryFilterBuilds: "PRODUZIONI",
@@ -2722,6 +3004,7 @@ module.exports = {
industryFilterPaused: "IN PAUSA",
industryFilterDissolved: "SCIOLTE",
industryAllTitle: "Industria",
+ industryRecentTitle: "Fabbriche recenti",
industryMemberTitle: "Fabbriche di cui faccio parte",
industryMineTitle: "Le mie fabbriche",
industryActiveTitle: "In funzione",
@@ -2769,7 +3052,7 @@ module.exports = {
industryPolicy_invite: "Solo su invito",
projectsTitle: "Progetti",
projectsDescription: "Crea, finanzia e segui progetti comunitari nella tua rete.",
- projectSearchPlaceholder: "Cerca progetti...",
+ projectSearchPlaceholder: "Cerca in Progetti...",
projectCreateProject: "Crea progetto",
projectCreateButton: "Crea progetto",
projectUpdateButton: "AGGIORNA",
@@ -2792,7 +3075,7 @@ module.exports = {
projectRecentTitle: "Progetti recenti",
projectTopTitle: "Più finanziati",
projectTitlePlaceholder: "Nome del progetto",
- projectImage: "Carica media (max: 50MB)",
+ projectImage: "Carica media (max: 75MB)",
projectDescription: "Descrizione",
projectDescriptionPlaceholder: "Racconta la storia e gli obiettivi…",
projectGoal: "Obiettivo (ECO)",
@@ -2864,15 +3147,13 @@ module.exports = {
modulesModuleName: "Nome",
modulesModuleDescription: "Descrizione",
modulesModuleStatus: "Stato",
- modulesTotalModulesLabel: "Moduli caricati",
+ modulesTotalModulesLabel: "Totale",
modulesEnabledModulesLabel: "Attivato",
modulesDisabledModulesLabel: "Disattivato",
modulesInvitesLabel: "Inviti",
modulesInvitesDescription: "Modulo per gestire e applicare codici invito.",
modulesWalletLabel: "Portafoglio",
modulesWalletDescription: "Modulo per gestire i tuoi asset digitali (ECOin).",
- modulesLegacyLabel: "Chiavi",
- modulesLegacyDescription: "Modulo per gestire il tuo segreto (chiave privata) in modo rapido e sicuro.",
modulesCipherLabel: "Crittografia",
modulesCipherDescription: "Modulo per crittografare e decifrare il tuo testo simmetricamente (usando una password condivisa).",
modulesBookmarksLabel: "Segnalibri",
@@ -2934,20 +3215,23 @@ module.exports = {
modulesProjectsLabel: "Progetti",
modulesProjectsDescription: "Modulo per esplorare, finanziare collettivamente e gestire i progetti.",
modulesBankingLabel: "Banca",
- modulesBankingDescription: "Modulo per determinare il valore reale di ECOIN e distribuire una UBI usando la tesoreria comune.",
+ modulesBankingDescription: "Modulo per gestire il tesoro comune: valore di ECOIN, tasse e RBU.",
modulesFavoritesLabel: "Preferiti",
modulesFavoritesDescription: "Modulo per gestire i tuoi contenuti preferiti.",
fileTooLargeTitle: "File troppo grande",
- fileTooLargeMessage: "Il file supera la dimensione massima consentita (50 MB). Seleziona un file più piccolo.",
+ fileTooLargeMessage: "Il file supera la dimensione massima consentita (75 MB). Seleziona un file più piccolo.",
goBack: "Torna indietro",
+ errorDismiss: "OK",
errorPageTitle: "Si è verificato un errore",
+ errorNoAllocation: "Nessuna allocazione trovata per questa richiesta.",
+ errorInvalidClaim: "Questa allocazione non può essere riscossa.",
visibilityLabel: "Visibilità",
+ clearnetPrivateConflict: "Un contenuto privato, nascosto, chiuso, solo su invito o a pagamento non può essere pubblicato sulla CLEARNET. Scegli OASIS o rendilo pubblico.",
visibilityPublic: "Pubblica",
visibilityHidden: "Nascosta",
visibilityMakePublic: "Rendi pubblica",
visibilityMakeHidden: "Rendi nascosta",
invitesInhabitantsTitle: "Abitanti",
- invitesInhabitantsFollow: "Segui",
aiNavPlaceholder: "Descrivi cosa ti serve...",
aiNavDisabled: "La navigazione con IA è disattivata.",
aiNavResultsTitle: "Suggerimenti AINav",
@@ -2958,7 +3242,7 @@ module.exports = {
modulesAINavDescription: "Modulo per query in linguaggio naturale sui contenuti della rete.",
directConnectDescription: "Connettiti direttamente a un peer inserendo indirizzo IP, porta e chiave pubblica.",
peerHost: "IP",
- peerPort: "Porta (predefinita: 8008)",
+ peerPort: "Porta",
peerPublicKey: "Chiave pubblica (@...ed25519)",
connectAndFollow: "Connetti",
modulesPresetTitle: "Configurazioni Comuni",
@@ -2967,15 +3251,15 @@ module.exports = {
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_kids: "Bambini",
+ workflow_activists: "Attivismo",
workflow_mobile: "Mobile",
statsCarbonFootprintTitle: "Impronta di carbonio",
statsCarbonTombstone: "Impronta del tombstoning",
- uploadMedia: "Carica media (max: 50MB)",
+ uploadMedia: "Carica media (max: 75MB)",
courtsRespondentInvalid: "Deve essere un ID SSB valido (@...ed25519)",
feedDetailTitle: "Feed",
@@ -2984,7 +3268,7 @@ module.exports = {
noComments: "Nessun commento ancora",
mapsLabel: "Mappe",
mapTitle: "Mappe",
- mapDescription: "Esplora e gestisci mappe offline nella tua rete.",
+ mapDescription: "Gestisci e condividi mappe offline nella tua rete.",
mapMineSectionTitle: "Le Tue Mappe",
mapCreateSectionTitle: "Crea Mappa",
mapUpdateSectionTitle: "Aggiorna Mappa",
@@ -3024,9 +3308,22 @@ module.exports = {
markerImageLabel: "Immagine del Marcatore",
mapAddMarkerTitle: "Aggiungi Marcatore",
mapAddMarkerButton: "Aggiungi Marcatore",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Rimuovi segnaposto",
mapApplyZoom: "Applica Zoom",
- mapSearchPlaceholder: "Cerca descrizione, tag, autore...",
+ mapPlaceSearchPlaceholder: "Cerca un luogo o un paese...",
+ mapNoPlaces: "Nessun luogo trovato.",
+ mapClusterTitle: "marcatori qui, clicca per ingrandire",
+ mapDeleteMarker: "Elimina marcatore",
+ mapZoomIn: "Ingrandisci",
+ mapZoomOut: "Riduci",
+ mapFitMarkers: "Adatta a tutti i marcatori",
+ mapPanLabel: "Sposta la mappa",
+ mapCenterHere: "Centra qui",
+ mapNear: "vicino a",
+ mapPickedSpot: "Punto scelto",
+ mapPickHint: "Clicca sulla mappa per scegliere un punto.",
+ mapClearPick: "Pulisci",
+ mapSearchPlaceholder: "Cerca in Mappe...",
mapSearchButton: "Cerca",
mapUpdatedAt: "Aggiornato",
mapNoMatch: "Nessuna mappa corrisponde alla tua ricerca.",
@@ -3037,6 +3334,465 @@ module.exports = {
typeMapMarker: "MARCATORE MAPPA",
modulesMapLabel: "Mappe",
modulesMapDescription: "Modulo per gestire e condividere mappe offline.",
+ emergenciesTitle: "Emergenze",
+ modulesEmergenciesLabel: "Emergenze",
+ modulesEmergenciesDescription: "Modulo per lanciare, confermare e seguire emergenze nella rete.",
+ emergenciesDescription: "Modulo per lanciare, confermare e seguire emergenze nella rete.",
+ emergencyCreate: "Crea emergenza",
+ emergencyUpdate: "Aggiorna",
+ emergencyDelete: "Elimina",
+ emergencyTitleLabel: "Titolo",
+ emergencyTitlePlaceholder: "Cosa sta succedendo?",
+ emergencyTextLabel: "Dettagli",
+ emergencyTextPlaceholder: "Dove, da quando, cosa fare...",
+ emergencyCategoryLabel: "Categoria",
+ emergencyCategoryWeather: "METEO",
+ emergencyCategoryInfrastructure: "INFRASTRUTTURE",
+ emergencyCategoryHealth: "SALUTE",
+ emergencyCategorySecurity: "SICUREZZA",
+ emergencyCategoryLost: "OGGETTI SMARRITI",
+ emergencyCategoryNeighborhood: "VICINATO",
+ emergencyExpiresLabel: "Scade tra",
+ emergencyExpires1d: "1 giorno",
+ emergencyExpires3d: "3 giorni",
+ emergencyExpires7d: "1 settimana",
+ emergencyExpires30d: "1 mese",
+ emergencyExpiresNone: "Indefinito",
+ emergencyExpiresKeep: "Mantieni la data attuale",
+ emergencyTagsLabel: "Tag",
+ emergencyTagsPlaceholder: "Inserisci tag separati da virgole",
+ emergencyFilterAll: "TUTTE",
+ emergencyFilterMine: "MIE",
+ emergencyFilterRecent: "RECENTI",
+ emergencySeverityUnverified: "NON VERIFICATA",
+ emergencySeverityLow: "BASSA",
+ emergencySeverityMedium: "MEDIA",
+ emergencySeverityHigh: "ALTA",
+ emergencyStatusActive: "ATTIVA",
+ emergencyStatusResolved: "RISOLTA",
+ emergencyStatusExpired: "SCADUTA",
+ emergencyConfirmations: "Conferme",
+ emergencyConfirmButton: "Conferma",
+ emergencyConfirmed: "Hai confermato questa emergenza",
+ emergencyResolveButton: "Risolvi",
+ emergencyReopenButton: "Riapri",
+ emergencyGenerateReport: "Genera rapporto",
+ emergencyUpdateEdited: "Modificato",
+ emergencyLastUpdate: "ULTIMO AGGIORNAMENTO",
+ emergencyUpdatesTitle: "Ultimi aggiornamenti:",
+ emergencyNoUpdates: "Ancora nessun aggiornamento.",
+ emergencyAddUpdate: "Pubblica aggiornamento",
+ emergencyUpdatePlaceholder: "Cosa è cambiato?",
+ emergencyNoItems: "Nessuna emergenza trovata.",
+ emergencyExpiresAt: "Scade",
+ emergencyBannerLabel: "Emergenza attiva",
+ emergencyCreateSectionTitle: "Crea emergenza",
+ emergencyUpdateSectionTitle: "Aggiorna emergenza",
+ emergencySearchPlaceholder: "Cerca nelle emergenze...",
+ typeEmergency: "EMERGENZE",
+ typeEmergencyConfirm: "CONFERMA EMERGENZA",
+ typeEmergencyUpdate: "AGGIORNAMENTO EMERGENZA",
+ statsEmergency: "Emergenze",
+ statsEmergencyConfirm: "Conferme di emergenze",
+ statsEmergencyUpdate: "Aggiornamenti di emergenze",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Un’emergenza che segui ha un aggiornamento.",
+ emergencyBotResolvedTitle: "Un’emergenza che segui è stata risolta.",
+ dataKindEmergencies: "EMERGENZE",
+ mailingTitle: "Mailing list",
+ modulesMailingLabel: "Mailing list",
+ modulesMailingDescription: "Scopri e gestisci mailing list nella tua rete.",
+ modulesPhoneLabel: "Telefono",
+ modulesPhoneDescription: "Modulo per chiamare altri abitanti con videochiamate cifrate end-to-end.",
+ mailingDescription: "Scopri e gestisci mailing list nella tua rete.",
+ mailingCreate: "Crea mailing list",
+ mailingUpdate: "Aggiorna",
+ mailingArchive: "Archivia",
+ mailingActivate: "Attiva",
+ mailingCreateSectionTitle: "Crea mailing list",
+ mailingUpdateSectionTitle: "Aggiorna mailing list",
+ mailingTitleLabel: "Titolo",
+ mailingTitlePlaceholder: "Nome della mailing list",
+ mailingDescriptionLabel: "Descrizione",
+ mailingDescriptionPlaceholder: "Di cosa tratta questa lista?",
+ mailingTypeLabel: "Tipo di mailing list",
+ mailingTypeOpen: "APERTA",
+ mailingTypeClosed: "CHIUSA",
+ mailingStatusLabel: "Stato",
+ mailingStatusActive: "ATTIVA",
+ mailingStatusArchived: "ARCHIVIATA",
+ mailingMembersLabel: "Invita abitanti",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Iscritti",
+ mailingTagsLabel: "Tag",
+ mailingTagsPlaceholder: "Inserisci tag separati da virgole",
+ mailingFilterAll: "TUTTE",
+ mailingFilterMine: "MIE",
+ mailingFilterSubscribed: "ISCRITTE",
+ mailingFilterRecent: "RECENTI",
+ mailingHistoryDate: "DATA",
+ mailingHistoryThreads: "DISCUSSIONI",
+ mailingHistoryInhabitants: "ABITANTI",
+ mailingHistorySearchPlaceholder: "Cerca nella cronologia...",
+ mailingNoMessages: "Ancora nessun messaggio.",
+ mailingNoItems: "Nessuna mailing list trovata.",
+ mailingSearchPlaceholder: "Cerca nelle mailing list...",
+ mailingWriteButton: "Scrivi messaggio",
+ mailingWriteTitle: "Scrivi alla lista",
+ mailingReplyTitle: "Rispondi alla lista",
+ mailingSend: "Invia",
+ mailingTextPlaceholder: "Il tuo messaggio raggiunge tutti i partecipanti della lista.",
+ mailingParticipants: "Partecipanti",
+ inboxFilterMailing: "Mailing list",
+ mailingReplyPlaceholder: "Rispondi alla lista...",
+ mailingReplyToList: "Rispondi alla lista",
+ typeMailingList: "MAILING LIST",
+ statsMailingList: "Mailing list",
+ mailingListLabel: "MAILING LIST",
+ logisticsTitle: "Logistica",
+ modulesLogisticsLabel: "Logistica",
+ modulesLogisticsDescription: "Scopri e gestisci piani logistici nella tua rete.",
+ logisticsDescription: "Scopri e gestisci piani logistici nella tua rete.",
+ logisticsCreate: "Crea rotta",
+ logisticsUpdate: "Aggiorna",
+ logisticsClose: "Chiudi",
+ logisticsReopen: "Riapri",
+ logisticsCreateSectionTitle: "Crea rotta",
+ logisticsUpdateSectionTitle: "Aggiorna rotta",
+ logisticsTitleLabel: "Titolo",
+ logisticsTitlePlaceholder: "Viaggio al mercato, furgone disponibile...",
+ logisticsKindLabel: "Tipo di logistica",
+ logisticsKindTrip: "VIAGGIO",
+ logisticsKindShipment: "SPEDIZIONE",
+ logisticsKindTrips: "VIAGGI",
+ logisticsKindShipments: "SPEDIZIONI",
+ logisticsModeLabel: "Modalità",
+ logisticsModeOffer: "OFFRO",
+ logisticsModeRequest: "CERCO",
+ logisticsModeOffers: "OFFERTE",
+ logisticsModeRequests: "RICHIESTE",
+ logisticsDescriptionLabel: "Descrizione",
+ logisticsDescriptionPlaceholder: "Punto d’incontro, cosa trasporti, condizioni...",
+ logisticsOriginLabel: "Origine",
+ logisticsOriginPlaceholder: "Da dove parte",
+ logisticsDestinationLabel: "Destinazione",
+ logisticsDestinationPlaceholder: "Dove arriva",
+ logisticsDateLabel: "Data e ora",
+ logisticsRecurrenceLabel: "Ricorrenza",
+ logisticsFrequencyLabel: "Frequenza",
+ logisticsRecurrenceNone: "UNICA",
+ logisticsRecurrenceDaily: "GIORNALIERA",
+ logisticsRecurrenceWeekly: "SETTIMANALE",
+ logisticsRecurrenceMonthly: "MENSILE",
+ logisticsSeatsLabel: "Posti",
+ logisticsSizeLabel: "Dimensioni",
+ logisticsSizePlaceholder: "es. 2m x 1m",
+ logisticsWeightLabel: "Peso",
+ logisticsWeightPlaceholder: "es. 40kg",
+ logisticsPriceFree: "GRATIS",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TEMPO",
+ logisticsPriceLabel: "Prezzo",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Link all’ordine",
+ logisticsOrderRefPlaceholder: "/shops/... o /market/... dell’ordine da consegnare",
+ logisticsOrderLink: "Ordine collegato",
+ logisticsTagsLabel: "Tag",
+ logisticsTagsPlaceholder: "Inserisci tag separati da virgole",
+ logisticsFilterAll: "TUTTE",
+ logisticsFilterMine: "MIE",
+ logisticsFilterBooked: "PRENOTATE",
+ logisticsFilterRecent: "RECENTI",
+ logisticsFilterHistory: "STORICO",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "APERTA",
+ logisticsStatusUpcoming: "PROSSIME",
+ logisticsStatusPast: "PASSATE",
+ logisticsStatusClosed: "CHIUSE",
+ logisticsZoneLabel: "Zona",
+ logisticsSearchPlaceholder: "Cerca nella logistica...",
+ logisticsNoItems: "Nessuna rotta trovata.",
+ logisticsBookingPending: "IN ATTESA",
+ logisticsBookingConfirmed: "CONFERMATA",
+ logisticsBookingRejected: "RIFIUTATA",
+ logisticsBookingCancelled: "ANNULLATA",
+ logisticsBookingDelivered: "CONSEGNATA",
+ logisticsConfirm: "Conferma",
+ logisticsReject: "Rifiuta",
+ logisticsDeliver: "Consegna",
+ logisticsReceiptLabel: "Ricevuta",
+ logisticsReceiptPlaceholder: "Nota di consegna (facoltativa)",
+ logisticsCancelBooking: "Annulla prenotazione",
+ logisticsBookTitle: "Prenota questa rotta",
+ logisticsNotesLabel: "Note",
+ logisticsNotesPlaceholder: "Ciò che il responsabile deve sapere",
+ logisticsBook: "Prenota",
+ logisticsBookingsTitle: "Prenotazioni",
+ logisticsMyBookingTitle: "La tua prenotazione",
+ logisticsRatingsTitle: "Valutazioni",
+ logisticsNoRatings: "Ancora nessuna valutazione.",
+ logisticsRatingsWhenClosed: "Le valutazioni si aprono alla chiusura della rotta.",
+ logisticsScoreLabel: "Punteggio",
+ logisticsRatingPlaceholder: "Com’è andata?",
+ logisticsRate: "Valuta",
+ typeLogisticsRoute: "ROTTA",
+ typeLogisticsRating: "VALUTAZIONE ROTTA",
+ statsLogisticsRoute: "Rotte",
+ statsLogisticsRating: "Valutazioni delle rotte",
+ logisticsRouteLabel: "ROTTA",
+ podcastsTitle: "Podcast",
+ modulesPodcastsLabel: "Podcast",
+ modulesPodcastsDescription: "Modulo per pubblicare canali podcast.",
+ podcastsDescription: "Modulo per pubblicare canali podcast.",
+ podcastCreate: "Crea podcast",
+ podcastUpdate: "Aggiorna",
+ podcastDelete: "Elimina",
+ podcastCreateSectionTitle: "Crea podcast",
+ podcastUpdateSectionTitle: "Aggiorna podcast",
+ podcastTitleLabel: "Titolo",
+ podcastTitlePlaceholder: "Nome del canale",
+ podcastDescriptionLabel: "Descrizione",
+ podcastDescriptionPlaceholder: "Di cosa parla questo podcast?",
+ podcastCategoryLabel: "Categoria",
+ podcastCategoryNews: "NOTIZIE",
+ podcastCategoryMusic: "MUSICA",
+ podcastCategoryTalk: "CONVERSAZIONE",
+ podcastCategoryEducation: "EDUCAZIONE",
+ podcastCategoryTech: "TECNOLOGIA",
+ podcastCategoryCulture: "CULTURA",
+ podcastCategoryCommunity: "COMUNITÀ",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "ALTRO",
+ podcastTagsLabel: "Tag",
+ podcastCoverLabel: "Copertina (immagine o video)",
+ podcastEpisodeAudioLabel: "File audio o video (max: 75MB)",
+ podcastTagsPlaceholder: "Inserisci tag separati da virgole",
+ podcastFilterAll: "TUTTI",
+ podcastFilterMine: "MIEI",
+ podcastFilterRecent: "RECENTI",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "ASCOLTATORI",
+ podcastSearchPlaceholder: "Cerca nei podcast...",
+ podcastNoItems: "Nessun podcast trovato.",
+ podcastEpisodesLabel: "Episodi",
+ podcastPlaysLabel: "Visualizzazioni",
+ podcastLastEpisode: "Ultimo episodio",
+ podcastEpisodesTitle: "Episodi",
+ podcastNoEpisodes: "Ancora nessun episodio.",
+ podcastEpisodeAdd: "Aggiungi episodio",
+ podcastEpisodeCreateTitle: "Pubblica episodio",
+ podcastEpisodeUpdateTitle: "Aggiorna episodio",
+ podcastEpisodeTitleLabel: "Titolo dell’episodio",
+ podcastEpisodeTitlePlaceholder: "Titolo dell’episodio",
+ podcastEpisodeDescriptionLabel: "Note",
+ podcastEpisodeDescriptionPlaceholder: "Cosa succede in questo episodio, link, crediti...",
+ podcastEpisodePublish: "Pubblica",
+ podcastPlayed: "Ascoltato",
+ podcastMarkPlayed: "Segna come ascoltato",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISODIO",
+ typePodcastOpinion: "OPINIONE SULL’EPISODIO",
+ typePodcastPlay: "ASCOLTO",
+ statsPodcast: "Podcast",
+ statsPodcastEpisode: "Episodi",
+ statsPodcastPlay: "Ascolti",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Un blog che segui ha una nuova voce.",
+ podcastBotEpisodeTitle: "Un podcast che segui ha un nuovo episodio.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISODIO",
+ campaignsTitle: "Campagne",
+ modulesCampaignsLabel: "Campagne",
+ modulesCampaignsDescription: "Scopri e gestisci campagne nella tua rete.",
+ campaignsDescription: "Scopri e gestisci campagne nella tua rete.",
+ campaignCreate: "Crea campagna",
+ campaignUpdate: "Aggiorna",
+ campaignDelete: "Elimina",
+ campaignClose: "Chiudi",
+ campaignReopen: "Riapri",
+ campaignCreateSectionTitle: "Crea campagna",
+ campaignUpdateSectionTitle: "Aggiorna campagna",
+ campaignTitleLabel: "Titolo",
+ campaignTitlePlaceholder: "Cosa vuoi ottenere?",
+ campaignTextLabel: "Testo",
+ campaignTextPlaceholder: "Spiega la causa, chi decide e cosa chiedi...",
+ campaignCategoryLabel: "Categoria",
+ campaignCategoryEnvironment: "AMBIENTE",
+ campaignCategoryRights: "DIRITTI",
+ campaignCategoryHealth: "SALUTE",
+ campaignCategoryEducation: "EDUCAZIONE",
+ campaignCategoryInfrastructure: "INFRASTRUTTURE",
+ campaignCategoryCulture: "CULTURA",
+ campaignCategoryEconomy: "ECONOMIA",
+ campaignCategoryOther: "ALTRO",
+ campaignGoalLabel: "Obiettivo di firme",
+ campaignDeadlineLabel: "Scadenza",
+ campaignTagsLabel: "Tag",
+ campaignTagsPlaceholder: "Inserisci tag separati da virgole",
+ campaignFilterAll: "TUTTE",
+ campaignFilterMine: "MIE",
+ campaignFilterSigned: "FIRMATE",
+ campaignFilterRecent: "RECENTI",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "APERTA",
+ campaignStatusAchieved: "RAGGIUNTA",
+ campaignStatusUnachieved: "NON RAGGIUNTA",
+ campaignStatusClosed: "CHIUSA",
+ campaignSearchPlaceholder: "Cerca nelle campagne...",
+ campaignNoItems: "Nessuna campagna trovata.",
+ campaignSignaturesLabel: "Firme",
+ campaignSignaturesTitle: "Sostenitori",
+ campaignNoSignatures: "Ancora nessuna firma.",
+ campaignSignTitle: "Firma questa campagna",
+ campaignSignPlaceholder: "Perché la sostieni? (facoltativo)",
+ campaignSign: "Firma",
+ campaignSigned: "Hai già firmato!",
+ campaignNotSigned: "Manca ancora la tua firma",
+ campaignElevate: "Porta in Parlamento",
+ campaignElevated: "Portata in Parlamento",
+ campaignUpdatesTitle: "Aggiornamenti",
+ campaignNoUpdates: "Ancora nessun aggiornamento.",
+ campaignUpdatePlaceholder: "Cosa è successo?",
+ campaignAddUpdate: "Pubblica aggiornamento",
+ campaignQrAlt: "QR per firmare questa campagna",
+ campaignQrCaption: "Scansiona per firmare",
+ typeCampaign: "CAMPAGNA",
+ typeCampaignSignature: "FIRMA",
+ typeCampaignUpdate: "AGGIORNAMENTO CAMPAGNA",
+ statsCampaign: "Campagne",
+ statsCampaignSignature: "Firme delle campagne",
+ statsCampaignUpdate: "Aggiornamenti delle campagne",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Una campagna che segui ha un aggiornamento.",
+ campaignBotAchievedTitle: "Una campagna che segui ha raggiunto l’obiettivo.",
+ campaignBotRaisedTitle: "Una campagna che hai firmato è stata portata in Parlamento.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Un percorso che hai prenotato è cambiato.",
+ logisticsBotClosedTitle: "Un percorso che hai prenotato è stato chiuso.",
+ logisticsBotBookedTitle: "Qualcuno ha prenotato il tuo percorso.",
+ logisticsBotCancelledTitle: "Una prenotazione sul tuo percorso è stata annullata.",
+ logisticsBotConfirmedTitle: "La tua prenotazione è confermata: il pacco è in viaggio.",
+ logisticsBotRejectedTitle: "La tua prenotazione è stata rifiutata.",
+ logisticsBotDeliveredTitle: "Il tuo pacco è arrivato.",
+ campaignLabel: "CAMPAGNA",
+ campaignGenerateReport: "Genera rapporto",
+ logisticsGenerateReport: "Genera rapporto",
+ mailingGenerateReport: "Genera rapporto",
+ campaignUpdateEdited: "Modificato",
+ mailingMessagesLabel: "Messaggi",
+ logisticsBookingsLabel: "Prenotazioni",
+ backupTitle: "Backup",
+ modulesBackupLabel: "Backup",
+ modulesBackupDescription: "Modulo per esportare e importare le tue chiavi e fare backup cifrati.",
+ backupDescription: "Modulo per esportare e importare le tue chiavi e fare backup cifrati.",
+ backupTypeRecovery: "RECUPERO",
+ backupTypeKeys: "ESPORTA CHIAVI",
+ backupTypeFull: "BACKUP COMPLETO",
+ backupTypeRestore: "RIPRISTINA BACKUP",
+ backupTypeInstant: "ISTANTANEA",
+ backupInstantDescription: "Uno .zip semplice di tutto il tuo registro e dei tuoi file, senza la chiave segreta e senza password. Rapido, ma ",
+ backupInstantRisk: "chi ha il file legge tutto.",
+ backupKitPageDescription: "Il kit di recupero può essere aperto solo da questo dispositivo.",
+ backupKitId: "ID Oasis",
+ backupKitDate: "Generato",
+ backupKitQrAlt: "Codice QR della tua chiave segreta",
+ backupKitStep1: "Stampalo o ricopialo a mano e conservalo in un luogo sicuro e offline.",
+ backupKitStep2: "Per recuperare, installa Oasis su un nuovo dispositivo e importa questo segreto da Backup › Chiavi.",
+ backupKitStep3: "Distruggi questa pagina se dovesse mai essere esposta.",
+ backupKitPdfButton: "Genera PDF",
+ backupScopeLabel: "Ambito",
+ backupScopeAll: "TUTTO",
+ backupScopeMine: "SOLO I MIEI CONTENUTI",
+ backupSinceLabel: "Da",
+ backupEstimateTitle: "Stima",
+ backupFileInfo: "La tua copia cifrata verrà scaricata sul tuo dispositivo (nome: oasis-backup-DATA.oasisbk)",
+ backupExportButton: "Scarica backup",
+ backupRestorePassword: "Scrivi la password usata quando è stato fatto il backup",
+ backupRestoreButton: "Ripristina backup",
+ backupRestoredLine: "Backup ripristinato.",
+ backupRestoredMessages: "Messaggi aggiunti",
+ backupRestoredSkipped: "Già presenti",
+ backupRestoredBlobs: "File aggiunti",
+ backupRestoredState: "Impostazioni ripristinate",
+ backupRestoredFailed: "Falliti",
+ backupRestoredForked: "Divergenti",
+ backupRestoreRunning: "Ripristino della copia in corso. Questa pagina si aggiorna da sola; nel frattempo puoi continuare a usare Oasis.",
+ backupRestoreElapsed: "Trascorso",
+ backupRestoreFailedLine: "Non è stato possibile ripristinare la copia.",
+ backupRestoreForkMine: "Questo dispositivo ha già pubblicato messaggi con la tua identità che non sono nella copia, quindi non è stato possibile applicarla sopra di essi. Ripristina su un’installazione pulita subito dopo aver importato le chiavi, prima di fare qualsiasi altra cosa.",
+ verificationTitle: "Verifica",
+ verificationDescription: "Controlla la catena del tuo feed, rileva biforcazioni e rivedi i file orfani o mancanti.",
+ verificationRun: "Esegui verifica",
+ verificationTotalMessages: "messaggi nel log",
+ verificationFeed: "Il tuo feed",
+ verificationMessages: "messaggi",
+ verificationLastSequence: "ultima sequenza",
+ verificationGaps: "Buchi",
+ verificationBrokenLinks: "Collegamenti rotti",
+ verificationBadHashes: "Hash errati",
+ verificationBadSignatures: "Firme errate",
+ verificationDuplicates: "Sequenze duplicate",
+ verificationForks: "Biforcazioni",
+ verificationBlobs: "File",
+ verificationBlobsPresent: "presenti",
+ verificationBlobsReferenced: "referenziati",
+ verificationBlobsOrphan: "orfani",
+ verificationBlobsMissing: "mancanti",
+ verificationBlobsMissingOwn: "File tuoi mancanti su questo dispositivo",
+ verificationBlobsMissingOthers: "File di altri abitanti non ancora scaricati",
+ verificationBlobsUnavailable: "Impossibile elencare i file su questo dispositivo.",
+ wikiTitle: "Wiki",
+ modulesWikiLabel: "Wiki",
+ modulesWikiDescription: "Modulo per scoprire e gestire wiki.",
+ wikiDescription: "Modulo per scoprire e gestire wiki.",
+ wikiCreate: "Crea wiki",
+ wikiUpdate: "Aggiorna",
+ wikiDelete: "Elimina",
+ wikiEdit: "Modifica",
+ wikiTitleLabel: "Titolo",
+ wikiTitlePlaceholder: "Titolo della wiki...",
+ wikiBodyLabel: "Contenuto",
+ wikiBodyPlaceholder: "Collega altre wiki con [[Titolo della wiki]] o [[Titolo della wiki|un’etichetta personalizzata]].\n\nMenziona un abitante con @id.\n\nTagga con #oasis.\n\nIncolla link come https://solarnethub.com\n\nUna riga vuota apre un nuovo paragrafo; le interruzioni di riga singole si conservano.\n\nAllega qualsiasi media supportato: verrà incorporato qui.",
+ formatBarLabel: "Formato",
+ wikiStatusLabel: "Tipo di wiki",
+ wikiStatusOpen: "APERTA",
+ wikiStatusClosed: "CHIUSA",
+ wikiTagsLabel: "Tag",
+ wikiTagsPlaceholder: "Inserisci tag separati da virgole",
+ wikiSummaryLabel: "Riepilogo della modifica",
+ wikiSummaryPlaceholder: "Cosa è cambiato?",
+ wikiFilterAll: "TUTTE",
+ wikiFilterMine: "MIE",
+ wikiFilterRecent: "RECENTI",
+ wikiFilterLinked: "COLLEGATE",
+ wikiChanges: "Modifiche recenti",
+ wikiNoPages: "Nessuna wiki trovata.",
+ wikiNoChanges: "Ancora nessuna modifica.",
+ wikiHistory: "Cronologia",
+ wikiVersion: "Versione",
+ wikiVersions: "versioni",
+ wikiRestore: "Ripristina",
+ wikiDiff: "Modifiche",
+ wikiViewVersion: "Vedi",
+ wikiLinkedPages: "Pagine collegate",
+ wikiNoLinkedPages: "Questa pagina non è ancora collegata a nessun altra.",
+ wikiMissingLink: "La pagina non esiste ancora",
+ wikiDuplicateTitle: "Esiste già una pagina con questo titolo. Cambia il titolo per creare una pagina diversa.",
+ wikiCreateSectionTitle: "Crea wiki",
+ wikiUpdateSectionTitle: "Aggiorna wiki",
+ wikiSearchPlaceholder: "Cerca nella Wiki...",
+ wikiCurrentVersion: "Versione attuale",
+ wikiViewingVersion: "Stai vedendo una versione precedente",
+ wikiBackToPage: "Torna alla pagina",
+ wikiLinkedChip: "Collegata",
+ wikiRestoredSummary: "Versione ripristinata",
+ wikiExportPdf: "Genera pagina",
+ wikiPreview: "Anteprima",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Crea wiki",
+ tribeWikiEmpty: "Ancora nessuna wiki.",
+ typeWiki: "WIKI",
padsTitle: "Pad",
padTitle: "Pad",
modulesPadsLabel: "Pad",
@@ -3047,21 +3803,133 @@ module.exports = {
padTitleLabel: "Titolo",
padTitlePlaceholder: "Inserisci il titolo del pad...",
padStatusLabel: "Stato",
+ padTypeLabel: "Tipo di pad",
padStatusOpen: "APERTO",
padStatusInviteOnly: "SOLO SU INVITO",
padStatusClosed: "CHIUSO",
padDeadlineLabel: "Scadenza",
padTagsLabel: "Tag",
- padTagsPlaceholder: "tag1, tag2, ...",
+ padTagsPlaceholder: "Inserisci tag separati da virgole",
padMembersLabel: "Membri",
padCreated: "Creato",
- padStartEditing: "INIZIA A MODIFICARE!",
+ padStartEditing: "Modifica",
padEditorPlaceholder: "Inizia a scrivere...",
padSubmitEntry: "Invia",
padNoEntries: "Nessuna voce ancora.",
padAllSectionTitle: "Tutti i Pad",
padMineSectionTitle: "I Miei Pad",
padsDescription: "Gestisci editor di testo collaborativi cifrati nella tua rete.",
+ roomsTitle: "Stanze",
+ roomsDescription: "Scopri ed entra nelle stanze di videoconferenza cifrate della tua rete.",
+ modulesRoomsLabel: "Stanze",
+ modulesRoomsDescription: "Modulo per scoprire ed entrare in stanze di videoconferenza cifrate.",
+ roomFilterRecent: "RECENTI",
+ roomFilterMine: "MIE",
+ roomFilterAll: "TUTTE",
+ roomFilterLive: "IN DIRETTA",
+ roomFilterOpen: "APERTE",
+ roomFilterInvite: "SOLO SU INVITO",
+ roomFilterClosed: "CHIUSE",
+ roomCreate: "Crea stanza",
+ roomUpdate: "Aggiorna",
+ roomDelete: "Elimina",
+ roomClose: "Chiudi",
+ roomCreateSectionTitle: "Crea stanza",
+ roomUpdateSectionTitle: "Aggiorna stanza",
+ roomTitlePlaceholder: "Titolo della stanza",
+ roomDescriptionLabel: "Descrizione",
+ roomDescriptionPlaceholder: "Di cosa parlerete?",
+ roomTypeLabel: "Tipo di stanza",
+ roomTagsLabel: "Tag",
+ roomStatusOpen: "APERTA",
+ roomStatusInviteOnly: "SOLO SU INVITO",
+ roomStatusClosed: "CHIUSA",
+ roomParticipants: "Partecipanti",
+ roomJoin: "Entra",
+ roomLeave: "Esci",
+ roomFull: "Stanza piena",
+ roomLiveChip: "IN DIRETTA",
+ roomMuted: "microfono disattivato",
+ roomRec: "Registra audio",
+ roomRecStop: "Ferma la registrazione",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} è entrato nella stanza",
+ roomEventLeft: "{name} ha lasciato la stanza",
+ roomEventRecStart: "{name} ha iniziato a registrare",
+ roomEventRecStop: "{name} ha smesso di registrare",
+ roomEventMuted: "{name} si è silenziato",
+ roomEventUnmuted: "{name} ha tolto il silenzio",
+ roomEventHand: "{name} ha alzato la mano",
+ roomRaiseHand: "Alza la mano",
+ roomLowerHand: "Abbassa la mano",
+ confirmActionTitle: "Conferma questa azione",
+ confirmActionButton: "Conferma",
+ confirmJoinText: "Stai per unirti con questo invito.",
+ confirmFollowText: "Stai per sostenere questo abitante.",
+ confirmSignText: "Stai per firmare questa campagna.",
+ confirmDownloadText: "Stai per scaricare questo file sul tuo dispositivo.",
+ roomRecordings: "Registrazioni",
+ roomClearNotices: "Pulisci",
+ roomLineSwitchboard: "Centralino",
+ roomLineDndError: "Il numero di questa stanza non accetta chiamate.",
+ roomNumberHint: "Componi questo numero da Telefono per entrare nella stanza.",
+ liveRefresh: "Aggiorna",
+ roomNobody: "Al momento non c'è nessuno nella stanza.",
+ roomSomeone: "{n} nella stanza in questo momento.",
+ roomYou: "tu",
+ roomYouAreIn: "Ci sei dentro",
+ roomNobodyInside: "Al momento non c'è nessuno in questa stanza.",
+ roomErrorFull: "La stanza è piena. Potrai entrare quando qualcuno esce.",
+ roomErrorUnreachable: "Al momento la stanza non è raggiungibile. Riprova più tardi.",
+ roomErrorBusy: "Sei già in una chiamata o in un'altra stanza.",
+ roomErrorClosed: "Questa stanza è chiusa.",
+ roomAccessDenied: "Questa stanza è solo su invito. Ti serve un invito per entrare.",
+ roomsNoItems: "Nessuna stanza trovata.",
+ roomSearchPlaceholder: "Cerca stanze...",
+ roomInviteMode: "Invito",
+ tribeSectionRooms: "STANZE",
+ tribeRoomCreate: "Crea stanza",
+ tribeRoomsEmpty: "Ancora nessuna stanza.",
+ typeRoom: "STANZE",
+ typeRoomMember: "PARTECIPANTE DI STANZA",
+ statsRoom: "Stanze",
+ statsRoomMember: "Partecipanti alle stanze",
+ favoritesFilterRooms: "STANZE",
+ invitesRoomsTitle: "Stanze",
+ inviteCodeInvalid: "Questo codice d'invito non è valido o è già stato usato.",
+ inviteAlreadyMember: "Ne fai già parte. Puoi aprirlo dal suo modulo.",
+ actionFailed: "Non è stato possibile farlo. Riprova.",
+ publishTooShort: "Il tuo post è troppo corto.",
+ walletSendFailed: "Non è stato possibile inviare il pagamento: {reason}",
+ pixeliaCoordsError: "Quelle coordinate sono fuori dalla griglia.",
+ courtsErrTitle: "Serve un titolo.",
+ courtsErrRespondent: "Indica contro chi è il caso.",
+ courtsErrRespondentId: "Questo non è un Oasis ID valido.",
+ courtsErrMethod: "Scegli come verrà risolto il caso.",
+ courtsErrCaseNotFound: "Quel caso non è stato trovato.",
+ courtsErrBrief: "Scrivi la tua risposta.",
+ courtsErrStance: "Scegli la tua posizione.",
+ courtsErrResult: "Scrivi il risultato.",
+ courtsErrTerms: "Scrivi i termini dell'accordo.",
+ courtsErrMediator: "Aggiungi almeno un mediatore.",
+ courtsErrSelfMediator: "Non puoi essere mediatore nel tuo stesso caso.",
+ courtsErrJudge: "Scegli un giudice.",
+ courtsErrSelfJudge: "Non puoi essere giudice del tuo stesso caso.",
+ courtsErrVisibility: "Scegli chi può vedere il caso.",
+ courtsErrNomination: "Quella candidatura non è stata trovata.",
+ opinionAlreadyGiven: "Hai già dato la tua opinione.",
+ cipherPasswordShort: "La password deve avere almeno 32 caratteri.",
+ errorForbidden: "Non hai accesso a questo.",
+ errorNotFound: "Non è stato trovato.",
+ errorClosed: "È chiuso.",
+ errorInviteOnly: "È solo su invito. Ti serve un invito.",
+ errorTooLong: "Quel testo è troppo lungo.",
+ errorRequired: "Mancano informazioni obbligatorie.",
+ errorInvalid: "Alcune informazioni non sono valide.",
+ errorNotAuthor: "Solo l'autore può farlo.",
+ panicRemoved: "La tua blockchain è stata eliminata.",
padRecentSectionTitle: "Pad Recenti",
padOpenSectionTitle: "Pad Aperti",
padClosedSectionTitle: "Pad Chiusi",
@@ -3073,18 +3941,18 @@ module.exports = {
padRemoveFavorite: "Rimuovi dai Preferiti",
padClose: "Chiudi",
padBackToEditor: "Torna all'editor",
- padSearchPlaceholder: "Cerca pad...",
+ padSearchPlaceholder: "Cerca in Pad...",
modulesChatsLabel: "Chat",
- modulesChatsDescription: "Modulo per scoprire e gestire chat cifrate.",
+ modulesChatsDescription: "Modulo per scoprire e gestire chat.",
typeChat: "CHATS",
typeChatMessage: "MESSAGGIO CHAT",
chatsTitle: "Chat",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "Le tue chat",
+ chatRecentTitle: "Chat recenti",
chatFavoritesTitle: "Preferiti",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "Chat aperte",
+ chatClosedTitle: "Chat chiuse",
chatDescription: "Descrizione",
chatCategory: "Categoria",
chatStatus: "STATO",
@@ -3099,34 +3967,172 @@ module.exports = {
chatMessagesLabel: "Messaggi",
chatThreadsLabel: "Discussioni",
chatCreatedAt: "CREATO",
- chatSearchPlaceholder: "Cerca chat...",
+ chatSearchPlaceholder: "Cerca in Chat...",
chatStatusOpen: "APERTO",
chatStatusInviteOnly: "SOLO SU INVITO",
chatStatusClosed: "CHIUSO",
chatSendMessage: "Invia",
chatJumpLatest: "Ultimo Messaggio",
+ chatReply: "Rispondi",
+ chatReplyCancel: "Annulla risposta",
+ chatPin: "Fissa",
+ chatUnpin: "Sblocca",
+ chatPinned: "Fissati",
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",
+ activitySearchPlaceholder: "Cerca in Attività...'attività...",
+ trendingSearchPlaceholder: "Cerca in Tendenze...",
+ opinionsSearchPlaceholder: "Cerca in Opinioni...",
+ votesSearchPlaceholder: "Cerca in Votazioni...",
+ gamesSearchPlaceholder: "Cerca in Giochi...",
+ schoolTitle: "Scuola",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Una pagina wiki che segui è stata modificata.",
+ wikiBotRestoredTitle: "È stata ripristinata una versione precedente di una pagina wiki che segui.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Un nuovo studente si è iscritto al tuo corso.",
+ schoolBotInvitedTitle: "Sei stato invitato a un corso.",
+ schoolBotAdmittedTitle: "Sei stato ammesso a un corso.",
+ schoolBotCertificateTitle: "Hai ricevuto un certificato.",
+ schoolBotPassedTitle: "Uno studente ha superato il tuo corso.",
+ schoolBotLessonTitle: "È stata pubblicata una nuova lezione.",
+ invitesSchoolTitle: "Scuola",
+ schoolEnrollLabel: "Unisciti al corso",
+ schoolExamRetryLater: "Potrai riprovare dopo 24 ore.",
+ schoolApproved: "SUPERATO",
+ schoolExamPassMark: "Soglia di superamento (0-10)",
+ schoolExamPassed: "SUPERATO",
+ schoolExamPending: "In attesa",
+ schoolExamFailed: "NON SUPERATO",
+ schoolExamAddQuestion: "Aggiungi domanda",
+ schoolExamCreateQuestion: "Crea domanda",
+ schoolExamOption: "Opzione",
+ schoolExamCorrect: "Opzione corretta",
+ schoolExamPoints: "Punti",
+ schoolMaterialTextPlaceholder: "Note per questa lezione...",
+ schoolMaterials: "Materiali",
+ schoolAddMaterial: "Aggiungi materiale",
+ schoolNoMaterials: "Ancora nessun materiale.",
+ bankYourSchoolBalance: "I tuoi guadagni della scuola",
+ schoolProgress: "Progresso",
+ schoolProgressMark: "Segna come completata",
+ schoolProgressDone: "Completata",
+ schoolExams: "Esami",
+ schoolExamCreate: "Crea esame",
+ schoolExamTitlePlaceholder: "Titolo dell'esame",
+ schoolExamHelp: "Una domanda per riga: Domanda? ; opzione ; opzione corretta* ; opzione",
+ schoolExamQuestionsPlaceholder: "Cos'è SSB? ; Un database ; Un protocollo P2P* ; Un browser",
+ schoolExamSubmit: "Invia risposte",
+ schoolExamScore: "Il tuo punteggio",
+ schoolNoScoresYet: "Ancora nessun risultato.",
+ schoolLessonUnit: "Unità / fase",
+ schoolLessonUnitPlaceholder: "es. Fase 1",
+ schoolLessonOrder: "Ordine",
+ profileClearnetSchoolLabel: "Scuola",
+ schoolStartDate: "Data di inizio",
+ schoolSessionDate: "Data della sessione",
+ schoolCourseChat: "Chat del corso",
+ agendaFilterSchool: "SCUOLA",
+ agendaFilterCampaigns: "CAMPAGNE",
+ agendaFilterLogistics: "LOGISTICA",
+ schoolCourseType: "Tipo di corso",
+ schoolTypeOpen: "APERTO",
+ schoolTypePaid: "A PAGAMENTO",
+ schoolTypeInvite: "SOLO SU INVITO",
+ schoolLessonLocked: "Lezione cifrata — chiedi all'insegnante la chiave del corso.",
+ schoolGrantAccess: "Invia chiave del corso",
+ schoolKeySent: "Chiave inviata",
+ schoolOngoing: "In corso",
+ schoolFilterApplied: "ISCRITTO",
+ schoolFilterOpen: "APERTI",
+ schoolFilterFavorites: "PREFERITI",
+ schoolPendingPayment: "Pagamento in sospeso",
+ schoolPendingStudents: "Iscrizioni in sospeso",
+ schoolViewBill: "Vedi fattura",
+ schoolPaymentNote: "L'iscrizione genera una fattura in ECO (un trasferimento). La tua iscrizione è confermata quando il trasferimento viene firmato.",
+ schoolCloseCourse: "Chiudi corso",
+ schoolReopenCourse: "Riapri corso",
+ schoolDescription: "Insegna e impara corsi nella tua rete.",
+ schoolFilterAll: "TUTTI",
+ schoolFilterMine: "MIEI",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RECENTI",
+ schoolCreateButton: "Crea Corso",
+ schoolCreateSectionTitle: "Crea un corso",
+ schoolUpdateSectionTitle: "Aggiorna corso",
+ schoolCourseTitlePlaceholder: "Nome del tuo corso",
+ schoolCourseDescriptionPlaceholder: "Cosa insegnerai in questo corso?",
+ schoolCourseImage: "Immagine del corso (dimensione max: 75MB)",
+ schoolTags: "Tag",
+ schoolTagsPlaceholder: "Inserisci tag separati da virgole",
+ schoolPrice: "Prezzo (ECO)",
+ schoolVisibility: "Visibilità",
+ schoolVisibilityPublic: "Pubblico",
+ schoolVisibilityInvite: "Su invito",
+ schoolStatus: "Stato",
+ schoolClosed: "Chiuso",
+ schoolFree: "Gratis",
+ schoolCreate: "Crea corso",
+ schoolUpdate: "Aggiorna corso",
+ schoolSearchPlaceholder: "Cerca in Scuola...",
+ schoolSortTitle: "Titolo",
+ schoolNoCourses: "Nessun corso trovato.",
+ schoolStudents: "Studenti",
+ schoolTeacher: "Insegnante",
+ schoolCreatedAt: "CREATO",
+ schoolLessons: "Lezioni",
+ schoolNoLessons: "Ancora nessuna lezione.",
+ schoolEnrollToSee: "Iscriviti per vedere le lezioni di questo corso.",
+ schoolEnrollButton: "ISCRIVITI",
+ schoolUnenrollButton: "Abbandona il corso",
+ schoolInviteRequired: "Questo corso è su invito.",
+ schoolTeacherPanel: "Pannello dell'insegnante",
+ schoolStudentPanel: "Pannello dello studente",
+ schoolAddLesson: "Crea lezione",
+ schoolLessonTitlePlaceholder: "Titolo della lezione",
+ schoolLessonTextPlaceholder: "Descrivi le nozioni trattate in questa lezione...",
+ schoolInviteStudents: "Invita studenti",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "INVITA",
+ schoolInvited: "Invitati",
+ schoolIssueCertificate: "Crea certificato",
+ schoolCertified: "Certificato",
+ schoolCertificateTextPlaceholder: "Nota del certificato (opzionale)",
+ schoolLessonOpen: "Apri lezione",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificati",
+ schoolNoCertificates: "Nessun certificato emesso finora.",
+ schoolEditButton: "Modifica",
+ schoolDeleteButton: "Elimina",
+ typeSchool: "SCUOLA",
+ schoolCourseLabel: "CORSO",
+ emergencyLabel: "EMERGENZA",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Corsi",
+ statsSchoolLesson: "Lezioni",
+ statsSchoolEnroll: "Iscrizioni",
+ statsSchoolCertificate: "Certificati della scuola",
+ modulesSchoolLabel: "Scuola",
+ modulesSchoolDescription: "Modulo per scambiare conoscenza.",
+ welcomeStepUxAction: "Salva vista",
+ welcomeStepWorkflowTitle: "Che uso di OASIS hai in mente?",
+ welcomeStepWorkflowText: "Oasis ha molti moduli. Scegli la configurazione adatta a te e resteranno attivi solo quelli utili. Puoi modificarla quando vuoi in Moduli.",
+ welcomeStepWorkflowAction: "Salva configurazione",
+ welcomeWorkflow_full: "Predefinito",
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.",
chatTitlePlaceholder: "Titolo chat",
chatDescriptionPlaceholder: "Descrizione chat",
- chatTagsPlaceholder: "tag1, tag2, tag3",
+ chatTagsPlaceholder: "Inserisci tag separati da virgole",
chatImageLabel: "Seleziona un file immagine (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Autore",
chatAddFavorite: "Aggiungi ai Preferiti",
chatRemoveFavorite: "Rimuovi dai Preferiti",
chatPM: "MP",
chatStatusLabel: "Stato",
+ chatTypeLabel: "Tipo di chat",
chatCategoryLabel: "Categoria",
gamesTitle: "Giochi",
gamesDescription: "Scopri e gioca ad alcuni giochi.",
@@ -3157,22 +4163,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Lancia una moneta e scommetti su testa o croce. Quanta fortuna hai?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "Biliardo visto dall'alto. Clicca per mirare, tieni premuto per caricare la potenza. Imbuca tutte le palle con il minor numero di tiri.",
+ gamesArtilleryTitle: "Artiglieria",
+ gamesArtilleryDesc: "Punta il cannone, tieni conto del vento e colpisci il bersaglio. 5 round, vince chi usa meno colpi.",
+ gamesLabyrinthTitle: "Labirinto",
+ gamesLabyrinthDesc: "Fuggi dal labirinto prima di esaurire le mosse. Ogni livello è più grande e più difficile.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Mangia tutti i puntini, evita i fantasmi. I fantasmi si muovono in tempo reale — non fermarti!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "Pendolo sonoro",
+ gamesAudioPendulumDesc: "Simulatore di fisica caotica con sintesi audio in tempo reale. Le velocità angolari diventano frequenze, i picchi colpi di percussione. Non esistono due simulazioni che suonino uguali.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Mixa visual dal vivo su due piatti: scegli un motivo per ciascuno, regola velocità, colore e zoom, sfuma tra i due e lancia flash a tempo. Batti il tempo o lascia che il microfono guidi il battito.",
+ gamesTetrisDesc: "I classici blocchi che cadono. Completa le linee per fare punti. Quanto resisterai?",
+ gamesMinesweeperTitle: "Campo minato",
+ gamesMinesweeperDesc: "La classica caccia alle mine. Ripulisci il campo per salire di livello — griglie più grandi, più mine, punteggio più alto.",
+ gamesFilterScoring: "PUNTEGGI",
+ gamesHallOfFame: "Albo d'oro",
+ gamesHallPlayer: "Giocatore",
+ gamesHallScore: "Punteggio",
+ gamesNoScores: "Ancora nessun punteggio.",
calendarsTitle: "Calendari",
calendarTitle: "Calendario",
modulesCalendarsLabel: "Calendari",
@@ -3180,15 +4190,15 @@ module.exports = {
typeCalendar: "CALENDARI",
calendarCreate: "Crea calendario",
calendarUpdate: "Aggiorna",
- calendarDelete: "Elimina",
calendarTitleLabel: "Titolo",
calendarTitlePlaceholder: "Titolo del calendario...",
calendarStatusLabel: "Stato",
+ calendarTypeLabel: "Tipo di calendario",
calendarStatusOpen: "APERTO",
calendarStatusClosed: "CHIUSO",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Scadenza",
calendarTagsLabel: "Tag",
- calendarTagsPlaceholder: "tag1, tag2...",
+ calendarTagsPlaceholder: "Inserisci tag separati da virgole",
calendarParticipantsLabel: "Partecipanti",
calendarCreated: "Creato",
calendarJoin: "Partecipa",
@@ -3199,11 +4209,11 @@ module.exports = {
calendarNotePlaceholder: "Aggiungi una nota...",
calendarFirstDateLabel: "Data",
calendarFirstNoteLabel: "Note",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Intervallo",
calendarIntervalNone: "Senza ripetizione",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Settimanale",
+ calendarIntervalMonthly: "Mensile",
+ calendarIntervalYearly: "Annuale",
calendarFormDescription: "Descrizione",
calendarNoDates: "Nessuna data aggiunta.",
calendarNoNotes: "Nessuna nota.",
@@ -3211,6 +4221,8 @@ module.exports = {
calendarsDescription: "Scopri e gestisci i calendari nella tua rete.",
calendarMonthPrev: "← Precedente",
calendarMonthNext: "Successivo →",
+ calendarMonthNames: "Gennaio,Febbraio,Marzo,Aprile,Maggio,Giugno,Luglio,Agosto,Settembre,Ottobre,Novembre,Dicembre",
+ calendarDayInitials: "L,M,M,G,V,S,D",
calendarAllSectionTitle: "Calendari",
calendarRecentSectionTitle: "Calendari Recenti",
calendarFavoritesSectionTitle: "Preferiti",
@@ -3220,9 +4232,9 @@ module.exports = {
calendarCreateSectionTitle: "Crea nuovo calendario",
calendarUpdateSectionTitle: "Aggiorna calendario",
calendarAddFavorite: "Aggiungi ai preferiti",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Elimina",
calendarRemoveFavorite: "Rimuovi dai preferiti",
- calendarSearchPlaceholder: "Cerca calendari...",
+ calendarSearchPlaceholder: "Cerca in Calendario...",
calendarAddEntry: "Aggiungi Voce",
statsCalendar: "Calendari",
statsCalendarDate: "Date calendario",
@@ -3234,6 +4246,146 @@ module.exports = {
tribeContentAccessDenied: "Accesso Negato",
tribeContentAccessDeniedMsg: "Questo contenuto appartiene a una tribù. Devi essere membro per accedervi.",
tribeViewTribes: "Visualizza Tribù",
+ tribeFilesEmpty: "Ancora nessun file.",
+ filesLabel: "File",
+ profileClearnetFilesLabel: "File",
+ filesTitle: "File",
+ filesDescription: "Esplora e gestisci i file nella tua rete.",
+ fileAllSectionTitle: "File",
+ fileMineSectionTitle: "I Tuoi File",
+ fileRecentSectionTitle: "File Recenti",
+ fileTopSectionTitle: "Migliori File",
+ fileFavoritesSectionTitle: "Preferiti",
+ fileFilterAll: "TUTTI",
+ fileFilterMine: "MIEI",
+ fileFilterRecent: "RECENTI",
+ fileFilterTop: "MIGLIORI",
+ fileFilterFavorites: "PREFERITI",
+ fileCreateSectionTitle: "Carica File",
+ fileUpdateSectionTitle: "Aggiorna File",
+ fileCreateButton: "Carica File",
+ fileUpdateButton: "Aggiorna",
+ fileAddFavoriteButton: "Aggiungi ai Preferiti",
+ fileRemoveFavoriteButton: "Rimuovi dai Preferiti",
+ fileFileLabel: "Seleziona un file (max: 75MB)",
+ calendarFilterRecent: "RECENTI",
+ calendarFilterAll: "TUTTI",
+ calendarFilterMine: "MIEI",
+ calendarFilterFavorites: "PREFERITI",
+ calendarFilterOpen: "APERTI",
+ calendarFilterClosed: "CHIUSI",
+ padFilterRecent: "RECENTI",
+ padFilterAll: "TUTTI",
+ padFilterMine: "MIEI",
+ padFilterOpen: "APERTI",
+ padFilterClosed: "CHIUSI",
+ chatFilterRecent: "RECENTI",
+ chatFilterAll: "TUTTI",
+ chatFilterMine: "MIEI",
+ chatFilterFavorites: "PREFERITI",
+ chatFilterOpen: "APERTI",
+ chatFilterClosed: "CHIUSI",
+ licenseLabel: "Licenza",
+ phoneTitle: "Telefono",
+ phoneDescription: "Gestisci le tue videochiamate cifrate end-to-end.",
+ phoneUnavailable: "Le chiamate non sono disponibili su questo dispositivo.",
+ phoneCallButton: "Chiama",
+ profileVisibilityPhone: "Numero di telefono",
+ phoneNumberUnknown: "Nessuno nella tua rete ha il numero {number}.",
+ phoneNumberChoose: "Controlla chi vuoi chiamare al {number}:",
+ phoneAnswer: "Rispondi",
+ phoneSpeaker: "Altoparlante",
+ phoneEarpiece: "Auricolare",
+ phoneReject: "Rifiuta",
+ phoneHangup: "Riaggancia",
+ phoneMute: "Disattiva microfono",
+ phoneUnmute: "Attiva microfono",
+ phoneCameraOn: "Fotocamera on",
+ phoneCameraOff: "Fotocamera off",
+ settingsPhoneVideo: "Video",
+ settingsPhoneVideoOn: "Consentito in chiamate e stanze",
+ settingsPhoneVideoOff: "Solo audio",
+ phoneSilence: "Non sentire",
+ phoneUnsilence: "Sentire di nuovo",
+ phoneCalling: "Chiamata a",
+ phoneIsCalling: "ti sta chiamando",
+ notifyNewPmFrom: "Nuovo MP da",
+ notifyNewPamFrom: "Nuovo PaM da",
+ notifyUpdateLabel: "Aggiornamento",
+ updateInstalledLabel: "Versione installata",
+ updateAvailableLabel: "Versione disponibile",
+ updateChangesLabel: "Modifiche",
+ updateFilesLabel: "File",
+ updateOriginLabel: "Origine",
+ phoneRecording: "Registrazione PaM per",
+ phoneLeaveMessage: "Nessuno risponde: lascia il tuo messaggio dopo il segnale acustico.",
+ phoneLeaveMessageBusy: "È in un'altra chiamata: lascia il tuo messaggio dopo il segnale.",
+ phoneLeaveMessageUnreachable: "Non è stato possibile contattarlo: lascia il tuo messaggio dopo il segnale.",
+ phoneConnecting: "Connessione con",
+ phoneSendPam: "Invia PaM",
+ phoneCancel: "Annulla",
+ phoneSearchPlaceholder: "Cerca in Telefono...",
+ phonePamTitle: "Registrazioni audio",
+ phoneNew: "Nuovo",
+ phoneDelete: "Elimina",
+ phoneNoPams: "Non hai registrazioni audio.",
+ phoneHistoryTitle: "Cronologia",
+ phoneLatestTitle: "Ultime chiamate",
+ phoneCreateButton: "Nuova chiamata",
+ phoneLimitsHint: "Fino a 7 abitanti per chiamata; con più di uno è una chiamata congiunta.",
+ phoneErrorPub: "Non si può chiamare un pub.",
+ phoneJointCall: "Chiamata congiunta",
+ phoneWith: "Con",
+ phoneResult: "Esito",
+ phoneWhen: "Quando",
+ phoneDuration: "Durata",
+ phoneOutgoing: "In uscita",
+ phoneIncoming: "In arrivo",
+ phoneNoHistory: "Ancora nessun registro.",
+ phoneOutcomeEnded: "Risposta",
+ phoneOutcomeMissed: "Persa",
+ phoneOutcomeRejected: "Rifiutata",
+ phoneOutcomeNoanswer: "Nessuna risposta",
+ phoneOutcomeCancelled: "Annullata",
+ phoneOutcomePam: "PaM inviato",
+ phoneOutcomeFailed: "Non riuscita",
+ phoneDialAdd: "Aggiungi",
+ phoneDialBack: "Cancella",
+ phoneDialClear: "Svuota",
+ phoneDialPlaceholder: "Numero o Oasis ID",
+ phoneDialInhabitants: "Abitanti",
+ phoneDialRemove: "Rimuovi",
+ phoneOwnNumber: "Questo è il tuo numero.",
+ phoneSettingsDesc: "Scegli chi può chiamarti.",
+ phoneDnd: "Non disturbare",
+ phoneOpen: "Aperto",
+ phoneRecipientRefuses: "L'abitante che stai cercando di chiamare non accetta chiamate.",
+ phoneRefusedNotice: "Questi abitanti non accettano chiamate e non sono stati chiamati:",
+ fileEmptyError: "Il file è vuoto. Scegli un altro file.",
+ fileTitleLabel: "Titolo",
+ fileTitlePlaceholder: "Titolo",
+ fileDescriptionLabel: "Descrizione",
+ fileDescriptionPlaceholder: "Descrizione",
+ fileTagsLabel: "Tag",
+ fileTagsPlaceholder: "Inserisci tag separati da virgole",
+ fileSizeLabel: "Dimensione",
+ fileDownloadButton: "SCARICA",
+ fileDetailsButton: "DETTAGLI",
+ fileNoFile: "Nessun file file",
+ fileSearchPlaceholder: "Cerca in File...",
+ fileSearchButton: "Cerca",
+ fileSortRecent: "Più recenti",
+ fileSortOldest: "Più vecchi",
+ fileSortTop: "Più votati",
+ fileNoMatch: "Nessun file corrispondente.",
+ fileUpdatedAt: "Aggiornato",
+ typeFile: "FILE",
+ modulesFilesLabel: "File",
+ modulesFilesDescription: "Modulo per scoprire e gestire gli file.",
+ tribeSectionFiles: "FILE",
+ fileDescription: "Descrizione",
+ fileDownload: "Scarica",
+ fileTypeLabel: "Tipo",
torrentsTitle: "Torrent",
torrentsDescription: "Esplora e gestisci i torrent nella tua rete.",
torrentAllSectionTitle: "Torrent",
@@ -3261,10 +4413,33 @@ module.exports = {
torrentTagsLabel: "Tag",
torrentTagsPlaceholder: "Inserisci tag separati da virgole",
torrentSizeLabel: "Dimensione",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Genera torrent",
+ torrentFromContentMissing: "Il file non è ancora disponibile su questo nodo. Riprova tra un po'.",
+ torrentDownloads: "Download",
+ torrentFetchOasis: "Scarica in Oasis",
+ torrentSaveFile: "Salva file",
+ torrentSeeds: "seed",
+ seedsLabel: "Seed",
+ seedAction: "Supporta",
+ torrentSourceFile: "File",
+ torrentStateQueued: "In coda",
+ torrentStateProbing: "Ricerca seed",
+ torrentStateDownloading: "Scaricamento",
+ torrentStateDone: "Completato",
+ torrentStateFailed: "Fallito",
+ torrentStateNoSource: "Nessun seed connesso, in attesa",
+ torrentStateCancelled: "Annullato",
+ torrentNoDownloads: "Nessun download per ora.",
+ torrentOriginalSection: "Originale",
+ torrentCancel: "Annulla",
+ torrentDownloadButton: "SCARICA",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETTAGLI",
torrentNoFile: "Nessun file torrent",
noTorrents: "Nessun torrent trovato.",
- torrentSearchPlaceholder: "Cerca titolo, tag, autore...",
+ noFiles: "Nessun file trovato.",
+ torrentSearchPlaceholder: "Cerca in Torrent...",
torrentSearchButton: "Cerca",
torrentSortRecent: "Più recenti",
torrentSortOldest: "Più vecchi",
@@ -3272,10 +4447,12 @@ module.exports = {
torrentNoMatch: "Nessun torrent corrispondente.",
torrentUpdatedAt: "Aggiornato",
statsTorrent: "Torrent",
+ statsFile: "File",
typeTorrent: "TORRENT",
modulesTorrentsLabel: "Torrent",
modulesTorrentsDescription: "Modulo per scoprire e gestire i torrent.",
favoritesFilterTorrents: "TORRENT",
+ favoritesFilterFiles: "FILE",
favoritesFilterMarket: "MERCATO",
favoritesFilterEvents: "EVENTI",
favoritesFilterForum: "FORUM",
@@ -3289,15 +4466,17 @@ module.exports = {
favoritesFilterShopProducts: "ARTICOLI NEGOZIO",
tribeSectionTorrents: "TORRENT",
tribeCreateTorrent: "Carica Torrent",
+ tribeCreateFile: "Carica file",
settingsWishTitle: "Desiderio",
- settingsWishDesc: "Configura il desiderio del tuo Avatar.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Determina come accedi a tutti i contenuti e la tua esperienza nella rete Oasis.",
+ settingsWishWhole: "Multiverso",
+ settingsWishMutuals: "Solo supporto reciproco",
+ settingsWishOnlyLan: "Solo LAN",
+ settingsWishLocal: "Locale",
settingsPmVisibilityTitle: "Messaggi Privati",
settingsPmVisibilityDesc: "Configura il livello di esposizione ai messaggi privati.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Multiverso",
+ settingsPmVisibilityMutuals: "Solo supporto reciproco",
pmMutualNotice: "L'invio è un guardrail UX. La ricezione è un filtro di attenzione.",
inhabitantsPendingFollowsTitle: "Richieste di supporto in attesa",
inhabitantsPendingAccept: "Accetta",
@@ -3341,7 +4520,7 @@ module.exports = {
tribeGovNoRevocations: "Ancora nessuna revoca",
tribeGovNoHistorical: "Ancora nessun record",
logsTitle: "Diario",
- logsDescription: "Registra la tua esperienza nella rete.",
+ logsDescription: "Tieni un diario privato delle tue esperienze.",
logsViewTitle: "Diario",
logsColumnType: "Tipo",
logsView: "Vedi",
@@ -3350,7 +4529,7 @@ module.exports = {
logsCreateTitle: "Crea voce",
logsWriteButton: "Scrivi",
logsTextPlaceholder: "Descrivi le tue esperienze...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "Assistente AI",
logsModeManual: "Manuale",
logsModeAI: "IA",
logsColumnLog: "Diario",
@@ -3369,19 +4548,20 @@ module.exports = {
logsExportOne: "Esporta registro",
logsViewDetails: "Vedi dettagli",
logsGenerateButton: "Genera testo",
- logsSearchText: "Cerca nei diari...",
+ logsSearchText: "Cerca in Diario...",
logsSearchAnyType: "Qualsiasi tipo",
logsSearchButton: "Cerca",
logsEmpty: "Nessuna voce ancora.",
+ logsNothingNew: "Non ci sono nuove azioni da registrare.",
modulesLogsLabel: "Diario",
- modulesLogsDescription: "Modulo per registrare (tramite assistente IA) le tue esperienze.",
+ modulesLogsDescription: "Modulo per tenere un diario privato delle tue esperienze.",
statsLogsTitle: "Diario",
typeLog: "DIARIO",
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...",
+ larpSearchPlaceholder: "Cerca in L.A.R.P....",
larpAllHouses: "Case:",
larpFilterRuling: "GOVERNA",
larpFilterHouses: "CASE",
@@ -3397,38 +4577,39 @@ module.exports = {
larpPostSubmit: "Pubblica",
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.",
+ bankRulesArchTaxNote: "La tassa ARCH riflette il costo a lungo termine di crescita e manutenzione dell'archivio della rete: più i tuoi dati sono vecchi nella rete, maggiore è la tua quota del costo di manutenzione.",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
+ bankRulesChipNote: "Il chip di ogni elemento è colorato rispetto al messaggio più grande mai osservato nella rete e attenuato dal numero di abitanti attivi — una rete più grande distribuisce il carico e porta più elementi nella fascia verde.",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
+ bankRulesEcoTaxNote: "La tassa ECO viene dedotta dal RBU lordo quando si calcola l'assegnazione dell'epoca. Gli ECO dedotti non vengono ridistribuiti in questa epoca — restano nel saldo del pub e alimentano il fondo dell'epoca successiva tramite i limiti reserveMin / alpha.",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
+ bankRulesKarmaNote: "Il karma deriva dalle tue azioni (post, voti, partecipazione a parlamento/tribunali, ecc.) con un fattore di decadimento nel tempo, meno i grammi di carbonio generati dal tuo feed.",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, 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.",
- 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.",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
- statsPad: "Pads",
- statsPadEntry: "Pad entries",
- typeGameScore: "GAME SCORES",
+ bankTaxesArchTaxFootprintNote: "La tassa ARCH riflette il costo di crescita e manutenzione dell'archivio della rete. Si calcola dall'intervallo di tempo tra il tuo primo blocco pubblicato e il blocco più recente della rete — più a lungo la tua storia è rimasta nell'archivio, maggiore è la tua quota del costo di manutenzione.",
+ bankTaxesArchTaxNoteBold: "ridurre direttamente la tassa ARCH",
+ bankTaxesArchTaxNoteIntro: "La tua tassa ARCH viene dedotta dall'eccedenza che la rete genera oltre il tuo RBU; il valore di base del RBU è fissato come minimo inamovibile. La tassa non viene mai dedotta dall'importo fisso che spetta a ogni abitante come RBU. I fondi dedotti alimentano l'algoritmo di redistribuzione della ricchezza e vengono incanalati verso altri abitanti tramite le loro richieste di RBU. Gli abitanti più recenti e quelli dedicati specificamente ad attività di archiviazione, replica e manutenzione avranno probabilmente un compito dedicato a mantenere in salute l'archivio della rete per tuo conto. Oppure possono dedicarsi a ",
+ bankTaxesArchTaxNoteOutro: " tramite accordi di potatura, deduplicazione dei dati ridondanti e infrastrutture di manutenzione condivise, e il loro contributo continuo può essere richiesto dal consenso della rete.",
+ bankTaxesUserNoteChips: "Il chip della Tassa ECO mostrato accanto a ogni elemento cambia colore (verde / giallo / rosso) in base alla dimensione dell'elemento rispetto al blocco più grande mai visto nella rete, attenuato dal numero di abitanti attivi — una rete solarpunk più grande distribuisce il carico e porta più elementi nella fascia verde.",
+ bankTaxesUserNoteOtherParams: "La tassa ECO deriva attualmente dall'impronta di carbonio di ogni blocco, ma col tempo potrà includere altri parametri — energia spesa per la replica, archiviazione ridondante tra i peer, banda dei blob, costo computazionale della decifratura, impronta di mining delle transazioni associate o qualsiasi altro carico misurabile che la rete decida di valutare.",
+ gamesHallDate: "Data",
+ gamesNewRecord: "Nuovo record!",
+ indexingRefreshNote: "Questa pagina si ricarica ogni 10 secondi.",
+ indexingMessage: "Oasis sta sincronizzando la rete di nodi distribuita. Attendi, per favore.",
+ indexingTitle: "Sincronizzazione",
+ padsNoItems: "Nessun pad trovato.",
+ padVersionHistory: "Cronologia delle versioni",
+ padAttributionView: "Per autrice",
+ padVersionView: "Visualizza",
+ statsChat: "Chat",
+ statsChatMessage: "Messaggi di chat",
+ statsGameScore: "Giochi",
+ statsWiki: "Pagine wiki",
+ statsPad: "Pad",
+ statsPadEntry: "Voci dei pad",
+ typeGameScore: "PUNTEGGI DI GIOCO",
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",
@@ -3443,6 +4624,14 @@ module.exports = {
settingsReplicationTitle: "Replicazione",
settingsReplicationDesc: "Configura il numero di salti che il tuo peer segue dal tuo feed durante la replica dei contenuti.",
settingsReplicationHopsLabel: "Salti",
+ settingsBlobCacheTitle: "Cache dei media",
+ settingsBlobCacheDesc: "I contenuti degli altri abitanti vengono conservati su questo dispositivo. Scegli quanto spazio possono occupare.",
+ settingsBlobCacheUsage: "Uso attuale",
+ settingsBlobCacheFiles: "file",
+ settingsBlobCacheLimit: "Limite",
+ settingsBlobCacheUnlimited: "Illimitato",
+ settingsBlobCacheCleanNow: "Pulisci ora",
+ settingsBlobCacheCleaned: "{n} file rimossi, {size} liberati.",
aiApproveTagsLabel: "Tag (separati da virgole)",
aiApproveTagsPlaceholder: "es. oasis, governance, ecologia",
aiApproveRatingLabel: "Valutazione",
@@ -3470,13 +4659,11 @@ module.exports = {
larpInviteBannerHint: "Condividi questo codice con qualcuno in ACADEMIA. Scade tra 30 cicli o dopo un singolo uso.",
larpTestRankingTitle: "Punteggio per casa",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "Codice di invito di casa",
- invitesHouseJoinButton: "Unisciti alla Casa",
- ecoTaxLabel: "ECO Tax",
+ ecoTaxLabel: "Tassa ECO",
bankTaxes: "Tasse",
- bankOverviewYourTaxes: "Le tue tasse",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesArchTaxTitle: "ARCH Tax",
+ bankOverviewYourTaxes: "Imposte totali",
+ bankTaxesEcoTaxTitle: "Tassa ECO",
+ bankTaxesArchTaxTitle: "Tassa ARCH",
bankTaxesUserAmount: "La tua ECO Tax (prezzo da restituire)",
bankTaxesArchTaxUserAmount: "La tua ARCH Tax (prezzo da restituire)",
bankTaxesArchTaxFirstBlock: "Età del tuo primo blocco",
@@ -3504,7 +4691,7 @@ module.exports = {
bankTaxesLookupType: "Tipo",
bankTaxesLookupSize: "Dimensione",
bankTaxesLookupCarbon: "Impronta di carbonio",
- bankTaxesLookupEcoin: "ECO Tax",
+ bankTaxesLookupEcoin: "Tassa ECO",
bankExchangeEcoTaxAnnual: "ECOin Taxes (annuale)",
bankExchangeEcoTaxMonthly: "ECOin Taxes (mensile)",
bankTaxesTypesLabel: "Seleziona quali tasse vuoi pagare",
@@ -3512,14 +4699,14 @@ module.exports = {
bankRulesPoolTitle: "Pool mensile",
bankRulesShareTitle: "Quota per utente",
bankRulesKarmaTitle: "Karma (punteggio di partecipazione)",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesArchTaxTitle: "ARCH Tax",
+ bankRulesEcoTaxTitle: "Tassa ECO",
+ bankRulesArchTaxTitle: "Tassa ARCH",
bankRulesChipTitle: "Banda di colore del chip ECO Tax",
bankRulesEpochKind: "Granularità dell'epoch",
bankRulesAlpha: "Alpha (quota massima del saldo del pub per epoch)",
bankRulesReserveMin: "Riserva minima (mantenuta nel saldo del pub)",
bankRulesCapPerEpoch: "Tetto per epoch (assoluto)",
- bankRulesGraceDays: "Periodo di grazia del claim",
+ bankRulesGraceDays: "Periodo di grazia della richiesta",
bankRulesWMin: "Peso minimo (w_min)",
bankRulesWMax: "Peso massimo (w_max)",
bankRulesFloor: "Pavimento per utente (lordo)",
@@ -3531,12 +4718,11 @@ module.exports = {
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",
- audioTranscodeDetailTitle: "Transcode",
+ audioTranscodeButton: "TRANSCODIFICA",
+ audioTranscodeDetailTitle: "Transcodifica",
audioTranscodeDetailDescription: "Decodifica il payload incorporato e la mappa di composizione originale della blockchain.",
- audioTranscodeStegoOasisId: "Da",
audioTranscodeStegoTimestamp: "Generato il",
- audioTranscodeStegoMessage: "TEXT",
+ audioTranscodeStegoMessage: "TESTO",
audioTranscodeStegoEmpty: "(nessuno)",
audioTranscodeStegoUnknown: "—",
audioTranscodeStegoNotFound: "Nessun payload steganografico è stato decodificato da questo audio.",
@@ -3544,7 +4730,6 @@ module.exports = {
audioBackToBcs: "Torna a BCS",
melodyCompositionTitle: "Mappa di composizione blockchain",
melodyFilterMine: "MIO",
- melodyByLabel: "Da",
melodyAllEmpty: "Ancora nessuna composizione BCS da altri abitanti.",
melodyNoteUnavailable: "il blocco non è nel tuo feed locale",
melodyUploadBcsTitle: "Pubblica",
@@ -3570,14 +4755,14 @@ module.exports = {
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).",
+ modulesLarpDescription: "Modulo per il livello di gioco di ruolo dal vivo.",
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",
larpProfileQ1O3: "Studiare la letteratura",
larpProfileQ1O4: "Sabotare il sistema che lo provoca",
larpProfileQ2: "Cosa dà senso al tuo lavoro quotidiano?",
- larpProfileQ2O1: "Difendere le persone che amo",
+ larpProfileQ2O1: "Difendere gli abitanti che amo",
larpProfileQ2O2: "Creare qualcosa di tangibile",
larpProfileQ2O3: "Guarire o coltivare la vita",
larpProfileQ2O4: "Lavorare con parole e idee",
@@ -3644,6 +4829,51 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Seleziona la modalità di navigazione UX per la tua interfaccia.",
uxModeMenus: "Blocchi",
+ uxModeChats: "Conversazioni",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Tag di Tendenza",
+ feedActiveTitle: "Abitanti Attivi",
+ cnBrandSub: "Libero · P2P · Federato",
+ cnSyncedPeers: "Peer sincronizzati",
+ cnLicense: "Licenza",
+ cnNotAccessible: "Il contenuto non è accessibile in questo momento.",
+ cnUntitled: "Senza titolo",
+ cnSearchPlaceholder: "Cerca…",
+ cnHubTitle: "HUB Clearnet",
+ cnHubDescription: "Contenuti pubblici condivisi dagli abitanti di questa rete Oasis.",
+ cnHubEmpty: "Nessun contenuto pubblico è ancora stato condiviso sulla Clearnet.",
+ cnPublicContent: "Contenuti",
+ cnTribesContent: "Tribù",
+ cnNetworkContent: "Rete",
+ cnCategoryEmpty: "Nessun contenuto in questa categoria.",
+ cnInhabitantEmpty: "Questo abitante non ha ancora pubblicato contenuti sulla Clearnet.",
+ cnPrevPage: "← Precedente",
+ cnNextPage: "Successiva →",
+ cnPageOf: "Pagina {page} di {pages}",
+ cnMoreInfo: "Maggiori informazioni →",
+ cnOpenCourse: "Corso aperto",
+ cnAuction: "ASTA",
+ cnExchange: "SCAMBIO",
+ cnRssDescription: "pubblicati dagli abitanti di questo HUB",
+ cnKindAudio: "Audio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Segnalibro",
+ cnKindDocument: "Documento",
+ cnKindEvent: "Evento",
+ cnKindFeed: "Feed",
+ cnKindImage: "Immagine",
+ cnKindJob: "Lavoro",
+ cnKindMarket: "Mercato",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Progetto",
+ cnKindCourse: "Corso",
+ cnKindShop: "Negozio",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "File",
+ cnKindVideo: "Video",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Stanza",
+ cnKindMap: "Mappa",
uxModeAINav: "AI",
}
diff --git a/src/client/assets/translations/oasis_pt.js b/src/client/assets/translations/oasis_pt.js
index 4d3ecd8..2180f61 100644
--- a/src/client/assets/translations/oasis_pt.js
+++ b/src/client/assets/translations/oasis_pt.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "Compras",
shopMyOrdersDescription: "As tuas encomendas de compra.",
shopMyOrdersEmpty: "Ainda não tens compras.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM Vendedor",
shopOrderSeller: "Vendedor",
shopOrderInvoice: "Fatura",
shopOrderInvoiceConcept: "Fatura",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Aceitar",
shopOrderReject: "Rejeitar",
shopOrderMarkShipped: "Marcar enviado",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM Comprador",
shopOrderContractConcept: "Encomenda de loja",
shopOrdersPending: "Encomendas pendentes",
all: "Todos",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Recentes",
anonymous: "Anónimo",
unnamed: "Anónimo",
- authorLabel: "AUTOR",
+ authorLabel: "Autoria",
delete: "Eliminar",
save: "Guardar",
vote: "Votar",
@@ -54,13 +54,13 @@ module.exports = {
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",
spreadContentUnavailable: "Conteúdo ainda não disponível (replicação pendente)",
filteredByTag: "Filtrado por etiqueta",
filteredByTagTitle: "Filtrado por etiqueta",
feedPublishedSuccess: "Feed publicado com sucesso!",
+ feedMastodonFailed: "Publicado no Oasis, mas não foi possível enviá-lo para o Mastodon.",
tribeFeedSent: "Mensagem enviada com sucesso!",
tribeContentEncrypted: "Conteúdo encriptado",
tribeTorrentsEmpty: "Ainda sem torrents.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Última visita",
profileClearnetBookmarksLabel: "Marcadores",
invitesPort: "Porta",
- currentlyUnrecheable: "ERRO!",
- peerHostValidation: "IPv4 válido (ex. 192.168.1.100) ou nome de host (ex. pub.example.com)",
+ peerHostValidation: "IPv4 válido (ex. 192.168.1.100) ou nome de host (ex. pub.solarnethub.com)",
peerPortValidation: "Porta 1-65535",
peerKeyValidation: "Chave pública SSB ed25519 (@<44 caracteres base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Cancelamento da tua oferta de emprego",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Descrição da tarefa",
exportPasswordLabel: "Senha de exportação",
importPasswordPlaceholder: "Introduz a palavra-passe",
- searchCasesPlaceholder: "Pesquisar casos…",
+ searchCasesPlaceholder: "Pesquisar em Tribunais...",
shopBuyDeliveryAddressPlaceholder: "Endereço de entrega",
shopBuyNotesPlaceholder: "Notas",
bankTaxesUserNoteBold: "reduzir diretamente o imposto ECO",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Apoiar o caso",
courtsSettlementAcceptBtn: "Aceitar acordo",
courtsSupportCount: "Apoios",
- courtsVerdictVoteTitle: "Votar no veredicto",
- courtsVerdictVoteLabel: "Voto do veredicto",
- courtsVerdictVoteAccept: "Aceitar",
- courtsVerdictVoteReject: "Rejeitar",
- courtsVerdictVoteSubmit: "Enviar voto",
reportsSetStatus: "Definir estado",
reportsStatusClosed: "FECHADO",
statsAvgPerInhabitant: "Média por habitante",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "Avatar",
inhabitants: "Habitantes",
- peersReplicatedFeeds: "Feeds replicados",
+ peersReplicatedFeeds: "Replicados",
+ peersTorColumn: "TOR",
+ peersTorYes: "Acessível por Tor",
+ peersTorNo: "Não acessível por Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Versão",
graphos: "Graphos",
graphosDescription: "Mapa interativo da rede ao seu redor.",
+ graphosFederation: "Federação",
+ graphosFedPubs: "PUBs",
+ graphosFedUnreachable: "Inalcançáveis",
+ graphosFedLinks: "Ligações mútuas",
+ graphosFedIsolated: "Isolados",
+ graphosFedNoData: "Sem dados",
+ graphosFedMutual: "Mútuo",
+ graphosFedOneWay: "Num sentido",
+ graphosFedTransport: "Rede",
+ graphosFedWith: "Federado com",
+ graphosZoom: "Ampliar",
+ graphosFedInhabitants: "Habitantes",
+ graphosFedClearnet: "Internet",
+ graphosFedBoth: "Internet + TOR",
+ graphosFedEmpty: "O seu nó ainda não conhece nenhum PUB.",
graphosViewingGraphOf: "A ver",
graphosBackToMine: "← Minha rede",
graphosShowing: "Mostrando",
@@ -203,8 +217,24 @@ module.exports = {
".",
],
noMentions: "Ainda não recebeste @menções.",
- mentionsSearchPlaceholder: "Procurar menções...",
+ mentionsSearchPlaceholder: "Pesquisar em Menções...",
privateReminders: "LEMBRETES",
+ inboxFilterPms: "MPs",
+ inboxFilterNotifications: "Notificações",
+ inboxMarkRead: "Marcar como lido",
+ inboxMarkUnread: "Marcar como não lido",
+ inboxUnreadChip: "Não lido",
+ inboxMarkAllRead: "Marcar tudo como lido",
+ inboxDeleteShown: "Apagar tudo",
+ inboxArchive: "Arquivar",
+ inboxUnarchive: "Desarquivar",
+ inboxFilterArchived: "Arquivados",
+ inboxEarlierMessages: "mensagens anteriores",
+ inboxSortThread: "Por conversa",
+ inboxSortRecent: "Mais recentes primeiro",
+ inboxAllBots: "Bots",
+ settingsInboxBotsTitle: "Notificações do Inbox",
+ settingsInboxBotsDesc: "Escolhe quais bots podem avisar-te no teu Inbox. Os bots desmarcados ficam ocultos e os seus avisos não são contados.",
inboxFiltersLabel: "Filtros:",
inboxToggleToMutuals: "Mudar para mútuos",
inboxToggleToWhole: "Mudar para todos",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "Responder",
pmReplies: "respostas",
inReplyTo: "EM RESPOSTA A",
+ forumInThread: "NO TÓPICO",
pmPreview: "Pré-visualizar",
pmPreviewTitle: "Pré-visualização da mensagem",
peers: "Pares",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "De",
searchToLabel: "Até",
searchQueryLabel: "Pesquisa",
- searchPerPageLabel: "Resultados por página",
+ searchPerPageLabel: "Resultados",
settings: "Definições",
+ settingsDescription: "Configura o ambiente da tua rede.",
continueReading: "Continuar a ler",
moreComments: "mais comentários",
readThread: "ler o resto da conversa",
@@ -239,7 +271,6 @@ module.exports = {
profileClearnetHelp: 'Módulos acessíveis a partir de fora do Oasis.',
profileHubAll: 'Tudo',
footerLicenseLabel: 'Licença',
- profileSwitchToOasis: 'Voltar para Oasis',
profileVisibilityFediverse: "Multiverso",
contributorsTitle: "Contribuidores",
colorLabel: 'Escolhe uma cor',
@@ -249,6 +280,7 @@ module.exports = {
modulesViewTitle: "Módulos",
modulesViewDescription: "Configura o teu ambiente ativando ou desativando módulos.",
inbox: "Caixa de entrada",
+ inboxSearchPlaceholder: "Pesquisar em Caixa de entrada...",
multiverse: "Multiverso",
fediverse: "Multiverso",
fediverseDescription: "Faça a gestão das suas outras contas do multiverso, incluindo enviar e receber conteúdo.",
@@ -257,9 +289,17 @@ module.exports = {
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",
+ nextcloudServerLabel: "Servidor",
+ nextcloudUserLabel: "Utilizador",
+ nextcloudFolderLabel: "Pasta",
+ nextcloudUploadButton: "Enviar",
+ nextcloudFileLabel: "Escolhe um ficheiro",
+ fileExternalLink: "Ligação externa",
+ nextcloudErrConnect: "Não foi possível chegar ao Nextcloud com estes dados.",
+ nextcloudErrUpload: "O envio para o Nextcloud falhou.",
+ nextcloudErrShare: "O Nextcloud não deu uma ligação pública para o ficheiro.",
fediverseDisconnect: "Desconectar",
fediverseEmptyLink: "suas definições",
fediverseComposePlaceholder: "No que está pensando?",
@@ -288,6 +328,76 @@ 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.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Número de telefone",
+ telegramSendCode: "Enviar código",
+ telegramCodeHelp: "Introduz o código que o Telegram te acabou de enviar (app ou SMS).",
+ telegramCodeLabel: "Código",
+ telegramPasswordHelp: "Esta conta tem verificação em dois passos. Introduz a tua palavra-passe.",
+ telegramPasswordLabel: "Palavra-passe",
+ telegramVerify: "Verificar",
+ telegramCancel: "Cancelar",
+ telegramChats: "Conversas",
+ telegramUnread: "Não lidas",
+ telegramOpen: "Abrir",
+ telegramSend: "Enviar",
+ telegramYou: "Tu",
+ telegramNoChats: "Ainda não há conversas.",
+ telegramNoMessages: "Ainda não há mensagens.",
+ telegramComposePlaceholder: "Escreve uma mensagem…",
+ telegramChannel: "Canal",
+ telegramGroup: "Grupo",
+ telegramPrivate: "Privado",
+ telegramErrConnect: "Não foi possível contactar o Telegram.",
+ telegramErrTimeout: "O Telegram demorou demasiado a responder.",
+ telegramErrAuth: "Sessão do Telegram inválida ou expirada. Liga de novo.",
+ telegramErrFetch: "Não foi possível carregar as conversas.",
+ telegramErrSend: "Não foi possível enviar a mensagem.",
+ telegramErrMissing: "São necessários API ID, API hash e número de telefone.",
+ telegramErrCode: "Código inválido. Tenta de novo.",
+ telegramErrCodeExpired: "O código expirou. Começa de novo.",
+ telegramErrPassword: "Palavra-passe errada.",
+ telegramErrPhone: "Número de telefone inválido.",
+ telegramErrApi: "API ID ou API hash inválidos.",
+ telegramErrFlood: "Demasiadas tentativas. Espera um pouco e tenta de novo.",
+ telegramErrNoLogin: "Nenhum início de sessão em curso. Começa de novo.",
+ peertubeUsernameLabel: "Utilizadora",
+ peertubePasswordLabel: "Palavra-passe",
+ peertubeSubscriptions: "Subscrições",
+ peertubeMyVideos: "Os meus vídeos",
+ peertubeVideos: "Vídeos",
+ peertubeFollowers: "Seguidoras",
+ peertubeViews: "visualizações",
+ peertubeLikes: "gostos",
+ peertubeQuota: "Quota",
+ peertubeUpload: "Carregar vídeo",
+ peertubeUploadHelp: "Escolhe um ficheiro de vídeo. É enviado para o teu canal e o PeerTube processa-o depois.",
+ peertubeTitleLabel: "Título",
+ peertubeDescriptionLabel: "Descrição",
+ peertubePrivacyLabel: "Privacidade",
+ peertubePrivacyPublic: "Público",
+ peertubePrivacyUnlisted: "Não listado",
+ peertubePrivacyPrivate: "Privado",
+ peertubeNoVideos: "Ainda não há vídeos.",
+ peertubeComments: "Comentários",
+ peertubeComment: "Comentar",
+ peertubeCommentPlaceholder: "Escreve um comentário…",
+ peertubeNoComments: "Ainda não há comentários.",
+ peertubeOpen: "Abrir no PeerTube",
+ peertubeWatch: "Ver",
+ peertubeChannel: "Canal",
+ peertubeNoStream: "Este vídeo ainda não pode ser reproduzido aqui. Abre-o no PeerTube.",
+ peertubeUploaded: "Vídeo enviado. O PeerTube está a processá-lo.",
+ peertubeErrConnect: "Não foi possível contactar o PeerTube.",
+ peertubeErrAuth: "Utilizadora ou palavra-passe incorretas, ou a sessão expirou. Liga de novo.",
+ peertubeErrInstance: "URL de instância inválido.",
+ peertubeErrMissing: "São necessários instância, utilizadora e palavra-passe.",
+ peertubeErrFetch: "Não foi possível carregar os vídeos.",
+ peertubeErrUpload: "Não foi possível enviar o vídeo.",
+ peertubeErrTitle: "Título obrigatório.",
+ peertubeErrComment: "Não foi possível publicar o comentário.",
+ peertubeErrNoFile: "Escolhe um ficheiro de vídeo.",
bookmarksLabel: "Marcadores",
videosLabel: "Vídeos",
torrentsLabel: "Torrents",
@@ -310,7 +420,6 @@ module.exports = {
comment: "Comentário",
subtopic: "Subtópico",
json: "JSON",
- createdBy: "por",
unfollow: "Deixar de apoiar",
follow: "Apoiar",
block: "Bloquear",
@@ -326,12 +435,15 @@ module.exports = {
relationshipNone: "Não estás a apoiar",
relationshipBlockingPost: "Publicação bloqueada",
viewLikes: "Ver difusões",
+ viewSupporters: "Ver apoiantes",
spreadedDescription: "Lista de publicações difundidas pelo habitante.",
preview: "Pré-visualizar",
publish: "Publicar",
contentWarningPlaceholder: "Adiciona um assunto à publicação (opcional)",
- publishWarningPlaceholder: "Corpo limitado a 7000 caracteres.",
+ publishWarningPlaceholder: "Escreve o corpo da tua entrada.",
publishTooLong: "A tua publicação é demasiado longa. Encurta-a, por favor.",
+ keepTextRetry: "Enviar de novo",
+ dateInPastError: "A data não pode ser anterior a hoje",
publishCustomDescription: [
"LEMBRA-TE: Devido à tecnologia blockchain, uma vez publicado, não pode ser editado nem eliminado.",
],
@@ -361,9 +473,8 @@ module.exports = {
mentionsMatching: "Menções correspondentes",
mentionsName: "Nome",
mentionsRelationship: "Relacionamento",
- updateit: "OBTER ATUALIZAÇÕES!",
updateBannerText: "Uma nova versão do Oasis está disponível.",
- updateBannerAction: "Atualizar agora →",
+ updateBannerAction: "Atualizar agora!",
info: "Info",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -371,16 +482,14 @@ module.exports = {
timeAgo: "atrás",
sendTime: "há ",
theme: "Tema",
- legacy: "Chaves",
- legacyTitle: "Chaves",
- legacyDescription: "Gere o teu segredo (chave privada) de forma rápida e segura.",
- legacyExportButton: "Exportar",
- legacyImportButton: "Importar",
- ssbLogStream: "Blokchain",
+ backupKeysExportButton: "Exportar",
+ backupKeysImportButton: "Importar",
+ ssbLogStream: "Blockchain",
ssbLogStreamDescription: "Configura o limite de mensagens para os fluxos da Blockchain.",
+ logWindowChip: "Últimos {n} streams da blockchain",
saveSettings: "Guardar definições",
exportDescription: "Define uma senha (mínimo 32 caracteres) para encriptar a tua chave",
- exportDataTitle: "Cópia de segurança",
+ exportDataTitle: "Cópia instantânea",
exportDataDescription: "Descarrega os teus dados (chave secreta excluída!)",
exportDataButton: "Descarregar base de dados",
importDescription: "Importa o teu segredo encriptado (chave privada) para ativar o teu avatar",
@@ -389,38 +498,33 @@ module.exports = {
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.",
+ welcomeBannerText: "O teu avatar ainda não está configurado.",
aiSuggestionBanner: "Sugestão:",
aiSuggestionsEnable: "Sugestões da IA",
- welcomeBannerAction: "Começar!",
+ welcomeBannerAction: "Começar",
welcomeTitle: "Bem-vinda",
+ welcomeStepIdentity: "Identidade",
+ welcomeStepType: "Tipo",
+ welcomeStepUse: "Uso",
+ welcomeStepLook: "Aparência",
+ welcomeStepCommunity: "Comunidade",
+ welcomeStepIntro: "Boas-vindas",
+ welcomeHintIdentity: "O teu nome e a tua imagem.",
+ welcomeHintType: "Como o Oasis se abre para ti.",
+ welcomeHintUse: "Que módulos ficam ativos.",
+ welcomeHintLook: "O tema que o Oasis veste.",
+ welcomeHintCommunity: "Entra num PUB para conheceres outros habitantes.",
+ welcomeHintIntro: "Envia uma primeira saudação à comunidade.",
+ welcomeStepThemeAction: "Usar este tema",
+ welcomeJoinPubs: "Entrar nos PUBs",
+ welcomeNoFederation: "Sem federação",
welcomeStepGreetingAction: "Enviar",
- welcomeJoinPubButton: "Juntar-se ao pub",
- welcomeStepLarpAction: "Juntar-se à \"Academia\"",
- welcomeStepLarpText: "Junta-te ao nosso jogo de representação ao vivo.",
- welcomeStepLarpTitle: "Junta-te ao L.A.R.P.",
- welcomeStepGreetingTitle: "Envia um \"Olá mundo!\"",
- welcomeStepGreetingText: "Envia uma mensagem para que outros habitantes te possam descobrir.",
- welcomeJoinPub: "Juntar-se a",
welcomeDescription: "Algumas coisas que vale a pena fazer antes de começar.",
- welcomeProgress: "Concluído",
- welcomeStepDone: "feito",
- welcomeStepPending: "pendente",
welcomeSkip: "Agora não",
- welcomeStepLanguageTitle: "Escolhe o teu idioma",
- welcomeStepLanguageText: "O Oasis fala vários idiomas. Podes mudar quando quiseres.",
- welcomeStepProfileTitle: "Edita o teu perfil",
- welcomeStepProfileText: "Escolhe um nome, acrescenta uma descrição e põe uma imagem para que os outros habitantes te reconheçam.",
welcomeStepProfileAction: "Guardar perfil",
- welcomeStepFederationTitle: "Junta-te à rede principal",
- welcomeStepFederationText: "Liga-te ao nosso pub para encontrar outros habitantes e começar a replicar.",
- welcomeStepFederationAction: "Ir aos convites",
- welcomeStepBackupTitle: "Faz cópia do teu ID",
- welcomeStepBackupText: "A tua identidade é um ficheiro de chaves neste dispositivo.",
- welcomeStepBackupWarning: "SE O PERDERES, NINGUÉM O PODE RECUPERAR POR TI.",
- welcomeStepBackupAction: "Cópia de segurança!",
+ welcomeBootstrapRunning: "A carregar o instantâneo do pub. Ao terminar junta-se ao pub automaticamente; entretanto podes continuar a usar o Oasis.",
welcomeCompleteTitle: "Tudo pronto.",
- welcomeCompleteText: "O teu nó está pronto. A partir daqui a rede cresce com as pessoas que segues.",
+ welcomeCompleteText: "O teu nó está pronto. A partir daqui a rede cresce com os habitantes que apoias.",
welcomeFindPeople: "Procurar habitantes",
devFilterFiles: "FICHEIROS",
devFilterSearch: "PROCURAR",
@@ -430,7 +534,7 @@ module.exports = {
devFilterTests: "TESTES",
devVersion: "Versão",
devNodeVersion: "Node",
- devStatsTests: "Suites de testes",
+ devStatsTests: "Testes",
devParentFolder: "Pasta superior",
devOpenFolder: "abrir",
devDescription: "Explora o código-fonte em execução neste nó.",
@@ -474,6 +578,27 @@ module.exports = {
"Se preferires usar outro idioma, seleciona-o aqui.",
setLanguage: "Definir idioma",
peerConnectionsIntro: "Gere todas as tuas ligações com outros pares.",
+ peersConnectFailed: "Não foi possível ligar: {reason}.",
+ peerStateLabel: "Estado",
+ peerAddressLabel: "Endereço",
+ peerLastChangeLabel: "Última alteração",
+ peerStateConnected: "Ligado",
+ peerStateConnecting: "A ligar",
+ peerStateStaged: "Disponível",
+ peerErrSilent: "Sem atividade",
+ peerErrTimeout: "Não responde",
+ peerErrRefused: "Recusa a ligação",
+ peerErrNotFound: "Endereço desconhecido",
+ peerErrUnreachable: "Rede inacessível",
+ peerErrKeys: "A usar chaves diferentes",
+ peerErrIdentity: "Não aceita a sua ligação",
+ peerErrTor: "Só TOR",
+ peerErrDropped: "Ligação cortada",
+ peerErrPaused: "Rede em pausa",
+ peerErrOther: "Erro de ligação",
+ peerOutdated: "Desatualizado",
+ peerVersionUnannounced: "Não anuncia a sua versão: um Oasis antigo",
+ peersTorMissing: "Este PUB só permite ligações através do TOR.",
peerConnectionsTitle: "Ligações",
online: "Online",
offline: "Offline",
@@ -492,22 +617,25 @@ module.exports = {
noConnections: "Nenhum par conectado.",
noDiscovered: "Nenhum par descoberto.",
noUnknownPeers: "Sem pares desconhecidos no grafo de amizades.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Ainda não há pares registados.",
+ peerConnect: "Ligar",
+ peerDisconnect: "Desligar",
peerRefresh: "Atualizar",
peerPruneIdle: "Remover inativos",
+ peersPause: "Pausar",
+ peersResume: "Retomar",
+ peersPausedNote: "Em pausa: o Oasis não se liga a ninguém e ninguém se pode ligar a ele.",
+ peersPauseHint: "Para todas as ligações: o Oasis não se liga a outros nós nem os aceita até retomares.",
peerExport: "Exportar",
peerImport: "Importar",
peerImportTitle: "Importar lista de peers",
peerImportPlaceholder: "Cola um endereço multiserver por linha, ou carrega um ficheiro .txt…",
connectionActionIntro:
"",
- startNetworking: "Iniciar rede",
- stopNetworking: "Parar rede",
- restartNetworking: "Reiniciar rede",
- sync: "Sincronizar rede",
indexes: "Índices",
+ indexesRebuilt: "Índices reconstruídos",
+ indexesRebuildFailed: "Não foi possível reconstruir os índices",
+ indexesFiles: "Ficheiros de índice",
indexesDescription:
"Reconstruir os teus índices é seguro e pode corrigir alguns tipos de erros.",
homePageTitle: "Início",
@@ -517,44 +645,33 @@ module.exports = {
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",
invitesChatsTitle: "Chats",
- invitesChatInviteCodePlaceholder: "Introduz código de convite do chat",
- invitesChatJoinButton: "Entrar no chat",
invitesPadsTitle: "Pads",
- invitesPadInviteCodePlaceholder: "Introduz código de convite do pad",
- invitesPadJoinButton: "Entrar no pad",
invitesCalendarsTitle: "Calendários",
- invitesCalendarInviteCodePlaceholder: "Introduz código de convite do calendário",
- invitesCalendarJoinButton: "Entrar no calendário",
invitesEventsTitle: "Eventos",
- invitesEventInviteCodePlaceholder: "Introduz código de convite do evento",
- invitesEventJoinButton: "Entrar no evento",
invitesForumsTitle: "Fóruns",
- invitesForumInviteCodePlaceholder: "Introduz código de convite do fórum",
- invitesForumJoinButton: "Entrar no fórum",
invitesMapsTitle: "Mapas",
- invitesMapInviteCodePlaceholder: "Introduz código de convite do mapa",
- invitesMapJoinButton: "Entrar no mapa",
invitesShopsTitle: "Lojas",
- invitesShopInviteCodePlaceholder: "Insira o código de convite da loja",
- invitesShopJoinButton: "Entrar na loja",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "PUBs Sugeridos",
+ invitesFilterOthers: "Outras",
+ invitesJoinTitle: "Convites",
+ invitesJoinHint: "Cola qualquer código de convite, seja do que for, ou o Oasis ID de um habitante.",
+ invitesJoinPlaceholder: "Código de convite ou Oasis ID",
+ invitesJoinButton: "Entrar",
+ invitesUsedTitle: "Últimos convites",
+ invitesUsedEmpty: "Ainda não utilizaste nenhum convite.",
+ invitesUsedType: "Tipo",
+ invitesUsedName: "Nome",
+ invitesUsedDate: "Data",
invitesPubInviteCodePlaceholder: "Introduz código de convite PUB",
invitesAcceptInvite: "Aderir ao PUB",
+ invitesPubUses: "Convites usados",
+ invitesPubExhausted: "Este PUB não tem convites disponíveis.",
invitesAlreadyFederated: "Você já está federado com este pub.",
+ invitesJoinPubMode: "Este Oasis funciona como PUB, em modo só de leitura. Para o juntar a outro PUB, usa o terminal: ./oasis.sh join ",
+ invitesJoinLocalOnly: "Os convites só podem ser aceites a partir do dispositivo onde o Oasis corre, ou com a ligação de administração que mostra ao arrancar.",
invitesFederationsTitle: "Federações",
invitesAcceptedInvites: "Federadas",
invitesUnfollow: "Deixar de seguir",
@@ -562,16 +679,12 @@ module.exports = {
invitesUnfollowedInvites: "Não federadas",
invitesNoFederatedPubs: "Sem pubs federados.",
invitesNoUnfollowed: "Sem pubs não federados.",
- invitesUnreachablePubs: "Inalcançáveis",
- invitesNoUnreachablePubs: "Sem pubs inalcançáveis.",
invitesPubsRefresh: "Atualizar",
- invitesPubsClearUnreachable: "Remover inalcançáveis",
+ invitesPubsClearUnreachable: "Limpar",
invitesPubsExport: "Exportar",
invitesPubsImport: "Importar",
invitesPubsImportTitle: "Importar pubs",
invitesPubsImportPlaceholder: "Cola um endereço multiserver ou código de convite por linha, ou carrega um ficheiro .txt…",
- currentlyUnreachable: "ERRO!",
- errorDetails: "Detalhes do erro",
genericError: "Ocorreu um erro.",
panicMode: "Modo pânico!",
encryptData: "Define uma senha (mínimo 32 caracteres) para encriptar a tua blockchain",
@@ -598,7 +711,6 @@ module.exports = {
votesOptionNoLabel:"Não",
votesOptionAbstentionLabel:"Abstenção",
votesQuestionLabel:"Pergunta",
- votesCreatedByLabel:"Criado por",
voteStatusOpen:"ABERTO",
voteStatusClosed:"FECHADO",
commentDescription: ({ parentUrl }) => [
@@ -615,22 +727,22 @@ module.exports = {
searchSubmit: "Pesquisar...",
votesLabel: "VOTAÇÕES",
pdfFallbackLabel: "Documento PDF",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "LOJAS",
+ voteLabel: "VOTOS",
submit: "Enviar",
editProfile: "Editar avatar",
oasisIdLabel: "OasisID",
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- /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.",
+ 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- [/avatar](/profile) — Edita o teu avatar, nome, descrição e quais módulos aparecem no teu lado público.\n- /settings — Ajusta a tua instância local: idioma, tema, módulos, privacidade e sincronização.\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 outros habitantes.\n- /tribes — Cria ou junta-te a grupos privados com cifragem ponta-a-ponta.\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",
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",
- profileVisibilityWallet: "Carteira ECOIN",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "RBU",
+ profileVisibilityWallet: "Carteira ECOin",
+ profileVisibilityEcoTax: "Taxa ECO",
+ profileVisibilityLarpSign: "Selo L.A.R.P.",
profileVisibilityGpg: "Chave GPG",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Lojas",
@@ -643,6 +755,10 @@ module.exports = {
profileClearnetImagesLabel: "Imagens",
profileClearnetDocumentsLabel: "Documentos",
profileClearnetTorrentsLabel: "Torrents",
+ profileClearnetPodcastsLabel: "Podcasts",
+ profileClearnetMarketLabel: "Mercado",
+ profileClearnetFeedLabel: "Feed",
+ profileClearnetWikiLabel: "Wikis",
editProfileDescription:
"",
profileName: "Nome",
@@ -668,7 +784,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Conf.",
walletConfirm: "Confirmar",
- walletDescription: "Gere os teus ativos digitais, incluindo enviar e receber ECOin, ver o teu saldo e aceder ao teu histórico de transações.",
+ walletDescription: "Gere a tua carteira ECOin.",
walletDate: "Data",
walletFee: "Taxa (quanto maior a taxa, mais rápido a tua transação será processada)",
walletFeeLine: ({ fee }) => `Taxa: ECO ${fee}`,
@@ -676,6 +792,86 @@ module.exports = {
walletReceive: "Receber",
walletReset: "Repor",
walletSend: "Enviar",
+ walletPayingTransfer: "A pagar transfer",
+ walletCreateTransferLabel: "Gerar contrato (transferência)",
+ walletTransferNotifiedNote: "A outra parte foi avisada deste pagamento",
+ walletTransferCreatedNote: "Foi criado um transfer (recibo) deste pagamento",
+ walletTransferNoPayeeNote: "Nenhum habitante publicou este endereço, por isso não se criou transfer",
+ walletTransferReceiptConcept: "Pagamento a partir da carteira",
+ walletPaymentPmText: "enviou-te um pagamento",
+ walletPayeeLabel: "Destinatário",
+ walletConceptLabel: "Conceito",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Recebeste o teu RBU.",
+ bankingBotPaymentTitle: "Recebeste um pagamento.",
+ bankingBotUbiPaidText: "O teu Rendimento Básico Universal foi pago",
+ bankUbiPubThisNode: "Este nó paga o RBU",
+ bankUbiPubConnected: "PUB do RBU",
+ bankUbiPubNone: "Nenhum PUB anuncia ainda RBU na tua rede",
+ bankUbiAddressPublished: "Endereço ECOin publicado",
+ bankUbiAddressMissing: "Publica o teu endereço ECOin para receber o RBU",
+ bankUbiClaimedThisMonth: "Reclamado este mês",
+ bankUbiPubBalance: "Carteira do PUB disponível para o RBU",
+ bankNoPubAddress: "O PUB do RBU ainda não publicou um endereço ECOin.",
+ bankUbiTab: "RBU",
+ bankDonateEco: "DOAR!",
+ donateTooltip: "Doar ECOin",
+ bankNoUserAddress: "Este habitante não partilha um endereço ECOin.",
+ bankUbiPubDefault: "Predefinido",
+ bankUbiPool: "Dote",
+ bankUbiLastSeen: "Visto pela última vez",
+ bankUbiLastPayout: "Última ação",
+ bankUbiPaidOut: "Distribuído",
+ bankRangeToday: "Hoje",
+ bankRangeWeek: "Semana",
+ bankRangeMonth: "Mês",
+ bankRangeYear: "Ano",
+ bankRangeFiveYears: "5 anos",
+ bankRangeAll: "Tudo",
+ bankChartValueTitle: "Evolução do valor de ECOin",
+ bankChartValueHours: "Equivalência em tempo (h)",
+ bankChartWealthTitle: "Redistribuição da riqueza ECOin",
+ bankChartDistributed: "RBU distribuído (ECO)",
+ bankChartRebalanceTitle: "Redistribuição da riqueza entre PUBs",
+ bankChartRebalanced: "ECO movidos entre PUBs",
+ bankChartTaxes: "Impostos retidos (ECO)",
+ bankChartNoDataRange: "Sem dados neste intervalo.",
+ bankChartNoDataYet: "Ainda sem dados",
+ bankChartPerHour: "por hora",
+ bankChartPerDay: "por dia",
+ bankChartPerMonth: "por mês",
+ bankTotalUbiDistributed: "RBU total redistribuído (rede)",
+ bankTotalTaxesWithheld: "Impostos totais retidos (rede)",
+ bankInflationIssuance: "Taxa de emissão (anual, pela recompensa de bloco)",
+ bankRulesEligibilityTitle: "Quem pode receber o RBU",
+ bankRulesEligibility1: "Um endereço ECOin publicado no perfil (Perfil → Sensores → Carteira ECOin).",
+ bankRulesEligibility2: "Um feed com mais de 30 dias e atividade na rede: karma acima de zero.",
+ bankRulesEligibility3: "Uma reclamação por mês (epoch), em Banking com o botão Reclamar RBU. O mês em curso pode recusar-se com Recusar RBU.",
+ bankRulesEligibility4: "O mínimo de 1 ECO paga-se sempre; os impostos só reduzem a parte acima dele e nunca se cobram à parte.",
+ bankRulesEligibility5: "O PUB paga no ciclo seguinte e publica um transfer RBU que podes confirmar.",
+ bankRulesEligibility6: "Se falta o endereço, o feed é demasiado novo, recusaste o mês ou o PUB não tem fundos, a reclamação é ignorada e registada no PUB.",
+ copyLinkTitle: "Copiar ligação",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Recusar RBU",
+ bankUbiRefusedThisMonth: "Recusaste o RBU deste mês.",
+ bankingBotUbiAvailableTitle: "Podes reclamar o teu RBU.",
+ bankingBotUbiAvailableText: "O teu RBU deste mês está disponível",
+ bankingBotConfirmTitle: "Tens um smart-contract pendente de confirmação",
+ bankingBotConfirmText: "Smart-contracts à espera da tua confirmação",
+ bankChartZoomHint: "Clica para ampliar",
+ bankChartPoolTitle: "Dote do RBU (ao longo do tempo)",
+ bankChartNetworkUbiTitle: "RBU total redistribuído (rede)",
+ bankChartSupplyTitle: "Oferta circulante de ECOin (ao longo do tempo)",
+ bankChartInflationTitle: "Inflação de ECOin (ao longo do tempo)",
+ bankChartInflationSeries: "Taxa anualizada (%)",
+ bankChartPool: "Dote total (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (ao longo do tempo)",
+ bankChartFundsTitle: "Os seus fundos ECOin (ao longo do tempo)",
+ bankChartKarma: "Karma",
+ bankWalletReady: "ECOin ligado",
+ bankWalletNotConfigured: "ECOin desligado",
+ transfersPayWithWallet: "PAGAR!",
walletStatus: "Estado",
walletDisconnected: [
"ECOin ",
@@ -685,8 +881,11 @@ module.exports = {
" ou o estado da ligação.",
],
walletSentToLine: ({ destination, amount }) => `Enviado ECO ${amount} para ${destination}`,
+ walletNotConfigured: "A sua carteira ECOin ainda não está configurada.",
walletSettingsDescription: "Integra o Oasis com a tua carteira ECOin.",
- walletSettingsDocLink: "Guia de instalação ECOin",
+ walletSettingsMobileDescription: "Ligue o Oasis à app ECOin Wallet deste dispositivo.",
+ walletDownloadEcoin: "Descarregar ECOin!",
+ walletRpcUrl: "URL do RPC",
walletStatusMessages: {
invalid_amount: "Montante inválido",
invalid_dest: "Endereço de destino inválido",
@@ -702,6 +901,7 @@ module.exports = {
walletUser: "Nome de utilizador",
walletPass: "Senha",
walletConfiguration: "Definir carteira",
+ walletDisconnectButton: "Desligar carteira",
cipher: "Encriptação",
cipherTitle: "Encriptação",
cipherDescription: "Encripta e decifra o teu texto simetricamente (usando uma senha partilhada).",
@@ -735,17 +935,16 @@ module.exports = {
bookmarkFilterRecent: "RECENTES",
bookmarkCreateButton: "Criar marcador",
bookmarkUpdateButton: "Atualizar",
- bookmarkDeleteButton: "Eliminar",
bookmarkAddFavoriteButton: "Adicionar favorito",
bookmarkRemoveFavoriteButton: "Remover favorito",
bookmarkUrlLabel: "Link",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Descrição",
bookmarkDescriptionPlaceholder: "Opcional",
bookmarkTagsLabel: "Tags",
bookmarkTagsPlaceholder: "Introduz tags separadas por vírgulas",
bookmarkLastVisitLabel: "Última visita",
- bookmarkSearchPlaceholder: "Pesquisar URL, tags, categoria, autor...",
+ bookmarkSearchPlaceholder: "Pesquisar em Marcadores...",
bookmarkSortRecent: "Mais recentes",
bookmarkSortOldest: "Mais antigos",
bookmarkSortTop: "Mais votados",
@@ -784,7 +983,7 @@ module.exports = {
videoDescriptionPlaceholder: "Opcional",
videoNoFile: "Nenhum ficheiro de vídeo fornecido",
noVideos: "Sem vídeos disponíveis.",
- videoSearchPlaceholder: "Pesquisar título, tags, autor...",
+ videoSearchPlaceholder: "Pesquisar em Vídeos...",
videoSortRecent: "Mais recentes",
videoSortOldest: "Mais antigos",
videoSortTop: "Mais votados",
@@ -807,7 +1006,6 @@ module.exports = {
documentFilterFavorites: "FAVORITOS",
documentCreateButton: "Carregar documento",
documentUpdateButton: "Atualizar",
- documentDeleteButton: "Eliminar",
documentAddFavoriteButton: "Adicionar favorito",
documentRemoveFavoriteButton: "Remover dos favoritos",
documentMessageAuthorButton: "MP",
@@ -820,7 +1018,7 @@ module.exports = {
documentDescriptionPlaceholder: "Opcional",
documentNoFile: "Sem ficheiro.",
noDocuments: "Sem documentos disponíveis.",
- documentSearchPlaceholder: "Pesquisar título, tags, descrição, autor...",
+ documentSearchPlaceholder: "Pesquisar em Documentos...",
documentSortRecent: "Mais recentes",
documentSortOldest: "Mais antigos",
documentSortTop: "Mais votados",
@@ -841,19 +1039,19 @@ module.exports = {
audioFilterTop: "TOP",
audioCreateButton: "Carregar áudio",
audioUpdateButton: "Atualizar",
- audioDeleteButton: "Eliminar",
audioAddFavoriteButton: "Adicionar favorito",
audioRemoveFavoriteButton: "Remover favorito",
audioFileLabel: "Seleciona um ficheiro de áudio (.mp3, .wav, .ogg)",
audioTagsLabel: "Tags",
audioTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ tagsPlaceholder: "Introduz tags separadas por vírgulas",
audioTitleLabel: "Título",
audioTitlePlaceholder: "Opcional",
audioDescriptionLabel: "Descrição",
audioDescriptionPlaceholder: "Opcional",
audioNoFile: "Nenhum ficheiro de áudio fornecido",
noAudios: "Sem áudios disponíveis.",
- audioSearchPlaceholder: "Pesquisar título, tags, autor...",
+ audioSearchPlaceholder: "Pesquisar em Áudios...",
audioSortRecent: "Mais recentes",
audioSortOldest: "Mais antigos",
audioSortTop: "Mais votados",
@@ -865,7 +1063,7 @@ module.exports = {
audioFilterFavorites: "FAVORITOS",
favoritesTitle: "Favoritos",
favoritesDescription: "Todos os teus conteúdos favoritos num só lugar.",
- favoritesSearchPlaceholder: "Pesquisar nos favoritos...",
+ favoritesSearchPlaceholder: "Pesquisar em Favoritos...",
favoritesFilterAll: "TODOS",
favoritesFilterRecent: "RECENTES",
favoritesFilterAudios: "ÁUDIOS",
@@ -877,13 +1075,12 @@ module.exports = {
favoritesFilterChats: "CHATS",
favoritesFilterCalendars: "CALENDÁRIOS",
favoritesFilterVideos: "VÍDEOS",
- favoritesRemoveButton: "Remover dos favoritos",
favoritesNoItems: "Ainda sem favoritos.",
yourContacts: "Os teus contactos",
allInhabitants: "Habitantes",
allCVs: "CVs",
discoverPeople: "Descobre habitantes na tua rede.",
- searchInhabitantsPlaceholder: "FILTRAR habitantes POR NOME …",
+ searchInhabitantsPlaceholder: "Pesquisar em Habitantes...",
filterLocation: "FILTRAR habitantes POR LOCALIZAÇÃO …",
filterLanguage: "FILTRAR habitantes POR IDIOMA …",
filterSkills: "FILTRAR habitantes POR COMPETÊNCIAS …",
@@ -907,7 +1104,6 @@ module.exports = {
topSectionTitle: "TOP",
blockedLabel: "Habitante bloqueado",
inhabitantviewDetails: "Ver detalhes",
- cvVisitButton: "Visitar CV",
keepReading: "Continuar lendo...",
oasisId: "ID",
noInhabitantsFound: "Ainda sem habitantes encontrados.",
@@ -925,6 +1121,18 @@ module.exports = {
parliamentFilterLeaders: "LÍDERES",
parliamentFilterRules: "REGRAS",
parliamentGovernmentCard: "Governo atual",
+ parliamentSeatsGovernment: "Governo",
+ parliamentSeatsOpposition: "Oposição",
+ parliamentSeatsAbstention: "Abstenção",
+ parliamentSeatsQuorum: "Quórum de eleição",
+ parliamentSeatsPass: "Limiar de aprovação",
+ parliamentSeatsByElection: "Por eleição",
+ parliamentSeatsByHouses: "Por casa do LARP",
+ parliamentSeatsSeats: "assentos",
+ parliamentSeatsSeat: "assento",
+ parliamentSeatsLeader: "Líder",
+ parliamentSeatsVotesFor: "votos para",
+ parliamentSeatsNoHouse: "Sem casa",
parliamentActorInPowerInhabitant: 'HABITANTE NO PODER',
parliamentActorInPowerTribe: 'TRIBO NO PODER',
parliamentHistoricalGovernmentsTitle: 'GOVERNOS',
@@ -975,7 +1183,7 @@ module.exports = {
parliamentMethodKARMATOCRACY: "Karmatocracia",
parliamentThId: "ID",
parliamentThProposalDate: "Data da proposta",
- parliamentThMethod: "Method",
+ parliamentThMethod: "Método",
parliamentThKarma: "Karma",
parliamentThSupports: "Apoios",
parliamentThVote: "Votar",
@@ -992,6 +1200,7 @@ module.exports = {
parliamentTimeRemaining: "Tempo restante",
parliamentElectionsStatusTitle: "Próximo governo",
parliamentProposalDeadlineLabel: "Prazo",
+ parliamentViewReport: "Ver relatório",
parliamentProposalTimeLeft: "Tempo restante",
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.",
@@ -1006,6 +1215,7 @@ module.exports = {
parliamentRulesLaws: "Quando uma proposta atinge o limiar, torna-se Lei e aparece no separador Leis com a data de promulgação.",
parliamentRulesHistorical: "No separador Histórico podes ver cada ciclo de governo que ocorreu e dados sobre a sua gestão.",
parliamentRulesLeaders: "No separador Líderes podes ver um ranking de habitantes/tribos que governaram (ou se candidataram), ordenados por eficiência.",
+ parliamentRulesHemicycle: "O hemiciclo atribui um assento por habitante: o bloco do governo (os eleitores da candidatura vencedora e o líder), um bloco de oposição por cada outra candidatura do ciclo, e a abstenção. As marcas tracejadas mostram o quórum de eleição (25 % do censo) e o limiar de aprovação do método em vigor. \"Por casa do LARP\" colore os mesmos assentos por casa.",
parliamentProposalVoteStatusLabel: "Estado da votação",
parliamentProposalOnTrackYes: "Limiar atingido",
parliamentProposalOnTrackNo: "Abaixo do limiar",
@@ -1019,6 +1229,7 @@ module.exports = {
courtsCaseFormTitle: "Abrir caso",
courtsCaseRespondent: "Acusado / Demandado",
courtsCaseRespondentPh: "Oasis ID (@...) ou nome da tribo",
+ courtsCaseSubjectPlaceholder: "Assunto ou descrição breve",
courtsCaseMethod: "Método de resolução",
courtsCaseSubmit: "Apresentar caso",
courtsNominateJudge: "Nomear juiz",
@@ -1052,15 +1263,30 @@ module.exports = {
courtsMethodDICTATOR: "Ditador",
courtsMethodPOPULAR: "Popular",
courtsMethodKARMATOCRACY: "Karmatocracia",
+ courtsCaseType: "Tipo de caso",
+ courtsPresetMinorConflict: "Conflito leve",
+ courtsPresetModerateConflict: "Conflito moderado",
+ courtsPresetSevereConflict: "Conflito grave",
+ courtsPresetHarassment: "Assédio ou abuso",
+ courtsPresetContentModeration: "Moderação de conteúdo",
+ courtsPresetBanRestriction: "Banimento ou restrição",
+ courtsPresetGovernanceDispute: "Disputa de governança",
+ courtsStatusOPEN: "Aberto",
+ courtsStatusIN_PROGRESS: "Em curso",
+ courtsStatusDECIDED: "Decidido",
+ courtsStatusCLOSED: "Fechado",
+ courtsStatusSOLVED: "Resolvido",
+ courtsStatusUNSOLVED: "Não resolvido",
+ courtsStatusDISCARDED: "Descartado",
courtsRulesTitle: "Como funcionam os Tribunais",
courtsRulesIntro: "Os Tribunais são um processo comunitário para resolver conflitos e promover justiça restaurativa. Diálogo, provas claras e medidas proporcionais são priorizados.",
courtsRulesLifecycle: "Processo: 1) Abrir caso 2) Selecionar método 3) Apresentar provas 4) Audiência e deliberação 5) Veredicto e medida 6) Cumprimento e encerramento 7) Recurso (se aplicável).",
- courtsRulesRoles: "Acusador: abre o caso. Defesa: pessoa ou tribo acusada. Método: mecanismo escolhido pela comunidade para facilitar, avaliar provas e emitir veredicto. Testemunha: fornece depoimento ou provas. Mediadores: pessoas neutras convidadas pelo acusador e/ou defesa, com acesso a todos os detalhes, que ajudam a desescalar o conflito e co-criar acordos.",
+ courtsRulesRoles: "Acusador: abre o caso. Defesa: habitante ou tribo acusada. Método: mecanismo escolhido pela comunidade para facilitar, avaliar provas e emitir veredicto. Testemunha: fornece depoimento ou provas. Mediadores: habitantes neutros convidados pelo acusador e/ou defesa, com acesso a todos os detalhes, que ajudam a desescalar o conflito e co-criar acordos.",
courtsRulesEvidence: "Descrição até 1000 caracteres. Anexa imagens, áudio, vídeo e documentos PDF relevantes e legais. Não partilhes dados privados sensíveis sem consentimento.",
courtsRulesDeliberation: "As audiências podem ser públicas ou privadas. Os juízes garantem respeito, pedem esclarecimentos e podem descartar material irrelevante ou ilegal.",
courtsRulesVerdict: "A restauração é priorizada: pedidos de desculpa, acordos de mediação, moderação de conteúdo, restrições temporárias ou outras medidas proporcionais. A fundamentação deve ser registada.",
courtsRulesAppeals: "Recurso: permitido quando há novas provas ou erro processual claro. Deve ser apresentado em 7 dias, salvo indicação contrária.",
- courtsRulesPrivacy: "Respeita a privacidade e segurança. Doxing, ódio ou ameaças são removidos. Os juízes podem editar ou selar partes do registo para proteger pessoas em risco.",
+ courtsRulesPrivacy: "Respeita a privacidade e segurança. Doxing, ódio ou ameaças são removidos. Os juízes podem editar ou selar partes do registo para proteger habitantes em risco.",
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",
@@ -1076,12 +1302,16 @@ module.exports = {
exploreTrending: "Explora o conteúdo mais popular na tua rede.",
votesButton: "VOTAÇÕES",
shopProductButton: "LOJA",
+ podcastButton: "PODCAST",
+ podcastEpisodeButton: "EPISÓDIO",
+ campaignButton: "CAMPANHA",
+ logisticsRouteButton: "ROTA",
trendingTotalOpinions: "Total de opiniões",
trendingNoContentMessage: "Ainda não há tendências.",
trendingTotalCount: "Contagem total",
tasksTitle: "Tarefas",
tasksDescription: "Descobre e gere tarefas na tua rede.",
- taskSearchPlaceholder: "Pesquisar tarefas...",
+ taskSearchPlaceholder: "Pesquisar em Tarefas...",
taskTitleLabel: "Título",
taskDescriptionLabel: "Descrição",
taskStartTimeLabel: "Hora de início",
@@ -1100,7 +1330,7 @@ module.exports = {
taskStatusOpen: "Abrir",
taskStatusInProgress: "Em progresso",
taskStatusClosed: "Fechado",
- taskAssignedTo: "Atribuído a",
+ taskAssignedTo: "Atribuído",
taskAssignedChip: "Atribuída",
taskUnassignedChip: "Por atribuir",
taskAssignees: "Atribuídos",
@@ -1110,6 +1340,7 @@ module.exports = {
taskUpdateButton: "Atualizar",
taskDeleteButton: "Eliminar",
taskFilterAll: "TODOS",
+ taskFilterRecent: "RECENTES",
taskFilterMine: "MEUS",
taskFilterOpen: "ABERTO",
taskFilterInProgress: "EM PROGRESSO",
@@ -1137,14 +1368,13 @@ module.exports = {
eventUpcomingDates: "Próximas datas",
eventsTitle: "Eventos",
eventsDescription: "Descobre e gere eventos na tua rede.",
- eventSearchPlaceholder: "Pesquisar eventos...",
+ eventSearchPlaceholder: "Pesquisar em Eventos...",
eventPrice: "Preço",
eventStatus: "Estado",
eventAllSectionTitle: "Eventos",
eventMineSectionTitle: "Os teus eventos",
eventCreateSectionTitle: "Criar evento",
eventUpdateSectionTitle: "Atualizar evento",
- eventDeleteButton: "Eliminar",
eventCreateButton: "Criar evento",
eventAddToCalendar: "Adicionar ao calendário",
eventVisitCalendar: "Ver calendário",
@@ -1162,11 +1392,11 @@ module.exports = {
viewPlace: "Ver Lugar",
generatePdf: "Gerar PDF",
sharePm: "Partilhar por MP",
- galleryImages: "Imagens (tamanho máx: 50MB cada)",
+ galleryImages: "Imagens (tamanho máx: 75MB cada)",
galleryPhotos: "Imagens",
galleryAddPhoto: "Adicionar Imagem",
galleryRemovePhoto: "Remover",
- galleryVideo: "Vídeo (tamanho máx: 50MB)",
+ galleryVideo: "Vídeo (tamanho máx: 75MB)",
galleryAddVideo: "Adicionar Vídeo",
galleryRemoveVideo: "Remover vídeo",
viewVotation: "Ver votação",
@@ -1186,6 +1416,7 @@ module.exports = {
eventDate: "Data",
eventAttendButton: "Participar no evento",
eventFilterAll: "TODOS",
+ eventFilterRecent: "RECENTES",
eventFilterMine: "MEUS",
eventFilterToday: "HOJE",
eventFilterWeek: "ESTA SEMANA",
@@ -1212,7 +1443,7 @@ module.exports = {
tagsFilterTop: "TOP",
tagsFilterCloud: "NUVEM",
tagsNoItems: "Sem tags disponíveis.",
- tagsSearchPlaceholder: "Procurar etiquetas...",
+ tagsSearchPlaceholder: "Pesquisar em Tags...",
tagsTableHeaderTag: "TAG/LINK:",
tagsTableHeaderCount: "CONTADOR:",
transfersTitle: "Transferências",
@@ -1220,7 +1451,10 @@ module.exports = {
transfersFrom: "De",
transfersTo: "Para",
transfersFilterAll: "TODOS",
+ transfersFilterRecent: "RECENTES",
transfersFilterMine: "MEUS",
+ transfersFilterMinePending: "PENDENTES",
+ transfersFilterMineConfirmed: "ASSINADOS",
transfersFilterUBI: "RBU",
transfersFilterMarket: "MERCADO",
transfersFilterTop: "TOP",
@@ -1235,7 +1469,6 @@ module.exports = {
transfersCategoryEconomic: "Económica",
transfersCategoryTime: "Tempo",
transfersCategoryTrust: "Confiança",
- transfersCategoryApply: "Aplicar",
transfersUnitEco: "ECO",
transfersUnitHours: "h",
transfersUnitTrust: "confiança",
@@ -1265,7 +1498,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Transferências descartadas",
transfersCreateSectionTitle: "Criar transferência",
transfersAllSectionTitle: "Transferências",
- transfersSearchPlaceholder: "Pesquisar conceito, tags, utilizadores...",
+ transfersSearchPlaceholder: "Pesquisar em Transferências...",
transfersMinAmountLabel: "Montante mínimo",
transfersMaxAmountLabel: "Montante máximo",
transfersSortRecent: "Mais recentes",
@@ -1287,15 +1520,17 @@ module.exports = {
voteErrorTitle: "Verifica o formulário",
voteErrorDeadlineMin: "O prazo tem de ser de pelo menos {days} dias a partir de agora.",
voteErrorGeneric: "Não foi possível guardar a votação.",
+ voteLocked: "Esta votação já recebeu votos ou opiniões, ou pertence ao Parlamento ou aos Tribunais: já não pode ser editada nem apagada.",
voteUpdateButton: "Atualizar",
voteDeleteButton: "Eliminar",
- voteOptionYes: "YES",
+ voteOptionYes: "SIM",
voteOptionNo: "NO",
voteOptionAbstention: "ABSTENTION",
voteConfused: "CONFUSO",
voteFollowMajority: "SEGUIR MAIORIA",
voteNotInterested: "SEM INTERESSE",
voteFilterAll: "TODOS",
+ voteFilterRecent: "RECENTES",
voteFilterMine: "MEUS",
voteFilterOpen: "ABERTO",
voteFilterClosed: "FECHADO",
@@ -1311,7 +1546,6 @@ module.exports = {
voteTags: "Tags",
voteOpinions: "Opiniões",
novotes: "Sem propostas de votação disponíveis.",
- voteBy: "Por",
voteCreatedAt: "Criado em",
voteNoQuestion: "Sem questão fornecida",
voteUnknownCreator: "Criador desconhecido",
@@ -1321,6 +1555,7 @@ module.exports = {
voteCommentsForumButton: 'Abrir discussão',
voteCommentsSectionTitle: 'Abrir discussão',
voteNoCommentsYet: 'Ainda sem comentários. Sê o primeiro a responder.',
+ commentsGoToLast: "Ir para o último comentário",
voteNewCommentPlaceholder: 'Escreve o teu comentário aqui…',
voteNewCommentButton: 'Publicar comentário',
voteNewCommentLabel: 'Adicionar comentário',
@@ -1331,6 +1566,8 @@ module.exports = {
cvNameLabel: "Nome completo",
cvDescriptionLabel: "Resumo",
cvPhotoLabel: "Foto",
+ cvPdfLabel: "CV (PDF)",
+ cvVisitButton: "Visitar CV",
cvPersonalExperiencesLabel: "Experiências pessoais",
cvPersonalSkillsLabel: "Competências pessoais (separadas por vírgulas)",
cvOasisExperiencesLabel: "Experiências de contribuição Oasis",
@@ -1360,9 +1597,9 @@ module.exports = {
cvNoCV: "Sem CV encontrado.",
blogSubject: "Assunto",
blogMessage: "Mensagem",
- blogImage: "Carregar mídia (máx: 50MB)",
+ blogImage: "Carregar mídia (máx: 75MB)",
blogMedia: "Anexos (até 8 imagens e um vídeo)",
- blogPublish: "Pré-visualizar",
+ blogPublish: "Publicar",
pollsTitle: "Sondagens",
dataTitle: "Correspondências",
dataDescription: "Explora e visualiza as correspondências da tua rede.",
@@ -1381,12 +1618,23 @@ module.exports = {
dataKindTasks: "TAREFAS",
dataKindReports: "RELATÓRIOS",
dataKindVotes: "VOTAÇÕES",
- dataSearchPlaceholder: "Procurar nos dados cruzados...",
+ dataSearchPlaceholder: "Pesquisar em Correspondências...",
dataCohesionTitle: "Coeficiente de coesão (CC)",
dataCcShort: "CC",
dataCohesionHint: "Afinidade média entre tudo o que a rede publicou.",
dataAffinity: "Afinidade",
dataCommonTerms: "Palavra-chave",
+ dataReasonFollowing: "Apoias este habitante",
+ dataReasonTribe: "Partilha uma tribo contigo",
+ dataReasonPinned: "Coincide com algo que fixaste",
+ dataReasonCv: "Coincide com as competências do teu CV",
+ dataReasonContent: "Relacionado com o que publicas",
+ dataReasonRelated: "Relacionado com os teus interesses",
+ dataReasonAlike: "Publicado por um habitante afim a ti",
+ dataReasonSupportsYou: "Apoia-te",
+ dataReasonMutual: "Apoio mútuo",
+ dataReasonRated: "Bem avaliado pela rede",
+ dataReasonNear: "Perto de ti",
dataStatPeople: "CVs",
dataStatConnected: "Ligados",
dataStatSkills: "Habilidades",
@@ -1439,7 +1687,7 @@ module.exports = {
pollStatusLabel: "Estado",
pollStatusOpen: "ABERTA",
pollStatusClosed: "FECHADA",
- pollSearchPlaceholder: "Procurar sondagens...",
+ pollSearchPlaceholder: "Pesquisar em Sondagens...",
pollsNoItems: "Nenhuma sondagem encontrada.",
viewPoll: "Ver Sondagem",
pollChatCreate: "Criar Sondagem",
@@ -1452,7 +1700,7 @@ module.exports = {
blogFilterFavorites: "FAVORITOS",
blogFilterTop: "TOP",
blogCreateButton: "Criar Blog",
- blogSearchPlaceholder: "Procurar blogs...",
+ blogSearchPlaceholder: "Pesquisar em Blogs...",
blogComments: "Comentários",
blogAllowComments: "Permitir comentários",
blogCommentsClosed: "O autor fechou os comentários deste blog.",
@@ -1465,12 +1713,11 @@ module.exports = {
forumCreateButton: "Criar fórum",
forumCreateSectionTitle: "Criar fórum",
forumDescription: "Conversa abertamente com outros habitantes na tua rede.",
- forumSearchPlaceholder: "Pesquisar fóruns...",
+ forumSearchPlaceholder: "Pesquisar em Fóruns...",
forumFilterAll: "TODOS",
forumFilterMine: "MEUS",
forumFilterRecent: "RECENTES",
forumFilterTop: "TOP",
- forumDeleteButton: "Eliminar",
forumParticipants: "participantes",
forumMessages: "mensagens",
forumMessageLabel: "Mensagem",
@@ -1497,7 +1744,6 @@ module.exports = {
imageFilterGallery: "GALERIA",
imageCreateButton: "Carregar imagem",
imageUpdateButton: "Atualizar",
- imageDeleteButton: "Eliminar",
imageAddFavoriteButton: "Adicionar favorito",
imageRemoveFavoriteButton: "Remover favorito",
imageFileLabel: "Seleciona um ficheiro de imagem (.jpeg, .jpg, .png, .gif)",
@@ -1509,13 +1755,14 @@ module.exports = {
imageDescriptionPlaceholder: "Opcional",
imageNoFile: "Nenhum ficheiro de imagem fornecido",
noImages: "Sem imagens disponíveis.",
- imageSearchPlaceholder: "Pesquisar título, tags, descrição, autor...",
+ imageSearchPlaceholder: "Pesquisar em Imagens...",
imageSortRecent: "Mais recentes",
imageSortOldest: "Mais antigos",
imageSortTop: "Mais votados",
imageSearchButton: "Pesquisa",
imageUpdatedAt: "Atualizado",
imageNoMatch: "Nenhuma imagem corresponde à tua pesquisa.",
+ feedSearchPlaceholder: "Pesquisar em Feed...",
feedTitle: "Feed",
createFeedTitle: "Criar Feed",
createFeedButton: "Enviar Feed!",
@@ -1530,7 +1777,7 @@ module.exports = {
alreadyRefeeded: "Já fizeste refeed disto.",
activityTitle: "Atividade",
yourActivity: "A tua atividade",
- globalActivity: "Atividade global",
+ globalActivity: "Atividade",
activityList: "Atividade",
activityDesc: "Vê a atividade mais recente na tua rede.",
allButton: "TODOS",
@@ -1545,7 +1792,8 @@ module.exports = {
meme: "Meme",
typeRecent: "RECENTES",
typeTop: "TOP",
- typePost: "BLOGS",
+ typePost: "BLOG",
+ activityUpdateLabel: "ATUALIZAÇÃO",
typeTribe: "TRIBOS",
typeLarp: "L.A.R.P.",
typeInhabitants: "HABITANTES",
@@ -1570,19 +1818,19 @@ module.exports = {
typeFeed: "FEEDS",
typeContact: "CONTACTO",
typePub: "PUB",
- typeTombstone: "TOMBSTONE",
+ typeTombstone: "ELIMINADO",
typeBanking: "BANCA",
typeBankWallet: "BANCA/CARTEIRA",
- typeBankClaim: "BANCA/UBI",
+ typeBankClaim: "BANCA/RBU",
typeKarmaScore: "KARMA",
- typeParliament: "PARLIAMENT",
+ typeParliament: "PARLAMENTO",
typeSpread: "DIFUSÕES",
- typeParliamentCandidature: "Parliament · Candidature",
- typeParliamentTerm: "Parliament · Term",
- typeParliamentProposal:"Parliament · Proposal",
+ typeParliamentCandidature: "Parlamento · Candidatura",
+ typeParliamentTerm: "Parlamento · Mandato",
+ typeParliamentProposal:"Parlamento · Proposta",
typeParliamentRevocation:"Parlamento · Revogação",
- typeParliamentLaw: "Parliament · New Law",
- typeCourts: "COURTS",
+ typeParliamentLaw: "Parlamento · Nova lei",
+ typeCourts: "TRIBUNAIS",
typeCourtsCase: "Tribunais · Caso",
typeCourtsEvidence: "Tribunais · Prova",
typeCourtsAnswer: "Tribunais · Resposta",
@@ -1596,8 +1844,8 @@ module.exports = {
deadline: "Prazo",
status: "Estado",
votes: "Votos",
- totalVotes: "Total Votes",
- voteTotalVotes: "Total Votes",
+ totalVotes: "Total de votos",
+ voteTotalVotes: "Total de votos",
name: "Nome",
skills: "Competências",
tags: "Tags",
@@ -1608,7 +1856,7 @@ module.exports = {
location: "Localização",
contentWarning: "Assunto",
bankWalletConnected: "Carteira ECOin",
- bankUbiReceived: "UBI recebido",
+ bankUbiReceived: "RBU recebido",
bankTx: "Tx",
bankEpochShort: "Época",
bankingUserEngagementScore: "Pontuação KARMA",
@@ -1620,30 +1868,30 @@ module.exports = {
unfollowing: "A DEIXAR DE SEGUIR",
pledged: "COMPROMETIDO",
parliamentCandidatureId: "Candidature",
- parliamentGovMethod: "Method",
- parliamentVotesReceived: "Votes received",
- parliamentMethodANARCHY: "Anarchy",
+ parliamentGovMethod: "Método",
+ parliamentVotesReceived: "Votos recebidos",
+ parliamentMethodANARCHY: "Anarquia",
parliamentMethodVOTE: "Votação comunitária",
parliamentMethodRANKED: "Escolha por ranking",
parliamentMethodPLURALITY: "Pluralidade",
parliamentMethodCOUNCIL: "Conselho",
parliamentMethodJURY: "Júri",
parliamentAnarchy: "ANARQUIA",
- parliamentElectionsStart: "Elections start",
- parliamentElectionsEnd: "Elections end",
- parliamentCurrentLeader: "Winning candidature",
+ parliamentElectionsStart: "Início das eleições",
+ parliamentElectionsEnd: "Fim das eleições",
+ parliamentCurrentLeader: "Candidatura vencedora",
parliamentProposalTitle: "Título",
- parliamentOpenVote: "Open vote",
+ parliamentOpenVote: "Votação aberta",
parliamentStatus: "Estado",
parliamentLawQuestion: "Question",
- parliamentLawMethod: "Method",
- parliamentLawProposer: "Proposer",
- parliamentLawEnacted: "Enacted at",
+ parliamentLawMethod: "Método",
+ parliamentLawProposer: "Proponente",
+ parliamentLawEnacted: "Promulgada em",
parliamentLawVotes: "Votações",
- createdAt: "Created at",
- courtsCaseTitle: "Case",
- courtsMethod: "Method",
- courtsMethodJUDGE: "Judge",
+ createdAt: "Criado em",
+ courtsCaseTitle: "Caso",
+ courtsMethod: "Método",
+ courtsMethodJUDGE: "Juiz",
courtsMethodJUDGES: "Painel de juízes",
courtsMethodSINGLE_JUDGE: "Juiz único",
courtsMethodJURY: "Júri",
@@ -1651,42 +1899,42 @@ module.exports = {
courtsMethodCOMMUNITY: "Comunidade",
courtsMethodARBITRATION: "Arbitragem",
courtsMethodVOTE: "Votação comunitária",
- courtsAccuser: "Accuser",
- courtsRespondent: "Respondent",
+ courtsAccuser: "Acusação",
+ courtsRespondent: "Defesa",
courtsThStatus: "Estado",
- courtsThAnswerBy: "Answer by",
- courtsThEvidenceBy: "Evidence by",
- courtsThDecisionBy: "Decision by",
- courtsVotesNeeded: "Votes needed",
- courtsVotesSlashTotal: "YES/TOTAL",
- courtsOpenVote: "Open vote",
- courtsAnswerTitle: "Answer",
- courtsVerdictResult: "Result",
- courtsVerdictOrders: "Orders",
- courtsSettlementText: "Settlement",
+ courtsThAnswerBy: "Responder até",
+ courtsThEvidenceBy: "Provas até",
+ courtsThDecisionBy: "Decisão até",
+ courtsVotesNeeded: "Votos necessários",
+ courtsVotesSlashTotal: "SIM/TOTAL",
+ courtsOpenVote: "Votação aberta",
+ courtsAnswerTitle: "Resposta",
+ courtsVerdictResult: "Resultado",
+ courtsVerdictOrders: "Ordens",
+ courtsSettlementText: "Acordo",
courtsSettlementAccepted: "Aceite",
courtsJudge: "Juiz",
- courtsThSupports: "Supports",
- courtsFilterOpenCase: 'Open Case',
- courtsCaseMediatorsPh: 'Mediator Oasis IDs, separated by comma',
+ courtsThSupports: "Apoios",
+ courtsFilterOpenCase: "Abrir caso",
+ courtsCaseMediatorsPh: "IDs de Oasis dos mediadores, separados por vírgulas",
courtsMediatorsLabel: 'Mediadores',
- courtsThCase: 'Case',
- courtsThCreatedAt: 'Start date',
- courtsPublicPrefLabel: 'Visibility after resolution',
- courtsPublicPrefYes: 'I agree this case can be fully public',
- courtsPublicPrefNo: 'I prefer to keep the details private',
- courtsPublicPrefSubmit: 'Save visibility preference',
- courtsMethodMEDIATION: 'Mediation',
- courtsNoCases: 'No cases.',
+ courtsThCase: "Caso",
+ courtsThCreatedAt: "Data de início",
+ courtsPublicPrefLabel: "Visibilidade após a resolução",
+ courtsPublicPrefYes: "Aceito que este caso seja totalmente público",
+ courtsPublicPrefNo: "Prefiro manter os detalhes privados",
+ courtsPublicPrefSubmit: "Guardar preferência de visibilidade",
+ courtsMethodMEDIATION: "Mediação",
+ courtsNoCases: "Não há casos.",
reportsTitle: "Relatórios",
reportsDescription: "Gere e acompanha os relatos da tua rede.",
- reportsSearchPlaceholder: "Pesquisar relatórios...",
+ reportsSearchPlaceholder: "Pesquisar em Relatórios...",
reportsFilterAll: "TODOS",
reportsFilterRecent: "RECENTES",
reportsFilterTop: "TOP",
reportsFilterMine: "MEUS",
reportsFilterFeatures: "FUNCIONALIDADES",
- reportsFilterBugs: "BUGS",
+ reportsFilterBugs: "ERROS",
reportsFilterAbuse: "ABUSO",
reportsFilterContent: "CONTEÚDO",
reportsFilterConfirmed: "CONFIRMADO",
@@ -1698,14 +1946,14 @@ module.exports = {
reportsTitleLabel: "Título",
reportsCategory: "Categoria",
reportsCategoryFeatures: "Funcionalidades",
- reportsCategoryBugs: "Bugs",
+ reportsCategoryBugs: "Erros",
reportsCategoryAbuse: "Abuso",
reportsCategoryContent: "Conteúdo",
reportsUpdateButton: "Atualizar",
reportsDeleteButton: "Eliminar",
reportsMineSectionTitle: "Os teus relatórios",
reportsFeaturesSectionTitle: "Pedidos de funcionalidades",
- reportsBugsSectionTitle: "Bugs",
+ reportsBugsSectionTitle: "Erros",
reportsAbuseSectionTitle: "Relatórios de abuso",
reportsContentSectionTitle: "Problemas de conteúdo",
reportsAllSectionTitle: "Relatórios",
@@ -1728,7 +1976,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Relatórios em análise",
reportsResolvedSectionTitle: "Relatórios resolvidos",
reportsInvalidSectionTitle: "Relatórios inválidos",
- reportsTemplateSectionTitle: 'Modelo de relatório',
reportsBugTemplateTitle: 'Detalhes de reprodução (Bugs)',
reportsFeatureTemplateTitle: 'Detalhes (Funcionalidades)',
reportsAbuseTemplateTitle: 'Detalhes (Abuso)',
@@ -1788,17 +2035,15 @@ module.exports = {
tribeGallerySectionTitle: "Galeria de tribos",
tribeRecentSectionTitle: "Tribos recentes",
tribeTopSectionTitle: "Tribos populares",
- tribeviewTribeButton: "Visitar tribo",
- tribeviewSubTribeButton: "Visitar sub-tribo",
tribeRootLabel: "RAIZ",
tribeDescription: "Explora ou cria tribos na tua rede.",
tribeMainTribeLabel: "TRIBO PRINCIPAL",
tribeCreateButton: "Criar tribo",
tribeUpdateButton: "Atualizar",
tribeDeleteButton: "Eliminar",
- tribeImageLabel: "Carregar mídia (máx: 50MB)",
+ tribeImageLabel: "Carregar mídia (máx: 75MB)",
tribeTitleLabel: "Título",
- searchTribesPlaceholder: "FILTRAR tribos POR NOME …",
+ searchTribesPlaceholder: "Pesquisar em Tribos...",
tribeTitlePlaceholder: "Nome da tribo",
tribeDescriptionLabel: "Descrição",
tribeDescriptionPlaceholder: "Descreve esta tribo",
@@ -1809,8 +2054,17 @@ module.exports = {
tribeInviteMode: "Modo de convite",
tribeModeLabel: "MODE",
tribeIsAnonymousLabel: "ESTADO",
- tribeMembersCount: "Members",
+ tribeMembersCount: "Membros",
tribeEnterInvite: "INSERIR CONVITE",
+ subscriptionTitle: "Subscrições",
+ subscriptionOn: "Subscrito",
+ subscriptionOff: "Não subscrito",
+ subscriptionSubscribe: "Subscrever",
+ subscriptionUnsubscribe: "Cancelar subscrição",
+ subscriptionSubscribers: "Subscritores",
+ pmListLabel: "Enviar para",
+ pmListNone: "— Sem lista —",
+ pmListNoSubscribers: "Sem subscritores",
tribeLeaveButton: "SAIR",
tribePublic: "PÚBLICO",
tribePrivate: "PRIVADO",
@@ -1843,16 +2097,16 @@ module.exports = {
tribeSectionVideos: "VÍDEOS",
tribeSectionDocuments: "DOCUMENTOS",
tribeSectionBookmarks: "MARCADORES",
- tribeSectionMaps: "MAPS",
+ tribeSectionMaps: "MAPAS",
tribeSectionPads: "PADS",
tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionCalendars: "CALENDÁRIOS",
+ tribePadCreate: "Criar pad",
+ tribeChatCreate: "Criar chat",
+ tribeCalendarCreate: "Criar calendário",
+ tribePadsEmpty: "Ainda não há pads.",
+ tribeChatsEmpty: "Ainda não há chats.",
+ tribeCalendarsEmpty: "Ainda não há calendários.",
tribeInhabitantsEmpty: "Ainda sem habitantes nesta tribo.",
tribeEventCreate: "Criar evento",
tribeEventsEmpty: "Ainda sem eventos.",
@@ -1907,9 +2161,14 @@ module.exports = {
tribeMediaTypeDocument: "Documento",
tribeMediaTypeBookmark: "Favorito",
tribeContentDelete: "ELIMINAR",
+ tribeReachTribe: "TRIBO",
+ tribeReachNotice: "OASIS mostra-o a todos os habitantes e CLEARNET também na web aberta. Abri-lo deixa uma cópia legível fora da tribo: voltar a TRIBO oculta-o, mas as cópias já partilhadas não podem ser apagadas.",
+ tribeReachPrivate: "O conteúdo de uma tribo privada só pode ficar dentro da tribo.",
+ tribeReachOpenedBy: "Aberto por",
+ tribeReachChange: "Onde é publicado",
tribeInviteCodeText: "Código de convite: ",
oasisVersionLabel: "Versão do Oasis",
- tribeInviteCodeHint: "Partilha este código com quem queres convidar. Pode entrar via /invites → Tribes.",
+ tribeInviteCodeHint: "Partilha este código com quem queres convidar. Pode entrar via /invites.",
tribeStatusOpen: "ABERTO",
tribeStatusClosed: "FECHADO",
tribeStatusInProgress: "EM PROGRESSO",
@@ -1949,7 +2208,7 @@ module.exports = {
tribeSearchMinChars: "Introduz pelo menos 2 caracteres para pesquisar.",
agendaTitle: "Agenda",
agendaDescription: "Aqui podes encontrar todos os teus itens atribuídos.",
- agendaSearchPlaceholder: "Pesquisar na agenda...",
+ agendaSearchPlaceholder: "Pesquisar em Agenda...",
agendaFilterAll: "TODOS",
agendaFilterToday: "HOJE",
agendaFilterUpcoming: "PRÓXIMOS",
@@ -1970,6 +2229,7 @@ module.exports = {
agendaNoItems: "Sem atribuições encontradas.",
agendaDiscardButton: "Descartar",
agendaRestoreButton: "Restaurar",
+ agendaRemoveButton: "Remover",
agendaMembersCount: "Membros",
agendaLocationLabel: "Localização",
agendaYes: "SIM",
@@ -1982,12 +2242,12 @@ module.exports = {
agendareportStatus: "Estado",
agendaTransferConcept: "Concept",
agendaTransferAmount: "Montante",
- agendaTransferDeadline: "Deadline",
+ agendaTransferDeadline: "Prazo",
opinionsTitle: "Opiniões",
shareYourOpinions: "Descobre e vota em opiniões na tua rede.",
- author: "By",
+ author: "Por",
voteNow: "Votar agora",
- alreadyVoted: "You have already opined.",
+ alreadyVoted: "Já opinaste.",
noOpinionsFound: "Sem opiniões encontradas.",
TOPButton: "TOP",
opinionsTotalCount: "Total de opiniões",
@@ -2036,8 +2296,8 @@ module.exports = {
pmComposeTitle: "Enviar uma mensagem",
pmRecipients: "Destinatários",
pmRecipientsHint: "Introduz Oasis IDs separados por vírgulas",
- pmLimitsHint: "Até 7 destinatários por mensagem.",
- pmTextPlaceholder: "Corpo limitado a 7000 caracteres.",
+ pmLimitsHint: "Até 7 habitantes por mensagem.",
+ pmTextPlaceholder: "Escreve a tua mensagem.",
pmSubject: "Assunto",
pmSubjectHint: "Introduz o assunto da mensagem",
pmText: "Mensagem",
@@ -2059,13 +2319,13 @@ module.exports = {
pmCrypterCharsLabel: "caracteres",
pmInvalidRecipients: "Oasis ID inválido (deveria ser como @…=.ed25519).",
pmEncryptionLabel: "Cifragem",
- private: "Privado",
- privateDescription: "Your encrypted messages.",
+ private: "Caixa de entrada",
+ privateDescription: "Gere as tuas mensagens privadas.",
privateInbox: "CAIXA DE ENTRADA",
privateSent: "ENVIADAS",
privateDelete: "Eliminar",
pmCreateButton: "Escrever MP",
- noPrivateMessages: "No private messages.",
+ noPrivateMessages: "Não há mensagens privadas.",
pmFromLabel: "De:",
pmToLabel: "Para:",
pmNoSubject: "(sem assunto)",
@@ -2095,94 +2355,98 @@ module.exports = {
inboxProjectPledgedTitle: "Novo compromisso com o teu projeto",
pmHasPledged: "comprometeu",
pmToYourProject: "ao teu projeto",
- blockchain: 'BlockExplorer',
- blockchainDescription: 'Explore and visualize the blocks in the blockchain.',
- blockchainNoBlocks: 'No blocks found in the blockchain.',
+ blockchain: "Explorador de blocos",
+ blockchainDescription: "Explora e visualiza os blocos da blockchain.",
+ blockchainNoBlocks: "Não foram encontrados blocos na blockchain.",
blockchainStatsTitle: 'Estatísticas',
blockchainStatsTypeBreakdown: 'Distribuição por tipo',
blockchainStatsTopAuthors: 'Autores principais',
blockchainStatsCount: 'Blocos',
- blockchainBlockID: 'Block ID',
- blockchainBlockAuthor: 'Author',
+ blockchainBlockID: "ID do bloco",
+ blockchainBlockAuthor: "Autor",
blockchainBlockCarbon: 'Pegada de carbono',
blockchainBlockType: 'Type',
- blockchainBlockTimestamp: 'Timestamp',
+ blockchainBlockTimestamp: "Carimbo temporal",
blockchainLatestDatagram: 'Último Datagrama',
blockchainDatagram: "Datagrama",
blockchainDetails: "Ver Detalhes do Bloco",
blockchainViewBlockexplorer: "Ver no Blockexplorer",
- blockchainBack: 'Back to Blockexplorer',
+ blockchainBack: "Voltar ao explorador de blocos",
blockchainContentDeleted: "Este conteúdo foi eliminado (tombstone)",
visitContent: "Visitar Conteúdo",
favoriteAdd: "Fixar nos Favoritos",
pmContentTooltip: "Enviar Mensagem Privada",
+ phoneCallTooltip: "Fazer uma Chamada",
favoriteRemove: "Remover dos Favoritos",
reportContent: "Denunciar Conteúdo",
- banking: 'Banking',
- bankingTitle: 'Banking',
- bankingDescription: "A economia ECOin: saldo, RBU, taxas e valor da indústria.",
- bankOverview: 'Overview',
- bankEpochs: 'Epochs',
- bankRules: 'Rules',
- pending: 'Pending',
- closed: 'Closed',
- bankViewTx: 'View Tx',
- bankClaimNow: 'Claim now',
- bankClaimUBI: 'Reivindicar RBU!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
- bankEpoch: 'Epoch',
- bankPool: 'Pool (this epoch)',
- bankWeightsSum: 'Sum of weights',
- bankNoAllocations: 'No allocations found.',
- bankNoEpochs: 'No epochs found.',
- bankEpochAllocations: 'Epoch allocations',
- bankAllocId: 'Allocation ID',
+ banking: "Banca",
+ bankingTitle: "Banca",
+ bankingDescription: "A economia coletiva de ECOin.",
+ bankOverview: "Resumo",
+ bankEpochs: "Épocas",
+ bankRules: "Regras",
+ pending: "Pendentes",
+ closed: "Fechadas",
+ bankClaimNow: "Reivindicar agora",
+ bankClaimUBI: 'Reivindicar RBU',
+ bankClaimAndPay: "Reivindicar e pagar",
+ bankClaimedPending: "Reivindicação pendente...",
+ bankStatusClaimed: "Reivindicado",
+ bankStatusExpired: "Expirado",
+ bankPubOnly: "Operação só para PUBs",
+ bankEpoch: "Época",
+ bankPool: "Fundo (esta época)",
+ bankWeightsSum: "Soma dos pesos",
+ bankNoAllocations: "Não foram encontradas atribuições.",
+ bankNoEpochs: "Não foram encontradas épocas.",
+ bankEpochAllocations: "Atribuições da época",
+ bankAllocId: "ID da atribuição",
bankAllocDate: 'Date',
bankAllocConcept: 'Concept',
- bankAllocFrom: 'From',
- bankAllocTo: 'To',
- bankAllocAmount: 'Amount',
+ bankAllocFrom: "De",
+ bankAllocTo: "Para",
+ bankAllocAmount: "Montante",
bankAllocStatus: 'Status',
- bankEpochId: 'Epoch ID',
- bankRuleHash: 'Rules Snapshot Hash',
- bankViewEpoch: 'View Epoch',
+ bankEpochId: "ID da época",
+ bankRuleHash: "Hash do instantâneo das regras",
+ bankViewEpoch: "Ver época",
bankYourIndustryBalance: "A tua parte da indústria",
bankYourUbiMonth: "O teu RBU (este mês)",
- bankYourFundsMonth: "Os teus fundos (este mês)",
- bankIndustryBalance: "Produção industrial (estimada)",
- bankUserBalance: 'Your Balance',
- bankAddresses: 'Addresses',
- bankNoAddresses: 'No addresses found.',
+ bankYourFundsMonth: "Fundos totais",
+ bankIndustryBalance: "Produção industrial",
+ bankUserBalance: "O teu saldo",
+ bankAddresses: "Endereços",
+ bankNoAddresses: "Não foram encontrados endereços.",
bankUser: 'Oasis ID',
- bankAddress: 'Address',
- bankAddAddressTitle: 'Add ECOIN address',
+ bankAddress: "Endereço",
+ bankAddAddressTitle: "Adicionar endereço ECOin",
bankAddAddressUser: 'Oasis ID',
- bankAddAddressAddress: 'ECOIN Address',
- bankAddAddressSave: 'Save',
- bankAddressAdded: 'Address added',
- bankAddressUpdated: 'Address updated',
- bankAddressExists: 'Address already exists',
- bankAddressInvalid: 'Invalid address',
- bankAddressDeleted: 'Address deleted',
- bankAddressNotFound: 'Address not found',
+ bankAddAddressLabel: "Etiqueta (opcional)",
+ bankAddAddressLabelPlaceholder: "Carteira do Bob, loja da Alice…",
+ bankAddAddressUserOptional: "Oasis ID (opcional)",
+ bankAddressUnnamed: "Endereço sem nome",
+ bankAddAddressAddress: "Endereço ECOin",
+ bankAddAddressSave: "Guardar",
+ bankAddressAdded: "Endereço adicionado",
+ bankAddressUpdated: "Endereço atualizado",
+ bankAddressExists: "O endereço já existe",
+ bankAddressInvalid: "Endereço inválido",
+ bankAddressDeleted: "Endereço eliminado",
+ bankAddressNotFound: "Endereço não encontrado",
bankAddressForbidden: 'Só podes configurar o teu próprio endereço de cobrança',
- bankAddressTotal: 'Total Addresses',
- bankAddressSearch: 'Search @inhabitant or address',
+ bankAddressTotal: "Total de endereços",
+ bankAddressSearch: "Procurar @habitante ou endereço",
bankAddressActions: 'Actions',
- bankAddressDelete: 'Delete',
+ bankAddressDelete: "Eliminar",
bankAddressSource: 'Source',
- bankAddressDeleteConfirm: 'Delete this address?',
- search: 'Search!',
+ bankAddressDeleteConfirm: "Eliminar este endereço?",
+ search: "Procurar!",
bankLocal: 'Local',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "Rede",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "SEM FUNDOS!",
bankUbiAvailableOk: "DISPONÍVEL!",
- bankUbiAvailability: "RBU (rede)",
+ bankUbiAvailability: "RBU",
bankAlreadyClaimedThisMonth: "Já reclamado este mês",
bankUbiThisMonth: "RBU (este mês)",
bankUbiLastClaimed: "RBU (última reclamada)",
@@ -2212,6 +2476,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Cifrado em trânsito",
shopAddFavorite: "Adicionar Favorito",
shopRemoveFavorite: "Remover Favorito",
shopOpen: "ABERTA",
@@ -2219,6 +2484,13 @@ module.exports = {
shopMakePrivate: "TORNAR PRIVADA (E2E)",
shopMakePublic: "TORNAR PÚBLICA",
shopProducts: "Produtos",
+ shopFilterAll: "TODAS",
+ shopFilterRecent: "RECENTES",
+ shopFilterMine: "MINHAS",
+ shopFilterTop: "TOP",
+ shopFilterProducts: "PRODUTOS",
+ shopFilterPrices: "PREÇOS",
+ shopFilterFavorites: "FAVORITOS",
shopProductAdd: "Adicionar Produto",
shopProductTitle: "Produto",
shopProductUpdate: "Atualizar Produto",
@@ -2246,7 +2518,7 @@ module.exports = {
marketVisitItem: "VER ARTIGO",
shopStatus: "ESTADO",
shopCreatedAt: "CRIADO",
- shopSearchPlaceholder: "Pesquisar lojas...",
+ shopSearchPlaceholder: "Pesquisar em Lojas...",
shopUrl: "URL",
shopLocation: "Localização",
shopTags: "Tags",
@@ -2256,22 +2528,24 @@ module.exports = {
shopTitlePlaceholder: "Nome da sua loja",
shopDescriptionPlaceholder: "Descricao detalhada da sua loja",
shopLocationPlaceholder: "Cidade, Pais",
- shopTagsPlaceholder: "tag1, tag2, tag3",
+ shopTagsPlaceholder: "Introduz tags separadas por vírgulas",
mapTitlePlaceholder: "Titulo do mapa",
shopProductFeatured: "Produto em Destaque",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "Enviar para o mercado",
typeShop: "LOJAS",
typeShopProduct: "PRODUTO DE LOJA",
- bankExchange: 'Exchange',
- bankExchangeCurrentValue: 'ECOin Value (1h)',
- bankTotalSupply: 'ECOin Total Supply',
- bankEcoinHours: "Equivalência ECOin em tempo",
- bankHoursOfWork: 'hours',
+ bankExchange: "Câmbio",
+ bankExchangeCurrentValue: "Valor de ECOin (1h)",
+ bankTotalSupply: "Oferta ECOin total",
+ bankPubsSupply: "Oferta ECOin da reserva dos PUBs",
+ bankHoldingSupply: "Oferta ECOin fora do RBU",
+ bankEcoinHours: "Equivalência ECOin em tempo (1 ECO)",
+ bankHoursOfWork: "horas",
bankUnitMs: "ms",
bankUnitSeconds: "segundos",
bankUnitMinutes: "minutos",
bankUnitDays: "dias",
- bankExchangeNoData: 'No data available',
+ bankExchangeNoData: "Não há dados disponíveis",
bankInflation: 'ECOin Inflation (anual)',
bankInflationMonthly: 'ECOin Inflation (mensual)',
bankExchangeChartTitle: 'Progressão do valor de ECOin ao longo do tempo',
@@ -2279,22 +2553,24 @@ module.exports = {
bankExchangeChartSupply: 'Oferta',
bankExchangeChartInflation: 'Inflação %',
bankExchangeChartEmpty: 'Ainda não há amostras suficientes — volte mais tarde',
- bankCurrentSupply: 'ECOin Current Supply',
- bankingSyncStatus: 'ECOin Status',
- bankingSyncStatusSynced: 'Synced',
- bankingSyncStatusOutdated: 'Outdated',
- statsTitle: 'Statistics',
+ bankCurrentSupply: "Oferta ECOin atual",
+ bankingSyncStatus: "Estado de ECOin",
+ bankingSyncStatusSynced: "Sincronizado",
+ bankingSyncStatusOutdated: "Não sincronizado",
+ statsTitle: "Estatísticas",
statistics: "Estatísticas",
statsDescription: "Descobre estatísticas sobre a tua rede.",
- ALLButton: "ALL",
- MINEButton: "MINE",
- TOMBSTONEButton: "TOMBSTONES",
+ ALLButton: "TUDO",
+ RECENTButton: "RECENTES",
+ MINEButton: "MEUS",
+ TOMBSTONEButton: "ELIMINADOS",
statsCreatedAt: "Criado em",
statsYourContent: "Conteúdo",
statsYourOpinions: "Opiniões",
statsNetworkContent: "Conteúdo",
statsNetworkOpinions: "Opiniões",
- statsEcoWalletLabel: "Carteira ECOIN",
+ statsEcoWalletLabel: "Carteira ECOin",
+ walletAddressCopyHint: "Clica para selecionar e copiar",
statsEcoWalletNotConfigured: "Não configurada!",
statsBookmark: "Marcadores",
statsEvent: "Eventos",
@@ -2316,6 +2592,8 @@ module.exports = {
statsTransfer: "Transferências",
statsAiExchange: "IA",
statsPUBs: 'PUBs',
+ statsSyncedPeers: "Pares",
+ statsTotalLabel: "Total",
statsPost: "Publicações",
statsSize: "Total (tamanho)",
statsBlockchainSize: "Blockchain (tamanho)",
@@ -2323,7 +2601,7 @@ module.exports = {
statsActivity7d: "Atividade (últimos 7 dias)",
statsActivity7dTotal: "Total 7 dias",
statsActivity30dTotal: "Total 30 dias",
- day: "Day",
+ day: "Dia",
messages: "Mensagens",
statsProject: "Projetos",
statsProjectsTitle: "Projetos",
@@ -2367,17 +2645,23 @@ module.exports = {
aiPrompt: "Fornece uma resposta informativa e precisa.",
aiConfiguration: "Definir prompt",
aiPromptUsed: "Prompt",
- aiClearHistory: "Limpar histórico de conversa",
- aiServerError: "A IA não conseguiu responder. Por favor, tenta novamente.",
- aiInputPlaceholder: "What is Oasis?",
+ aiClearHistory: "Limpar histórico",
+ aiServerError: "Não consigo responder bem. Tenta de novo.",
+ aiStatusLoading: "42 está a carregar o modelo. Pergunta de novo dentro de momentos.",
+ aiThinking: "A pensar",
+ aiWaiting: "À espera",
+ aiStatusMissingModel: "O modelo de IA não está instalado: falta src/AI/oasis-42-1-chat.Q4_K_M.gguf.",
+ aiExportFineTuning: "Exportar Fine-Tuning",
+ aiFactsTitle: "Dados da tua rede",
+ aiInputPlaceholder: "O que é o Oasis?",
typeAiExchange: "IA",
aiApproveTrain: "Adicionar ao treino coletivo",
aiRejectTrain: "Não treinar",
aiTrainApproved: "Aprovado para treino",
aiTrainRejected: "Rejeitado para treino",
aiSnippetsUsed: "Excertos usados",
- aiSnippetsLearned: "Snippets learned",
- statsAITraining: "AI training",
+ aiSnippetsLearned: "Fragmentos aprendidos",
+ statsAITraining: "Treino de IA",
aiCustomAnswerPlaceholder: "Escreve a tua resposta personalizada…",
marketMineSectionTitle: "Os teus itens",
marketCreateSectionTitle: "Criar item",
@@ -2397,7 +2681,7 @@ module.exports = {
marketFilterDiscarded: "DESCARTADO",
marketFilterRecent: "RECENTES",
marketFilterMyBids: "LICITAÇÕES",
- marketCreateButton: "Criar item",
+ marketCreateButton: "Vender algo",
marketItemType: "Tipo",
marketItemTitle: "Título",
marketItemAvailable: "Prazo",
@@ -2424,8 +2708,8 @@ module.exports = {
marketItemSeller: "Vendedor",
marketNoItems: "Ainda sem itens disponíveis.",
marketYourBid: "A tua licitação",
- marketCreateFormImageLabel: "Carregar mídia (máx: 50MB)",
- marketSearchPlaceholder: "Pesquisar título ou tags",
+ marketCreateFormImageLabel: "Carregar mídia (máx: 75MB)",
+ marketSearchPlaceholder: "Pesquisar em Mercado...",
marketMinPriceLabel: "Preço mínimo",
marketMaxPriceLabel: "Preço máximo",
marketSortRecent: "Mais recentes",
@@ -2491,8 +2775,7 @@ module.exports = {
housingSetClosed: "Tornar indisponível",
housingCreateButton: "Criar lugar",
housingUpdateButton: "Atualizar",
- housingDeleteButton: "Apagar",
- housingSearchPlaceholder: "Procurar lugares...",
+ housingSearchPlaceholder: "Pesquisar em Habitação...",
housingSearchButton: "Procurar",
housingMinPrice: "Preço mín.",
housingMaxPrice: "Preço máx.",
@@ -2548,7 +2831,7 @@ module.exports = {
jobLocationPresencial: "Presencial",
jobLocationRemote: "Remoto",
jobVacantsPlaceholder: "Número de posições",
- jobImage: "Carregar mídia (máx: 50MB)",
+ jobImage: "Carregar mídia (máx: 75MB)",
jobTasks: "Tarefas",
jobType: "Tipo de emprego",
jobTime: "Horário",
@@ -2559,7 +2842,7 @@ module.exports = {
createJobButton: "Publicar emprego",
noJobsFound: "Sem ofertas de emprego encontradas.",
jobAuthor: "Por",
- jobTypeFreelance: "Freelancer",
+ jobTypeFreelance: "Independente",
jobTypeSalary: "Empregado",
jobTypeExchange: "Troca de horas",
jobTypeEXCHANGE: "TROCA DE HORAS",
@@ -2568,14 +2851,13 @@ module.exports = {
jobsHoursOffered: "Horas oferecidas",
jobsHoursRequested: "Horas pedidas em troca",
jobsExchangeSkill: "Habilidade pedida em troca",
- jobTimePartial: "Part-time",
- jobTimeComplete: "Full-time",
- jobsDeleteButton: "ELIMINAR",
+ jobTimePartial: "Tempo parcial",
+ jobTimeComplete: "Tempo inteiro",
jobsUpdateButton: "ATUALIZAR",
jobsFilterApplied: "CANDIDATADO",
jobsAppliedTitle: "As minhas candidaturas",
jobsAppliedBadge: "Candidatado",
- jobsSearchPlaceholder: "Pesquisar título, tags, descrição...",
+ jobsSearchPlaceholder: "Pesquisar em Empregos...",
jobsMinSalaryLabel: "Salário mínimo",
jobsMaxSalaryLabel: "Salário máximo",
jobsSortRecent: "Mais recentes",
@@ -2584,18 +2866,18 @@ module.exports = {
jobsSearchButton: "Pesquisa",
jobsApplicants: "Candidatos",
jobsUpdatedAt: "Atualizado",
- jobSetOpen: "Set open",
+ jobSetOpen: "Marcar como aberto",
jobsTagsLabel: "Tags",
noJobsMatch: "Nenhum emprego corresponde à tua pesquisa.",
- industrySearchPlaceholder: "Procurar fábricas…",
+ industrySearchPlaceholder: "Pesquisar em Indústria...",
industryAllSectors: "Todos os setores",
industryVisitButton: "Visitar indústria",
industryAdvanceTo: "Definir para",
industryAmount: "Quantia",
industryApproveBuild: "Aprovar",
- industryBlueprint: "Blueprint",
- industryBlueprints: "Blueprints",
- industryBuild: "Build",
+ industryBlueprint: "Plano",
+ industryBlueprints: "Planos",
+ industryBuild: "Produção",
industryBuildNotes: "Notas",
industryBuildStart: "Data de início",
industryVoteUpdateButton: "Votar atualização",
@@ -2603,7 +2885,7 @@ module.exports = {
industryRevokeVote: "Revogar",
industryTimeLeft: "Tempo restante",
industryBuildEnd: "Data de fim",
- industryBuilds: "Builds",
+ industryBuilds: "Produções",
industryBuildTitle: "Título",
industryContribute: "Contribuir",
industryContributeButton: "Contribuir",
@@ -2661,7 +2943,6 @@ 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",
@@ -2688,7 +2969,7 @@ module.exports = {
industryRulesIntro: "Industry permite aos habitantes possuir coletivamente os meios de produção: uma Fábrica é uma oficina da rede que ninguém possui de forma privada.",
industryRulesSteward: "O fundador é o administrador — um guardião, não um dono: não pode vender, privatizar nem dissolver a Fábrica sozinho.",
industryRulesMembership: "A política de adesão define como se entra: Aberta (na hora), Por voto (admitido pelo voto dos membros) ou Apenas convite (um membro deve convidar primeiro).",
- industryRulesQuorum: "O quórum é o número mínimo de membros que devem votar para uma decisão contar, para que uma Fábrica pequena não seja decidida por uma só pessoa.",
+ industryRulesQuorum: "O quórum é o número mínimo de membros que devem votar para uma decisão contar, para que uma Fábrica pequena não seja decidida por um só habitante.",
industryRulesMajority: "A maioria é a fração de votos necessária (0,5 = metade, 1 = unanimidade); uma decisão passa quando os SIM atingem pelo menos max(quórum, membros × maioria).",
industryRulesDecisions: "Os membros votam para admitir novos, aprovar builds e dissolver a Fábrica; o administrador não pode ignorar estas decisões coletivas.",
industryRulesBlueprints: "Os Blueprints são receitas livres (COPYLEFT) — as entradas (materiais, horas de trabalho, competências) e a saída (um bem físico ou digital) — e qualquer um pode forká-las.",
@@ -2707,13 +2988,14 @@ module.exports = {
industryPauseVotes: "Votos de estado",
industryTitle: "Indústria",
industryDescription: "Módulo para gerir os meios de produção de forma coletiva.",
- typeIndustryBuild: "BUILD",
- typeIndustryBlueprint: "BLUEPRINT",
+ typeIndustryBuild: "PRODUÇÃO",
+ typeIndustryBlueprint: "PLANO",
typeIndustryAllocation: "DISTRIBUIÇÃO",
typeIndustry: "INDÚSTRIA",
modulesIndustryLabel: "Indústria",
modulesIndustryDescription: "Módulo para gerir os meios de produção de forma coletiva.",
industryFilterAll: "TODAS",
+ industryFilterRecent: "RECENTES",
industryFilterMember: "MEMBRO",
industryFilterBlueprints: "PLANOS",
industryFilterBuilds: "PRODUÇÕES",
@@ -2722,6 +3004,7 @@ module.exports = {
industryFilterPaused: "PAUSADAS",
industryFilterDissolved: "DISSOLVIDAS",
industryAllTitle: "Indústria",
+ industryRecentTitle: "Fábricas recentes",
industryMemberTitle: "Fábricas de que faço parte",
industryMineTitle: "Minhas fábricas",
industryActiveTitle: "Em funcionamento",
@@ -2769,7 +3052,7 @@ module.exports = {
industryPolicy_invite: "Apenas convite",
projectsTitle: "Projetos",
projectsDescription: "Cria, financia e acompanha projetos comunitários na tua rede.",
- projectSearchPlaceholder: "Pesquisar projetos...",
+ projectSearchPlaceholder: "Pesquisar em Projetos...",
projectCreateProject: "Criar projeto",
projectCreateButton: "Criar projeto",
projectUpdateButton: "ATUALIZAR",
@@ -2792,7 +3075,7 @@ module.exports = {
projectRecentTitle: "Projetos recentes",
projectTopTitle: "Mais financiados",
projectTitlePlaceholder: "Nome do projeto",
- projectImage: "Carregar mídia (máx: 50MB)",
+ projectImage: "Carregar mídia (máx: 75MB)",
projectDescription: "Descrição",
projectDescriptionPlaceholder: "Conta a história e os objetivos…",
projectGoal: "Objetivo (ECO)",
@@ -2833,7 +3116,7 @@ module.exports = {
projectMilestoneOpen: "aberto",
projectMilestoneDone: "concluído",
projectMilestoneDue: "prazo",
- projectMilestoneMarkDone: "Mark as Done",
+ projectMilestoneMarkDone: "Marcar como concluído",
projectMilestoneTitlePlaceholder: "Introduz o título do marco",
projectMilestoneDescriptionPlaceholder: "Introduz a descrição para este marco",
projectMilestoneDescription: "Descrição do marco",
@@ -2864,15 +3147,13 @@ module.exports = {
modulesModuleName: "Nome",
modulesModuleDescription: "Descrição",
modulesModuleStatus: "Estado",
- modulesTotalModulesLabel: "Módulos carregados",
+ modulesTotalModulesLabel: "Total",
modulesEnabledModulesLabel: "Ativado",
modulesDisabledModulesLabel: "Desativado",
modulesInvitesLabel: "Convites",
modulesInvitesDescription: "Módulo para gerir e aplicar códigos de convite.",
modulesWalletLabel: "Carteira",
modulesWalletDescription: "Módulo para gerir os teus ativos digitais (ECOin).",
- modulesLegacyLabel: "Chaves",
- modulesLegacyDescription: "Módulo para gerir o teu segredo (chave privada) de forma rápida e segura.",
modulesCipherLabel: "Encriptação",
modulesCipherDescription: "Módulo para encriptar e decifrar o teu texto simetricamente (com senha partilhada).",
modulesBookmarksLabel: "Marcadores",
@@ -2925,7 +3206,7 @@ module.exports = {
modulesMelodyDescription: "Módulo para gerar e partilhar o \"som\" da tua blockchain.",
modulesAgendaLabel: "Agenda",
modulesAgendaDescription: "Módulo para gerir todos os teus itens atribuídos.",
- modulesAILabel: "AI",
+ modulesAILabel: "IA",
modulesAIDescription: "Módulo para conversar com um LLM chamado '42'.",
modulesForumLabel: "Fóruns",
modulesForumDescription: "Módulo para descobrir e gerir fóruns.",
@@ -2934,20 +3215,23 @@ module.exports = {
modulesProjectsLabel: "Projetos",
modulesProjectsDescription: "Módulo para explorar, financiar coletivamente e gerir projetos.",
modulesBankingLabel: "Banca",
- modulesBankingDescription: "Módulo para determinar o valor real do ECOIN e distribuir um UBI usando o tesouro comum.",
+ modulesBankingDescription: "Módulo para gerir o tesouro comum: valor do ECOIN, impostos e RBU.",
modulesFavoritesLabel: "Favoritos",
modulesFavoritesDescription: "Módulo para gerir o teu conteúdo favorito.",
fileTooLargeTitle: "Ficheiro demasiado grande",
- fileTooLargeMessage: "O ficheiro excede o tamanho máximo permitido (50 MB). Por favor, seleciona um ficheiro mais pequeno.",
+ fileTooLargeMessage: "O ficheiro excede o tamanho máximo permitido (75 MB). Por favor, seleciona um ficheiro mais pequeno.",
goBack: "Voltar",
+ errorDismiss: "OK",
errorPageTitle: "Algo correu mal",
+ errorNoAllocation: "Nenhuma alocação encontrada para esta reivindicação.",
+ errorInvalidClaim: "Esta alocação não pode ser reivindicada.",
visibilityLabel: "Visibilidade",
+ clearnetPrivateConflict: "Um conteúdo privado, oculto, fechado, só por convite ou pago não pode ser publicado na CLEARNET. Escolhe OASIS ou torna-o público.",
visibilityPublic: "Pública",
visibilityHidden: "Oculta",
visibilityMakePublic: "Tornar pública",
visibilityMakeHidden: "Ocultar",
invitesInhabitantsTitle: "Habitantes",
- invitesInhabitantsFollow: "Seguir",
aiNavPlaceholder: "Descreve o que precisas...",
aiNavDisabled: "A navegação por IA está desativada.",
aiNavResultsTitle: "Sugestões AINav",
@@ -2958,24 +3242,24 @@ module.exports = {
modulesAINavDescription: "Módulo para consultas em linguagem natural sobre o conteúdo da rede.",
directConnectDescription: "Conecta-te diretamente a um par inserindo o endereço IP, porta e chave pública.",
peerHost: "IP",
- peerPort: "Porta (predefinida: 8008)",
+ peerPort: "Porta",
peerPublicKey: "Chave pública (@...ed25519)",
connectAndFollow: "Conectar",
modulesPresetTitle: "Configurações Comuns",
- workflowsTitle: "Workflows",
+ workflowsTitle: "Fluxos de trabalho",
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_kids: "Crianças",
+ workflow_activists: "Ativismo",
workflow_mobile: "Móvel",
statsCarbonFootprintTitle: "Pegada de carbono",
statsCarbonTombstone: "Pegada do tombstoning",
- uploadMedia: "Carregar mídia (máx: 50MB)",
+ uploadMedia: "Carregar mídia (máx: 75MB)",
courtsRespondentInvalid: "Demandado inválido",
feedDetailTitle: "Detalhe do feed",
@@ -2984,7 +3268,7 @@ module.exports = {
noComments: "Ainda sem comentários.",
mapsLabel: "Mapas",
mapTitle: "Mapas",
- mapDescription: "Explore e gerencie mapas offline na sua rede.",
+ mapDescription: "Gerencie e compartilhe mapas offline na sua rede.",
mapMineSectionTitle: "Seus Mapas",
mapCreateSectionTitle: "Criar Mapa",
mapUpdateSectionTitle: "Atualizar Mapa",
@@ -3013,7 +3297,7 @@ module.exports = {
mapTypeOpen: "ABERTO",
mapTypeClosed: "FECHADO",
mapTagsLabel: "Tags",
- mapTagsPlaceholder: "Insira tags separadas por vírgulas",
+ mapTagsPlaceholder: "Introduz tags separadas por vírgulas",
mapUrlLabel: "URL do mapa",
mapMarkersTitle: "Marcadores",
mapMarkerDefault: "Marcador",
@@ -3024,9 +3308,22 @@ module.exports = {
markerImageLabel: "Imagem do Marcador",
mapAddMarkerTitle: "Adicionar Marcador",
mapAddMarkerButton: "Adicionar Marcador",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Limpar marcador",
mapApplyZoom: "Aplicar Zoom",
- mapSearchPlaceholder: "Buscar descrição, tags, autor...",
+ mapPlaceSearchPlaceholder: "Procurar um lugar ou país...",
+ mapNoPlaces: "Nenhum lugar encontrado.",
+ mapClusterTitle: "marcadores aqui, clique para aproximar",
+ mapDeleteMarker: "Eliminar marcador",
+ mapZoomIn: "Aproximar",
+ mapZoomOut: "Afastar",
+ mapFitMarkers: "Ajustar a todos os marcadores",
+ mapPanLabel: "Mover o mapa",
+ mapCenterHere: "Centrar aqui",
+ mapNear: "perto de",
+ mapPickedSpot: "Ponto escolhido",
+ mapPickHint: "Clique no mapa para escolher um ponto.",
+ mapClearPick: "Limpar",
+ mapSearchPlaceholder: "Pesquisar em Mapas...",
mapSearchButton: "Buscar",
mapUpdatedAt: "Atualizado",
mapNoMatch: "Nenhum mapa corresponde à sua busca.",
@@ -3037,6 +3334,465 @@ module.exports = {
typeMapMarker: "MARCADOR DE MAPA",
modulesMapLabel: "Mapas",
modulesMapDescription: "Módulo para gerenciar e compartilhar mapas offline.",
+ emergenciesTitle: "Emergências",
+ modulesEmergenciesLabel: "Emergências",
+ modulesEmergenciesDescription: "Módulo para lançar, confirmar e seguir emergências na rede.",
+ emergenciesDescription: "Módulo para lançar, confirmar e seguir emergências na rede.",
+ emergencyCreate: "Criar emergência",
+ emergencyUpdate: "Atualizar",
+ emergencyDelete: "Apagar",
+ emergencyTitleLabel: "Título",
+ emergencyTitlePlaceholder: "O que está a acontecer?",
+ emergencyTextLabel: "Detalhes",
+ emergencyTextPlaceholder: "Onde, desde quando, o que fazer...",
+ emergencyCategoryLabel: "Categoria",
+ emergencyCategoryWeather: "METEOROLOGIA",
+ emergencyCategoryInfrastructure: "INFRAESTRUTURA",
+ emergencyCategoryHealth: "SAÚDE",
+ emergencyCategorySecurity: "SEGURANÇA",
+ emergencyCategoryLost: "PERDIDOS E ACHADOS",
+ emergencyCategoryNeighborhood: "VIZINHANÇA",
+ emergencyExpiresLabel: "Expira em",
+ emergencyExpires1d: "1 dia",
+ emergencyExpires3d: "3 dias",
+ emergencyExpires7d: "1 semana",
+ emergencyExpires30d: "1 mês",
+ emergencyExpiresNone: "Indefinido",
+ emergencyExpiresKeep: "Manter a data atual",
+ emergencyTagsLabel: "Etiquetas",
+ emergencyTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ emergencyFilterAll: "TODOS",
+ emergencyFilterMine: "MEUS",
+ emergencyFilterRecent: "RECENTES",
+ emergencySeverityUnverified: "NÃO VERIFICADO",
+ emergencySeverityLow: "BAIXA",
+ emergencySeverityMedium: "MÉDIA",
+ emergencySeverityHigh: "ALTA",
+ emergencyStatusActive: "ATIVO",
+ emergencyStatusResolved: "RESOLVIDO",
+ emergencyStatusExpired: "EXPIRADO",
+ emergencyConfirmations: "Confirmações",
+ emergencyConfirmButton: "Confirmar",
+ emergencyConfirmed: "Confirmaste esta emergência",
+ emergencyResolveButton: "Resolver",
+ emergencyReopenButton: "Reabrir",
+ emergencyGenerateReport: "Gerar relatório",
+ emergencyUpdateEdited: "Editada",
+ emergencyLastUpdate: "ÚLTIMA ATUALIZAÇÃO",
+ emergencyUpdatesTitle: "Últimas atualizações:",
+ emergencyNoUpdates: "Ainda sem atualizações.",
+ emergencyAddUpdate: "Publicar atualização",
+ emergencyUpdatePlaceholder: "O que mudou?",
+ emergencyNoItems: "Nenhuma emergência encontrada.",
+ emergencyExpiresAt: "Expira",
+ emergencyBannerLabel: "Emergência ativa",
+ emergencyCreateSectionTitle: "Criar emergência",
+ emergencyUpdateSectionTitle: "Atualizar emergência",
+ emergencySearchPlaceholder: "Pesquisar em emergências...",
+ typeEmergency: "EMERGÊNCIAS",
+ typeEmergencyConfirm: "CONFIRMAÇÃO DE EMERGÊNCIA",
+ typeEmergencyUpdate: "ATUALIZAÇÃO DE EMERGÊNCIA",
+ statsEmergency: "Emergências",
+ statsEmergencyConfirm: "Confirmações de emergências",
+ statsEmergencyUpdate: "Atualizações de emergências",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "Uma emergência que segues tem uma atualização.",
+ emergencyBotResolvedTitle: "Uma emergência que segues foi resolvida.",
+ dataKindEmergencies: "EMERGÊNCIAS",
+ mailingTitle: "Listas de correio",
+ modulesMailingLabel: "Listas de correio",
+ modulesMailingDescription: "Descobre e gere listas de correio na tua rede.",
+ modulesPhoneLabel: "Telefone",
+ modulesPhoneDescription: "Módulo para ligar a outros habitantes com videochamadas cifradas de ponta a ponta.",
+ mailingDescription: "Descobre e gere listas de correio na tua rede.",
+ mailingCreate: "Criar lista de correio",
+ mailingUpdate: "Atualizar",
+ mailingArchive: "Arquivar",
+ mailingActivate: "Ativar",
+ mailingCreateSectionTitle: "Criar lista de correio",
+ mailingUpdateSectionTitle: "Atualizar lista de correio",
+ mailingTitleLabel: "Título",
+ mailingTitlePlaceholder: "Nome da lista de correio",
+ mailingDescriptionLabel: "Descrição",
+ mailingDescriptionPlaceholder: "Sobre o que é esta lista?",
+ mailingTypeLabel: "Tipo de lista de correio",
+ mailingTypeOpen: "ABERTA",
+ mailingTypeClosed: "FECHADA",
+ mailingStatusLabel: "Estado",
+ mailingStatusActive: "ATIVA",
+ mailingStatusArchived: "ARQUIVADA",
+ mailingMembersLabel: "Convidar habitantes",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Subscritores",
+ mailingTagsLabel: "Etiquetas",
+ mailingTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ mailingFilterAll: "TODAS",
+ mailingFilterMine: "MINHAS",
+ mailingFilterSubscribed: "SUBSCRITAS",
+ mailingFilterRecent: "RECENTES",
+ mailingHistoryDate: "DATA",
+ mailingHistoryThreads: "TÓPICOS",
+ mailingHistoryInhabitants: "HABITANTES",
+ mailingHistorySearchPlaceholder: "Pesquisar no histórico...",
+ mailingNoMessages: "Ainda não há mensagens.",
+ mailingNoItems: "Nenhuma lista de correio encontrada.",
+ mailingSearchPlaceholder: "Pesquisar em listas de correio...",
+ mailingWriteButton: "Escrever mensagem",
+ mailingWriteTitle: "Escrever à lista",
+ mailingReplyTitle: "Responder à lista",
+ mailingSend: "Enviar",
+ mailingTextPlaceholder: "A tua mensagem chega a todos os participantes da lista.",
+ mailingParticipants: "Participantes",
+ inboxFilterMailing: "Listas de correio",
+ mailingReplyPlaceholder: "Responder à lista...",
+ mailingReplyToList: "Responder à lista",
+ typeMailingList: "LISTA DE CORREIO",
+ statsMailingList: "Listas de correio",
+ mailingListLabel: "LISTA DE CORREIO",
+ logisticsTitle: "Logística",
+ modulesLogisticsLabel: "Logística",
+ modulesLogisticsDescription: "Descobre e gere planos logísticos na tua rede.",
+ logisticsDescription: "Descobre e gere planos logísticos na tua rede.",
+ logisticsCreate: "Criar rota",
+ logisticsUpdate: "Atualizar",
+ logisticsClose: "Fechar",
+ logisticsReopen: "Reabrir",
+ logisticsCreateSectionTitle: "Criar rota",
+ logisticsUpdateSectionTitle: "Atualizar rota",
+ logisticsTitleLabel: "Título",
+ logisticsTitlePlaceholder: "Viagem ao mercado, carrinha disponível...",
+ logisticsKindLabel: "Tipo de logística",
+ logisticsKindTrip: "VIAGEM",
+ logisticsKindShipment: "ENVIO",
+ logisticsKindTrips: "VIAGENS",
+ logisticsKindShipments: "ENVIOS",
+ logisticsModeLabel: "Modo",
+ logisticsModeOffer: "OFEREÇO",
+ logisticsModeRequest: "PROCURO",
+ logisticsModeOffers: "OFERTAS",
+ logisticsModeRequests: "PEDIDOS",
+ logisticsDescriptionLabel: "Descrição",
+ logisticsDescriptionPlaceholder: "Ponto de encontro, o que levas, condições...",
+ logisticsOriginLabel: "Origem",
+ logisticsOriginPlaceholder: "Onde começa",
+ logisticsDestinationLabel: "Destino",
+ logisticsDestinationPlaceholder: "Onde termina",
+ logisticsDateLabel: "Data e hora",
+ logisticsRecurrenceLabel: "Recorrência",
+ logisticsFrequencyLabel: "Frequência",
+ logisticsRecurrenceNone: "ÚNICA",
+ logisticsRecurrenceDaily: "DIÁRIA",
+ logisticsRecurrenceWeekly: "SEMANAL",
+ logisticsRecurrenceMonthly: "MENSAL",
+ logisticsSeatsLabel: "Lugares",
+ logisticsSizeLabel: "Tamanho",
+ logisticsSizePlaceholder: "p. ex. 2m x 1m",
+ logisticsWeightLabel: "Peso",
+ logisticsWeightPlaceholder: "p. ex. 40kg",
+ logisticsPriceFree: "GRÁTIS",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "TEMPO",
+ logisticsPriceLabel: "Preço",
+ logisticsHours: "h",
+ logisticsOrderRefLabel: "Ligação ao pedido",
+ logisticsOrderRefPlaceholder: "/shops/... ou /market/... do pedido a entregar",
+ logisticsOrderLink: "Pedido ligado",
+ logisticsTagsLabel: "Etiquetas",
+ logisticsTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ logisticsFilterAll: "TODAS",
+ logisticsFilterMine: "MINHAS",
+ logisticsFilterBooked: "RESERVADAS",
+ logisticsFilterRecent: "RECENTES",
+ logisticsFilterHistory: "HISTÓRICO",
+ logisticsFilterTop: "TOP",
+ logisticsStatusOpen: "ABERTA",
+ logisticsStatusUpcoming: "PRÓXIMAS",
+ logisticsStatusPast: "PASSADAS",
+ logisticsStatusClosed: "FECHADAS",
+ logisticsZoneLabel: "Zona",
+ logisticsSearchPlaceholder: "Pesquisar em logística...",
+ logisticsNoItems: "Nenhuma rota encontrada.",
+ logisticsBookingPending: "PENDENTE",
+ logisticsBookingConfirmed: "CONFIRMADA",
+ logisticsBookingRejected: "RECUSADA",
+ logisticsBookingCancelled: "CANCELADA",
+ logisticsBookingDelivered: "ENTREGUE",
+ logisticsConfirm: "Confirmar",
+ logisticsReject: "Recusar",
+ logisticsDeliver: "Entregar",
+ logisticsReceiptLabel: "Recibo",
+ logisticsReceiptPlaceholder: "Nota de entrega (opcional)",
+ logisticsCancelBooking: "Cancelar reserva",
+ logisticsBookTitle: "Reservar esta rota",
+ logisticsNotesLabel: "Notas",
+ logisticsNotesPlaceholder: "O que o responsável deve saber",
+ logisticsBook: "Reservar",
+ logisticsBookingsTitle: "Reservas",
+ logisticsMyBookingTitle: "A tua reserva",
+ logisticsRatingsTitle: "Avaliações",
+ logisticsNoRatings: "Ainda não há avaliações.",
+ logisticsRatingsWhenClosed: "As avaliações abrem quando a rota fecha.",
+ logisticsScoreLabel: "Pontuação",
+ logisticsRatingPlaceholder: "Como correu?",
+ logisticsRate: "Avaliar",
+ typeLogisticsRoute: "ROTA",
+ typeLogisticsRating: "AVALIAÇÃO DE ROTA",
+ statsLogisticsRoute: "Rotas",
+ statsLogisticsRating: "Avaliações de rotas",
+ logisticsRouteLabel: "ROTA",
+ podcastsTitle: "Podcasts",
+ modulesPodcastsLabel: "Podcasts",
+ modulesPodcastsDescription: "Módulo para publicar canais de podcast.",
+ podcastsDescription: "Módulo para publicar canais de podcast.",
+ podcastCreate: "Criar podcast",
+ podcastUpdate: "Atualizar",
+ podcastDelete: "Eliminar",
+ podcastCreateSectionTitle: "Criar podcast",
+ podcastUpdateSectionTitle: "Atualizar podcast",
+ podcastTitleLabel: "Título",
+ podcastTitlePlaceholder: "Nome do canal",
+ podcastDescriptionLabel: "Descrição",
+ podcastDescriptionPlaceholder: "Sobre o que é este podcast?",
+ podcastCategoryLabel: "Categoria",
+ podcastCategoryNews: "NOTÍCIAS",
+ podcastCategoryMusic: "MÚSICA",
+ podcastCategoryTalk: "CONVERSA",
+ podcastCategoryEducation: "EDUCAÇÃO",
+ podcastCategoryTech: "TECNOLOGIA",
+ podcastCategoryCulture: "CULTURA",
+ podcastCategoryCommunity: "COMUNIDADE",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "OUTROS",
+ podcastTagsLabel: "Etiquetas",
+ podcastCoverLabel: "Capa (imagem ou vídeo)",
+ podcastEpisodeAudioLabel: "Ficheiro de áudio ou vídeo (máx: 75MB)",
+ podcastTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ podcastFilterAll: "TODOS",
+ podcastFilterMine: "MEUS",
+ podcastFilterRecent: "RECENTES",
+ podcastFilterTop: "TOP",
+ podcastFilterViewers: "OUVINTES",
+ podcastSearchPlaceholder: "Pesquisar em podcasts...",
+ podcastNoItems: "Nenhum podcast encontrado.",
+ podcastEpisodesLabel: "Episódios",
+ podcastPlaysLabel: "Visualizações",
+ podcastLastEpisode: "Último episódio",
+ podcastEpisodesTitle: "Episódios",
+ podcastNoEpisodes: "Ainda não há episódios.",
+ podcastEpisodeAdd: "Adicionar episódio",
+ podcastEpisodeCreateTitle: "Publicar episódio",
+ podcastEpisodeUpdateTitle: "Atualizar episódio",
+ podcastEpisodeTitleLabel: "Título do episódio",
+ podcastEpisodeTitlePlaceholder: "Título do episódio",
+ podcastEpisodeDescriptionLabel: "Notas",
+ podcastEpisodeDescriptionPlaceholder: "O que acontece neste episódio, ligações, créditos...",
+ podcastEpisodePublish: "Publicar",
+ podcastPlayed: "Reproduzido",
+ podcastMarkPlayed: "Marcar como reproduzido",
+ typePodcast: "PODCAST",
+ typePodcastEpisode: "EPISÓDIO",
+ typePodcastOpinion: "OPINIÃO DO EPISÓDIO",
+ typePodcastPlay: "REPRODUÇÃO",
+ statsPodcast: "Podcasts",
+ statsPodcastEpisode: "Episódios",
+ statsPodcastPlay: "Reproduções",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "Um blog que segues tem uma nova entrada.",
+ podcastBotEpisodeTitle: "Um podcast que segues tem um novo episódio.",
+ podcastLabel: "PODCAST",
+ podcastEpisodeLabel: "EPISÓDIO",
+ campaignsTitle: "Campanhas",
+ modulesCampaignsLabel: "Campanhas",
+ modulesCampaignsDescription: "Descobre e gere campanhas na tua rede.",
+ campaignsDescription: "Descobre e gere campanhas na tua rede.",
+ campaignCreate: "Criar campanha",
+ campaignUpdate: "Atualizar",
+ campaignDelete: "Eliminar",
+ campaignClose: "Fechar",
+ campaignReopen: "Reabrir",
+ campaignCreateSectionTitle: "Criar campanha",
+ campaignUpdateSectionTitle: "Atualizar campanha",
+ campaignTitleLabel: "Título",
+ campaignTitlePlaceholder: "O que queres alcançar?",
+ campaignTextLabel: "Texto",
+ campaignTextPlaceholder: "Explica a causa, quem decide e o que pedes...",
+ campaignCategoryLabel: "Categoria",
+ campaignCategoryEnvironment: "AMBIENTE",
+ campaignCategoryRights: "DIREITOS",
+ campaignCategoryHealth: "SAÚDE",
+ campaignCategoryEducation: "EDUCAÇÃO",
+ campaignCategoryInfrastructure: "INFRAESTRUTURA",
+ campaignCategoryCulture: "CULTURA",
+ campaignCategoryEconomy: "ECONOMIA",
+ campaignCategoryOther: "OUTROS",
+ campaignGoalLabel: "Objetivo de assinaturas",
+ campaignDeadlineLabel: "Prazo",
+ campaignTagsLabel: "Etiquetas",
+ campaignTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ campaignFilterAll: "TODAS",
+ campaignFilterMine: "MINHAS",
+ campaignFilterSigned: "ASSINADAS",
+ campaignFilterRecent: "RECENTES",
+ campaignFilterTop: "TOP",
+ campaignStatusOpen: "ABERTA",
+ campaignStatusAchieved: "ALCANÇADA",
+ campaignStatusUnachieved: "NÃO ALCANÇADA",
+ campaignStatusClosed: "FECHADA",
+ campaignSearchPlaceholder: "Pesquisar em campanhas...",
+ campaignNoItems: "Nenhuma campanha encontrada.",
+ campaignSignaturesLabel: "Assinaturas",
+ campaignSignaturesTitle: "Apoiantes",
+ campaignNoSignatures: "Ainda não há assinaturas.",
+ campaignSignTitle: "Assinar esta campanha",
+ campaignSignPlaceholder: "Porque a apoias? (opcional)",
+ campaignSign: "Assinar",
+ campaignSigned: "Já assinaste!",
+ campaignNotSigned: "Ainda falta a tua assinatura",
+ campaignElevate: "Levar ao Parlamento",
+ campaignElevated: "Levada ao Parlamento",
+ campaignUpdatesTitle: "Atualizações",
+ campaignNoUpdates: "Ainda não há atualizações.",
+ campaignUpdatePlaceholder: "O que aconteceu?",
+ campaignAddUpdate: "Publicar atualização",
+ campaignQrAlt: "QR para assinar esta campanha",
+ campaignQrCaption: "Digitaliza para assinar",
+ typeCampaign: "CAMPANHA",
+ typeCampaignSignature: "ASSINATURA",
+ typeCampaignUpdate: "ATUALIZAÇÃO DE CAMPANHA",
+ statsCampaign: "Campanhas",
+ statsCampaignSignature: "Assinaturas de campanhas",
+ statsCampaignUpdate: "Atualizações de campanhas",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "Uma campanha que segues tem uma atualização.",
+ campaignBotAchievedTitle: "Uma campanha que segues atingiu o objetivo.",
+ campaignBotRaisedTitle: "Uma campanha que assinaste foi levada ao Parlamento.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Uma rota que reservaste mudou.",
+ logisticsBotClosedTitle: "Uma rota que reservaste foi fechada.",
+ logisticsBotBookedTitle: "Alguém reservou a tua rota.",
+ logisticsBotCancelledTitle: "Uma reserva na tua rota foi cancelada.",
+ logisticsBotConfirmedTitle: "A tua reserva foi confirmada: o pacote está a caminho.",
+ logisticsBotRejectedTitle: "A tua reserva foi rejeitada.",
+ logisticsBotDeliveredTitle: "O teu pacote chegou.",
+ campaignLabel: "CAMPANHA",
+ campaignGenerateReport: "Gerar relatório",
+ logisticsGenerateReport: "Gerar relatório",
+ mailingGenerateReport: "Gerar relatório",
+ campaignUpdateEdited: "Editada",
+ mailingMessagesLabel: "Mensagens",
+ logisticsBookingsLabel: "Reservas",
+ backupTitle: "Cópia de segurança",
+ modulesBackupLabel: "Cópia de segurança",
+ modulesBackupDescription: "Módulo para exportar e importar as tuas chaves e fazer cópias de segurança cifradas.",
+ backupDescription: "Módulo para exportar e importar as tuas chaves e fazer cópias de segurança cifradas.",
+ backupTypeRecovery: "RECUPERAÇÃO",
+ backupTypeKeys: "EXPORTAR CHAVES",
+ backupTypeFull: "CÓPIA COMPLETA",
+ backupTypeRestore: "RESTAURAR CÓPIA",
+ backupTypeInstant: "INSTANTÂNEA",
+ backupInstantDescription: "Um .zip simples de todo o teu registo e ficheiros, sem a tua chave secreta e sem palavra-passe. Rápido, mas ",
+ backupInstantRisk: "quem tiver o ficheiro lê tudo.",
+ backupKitPageDescription: "O kit de recuperação só pode ser aberto a partir deste dispositivo.",
+ backupKitId: "ID Oasis",
+ backupKitDate: "Gerado",
+ backupKitQrAlt: "Código QR da tua chave secreta",
+ backupKitStep1: "Imprime-o ou copia-o à mão e guarda-o num lugar seguro e offline.",
+ backupKitStep2: "Para recuperar, instala o Oasis num dispositivo novo e importa este segredo em Cópia de segurança › Chaves.",
+ backupKitStep3: "Destrói esta página se alguma vez ficar exposta.",
+ backupKitPdfButton: "Gerar PDF",
+ backupScopeLabel: "Âmbito",
+ backupScopeAll: "TUDO",
+ backupScopeMine: "SÓ O MEU CONTEÚDO",
+ backupSinceLabel: "Desde",
+ backupEstimateTitle: "Estimativa",
+ backupFileInfo: "A tua cópia cifrada será descarregada para o teu dispositivo (nome: oasis-backup-DATA.oasisbk)",
+ backupExportButton: "Descarregar cópia",
+ backupRestorePassword: "Escreve a palavra-passe usada ao fazer a cópia",
+ backupRestoreButton: "Restaurar cópia",
+ backupRestoredLine: "Cópia restaurada.",
+ backupRestoredMessages: "Mensagens adicionadas",
+ backupRestoredSkipped: "Já existentes",
+ backupRestoredBlobs: "Ficheiros adicionados",
+ backupRestoredState: "Configurações restauradas",
+ backupRestoredFailed: "Falhados",
+ backupRestoredForked: "Divergentes",
+ backupRestoreRunning: "Restaurando a cópia. Esta página atualiza-se sozinha; entretanto podes continuar a usar o Oasis.",
+ backupRestoreElapsed: "Decorrido",
+ backupRestoreFailedLine: "Não foi possível restaurar a cópia.",
+ backupRestoreForkMine: "Este dispositivo já publicou mensagens com a tua identidade que não estão na cópia, por isso não foi possível aplicá-la por cima. Restaura numa instalação limpa logo após importar as tuas chaves, antes de fazer qualquer outra coisa.",
+ verificationTitle: "Verificação",
+ verificationDescription: "Verifica a cadeia do teu feed, deteta bifurcações e revê ficheiros órfãos ou em falta.",
+ verificationRun: "Executar verificação",
+ verificationTotalMessages: "mensagens no registo",
+ verificationFeed: "O teu feed",
+ verificationMessages: "mensagens",
+ verificationLastSequence: "última sequência",
+ verificationGaps: "Lacunas",
+ verificationBrokenLinks: "Ligações quebradas",
+ verificationBadHashes: "Hashes incorretos",
+ verificationBadSignatures: "Assinaturas incorretas",
+ verificationDuplicates: "Sequências duplicadas",
+ verificationForks: "Bifurcações",
+ verificationBlobs: "Ficheiros",
+ verificationBlobsPresent: "presentes",
+ verificationBlobsReferenced: "referenciados",
+ verificationBlobsOrphan: "órfãos",
+ verificationBlobsMissing: "em falta",
+ verificationBlobsMissingOwn: "Ficheiros teus em falta neste dispositivo",
+ verificationBlobsMissingOthers: "Ficheiros de outros habitantes ainda por descarregar",
+ verificationBlobsUnavailable: "Não foi possível listar os ficheiros neste dispositivo.",
+ wikiTitle: "Wikis",
+ modulesWikiLabel: "Wikis",
+ modulesWikiDescription: "Módulo para descobrir e gerir wikis.",
+ wikiDescription: "Módulo para descobrir e gerir wikis.",
+ wikiCreate: "Criar wiki",
+ wikiUpdate: "Atualizar",
+ wikiDelete: "Apagar",
+ wikiEdit: "Editar",
+ wikiTitleLabel: "Título",
+ wikiTitlePlaceholder: "Título da wiki...",
+ wikiBodyLabel: "Conteúdo",
+ wikiBodyPlaceholder: "Liga outras wikis com [[Título da wiki]] ou [[Título da wiki|um texto próprio]].\n\nMenciona um habitante com @id.\n\nEtiqueta com #oasis.\n\nCola ligações como https://solarnethub.com\n\nUma linha em branco abre um novo parágrafo; as quebras de linha simples mantêm-se.\n\nAnexa qualquer media suportado e será incorporado aqui.",
+ formatBarLabel: "Formato",
+ wikiStatusLabel: "Tipo de wiki",
+ wikiStatusOpen: "ABERTA",
+ wikiStatusClosed: "FECHADA",
+ wikiTagsLabel: "Etiquetas",
+ wikiTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ wikiSummaryLabel: "Resumo da alteração",
+ wikiSummaryPlaceholder: "O que mudou?",
+ wikiFilterAll: "TODAS",
+ wikiFilterMine: "MINHAS",
+ wikiFilterRecent: "RECENTES",
+ wikiFilterLinked: "LIGADAS",
+ wikiChanges: "Alterações recentes",
+ wikiNoPages: "Nenhuma wiki encontrada.",
+ wikiNoChanges: "Ainda sem alterações.",
+ wikiHistory: "Histórico",
+ wikiVersion: "Versão",
+ wikiVersions: "versões",
+ wikiRestore: "Restaurar",
+ wikiDiff: "Alterações",
+ wikiViewVersion: "Ver",
+ wikiLinkedPages: "Páginas ligadas",
+ wikiNoLinkedPages: "Esta página ainda não está ligada a nenhuma outra.",
+ wikiMissingLink: "A página ainda não existe",
+ wikiDuplicateTitle: "Já existe uma página com este título. Muda o título para criar uma página diferente.",
+ wikiCreateSectionTitle: "Criar wiki",
+ wikiUpdateSectionTitle: "Atualizar wiki",
+ wikiSearchPlaceholder: "Pesquisar na Wiki...",
+ wikiCurrentVersion: "Versão atual",
+ wikiViewingVersion: "Estás a ver uma versão antiga",
+ wikiBackToPage: "Voltar à página",
+ wikiLinkedChip: "Ligada",
+ wikiRestoredSummary: "Versão restaurada",
+ wikiExportPdf: "Gerar página",
+ wikiPreview: "Pré-visualizar",
+ tribeSectionWiki: "WIKI",
+ tribeWikiCreate: "Criar wiki",
+ tribeWikiEmpty: "Ainda sem wikis.",
+ typeWiki: "WIKI",
padsTitle: "Pads",
padTitle: "Pad",
modulesPadsLabel: "Pads",
@@ -3047,21 +3803,133 @@ module.exports = {
padTitleLabel: "Título",
padTitlePlaceholder: "Escreva o título do pad...",
padStatusLabel: "Estado",
+ padTypeLabel: "Tipo de pad",
padStatusOpen: "ABERTO",
padStatusInviteOnly: "APENAS POR CONVITE",
padStatusClosed: "FECHADO",
padDeadlineLabel: "Prazo",
padTagsLabel: "Tags",
- padTagsPlaceholder: "tag1, tag2, ...",
+ padTagsPlaceholder: "Introduz tags separadas por vírgulas",
padMembersLabel: "Membros",
padCreated: "Criado",
- padStartEditing: "COMEÇAR A EDITAR!",
+ padStartEditing: "Editar",
padEditorPlaceholder: "Comece a escrever...",
padSubmitEntry: "Enviar",
padNoEntries: "Sem entradas ainda.",
padAllSectionTitle: "Todos os Pads",
padMineSectionTitle: "Os Meus Pads",
padsDescription: "Gere editores de texto colaborativos cifrados na tua rede.",
+ roomsTitle: "Salas",
+ roomsDescription: "Descobre e entra em salas de videoconferência cifradas na tua rede.",
+ modulesRoomsLabel: "Salas",
+ modulesRoomsDescription: "Módulo para descobrir e entrar em salas de videoconferência cifradas.",
+ roomFilterRecent: "RECENTES",
+ roomFilterMine: "MINHAS",
+ roomFilterAll: "TODAS",
+ roomFilterLive: "EM DIRETO",
+ roomFilterOpen: "ABERTAS",
+ roomFilterInvite: "APENAS POR CONVITE",
+ roomFilterClosed: "FECHADAS",
+ roomCreate: "Criar sala",
+ roomUpdate: "Atualizar",
+ roomDelete: "Eliminar",
+ roomClose: "Fechar",
+ roomCreateSectionTitle: "Criar sala",
+ roomUpdateSectionTitle: "Atualizar sala",
+ roomTitlePlaceholder: "Título da sala",
+ roomDescriptionLabel: "Descrição",
+ roomDescriptionPlaceholder: "Sobre o que vão falar?",
+ roomTypeLabel: "Tipo de sala",
+ roomTagsLabel: "Tags",
+ roomStatusOpen: "ABERTA",
+ roomStatusInviteOnly: "APENAS POR CONVITE",
+ roomStatusClosed: "FECHADA",
+ roomParticipants: "Participantes",
+ roomJoin: "Entrar",
+ roomLeave: "Sair",
+ roomFull: "Sala cheia",
+ roomLiveChip: "EM DIRETO",
+ roomMuted: "silenciado",
+ roomRec: "Gravar áudio",
+ roomRecStop: "Parar a gravação",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} entrou na sala",
+ roomEventLeft: "{name} saiu da sala",
+ roomEventRecStart: "{name} começou a gravar",
+ roomEventRecStop: "{name} parou de gravar",
+ roomEventMuted: "{name} silenciou-se",
+ roomEventUnmuted: "{name} tirou o silêncio",
+ roomEventHand: "{name} levantou a mão",
+ roomRaiseHand: "Levantar a mão",
+ roomLowerHand: "Baixar a mão",
+ confirmActionTitle: "Confirma esta ação",
+ confirmActionButton: "Confirmar",
+ confirmJoinText: "Vais juntar-te usando este convite.",
+ confirmFollowText: "Vais apoiar este habitante.",
+ confirmSignText: "Vais assinar esta campanha.",
+ confirmDownloadText: "Vais transferir este ficheiro para o teu dispositivo.",
+ roomRecordings: "Gravações",
+ roomClearNotices: "Limpar",
+ roomLineSwitchboard: "Central",
+ roomLineDndError: "O número desta sala não aceita chamadas.",
+ roomNumberHint: "Marque este número a partir do Telefone para entrar na sala.",
+ liveRefresh: "Atualizar",
+ roomNobody: "Neste momento não está ninguém na sala.",
+ roomSomeone: "{n} na sala neste momento.",
+ roomYou: "tu",
+ roomYouAreIn: "Está dentro",
+ roomNobodyInside: "Neste momento não há ninguém nesta sala.",
+ roomErrorFull: "A sala está cheia. Podes entrar quando alguém sair.",
+ roomErrorUnreachable: "Neste momento não é possível chegar à sala. Tenta mais tarde.",
+ roomErrorBusy: "Já estás numa chamada ou noutra sala.",
+ roomErrorClosed: "Esta sala está fechada.",
+ roomAccessDenied: "Esta sala é apenas por convite. Precisas de um convite para entrar.",
+ roomsNoItems: "Não foram encontradas salas.",
+ roomSearchPlaceholder: "Procurar salas...",
+ roomInviteMode: "Convite",
+ tribeSectionRooms: "SALAS",
+ tribeRoomCreate: "Criar sala",
+ tribeRoomsEmpty: "Ainda não há salas.",
+ typeRoom: "SALAS",
+ typeRoomMember: "PARTICIPANTE DE SALA",
+ statsRoom: "Salas",
+ statsRoomMember: "Participantes de salas",
+ favoritesFilterRooms: "SALAS",
+ invitesRoomsTitle: "Salas",
+ inviteCodeInvalid: "Este código de convite não é válido ou já foi usado.",
+ inviteAlreadyMember: "Já fazes parte. Podes abri-lo a partir do seu módulo.",
+ actionFailed: "Não foi possível fazê-lo. Tenta de novo.",
+ publishTooShort: "A tua publicação é demasiado curta.",
+ walletSendFailed: "Não foi possível enviar o pagamento: {reason}",
+ pixeliaCoordsError: "Essas coordenadas estão fora da grelha.",
+ courtsErrTitle: "É necessário um título.",
+ courtsErrRespondent: "Indica contra quem é o caso.",
+ courtsErrRespondentId: "Esse não é um Oasis ID válido.",
+ courtsErrMethod: "Escolhe como o caso será resolvido.",
+ courtsErrCaseNotFound: "Esse caso não foi encontrado.",
+ courtsErrBrief: "Escreve a tua resposta.",
+ courtsErrStance: "Escolhe a tua posição.",
+ courtsErrResult: "Escreve o resultado.",
+ courtsErrTerms: "Escreve os termos do acordo.",
+ courtsErrMediator: "Adiciona pelo menos um mediador.",
+ courtsErrSelfMediator: "Não podes ser mediador no teu próprio caso.",
+ courtsErrJudge: "Escolhe um juiz.",
+ courtsErrSelfJudge: "Não podes ser juiz do teu próprio caso.",
+ courtsErrVisibility: "Escolhe quem pode ver o caso.",
+ courtsErrNomination: "Essa nomeação não foi encontrada.",
+ opinionAlreadyGiven: "Já deste a tua opinião.",
+ cipherPasswordShort: "A palavra-passe deve ter pelo menos 32 caracteres.",
+ errorForbidden: "Não tens acesso a isto.",
+ errorNotFound: "Não foi encontrado.",
+ errorClosed: "Está fechado.",
+ errorInviteOnly: "Isto é apenas por convite. Precisas de um convite.",
+ errorTooLong: "Esse texto é demasiado longo.",
+ errorRequired: "Falta informação obrigatória.",
+ errorInvalid: "Parte da informação não é válida.",
+ errorNotAuthor: "Só quem o criou pode fazer isto.",
+ panicRemoved: "A tua blockchain foi eliminada.",
padRecentSectionTitle: "Pads Recentes",
padOpenSectionTitle: "Pads Abertos",
padClosedSectionTitle: "Pads Fechados",
@@ -3073,18 +3941,18 @@ module.exports = {
padRemoveFavorite: "Remover dos Favoritos",
padClose: "Fechar",
padBackToEditor: "Voltar ao editor",
- padSearchPlaceholder: "Pesquisar pads...",
+ padSearchPlaceholder: "Pesquisar em Pads...",
modulesChatsLabel: "Chats",
- modulesChatsDescription: "Módulo para descobrir e gerir chats cifrados.",
+ modulesChatsDescription: "Módulo para descobrir e gerir chats.",
typeChat: "CHATS",
typeChatMessage: "MENSAGEM CHAT",
chatsTitle: "Chats",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "Os teus chats",
+ chatRecentTitle: "Chats recentes",
chatFavoritesTitle: "Favoritos",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "Chats abertos",
+ chatClosedTitle: "Chats fechados",
chatDescription: "Descrição",
chatCategory: "Categoria",
chatStatus: "ESTADO",
@@ -3099,34 +3967,172 @@ module.exports = {
chatMessagesLabel: "Mensagens",
chatThreadsLabel: "Tópicos",
chatCreatedAt: "CRIADO",
- chatSearchPlaceholder: "Pesquisar chats...",
+ chatSearchPlaceholder: "Pesquisar em Chats...",
chatStatusOpen: "ABERTO",
chatStatusInviteOnly: "SÓ POR CONVITE",
chatStatusClosed: "FECHADO",
chatSendMessage: "Enviar",
chatJumpLatest: "Última Mensagem",
+ chatReply: "Responder",
+ chatReplyCancel: "Cancelar resposta",
+ chatPin: "Fixar",
+ chatUnpin: "Desafixar",
+ chatPinned: "Fixados",
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",
+ activitySearchPlaceholder: "Pesquisar em Atividade...",
+ trendingSearchPlaceholder: "Pesquisar em Tendências...",
+ opinionsSearchPlaceholder: "Pesquisar em Opiniões...",
+ votesSearchPlaceholder: "Pesquisar em Votações...",
+ gamesSearchPlaceholder: "Pesquisar em Jogos...",
+ schoolTitle: "Escola",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Uma página wiki que segues foi editada.",
+ wikiBotRestoredTitle: "Foi restaurada uma versão anterior de uma página wiki que segues.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Um novo estudante se inscreveu no seu curso.",
+ schoolBotInvitedTitle: "Você foi convidado para um curso.",
+ schoolBotAdmittedTitle: "Você foi admitido em um curso.",
+ schoolBotCertificateTitle: "Você recebeu um certificado.",
+ schoolBotPassedTitle: "Um estudante foi aprovado no seu curso.",
+ schoolBotLessonTitle: "Uma nova lição foi publicada.",
+ invitesSchoolTitle: "Escola",
+ schoolEnrollLabel: "Juntar-se ao curso",
+ schoolExamRetryLater: "Você poderá tentar novamente após 24 horas.",
+ schoolApproved: "APROVADO",
+ schoolExamPassMark: "Nota de aprovação (0-10)",
+ schoolExamPassed: "APROVADO",
+ schoolExamPending: "Pendente",
+ schoolExamFailed: "REPROVADO",
+ schoolExamAddQuestion: "Adicionar pergunta",
+ schoolExamCreateQuestion: "Criar pergunta",
+ schoolExamOption: "Opção",
+ schoolExamCorrect: "Opção correta",
+ schoolExamPoints: "Pontos",
+ schoolMaterialTextPlaceholder: "Notas para esta lição...",
+ schoolMaterials: "Materiais",
+ schoolAddMaterial: "Adicionar material",
+ schoolNoMaterials: "Ainda não há materiais.",
+ bankYourSchoolBalance: "Seus ganhos da escola",
+ schoolProgress: "Progresso",
+ schoolProgressMark: "Marcar como concluída",
+ schoolProgressDone: "Concluída",
+ schoolExams: "Exames",
+ schoolExamCreate: "Criar exame",
+ schoolExamTitlePlaceholder: "Título do exame",
+ schoolExamHelp: "Uma pergunta por linha: Pergunta? ; opção ; opção correta* ; opção",
+ schoolExamQuestionsPlaceholder: "O que é SSB? ; Um banco de dados ; Um protocolo P2P* ; Um navegador",
+ schoolExamSubmit: "Enviar respostas",
+ schoolExamScore: "Sua nota",
+ schoolNoScoresYet: "Ainda não há resultados.",
+ schoolLessonUnit: "Unidade / fase",
+ schoolLessonUnitPlaceholder: "ex. Fase 1",
+ schoolLessonOrder: "Ordem",
+ profileClearnetSchoolLabel: "Escola",
+ schoolStartDate: "Data de início",
+ schoolSessionDate: "Data da sessão",
+ schoolCourseChat: "Chat do curso",
+ agendaFilterSchool: "ESCOLA",
+ agendaFilterCampaigns: "CAMPANHAS",
+ agendaFilterLogistics: "LOGÍSTICA",
+ schoolCourseType: "Tipo de curso",
+ schoolTypeOpen: "ABERTO",
+ schoolTypePaid: "PAGO",
+ schoolTypeInvite: "SÓ POR CONVITE",
+ schoolLessonLocked: "Lição cifrada — peça a chave do curso ao professor.",
+ schoolGrantAccess: "Enviar chave do curso",
+ schoolKeySent: "Chave enviada",
+ schoolOngoing: "Em curso",
+ schoolFilterApplied: "INSCRITO",
+ schoolFilterOpen: "ABERTOS",
+ schoolFilterFavorites: "FAVORITOS",
+ schoolPendingPayment: "Pagamento pendente",
+ schoolPendingStudents: "Inscrições pendentes",
+ schoolViewBill: "Ver fatura",
+ schoolPaymentNote: "A inscrição gera uma fatura em ECO (uma transferência). Sua inscrição é confirmada quando a transferência é assinada.",
+ schoolCloseCourse: "Fechar curso",
+ schoolReopenCourse: "Reabrir curso",
+ schoolDescription: "Ensine e aprenda cursos na sua rede.",
+ schoolFilterAll: "TODOS",
+ schoolFilterMine: "MEUS",
+ schoolFilterTop: "TOP",
+ schoolFilterRecent: "RECENTES",
+ schoolCreateButton: "Criar Curso",
+ schoolCreateSectionTitle: "Criar um curso",
+ schoolUpdateSectionTitle: "Atualizar curso",
+ schoolCourseTitlePlaceholder: "Nome do seu curso",
+ schoolCourseDescriptionPlaceholder: "O que você vai ensinar neste curso?",
+ schoolCourseImage: "Imagem do curso (tamanho máx: 75MB)",
+ schoolTags: "Tags",
+ schoolTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ schoolPrice: "Preço (ECO)",
+ schoolVisibility: "Visibilidade",
+ schoolVisibilityPublic: "Público",
+ schoolVisibilityInvite: "Por convite",
+ schoolStatus: "Estado",
+ schoolClosed: "Fechado",
+ schoolFree: "Grátis",
+ schoolCreate: "Criar curso",
+ schoolUpdate: "Atualizar curso",
+ schoolSearchPlaceholder: "Pesquisar em Escola...",
+ schoolSortTitle: "Título",
+ schoolNoCourses: "Nenhum curso encontrado.",
+ schoolStudents: "Estudantes",
+ schoolTeacher: "Professor",
+ schoolCreatedAt: "CRIADO",
+ schoolLessons: "Lições",
+ schoolNoLessons: "Ainda não há lições.",
+ schoolEnrollToSee: "Inscreva-se para ver as lições deste curso.",
+ schoolEnrollButton: "INSCREVER-SE",
+ schoolUnenrollButton: "Abandonar curso",
+ schoolInviteRequired: "Este curso é por convite.",
+ schoolTeacherPanel: "Painel do professor",
+ schoolStudentPanel: "Painel do estudante",
+ schoolAddLesson: "Criar lição",
+ schoolLessonTitlePlaceholder: "Título da lição",
+ schoolLessonTextPlaceholder: "Descreva as noções abordadas nesta lição...",
+ schoolInviteStudents: "Convidar estudantes",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "CONVIDAR",
+ schoolInvited: "Convidados",
+ schoolIssueCertificate: "Criar certificado",
+ schoolCertified: "Certificado",
+ schoolCertificateTextPlaceholder: "Nota do certificado (opcional)",
+ schoolLessonOpen: "Abrir lição",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Certificados",
+ schoolNoCertificates: "Nenhum certificado emitido ainda.",
+ schoolEditButton: "Editar",
+ schoolDeleteButton: "Apagar",
+ typeSchool: "ESCOLA",
+ schoolCourseLabel: "CURSO",
+ emergencyLabel: "EMERGÊNCIA",
+ wikiPageLabel: "WIKI",
+ statsSchoolCourse: "Cursos",
+ statsSchoolLesson: "Lições",
+ statsSchoolEnroll: "Inscrições",
+ statsSchoolCertificate: "Certificados da escola",
+ modulesSchoolLabel: "Escola",
+ modulesSchoolDescription: "Módulo para trocar conhecimento.",
+ welcomeStepUxAction: "Guardar vista",
+ welcomeStepWorkflowTitle: "Que uso do OASIS tens em mente?",
+ welcomeStepWorkflowText: "O Oasis tem muitos módulos. Escolhe a configuração que combina contigo e só os úteis ficam ativados. Podes ajustá-la quando quiseres em Módulos.",
+ welcomeStepWorkflowAction: "Guardar configuração",
+ welcomeWorkflow_full: "Predefinido",
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.",
chatTitlePlaceholder: "Título do chat",
chatDescriptionPlaceholder: "Descrição do chat",
- chatTagsPlaceholder: "tag1, tag2, tag3",
+ chatTagsPlaceholder: "Introduz tags separadas por vírgulas",
chatImageLabel: "Seleciona um ficheiro de imagem (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Autor",
chatAddFavorite: "Adicionar aos Favoritos",
chatRemoveFavorite: "Remover dos Favoritos",
chatPM: "MP",
chatStatusLabel: "Estado",
+ chatTypeLabel: "Tipo de chat",
chatCategoryLabel: "Categoria",
gamesTitle: "Jogos",
gamesDescription: "Descubra e jogue alguns jogos.",
@@ -3157,22 +4163,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Lance uma moeda e aposte em cara ou coroa. Qual é a sua sorte?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "Bilhar visto de cima. Clica para apontar e mantém premido para carregar a força. Mete todas as bolas com o menor número de tacadas.",
+ gamesArtilleryTitle: "Artilharia",
+ gamesArtilleryDesc: "Aponta o canhão, tem em conta o vento e acerta no alvo. 5 rondas: ganha quem fizer menos disparos.",
+ gamesLabyrinthTitle: "Labirinto",
+ gamesLabyrinthDesc: "Foge do labirinto antes de ficares sem movimentos. Cada nível é maior e mais difícil.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Come todos os pontos e evita os fantasmas. Os fantasmas movem-se em tempo real — não pares!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "Pêndulo sonoro",
+ gamesAudioPendulumDesc: "Simulador de física caótica com síntese de áudio em tempo real. As velocidades angulares tornam-se frequências e os picos, batidas de percussão. Não há duas simulações que soem iguais.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Mistura visuais ao vivo em dois pratos: escolhe um padrão para cada um, ajusta velocidade, cor e zoom, faz a transição entre ambos e lança flashes ao ritmo. Marca o tempo ou deixa o microfone comandar a pulsação.",
+ gamesTetrisDesc: "Os clássicos blocos que caem. Completa linhas para pontuar. Quanto tempo aguentas?",
+ gamesMinesweeperTitle: "Caça-minas",
+ gamesMinesweeperDesc: "A clássica caça às minas. Limpa o tabuleiro para subir de nível — grelhas maiores, mais minas, mais pontuação.",
+ gamesFilterScoring: "PONTUAÇÕES",
+ gamesHallOfFame: "Hall da fama",
+ gamesHallPlayer: "Jogador",
+ gamesHallScore: "Pontuação",
+ gamesNoScores: "Ainda não há pontuações.",
calendarsTitle: "Calendários",
calendarTitle: "Calendário",
modulesCalendarsLabel: "Calendários",
@@ -3180,15 +4190,15 @@ module.exports = {
typeCalendar: "CALENDÁRIOS",
calendarCreate: "Criar calendário",
calendarUpdate: "Atualizar",
- calendarDelete: "Eliminar",
calendarTitleLabel: "Título",
calendarTitlePlaceholder: "Título do calendário...",
calendarStatusLabel: "Estado",
+ calendarTypeLabel: "Tipo de calendário",
calendarStatusOpen: "ABERTO",
calendarStatusClosed: "FECHADO",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Prazo",
calendarTagsLabel: "Etiquetas",
- calendarTagsPlaceholder: "etiqueta1, etiqueta2...",
+ calendarTagsPlaceholder: "Introduz tags separadas por vírgulas",
calendarParticipantsLabel: "Participantes",
calendarCreated: "Criado",
calendarJoin: "Participar",
@@ -3199,11 +4209,11 @@ module.exports = {
calendarNotePlaceholder: "Adicionar uma nota...",
calendarFirstDateLabel: "Data",
calendarFirstNoteLabel: "Notas",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Intervalo",
calendarIntervalNone: "Sem repetição",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Semanal",
+ calendarIntervalMonthly: "Mensal",
+ calendarIntervalYearly: "Anual",
calendarFormDescription: "Descrição",
calendarNoDates: "Nenhuma data adicionada.",
calendarNoNotes: "Nenhuma nota.",
@@ -3211,6 +4221,8 @@ module.exports = {
calendarsDescription: "Descubra e gerencie calendários na sua rede.",
calendarMonthPrev: "← Anterior",
calendarMonthNext: "Seguinte →",
+ calendarMonthNames: "Janeiro,Fevereiro,Março,Abril,Maio,Junho,Julho,Agosto,Setembro,Outubro,Novembro,Dezembro",
+ calendarDayInitials: "S,T,Q,Q,S,S,D",
calendarAllSectionTitle: "Calendários",
calendarRecentSectionTitle: "Calendários Recentes",
calendarFavoritesSectionTitle: "Favoritos",
@@ -3220,9 +4232,9 @@ module.exports = {
calendarCreateSectionTitle: "Criar novo calendário",
calendarUpdateSectionTitle: "Atualizar calendário",
calendarAddFavorite: "Adicionar aos favoritos",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Eliminar",
calendarRemoveFavorite: "Remover dos favoritos",
- calendarSearchPlaceholder: "Pesquisar calendários...",
+ calendarSearchPlaceholder: "Pesquisar em Calendário...",
calendarAddEntry: "Adicionar Entrada",
statsCalendar: "Calendários",
statsCalendarDate: "Datas de calendário",
@@ -3234,6 +4246,146 @@ module.exports = {
tribeContentAccessDenied: "Acesso Negado",
tribeContentAccessDeniedMsg: "Este conteúdo pertence a uma tribo. Você deve ser membro para acessá-lo.",
tribeViewTribes: "Ver Tribos",
+ tribeFilesEmpty: "Ainda sem ficheiros.",
+ filesLabel: "Ficheiros",
+ profileClearnetFilesLabel: "Ficheiros",
+ filesTitle: "Ficheiros",
+ filesDescription: "Explore e gerencie ficheiros na sua rede.",
+ fileAllSectionTitle: "Ficheiros",
+ fileMineSectionTitle: "Seus Ficheiros",
+ fileRecentSectionTitle: "Ficheiros Recentes",
+ fileTopSectionTitle: "Melhores Ficheiros",
+ fileFavoritesSectionTitle: "Favoritos",
+ fileFilterAll: "TODOS",
+ fileFilterMine: "MEUS",
+ fileFilterRecent: "RECENTES",
+ fileFilterTop: "MELHORES",
+ fileFilterFavorites: "FAVORITOS",
+ fileCreateSectionTitle: "Enviar Ficheiro",
+ fileUpdateSectionTitle: "Atualizar Ficheiro",
+ fileCreateButton: "Enviar Ficheiro",
+ fileUpdateButton: "Atualizar",
+ fileAddFavoriteButton: "Adicionar aos Favoritos",
+ fileRemoveFavoriteButton: "Remover dos Favoritos",
+ fileFileLabel: "Seleciona um ficheiro (máx: 75MB)",
+ calendarFilterRecent: "RECENTES",
+ calendarFilterAll: "TODOS",
+ calendarFilterMine: "MEUS",
+ calendarFilterFavorites: "FAVORITOS",
+ calendarFilterOpen: "ABERTO",
+ calendarFilterClosed: "FECHADO",
+ padFilterRecent: "RECENTES",
+ padFilterAll: "TODOS",
+ padFilterMine: "MEUS",
+ padFilterOpen: "ABERTO",
+ padFilterClosed: "FECHADO",
+ chatFilterRecent: "RECENTES",
+ chatFilterAll: "TODOS",
+ chatFilterMine: "MEUS",
+ chatFilterFavorites: "FAVORITOS",
+ chatFilterOpen: "ABERTO",
+ chatFilterClosed: "FECHADO",
+ licenseLabel: "Licença",
+ phoneTitle: "Telefone",
+ phoneDescription: "Gere as tuas videochamadas cifradas de ponta a ponta.",
+ phoneUnavailable: "As chamadas não estão disponíveis neste dispositivo.",
+ phoneCallButton: "Ligar",
+ profileVisibilityPhone: "Número de telefone",
+ phoneNumberUnknown: "Ninguém na tua rede tem o número {number}.",
+ phoneNumberChoose: "Confirma a quem queres ligar para o {number}:",
+ phoneAnswer: "Atender",
+ phoneSpeaker: "Altifalante",
+ phoneEarpiece: "Auricular",
+ phoneReject: "Recusar",
+ phoneHangup: "Desligar",
+ phoneMute: "Silenciar",
+ phoneUnmute: "Ativar microfone",
+ phoneCameraOn: "Câmara on",
+ phoneCameraOff: "Câmara off",
+ settingsPhoneVideo: "Vídeo",
+ settingsPhoneVideoOn: "Permitido em chamadas e salas",
+ settingsPhoneVideoOff: "Só áudio",
+ phoneSilence: "Não ouvir",
+ phoneUnsilence: "Voltar a ouvir",
+ phoneCalling: "Ligando para",
+ phoneIsCalling: "está ligando para você",
+ notifyNewPmFrom: "Nova MP de",
+ notifyNewPamFrom: "Novo PaM de",
+ notifyUpdateLabel: "Atualização",
+ updateInstalledLabel: "Versão instalada",
+ updateAvailableLabel: "Versão disponível",
+ updateChangesLabel: "Alterações",
+ updateFilesLabel: "Arquivos",
+ updateOriginLabel: "Origem",
+ phoneRecording: "Gravando PaM para",
+ phoneLeaveMessage: "Ninguém atende: deixa a tua mensagem depois do sinal.",
+ phoneLeaveMessageBusy: "Está noutra chamada: deixe a sua mensagem depois do sinal.",
+ phoneLeaveMessageUnreachable: "Não foi possível contactar: deixe a sua mensagem depois do sinal.",
+ phoneConnecting: "A ligar a",
+ phoneSendPam: "Enviar PaM",
+ phoneCancel: "Cancelar",
+ phoneSearchPlaceholder: "Pesquisar em Telefone...",
+ phonePamTitle: "Gravações de áudio",
+ phoneNew: "Novo",
+ phoneDelete: "Apagar",
+ phoneNoPams: "Não tens gravações de áudio.",
+ phoneHistoryTitle: "Histórico",
+ phoneLatestTitle: "Últimas chamadas",
+ phoneCreateButton: "Nova chamada",
+ phoneLimitsHint: "Até 7 habitantes por chamada; com mais de um é uma chamada conjunta.",
+ phoneErrorPub: "Não é possível ligar para um pub.",
+ phoneJointCall: "Chamada conjunta",
+ phoneWith: "Com",
+ phoneResult: "Resultado",
+ phoneWhen: "Quando",
+ phoneDuration: "Duração",
+ phoneOutgoing: "Efetuada",
+ phoneIncoming: "Recebida",
+ phoneNoHistory: "Ainda não há registos.",
+ phoneOutcomeEnded: "Atendida",
+ phoneOutcomeMissed: "Perdida",
+ phoneOutcomeRejected: "Recusada",
+ phoneOutcomeNoanswer: "Sem resposta",
+ phoneOutcomeCancelled: "Cancelada",
+ phoneOutcomePam: "PaM enviado",
+ phoneOutcomeFailed: "Falhou",
+ phoneDialAdd: "Adicionar",
+ phoneDialBack: "Apagar",
+ phoneDialClear: "Limpar",
+ phoneDialPlaceholder: "Número ou Oasis ID",
+ phoneDialInhabitants: "Habitantes",
+ phoneDialRemove: "Remover",
+ phoneOwnNumber: "Esse é o teu próprio número.",
+ phoneSettingsDesc: "Escolha quem pode ligar para você.",
+ phoneDnd: "Não incomodar",
+ phoneOpen: "Aberto",
+ phoneRecipientRefuses: "O habitante a quem estás a tentar ligar não aceita chamadas.",
+ phoneRefusedNotice: "Estes habitantes não aceitam chamadas e não foram chamados:",
+ fileEmptyError: "O ficheiro está vazio. Escolhe outro ficheiro.",
+ fileTitleLabel: "Título",
+ fileTitlePlaceholder: "Título",
+ fileDescriptionLabel: "Descrição",
+ fileDescriptionPlaceholder: "Descrição",
+ fileTagsLabel: "Tags",
+ fileTagsPlaceholder: "Introduz tags separadas por vírgulas",
+ fileSizeLabel: "Tamanho",
+ fileDownloadButton: "DESCARREGAR",
+ fileDetailsButton: "DETALHES",
+ fileNoFile: "Nenhum arquivo ficheiro",
+ fileSearchPlaceholder: "Pesquisar em Ficheiros...",
+ fileSearchButton: "Pesquisar",
+ fileSortRecent: "Mais recentes",
+ fileSortOldest: "Mais antigos",
+ fileSortTop: "Mais votados",
+ fileNoMatch: "Nenhum ficheiro correspondente.",
+ fileUpdatedAt: "Atualizado",
+ typeFile: "FICHEIROS",
+ modulesFilesLabel: "Ficheiros",
+ modulesFilesDescription: "Módulo para descobrir e gerir áudios.",
+ tribeSectionFiles: "FICHEIROS",
+ fileDescription: "Descrição",
+ fileDownload: "Baixar",
+ fileTypeLabel: "Tipo",
torrentsTitle: "Torrents",
torrentsDescription: "Explore e gerencie torrents na sua rede.",
torrentAllSectionTitle: "Torrents",
@@ -3259,12 +4411,35 @@ module.exports = {
torrentDescriptionLabel: "Descrição",
torrentDescriptionPlaceholder: "Descrição",
torrentTagsLabel: "Tags",
- torrentTagsPlaceholder: "Insira tags separadas por vírgulas",
+ torrentTagsPlaceholder: "Introduz tags separadas por vírgulas",
torrentSizeLabel: "Tamanho",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Gerar torrent",
+ torrentFromContentMissing: "O ficheiro ainda não está disponível neste nó. Tenta de novo mais tarde.",
+ torrentDownloads: "Transferências",
+ torrentFetchOasis: "Transferir no Oasis",
+ torrentSaveFile: "Guardar ficheiro",
+ torrentSeeds: "seeds",
+ seedsLabel: "Sementes",
+ seedAction: "Apoiar",
+ torrentSourceFile: "Ficheiro",
+ torrentStateQueued: "Em fila",
+ torrentStateProbing: "À procura de seeds",
+ torrentStateDownloading: "A transferir",
+ torrentStateDone: "Concluída",
+ torrentStateFailed: "Falhou",
+ torrentStateNoSource: "Sem seeds ligados, à espera",
+ torrentStateCancelled: "Cancelada",
+ torrentNoDownloads: "Ainda não há transferências.",
+ torrentOriginalSection: "Original",
+ torrentCancel: "Cancelar",
+ torrentDownloadButton: "DESCARREGAR",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "DETALHES",
torrentNoFile: "Nenhum arquivo torrent",
noTorrents: "Nenhum torrent encontrado.",
- torrentSearchPlaceholder: "Pesquisar título, tags, autor...",
+ noFiles: "Nenhum ficheiro encontrado.",
+ torrentSearchPlaceholder: "Pesquisar em Torrents...",
torrentSearchButton: "Pesquisar",
torrentSortRecent: "Mais recentes",
torrentSortOldest: "Mais antigos",
@@ -3272,10 +4447,12 @@ module.exports = {
torrentNoMatch: "Nenhum torrent correspondente.",
torrentUpdatedAt: "Atualizado",
statsTorrent: "Torrents",
+ statsFile: "Ficheiros",
typeTorrent: "TORRENTS",
modulesTorrentsLabel: "Torrents",
modulesTorrentsDescription: "Módulo para descobrir e gerenciar torrents.",
favoritesFilterTorrents: "TORRENTS",
+ favoritesFilterFiles: "FICHEIROS",
favoritesFilterMarket: "MERCADO",
favoritesFilterEvents: "EVENTOS",
favoritesFilterForum: "FÓRUM",
@@ -3289,15 +4466,17 @@ module.exports = {
favoritesFilterShopProducts: "ITENS DA LOJA",
tribeSectionTorrents: "TORRENTS",
tribeCreateTorrent: "Enviar Torrent",
+ tribeCreateFile: "Carregar ficheiro",
settingsWishTitle: "Desejo",
- settingsWishDesc: "Configure o desejo do seu Avatar.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Determina como acedes a todo o conteúdo e a tua experiência na rede Oasis.",
+ settingsWishWhole: "Multiverso",
+ settingsWishMutuals: "Só apoio mútuo",
+ settingsWishOnlyLan: "Só LAN",
+ settingsWishLocal: "Local",
settingsPmVisibilityTitle: "Mensagens Privadas",
settingsPmVisibilityDesc: "Configure seu nível de exposição a mensagens privadas.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Multiverso",
+ settingsPmVisibilityMutuals: "Só apoio mútuo",
pmMutualNotice: "O envio é uma barreira de UX. O recebimento é um filtro de atenção.",
inhabitantsPendingFollowsTitle: "Pedidos de apoio pendentes",
inhabitantsPendingAccept: "Aceitar",
@@ -3341,7 +4520,7 @@ module.exports = {
tribeGovNoRevocations: "Ainda nenhuma revogação",
tribeGovNoHistorical: "Ainda nenhum registo",
logsTitle: "Diário",
- logsDescription: "Regista a sua experiência na rede.",
+ logsDescription: "Mantém um diário privado das tuas experiências.",
logsViewTitle: "Diário",
logsColumnType: "Tipo",
logsView: "Ver",
@@ -3350,7 +4529,7 @@ module.exports = {
logsCreateTitle: "Criar entrada",
logsWriteButton: "Escrever",
logsTextPlaceholder: "Descreva as suas experiências...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "Assistente IA",
logsModeManual: "Manual",
logsModeAI: "IA",
logsColumnLog: "Diário",
@@ -3369,19 +4548,20 @@ module.exports = {
logsExportOne: "Exportar registo",
logsViewDetails: "Ver detalhes",
logsGenerateButton: "Gerar texto",
- logsSearchText: "Procurar nos diários...",
+ logsSearchText: "Pesquisar em Diário...",
logsSearchAnyType: "Qualquer tipo",
logsSearchButton: "Procurar",
logsEmpty: "Sem entradas.",
+ logsNothingNew: "Não há ações novas para registar.",
modulesLogsLabel: "Diário",
- modulesLogsDescription: "Módulo para registar (via assistente de IA) as suas experiências.",
+ modulesLogsDescription: "Módulo para manter um diário privado das tuas experiências.",
statsLogsTitle: "Diário",
typeLog: "DIÁRIO",
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...",
+ larpSearchPlaceholder: "Pesquisar em L.A.R.P....",
larpAllHouses: "Casas:",
larpFilterRuling: "GOVERNA",
larpFilterHouses: "CASAS",
@@ -3396,54 +4576,55 @@ module.exports = {
larpPostPlaceholder: "O que tem esta casa a dizer?",
larpPostSubmit: "Publicar",
larpCycleLabel: "Ciclo:",
- audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.",
- audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.",
- audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.",
- bankRulesAlpha: "Alpha (max share of pub balance per epoch)",
+ audioTranscodeCompositionEmpty: "Este áudio não inclui nenhuma composição de blockchain guardada.",
+ audioTranscodeDetailDescription: "Descodifica a carga incorporada e o mapa de composição original da blockchain.",
+ audioTranscodeStegoNotFound: "Não foi possível descodificar nenhuma carga esteganográfica deste áudio.",
+ bankRulesAlpha: "Alpha (quota máx. do saldo do pub por época)",
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.",
- bankRulesArchTaxRate: "Rate",
- bankRulesCapPerEpoch: "Cap per epoch (absolute)",
- bankRulesCapUser: "Cap per user per epoch",
- bankRulesCarbonFactor: "Carbon factor",
+ bankRulesArchTaxNote: "A taxa ARCH reflete o custo a longo prazo de fazer crescer e manter o arquivo da rede: quanto mais antigos forem os teus dados na rede, maior será a tua parte do custo de manutenção.",
+ bankRulesArchTaxRate: "Tarifa",
+ bankRulesCapPerEpoch: "Limite por época (absoluto)",
+ bankRulesCapUser: "Limite por utilizador por época",
+ bankRulesCarbonFactor: "Fator de carbono",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
+ bankRulesChipNote: "O chip de cada elemento é colorido em relação à maior mensagem alguma vez observada na rede e suavizado pelo número de habitantes ativos — uma rede maior distribui a carga e empurra mais elementos para a faixa verde.",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
- bankRulesEcoTaxRate: "Rate",
- bankRulesEpochKind: "Epoch granularity",
- bankRulesFloor: "Floor per user (gross)",
- bankRulesGraceDays: "Claim grace period",
+ bankRulesEcoTaxNote: "A taxa ECO é deduzida do RBU bruto quando se calcula a atribuição da época. Os ECO deduzidos não são redistribuídos nesta época — ficam no saldo do pub e alimentam o fundo da época seguinte através dos limites reserveMin / alpha.",
+ bankRulesEcoTaxRate: "Tarifa",
+ bankRulesEpochKind: "Granularidade da época",
+ bankRulesFloor: "Mínimo por utilizador (bruto)",
+ bankRulesGraceDays: "Período de carência da reivindicação",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
+ bankRulesKarmaNote: "O karma deriva das tuas ações (publicações, votos, participação no parlamento/tribunais, etc.) com um fator de decaimento temporal, menos os gramas de carbono gerados pelo teu feed.",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
- bankRulesReserveMin: "Reserve minimum (kept in pub balance)",
+ bankRulesReserveMin: "Reserva mínima (mantida no saldo do pub)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankRulesWMax: "Maximum weight (w_max)",
- bankRulesWMin: "Minimum weight (w_min)",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, 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.",
- 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.",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
+ bankRulesWMax: "Peso máximo (w_max)",
+ bankRulesWMin: "Peso mínimo (w_min)",
+ bankTaxesArchTaxFootprintNote: "A taxa ARCH reflete o custo de fazer crescer e manter o arquivo da rede. É calculada a partir do intervalo de tempo entre o teu primeiro bloco publicado e o bloco mais recente da rede — quanto mais tempo a tua história viver no arquivo, maior será a tua parte do custo de manutenção.",
+ bankTaxesArchTaxNoteBold: "reduzir diretamente a taxa ARCH",
+ bankTaxesArchTaxNoteIntro: "A tua taxa ARCH é deduzida do excedente que a rede gera acima do teu RBU; o valor base do RBU é fixado como um mínimo inamovível. A taxa nunca é deduzida do montante fixo que cabe a cada habitante como RBU. Os fundos deduzidos alimentam o algoritmo de redistribuição da riqueza e são canalizados de volta para outros habitantes através das suas reivindicações de RBU. Os habitantes mais recentes e os que se dedicam especificamente a tarefas de arquivo, replicação e manutenção terão provavelmente alguma tarefa dedicada a manter saudável o arquivo da rede em teu nome. Ou podem dedicar-se a ",
+ bankTaxesArchTaxNoteOutro: " através de acordos de poda, deduplicação de dados redundantes e infraestrutura de manutenção partilhada, e o seu contributo contínuo pode ser exigido pelo consenso da rede.",
+ bankTaxesUserNoteChips: "O chip da Taxa ECO mostrado junto a cada elemento muda de cor (verde / amarelo / vermelho) consoante o tamanho do elemento em relação ao maior bloco alguma vez visto na rede, suavizado pelo número de habitantes ativos — uma rede solarpunk maior distribui a carga e empurra mais elementos para a faixa verde.",
+ bankTaxesUserNoteOtherParams: "A taxa ECO deriva atualmente da pegada de carbono de cada bloco, mas pode incorporar outros parâmetros com o tempo — energia gasta na replicação, armazenamento redundante entre pares, largura de banda dos blobs, custo computacional da decifração, pegada de mineração das transações associadas ou qualquer outra carga mensurável que a rede acorde valorizar.",
+ gamesHallDate: "Data",
+ gamesNewRecord: "Novo recorde!",
+ indexingRefreshNote: "Esta página recarrega a cada 10 segundos.",
+ indexingMessage: "O Oasis está sincronizando a rede distribuída de nós. Por favor, aguarde.",
+ indexingTitle: "A sincronizar",
+ padsNoItems: "Nenhum pad encontrado.",
+ padVersionHistory: "Histórico de versões",
+ padAttributionView: "Por autora",
+ padVersionView: "Ver",
statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
+ statsChatMessage: "Mensagens de chat",
+ statsGameScore: "Jogos",
+ statsWiki: "Páginas wiki",
statsPad: "Pads",
- statsPadEntry: "Pad entries",
- typeGameScore: "GAME SCORES",
+ statsPadEntry: "Entradas de pad",
+ typeGameScore: "PONTUAÇÕES DE JOGO",
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",
@@ -3458,6 +4639,14 @@ module.exports = {
settingsReplicationTitle: "Replicação",
settingsReplicationDesc: "Configura o número de saltos que o teu peer segue a partir do teu próprio feed ao replicar conteúdo.",
settingsReplicationHopsLabel: "Saltos",
+ settingsBlobCacheTitle: "Cache de média",
+ settingsBlobCacheDesc: "O conteúdo de outros habitantes fica guardado neste dispositivo. Escolhe quanto espaço pode ocupar.",
+ settingsBlobCacheUsage: "Utilização atual",
+ settingsBlobCacheFiles: "ficheiros",
+ settingsBlobCacheLimit: "Limite",
+ settingsBlobCacheUnlimited: "Sem limite",
+ settingsBlobCacheCleanNow: "Limpar agora",
+ settingsBlobCacheCleaned: "{n} ficheiros removidos, {size} libertados.",
aiApproveTagsLabel: "Etiquetas (separadas por vírgulas)",
aiApproveTagsPlaceholder: "p.ex. oasis, governança, ecologia",
aiApproveRatingLabel: "Avaliação",
@@ -3485,13 +4674,11 @@ module.exports = {
larpInviteBannerHint: "Partilha este código com alguém em ACADEMIA. Expira em 30 ciclos ou após um único uso.",
larpTestRankingTitle: "Pontuação por casa",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "Código de convite de casa",
- invitesHouseJoinButton: "Entrar na Casa",
- ecoTaxLabel: "ECO Tax",
+ ecoTaxLabel: "Taxa ECO",
bankTaxes: "Impostos",
- bankOverviewYourTaxes: "Os teus impostos",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesArchTaxTitle: "ARCH Tax",
+ bankOverviewYourTaxes: "Impostos totais",
+ bankTaxesEcoTaxTitle: "Taxa ECO",
+ bankTaxesArchTaxTitle: "Taxa ARCH",
bankTaxesUserAmount: "A tua ECO Tax (preço a devolver)",
bankTaxesArchTaxUserAmount: "A tua ARCH Tax (preço a devolver)",
bankTaxesArchTaxFirstBlock: "Idade do teu primeiro bloco",
@@ -3519,7 +4706,7 @@ module.exports = {
bankTaxesLookupType: "Tipo",
bankTaxesLookupSize: "Tamanho",
bankTaxesLookupCarbon: "Pegada de carbono",
- bankTaxesLookupEcoin: "ECO Tax",
+ bankTaxesLookupEcoin: "Taxa ECO",
bankExchangeEcoTaxAnnual: "ECOin Taxes (anual)",
bankExchangeEcoTaxMonthly: "ECOin Taxes (mensal)",
bankTaxesTypesLabel: "Seleciona que impostos queres pagar",
@@ -3527,24 +4714,22 @@ module.exports = {
bankRulesPoolTitle: "Pool mensal",
bankRulesShareTitle: "Parcela por utilizador",
bankRulesKarmaTitle: "Karma (pontuação de envolvimento)",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesArchTaxTitle: "ARCH Tax",
+ bankRulesEcoTaxTitle: "Taxa ECO",
+ bankRulesArchTaxTitle: "Taxa ARCH",
bankRulesChipTitle: "Faixa de cor do chip 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",
+ audioTranscodeButton: "TRANSCODIFICAR",
audioTranscodeDetailTitle: "Transcodificar",
- audioTranscodeStegoOasisId: "Por",
audioTranscodeStegoTimestamp: "Gerado em",
- audioTranscodeStegoMessage: "TEXT",
+ audioTranscodeStegoMessage: "TEXTO",
audioTranscodeStegoEmpty: "(nenhum)",
audioTranscodeStegoUnknown: "—",
audioBackToBcs: "Voltar ao BCS",
melodyCompositionTitle: "Mapa de composição da blockchain",
melodyFilterMine: "MEU",
- melodyByLabel: "Por",
melodyAllEmpty: "Ainda sem composições BCS de outros habitantes.",
melodyNoteUnavailable: "o bloco não está no teu feed local",
melodyUploadBcsTitle: "Publicar",
@@ -3570,14 +4755,14 @@ module.exports = {
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).",
+ modulesLarpDescription: "Módulo para a camada de jogo de papéis ao vivo.",
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",
larpProfileQ1O3: "Investigar a literatura",
larpProfileQ1O4: "Sabotar o sistema que o provoca",
larpProfileQ2: "O que dá sentido ao teu trabalho diário?",
- larpProfileQ2O1: "Defender as pessoas que amo",
+ larpProfileQ2O1: "Defender os habitantes que amo",
larpProfileQ2O2: "Criar algo tangível",
larpProfileQ2O3: "Curar ou cuidar da vida",
larpProfileQ2O4: "Trabalhar com palavras e ideias",
@@ -3644,7 +4829,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Seleciona o modo de navegação UX para a tua interface.",
uxModeMenus: "Blocos",
- uxModeAINav: "AI",
+ uxModeChats: "Conversas",
+ uxModeFeed: "Microblogging",
+ feedTrendingTitle: "Tags em Tendência",
+ feedActiveTitle: "Habitantes Ativos",
+ cnBrandSub: "Livre · P2P · Federada",
+ cnSyncedPeers: "Pares sincronizados",
+ cnLicense: "Licença",
+ cnNotAccessible: "O conteúdo não está acessível neste momento.",
+ cnUntitled: "Sem título",
+ cnSearchPlaceholder: "Procurar…",
+ cnHubTitle: "HUB Clearnet",
+ cnHubDescription: "Conteúdo público partilhado pelos habitantes desta rede Oasis.",
+ cnHubEmpty: "Ainda não foi partilhado conteúdo público na Clearnet.",
+ cnPublicContent: "Conteúdo",
+ cnTribesContent: "Tribos",
+ cnNetworkContent: "Rede",
+ cnCategoryEmpty: "Não há conteúdo nesta categoria.",
+ cnInhabitantEmpty: "Este habitante ainda não publicou conteúdo na Clearnet.",
+ cnPrevPage: "← Anterior",
+ cnNextPage: "Seguinte →",
+ cnPageOf: "Página {page} de {pages}",
+ cnMoreInfo: "Mais informações →",
+ cnOpenCourse: "Curso aberto",
+ cnAuction: "LEILÃO",
+ cnExchange: "TROCA",
+ cnRssDescription: "publicados pelos habitantes deste HUB",
+ cnKindAudio: "Áudio",
+ cnKindBlog: "Blog",
+ cnKindBookmark: "Marcador",
+ cnKindDocument: "Documento",
+ cnKindEvent: "Evento",
+ cnKindFeed: "Feed",
+ cnKindImage: "Imagem",
+ cnKindJob: "Emprego",
+ cnKindMarket: "Mercado",
+ cnKindPodcast: "Podcast",
+ cnKindProject: "Projeto",
+ cnKindCourse: "Curso",
+ cnKindShop: "Loja",
+ cnKindTorrent: "Torrent",
+ cnKindFile: "Ficheiro",
+ cnKindVideo: "Vídeo",
+ cnKindWiki: "Wiki",
+ cnKindRoom: "Sala",
+ cnKindMap: "Mapa",
+ uxModeAINav: "IA",
}
};
diff --git a/src/client/assets/translations/oasis_ru.js b/src/client/assets/translations/oasis_ru.js
index cd9fee9..c16775f 100644
--- a/src/client/assets/translations/oasis_ru.js
+++ b/src/client/assets/translations/oasis_ru.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "Покупки",
shopMyOrdersDescription: "Ваши заказы.",
shopMyOrdersEmpty: "У вас пока нет покупок.",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM Продавец",
shopOrderSeller: "Продавец",
shopOrderInvoice: "Счёт",
shopOrderInvoiceConcept: "Счёт",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "Принять",
shopOrderReject: "Отклонить",
shopOrderMarkShipped: "Отметить отправленным",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM Покупатель",
shopOrderContractConcept: "Заказ магазина",
shopOrdersPending: "Ожидающие заказы",
all: "Все",
@@ -28,7 +28,7 @@ module.exports = {
recent: "Недавние",
anonymous: "Аноним",
unnamed: "Аноним",
- authorLabel: "АВТОР",
+ authorLabel: "Автор",
delete: "Удалить",
save: "Сохранить",
vote: "Голосовать",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "Предупреждение о контенте",
invalidPost: "Недопустимое содержимое",
invalidPostHint: "В этом сообщении пустой/недопустимый текст.",
- spreadBy: "От",
spreadChron: "Распространение",
spreaded: "Распространено",
spreadContentUnavailable: "Контент пока недоступен (ожидается репликация)",
filteredByTag: "Отфильтровано по тегу",
filteredByTagTitle: "Отфильтровано по тегу",
feedPublishedSuccess: "Лента успешно опубликована!",
+ feedMastodonFailed: "Опубликовано в Oasis, но отправить в Mastodon не удалось.",
tribeFeedSent: "Сообщение успешно отправлено!",
tribeContentEncrypted: "Зашифрованное содержимое",
tribeTorrentsEmpty: "Торрентов пока нет.",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "Последний визит",
profileClearnetBookmarksLabel: "Закладки",
invitesPort: "Порт",
- currentlyUnrecheable: "ОШИБКА!",
- peerHostValidation: "Корректный IPv4 (напр. 192.168.1.100) или имя хоста (напр. pub.example.com)",
+ peerHostValidation: "Корректный IPv4 (напр. 192.168.1.100) или имя хоста (напр. pub.solarnethub.com)",
peerPortValidation: "Порт 1-65535",
peerKeyValidation: "Открытый ключ SSB ed25519 (@<44 символа base64>=.ed25519)",
inboxJobUnsubscribedTitle: "Отписка от вашей вакансии",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "Описание задачи",
exportPasswordLabel: "Пароль экспорта",
importPasswordPlaceholder: "Введите пароль",
- searchCasesPlaceholder: "Поиск дел…",
+ searchCasesPlaceholder: "Поиск в Суды...",
shopBuyDeliveryAddressPlaceholder: "Адрес доставки",
shopBuyNotesPlaceholder: "Заметки",
bankTaxesUserNoteBold: "прямое снижение ECO-налога",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "Поддержать дело",
courtsSettlementAcceptBtn: "Принять соглашение",
courtsSupportCount: "Поддержавшие",
- courtsVerdictVoteTitle: "Голосование по вердикту",
- courtsVerdictVoteLabel: "Голос по вердикту",
- courtsVerdictVoteAccept: "Принять",
- courtsVerdictVoteReject: "Отклонить",
- courtsVerdictVoteSubmit: "Отправить голос",
reportsSetStatus: "Установить статус",
reportsStatusClosed: "ЗАКРЫТО",
statsAvgPerInhabitant: "Среднее на жителя",
@@ -190,9 +184,29 @@ module.exports = {
],
profile: "Аватар",
inhabitants: "Жители",
- peersReplicatedFeeds: "Реплицированные ленты",
+ peersReplicatedFeeds: "Реплицированные",
+ peersTorColumn: "TOR",
+ peersTorYes: "Доступен через Tor",
+ peersTorNo: "Недоступен через Tor",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "Версия",
graphos: "Графос",
graphosDescription: "Интерактивная карта сети вокруг вас.",
+ graphosFederation: "Федерация",
+ graphosFedPubs: "PUB",
+ graphosFedUnreachable: "Недоступны",
+ graphosFedLinks: "Взаимные связи",
+ graphosFedIsolated: "Изолированы",
+ graphosFedNoData: "Нет данных",
+ graphosFedMutual: "Взаимная",
+ graphosFedOneWay: "Односторонняя",
+ graphosFedTransport: "Сеть",
+ graphosFedWith: "Федерирован с",
+ graphosZoom: "Увеличить",
+ graphosFedInhabitants: "Жители",
+ graphosFedClearnet: "Интернет",
+ graphosFedBoth: "Интернет + TOR",
+ graphosFedEmpty: "Ваш узел пока не знает ни одного PUB.",
graphosViewingGraphOf: "Просмотр",
graphosBackToMine: "← Моя сеть",
graphosShowing: "Показано",
@@ -204,10 +218,27 @@ module.exports = {
".",
],
noMentions: "Вы ещё не получали @упоминаний.",
- mentionsSearchPlaceholder: "Поиск упоминаний...",
+ mentionsSearchPlaceholder: "Поиск в Упоминания...",
private: "Входящие",
+ privateDescription: "Управляйте своими личными сообщениями.",
privateInbox: "ВХОДЯЩИЕ",
privateReminders: "НАПОМИНАНИЯ",
+ inboxFilterPms: "ЛС",
+ inboxFilterNotifications: "Уведомления",
+ inboxMarkRead: "Отметить прочитанным",
+ inboxMarkUnread: "Отметить непрочитанным",
+ inboxUnreadChip: "Не прочитано",
+ inboxMarkAllRead: "Отметить все прочитанными",
+ inboxDeleteShown: "Удалить все",
+ inboxArchive: "В архив",
+ inboxUnarchive: "Из архива",
+ inboxFilterArchived: "Архив",
+ inboxEarlierMessages: "предыдущих сообщений",
+ inboxSortThread: "По темам",
+ inboxSortRecent: "Сначала новые",
+ inboxAllBots: "Боты",
+ settingsInboxBotsTitle: "Уведомления Inbox",
+ settingsInboxBotsDesc: "Выберите, какие боты могут уведомлять вас в Inbox. Снятые боты скрываются, и их уведомления не учитываются.",
inboxFiltersLabel: "Фильтры:",
inboxToggleToMutuals: "Переключить на взаимных",
inboxToggleToWhole: "Переключить на всех",
@@ -218,18 +249,19 @@ module.exports = {
pmReply: "Ответить",
pmReplies: "ответы",
inReplyTo: "В ОТВЕТ НА",
+ forumInThread: "В ТЕМЕ",
pmPreview: "Предпросмотр",
pmPreviewTitle: "Предпросмотр сообщения",
noPrivateMessages: "Вы ещё не получали личных сообщений.",
peers: "Узлы",
- privateDescription: ["Личные сообщения ",strong("зашифрованы вашим открытым ключом")," и могут иметь максимум 7 получателей."],
search: "Поиск",
searchDescription: "Описание",
searchFromLabel: "С",
searchToLabel: "До",
searchQueryLabel: "Запрос",
- searchPerPageLabel: "Результатов на странице",
+ searchPerPageLabel: "Результаты",
settings: "Настройки",
+ settingsDescription: "Настройте окружение вашей сети.",
continueReading: "Продолжить чтение",
moreComments: "ещё комментарий",
readThread: "прочитать остальное обсуждение",
@@ -250,7 +282,6 @@ module.exports = {
profileClearnetHelp: 'Модули, доступные извне Oasis.',
profileHubAll: 'Все',
footerLicenseLabel: 'Лицензия',
- profileSwitchToOasis: 'Вернуться в Oasis',
profileVisibilityFediverse: "Мультивселенная",
contributorsTitle: "Участники",
colorLabel: 'Выберите цвет',
@@ -260,6 +291,7 @@ module.exports = {
modulesViewTitle: "Модули",
modulesViewDescription: "Настройте свою среду, включая или отключая модули.",
inbox: "Входящие",
+ inboxSearchPlaceholder: "Поиск в Входящие...",
multiverse: "Мультивселенная",
fediverse: "Мультивселенная",
fediverseDescription: "Управляйте своими другими аккаунтами мультивселенной, включая отправку и получение контента.",
@@ -268,9 +300,17 @@ module.exports = {
fediverseSettingsTitle: "Мультивселенная",
fediverseInstanceLabel: "Адрес",
fediverseTokenLabel: "Токен доступа",
- fediverseTokenHelp: "Укажите ваш токен доступа. Он будет использоваться для управления вашим аккаунтом Mastodon из Oasis.",
fediverseConnect: "Подключить",
fediverseConnectedAs: "Подключено как",
+ nextcloudServerLabel: "Сервер",
+ nextcloudUserLabel: "Пользователь",
+ nextcloudFolderLabel: "Папка",
+ nextcloudUploadButton: "Загрузить",
+ nextcloudFileLabel: "Выберите файл",
+ fileExternalLink: "Внешняя ссылка",
+ nextcloudErrConnect: "Не удалось связаться с Nextcloud с этими данными.",
+ nextcloudErrUpload: "Загрузка в Nextcloud не удалась.",
+ nextcloudErrShare: "Nextcloud не дал публичную ссылку на файл.",
fediverseDisconnect: "Отключить",
fediverseEmptyLink: "настроек",
fediverseComposePlaceholder: "О чём вы думаете?",
@@ -299,6 +339,76 @@ module.exports = {
fediverseErrPost: "Не удалось опубликовать.",
fediverseErrMedia: "Не удалось загрузить файл.",
fediverseErrEmpty: "Напишите что-нибудь или прикрепите файл.",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "Номер телефона",
+ telegramSendCode: "Отправить код",
+ telegramCodeHelp: "Введите код, который Telegram только что отправил (приложение или SMS).",
+ telegramCodeLabel: "Код",
+ telegramPasswordHelp: "У аккаунта включена двухэтапная проверка. Введите облачный пароль.",
+ telegramPasswordLabel: "Пароль",
+ telegramVerify: "Подтвердить",
+ telegramCancel: "Отмена",
+ telegramChats: "Чаты",
+ telegramUnread: "Непрочитанные",
+ telegramOpen: "Открыть",
+ telegramSend: "Отправить",
+ telegramYou: "Вы",
+ telegramNoChats: "Чатов пока нет.",
+ telegramNoMessages: "Сообщений пока нет.",
+ telegramComposePlaceholder: "Напишите сообщение…",
+ telegramChannel: "Канал",
+ telegramGroup: "Группа",
+ telegramPrivate: "Личный",
+ telegramErrConnect: "Не удалось связаться с Telegram.",
+ telegramErrTimeout: "Telegram слишком долго не отвечал.",
+ telegramErrAuth: "Сессия Telegram недействительна или истекла. Подключитесь снова.",
+ telegramErrFetch: "Не удалось загрузить чаты.",
+ telegramErrSend: "Не удалось отправить сообщение.",
+ telegramErrMissing: "Нужны API ID, API hash и номер телефона.",
+ telegramErrCode: "Неверный код. Попробуйте ещё раз.",
+ telegramErrCodeExpired: "Код истёк. Начните заново.",
+ telegramErrPassword: "Неверный пароль.",
+ telegramErrPhone: "Неверный номер телефона.",
+ telegramErrApi: "Неверные API ID или API hash.",
+ telegramErrFlood: "Слишком много попыток. Подождите и попробуйте снова.",
+ telegramErrNoLogin: "Вход не начат. Начните заново.",
+ peertubeUsernameLabel: "Имя пользователя",
+ peertubePasswordLabel: "Пароль",
+ peertubeSubscriptions: "Подписки",
+ peertubeMyVideos: "Мои видео",
+ peertubeVideos: "Видео",
+ peertubeFollowers: "Подписчики",
+ peertubeViews: "просмотров",
+ peertubeLikes: "лайков",
+ peertubeQuota: "Квота",
+ peertubeUpload: "Загрузить видео",
+ peertubeUploadHelp: "Выберите видеофайл. Он загружается в ваш канал, затем PeerTube его обрабатывает.",
+ peertubeTitleLabel: "Название",
+ peertubeDescriptionLabel: "Описание",
+ peertubePrivacyLabel: "Приватность",
+ peertubePrivacyPublic: "Публичное",
+ peertubePrivacyUnlisted: "По ссылке",
+ peertubePrivacyPrivate: "Приватное",
+ peertubeNoVideos: "Видео пока нет.",
+ peertubeComments: "Комментарии",
+ peertubeComment: "Комментировать",
+ peertubeCommentPlaceholder: "Напишите комментарий…",
+ peertubeNoComments: "Комментариев пока нет.",
+ peertubeOpen: "Открыть на PeerTube",
+ peertubeWatch: "Смотреть",
+ peertubeChannel: "Канал",
+ peertubeNoStream: "Это видео пока нельзя воспроизвести здесь. Откройте его на PeerTube.",
+ peertubeUploaded: "Видео загружено. PeerTube обрабатывает его.",
+ peertubeErrConnect: "Не удалось связаться с PeerTube.",
+ peertubeErrAuth: "Неверное имя пользователя или пароль, либо сессия истекла. Подключитесь снова.",
+ peertubeErrInstance: "Неверный адрес инстанса.",
+ peertubeErrMissing: "Нужны инстанс, имя пользователя и пароль.",
+ peertubeErrFetch: "Не удалось загрузить видео.",
+ peertubeErrUpload: "Не удалось загрузить видео на сервер.",
+ peertubeErrTitle: "Нужно название.",
+ peertubeErrComment: "Не удалось опубликовать комментарий.",
+ peertubeErrNoFile: "Выберите видеофайл.",
bookmarksLabel: "Закладки",
videosLabel: "Видео",
torrentsLabel: "Торренты",
@@ -321,7 +431,6 @@ module.exports = {
comment: "Комментарий",
subtopic: "Подтема",
json: "JSON",
- createdBy: "автор",
unfollow: "Отменить поддержку",
follow: "Поддержать",
block: "Заблокировать",
@@ -337,12 +446,15 @@ module.exports = {
relationshipNone: "Вы не поддерживаете",
relationshipBlockingPost: "Заблокированная запись",
viewLikes: "Посмотреть распространения",
+ viewSupporters: "Посмотреть сторонников",
spreadedDescription: "Список записей, распространённых жителем.",
preview: "Предпросмотр",
publish: "Написать",
contentWarningPlaceholder: "Добавьте тему к записи (необязательно)",
- publishWarningPlaceholder: "Текст ограничен 7000 символами.",
+ publishWarningPlaceholder: "Напишите текст вашей записи.",
publishTooLong: "Ваш пост слишком длинный. Пожалуйста, сократите его.",
+ keepTextRetry: "Отправить снова",
+ dateInPastError: "Дата не может быть в прошлом",
publishCustomDescription: [
"ПОМНИТЕ: Благодаря технологии блокчейн, после публикации запись невозможно отредактировать или удалить.",
],
@@ -372,9 +484,8 @@ module.exports = {
mentionsMatching: "Совпадающие упоминания",
mentionsName: "Имя",
mentionsRelationship: "Отношение",
- updateit: "ОБНОВИТЬ!",
updateBannerText: "Доступна новая версия Oasis.",
- updateBannerAction: "Обновить сейчас →",
+ updateBannerAction: "Обновить сейчас!",
info: "Информация",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -382,16 +493,14 @@ module.exports = {
timeAgo: "назад",
sendTime: "примерно ",
theme: "Тема",
- legacy: "Ключи",
- legacyTitle: "Ключи",
- legacyDescription: "Быстро и безопасно управляйте своим секретом (приватным ключом).",
- legacyExportButton: "Экспорт",
- legacyImportButton: "Импорт",
+ backupKeysExportButton: "Экспорт",
+ backupKeysImportButton: "Импорт",
ssbLogStream: "Блокчейн",
ssbLogStreamDescription: "Настройте лимит сообщений для потоков блокчейна.",
+ logWindowChip: "Последние {n} потоков блокчейна",
saveSettings: "Сохранить настройки",
exportDescription: "Установите пароль (минимум 32 символа) для шифрования вашего ключа",
- exportDataTitle: "Резервная копия",
+ exportDataTitle: "Мгновенная копия",
exportDataDescription: "Скачайте ваши данные (без секретного ключа!)",
exportDataButton: "Скачать базу данных",
importDescription: "Импортируйте ваш зашифрованный секрет (приватный ключ) для активации аватара",
@@ -400,38 +509,33 @@ module.exports = {
fileInfo: "Ваш зашифрованный секретный ключ будет скачан на ваше устройство (имя файла: oasis.enc)",
developer: "Разработка",
devTitle: "Разработка",
- welcomeBannerText: "Добро пожаловать в OASIS. Выполните эти быстрые шаги, чтобы настроить свой аватар.",
+ welcomeBannerText: "Твой аватар ещё не настроен.",
aiSuggestionBanner: "Совет:",
aiSuggestionsEnable: "Советы ИИ",
- welcomeBannerAction: "Начать!",
+ welcomeBannerAction: "Начать",
welcomeTitle: "Добро пожаловать",
+ welcomeStepIdentity: "Личность",
+ welcomeStepType: "Тип",
+ welcomeStepUse: "Использование",
+ welcomeStepLook: "Внешний вид",
+ welcomeStepCommunity: "Сообщество",
+ welcomeStepIntro: "Приветствие",
+ welcomeHintIdentity: "Ваше имя и изображение.",
+ welcomeHintType: "Как Oasis открывается для вас.",
+ welcomeHintUse: "Какие модули остаются включёнными.",
+ welcomeHintLook: "Тема, которую носит Oasis.",
+ welcomeHintCommunity: "Войдите в PUB, чтобы познакомиться с другими жителями.",
+ welcomeHintIntro: "Отправьте первое приветствие сообществу.",
+ welcomeStepThemeAction: "Использовать эту тему",
+ welcomeJoinPubs: "Войти в PUB",
+ welcomeNoFederation: "Без федерации",
welcomeStepGreetingAction: "Отправить",
- welcomeJoinPubButton: "Войти в паб",
- welcomeStepLarpAction: "Вступить в «Академию»",
- welcomeStepLarpText: "Присоединяйтесь к нашей ролевой игре живого действия.",
- welcomeStepLarpTitle: "Присоединиться к L.A.R.P.",
- welcomeStepGreetingTitle: "Отправьте «Привет, мир!»",
- welcomeStepGreetingText: "Отправьте сообщение, чтобы другие жители могли вас найти.",
- welcomeJoinPub: "Присоединиться:",
welcomeDescription: "Несколько вещей, которые стоит сделать перед началом.",
- welcomeProgress: "Выполнено",
- welcomeStepDone: "готово",
- welcomeStepPending: "не сделано",
welcomeSkip: "Не сейчас",
- welcomeStepLanguageTitle: "Выберите язык",
- welcomeStepLanguageText: "Oasis говорит на нескольких языках. Изменить можно в любой момент.",
- welcomeStepProfileTitle: "Заполните профиль",
- welcomeStepProfileText: "Выберите имя, добавьте описание и поставьте изображение, чтобы другие жители вас узнавали.",
welcomeStepProfileAction: "Сохранить профиль",
- welcomeStepFederationTitle: "Присоединитесь к основной сети",
- welcomeStepFederationText: "Подключитесь к нашему пабу, чтобы встретить других жителей и начать репликацию.",
- welcomeStepFederationAction: "К приглашениям",
- welcomeStepBackupTitle: "Сохраните свой ID",
- welcomeStepBackupText: "Ваша личность — это файл ключа на этом устройстве.",
- welcomeStepBackupWarning: "ЕСЛИ ВЫ ЕГО ПОТЕРЯЕТЕ, НИКТО НЕ СМОЖЕТ ЕГО ВОССТАНОВИТЬ.",
- welcomeStepBackupAction: "Резервная копия!",
+ welcomeBootstrapRunning: "Загружается снимок паба. По завершении паб будет подключён автоматически; тем временем можно продолжать пользоваться Oasis.",
welcomeCompleteTitle: "Всё готово.",
- welcomeCompleteText: "Ваш узел готов. Дальше сеть растёт вместе с теми, на кого вы подписаны.",
+ welcomeCompleteText: "Ваш узел готов. Дальше сеть растёт вместе с жителями, которых вы поддерживаете.",
welcomeFindPeople: "Найти жителей",
devFilterFiles: "ФАЙЛЫ",
devFilterSearch: "ПОИСК",
@@ -441,7 +545,7 @@ module.exports = {
devFilterTests: "ТЕСТЫ",
devVersion: "Версия",
devNodeVersion: "Node",
- devStatsTests: "Наборы тестов",
+ devStatsTests: "Тесты",
devParentFolder: "Родительская папка",
devOpenFolder: "открыть",
devDescription: "Изучайте исходный код, работающий на этом узле.",
@@ -485,6 +589,27 @@ module.exports = {
"Если вы хотите использовать другой язык, выберите его здесь.",
setLanguage: "Установить язык",
peerConnectionsIntro: "Управляйте всеми подключениями к другим узлам.",
+ peersConnectFailed: "Не удалось подключиться: {reason}.",
+ peerStateLabel: "Состояние",
+ peerAddressLabel: "Адрес",
+ peerLastChangeLabel: "Последнее изменение",
+ peerStateConnected: "Подключён",
+ peerStateConnecting: "Подключение",
+ peerStateStaged: "Доступен",
+ peerErrSilent: "Нет активности",
+ peerErrTimeout: "Не отвечает",
+ peerErrRefused: "Отклоняет подключение",
+ peerErrNotFound: "Неизвестный адрес",
+ peerErrUnreachable: "Сеть недоступна",
+ peerErrKeys: "Использует другие ключи",
+ peerErrIdentity: "Не принимает ваше подключение",
+ peerErrTor: "Только TOR",
+ peerErrDropped: "Соединение прервано",
+ peerErrPaused: "Сеть приостановлена",
+ peerErrOther: "Ошибка подключения",
+ peerOutdated: "Устарел",
+ peerVersionUnannounced: "Не сообщает свою версию: старый Oasis",
+ peersTorMissing: "Этот PUB принимает подключения только через TOR.",
peerConnectionsTitle: "Подключения",
online: "В сети",
offline: "Не в сети",
@@ -503,22 +628,25 @@ module.exports = {
noConnections: "Нет подключённых узлов.",
noDiscovered: "Нет обнаруженных узлов.",
noUnknownPeers: "Нет неизвестных пиров в графе друзей.",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "Пока нет зарегистрированных узлов.",
+ peerConnect: "Подключить",
+ peerDisconnect: "Отключить",
peerRefresh: "Обновить",
peerPruneIdle: "Удалить неактивные",
+ peersPause: "Пауза",
+ peersResume: "Продолжить",
+ peersPausedNote: "На паузе: Oasis ни с кем не соединяется, и к нему никто не может подключиться.",
+ peersPauseHint: "Останавливает все соединения: Oasis не подключается к другим узлам и не принимает их, пока вы не возобновите.",
peerExport: "Экспорт",
peerImport: "Импорт",
peerImportTitle: "Импорт списка пиров",
peerImportPlaceholder: "Вставьте по одному multiserver-адресу на строку или загрузите .txt файл…",
connectionActionIntro:
"",
- startNetworking: "Запустить сеть",
- stopNetworking: "Остановить сеть",
- restartNetworking: "Перезапустить сеть",
- sync: "Синхронизировать сеть",
indexes: "Индексы",
+ indexesRebuilt: "Индексы перестроены",
+ indexesRebuildFailed: "Не удалось перестроить индексы",
+ indexesFiles: "Файлы индексов",
indexesDescription:
"Перестройка индексов безопасна и может исправить некоторые типы ошибок.",
homePageTitle: "Главная",
@@ -528,44 +656,33 @@ module.exports = {
invitesDescription: "Управляйте и применяйте коды приглашений в вашей сети.",
invitesPubsHint: "Вставьте пригласительный код паба, чтобы федерироваться с ним и начать реплицировать его жителей.",
invitesFederationsHint: "Пабы, с которыми вы федерированы: обновите их, удалите недоступные или экспортируйте список.",
- invitesHousesHint: "Введите код дома, чтобы вступить в дом LARP и участвовать в его экономике.",
- invitesTribesHint: "Введите код племени, чтобы стать участником и получить доступ к его закрытому содержимому.",
- invitesChatsHint: "Введите код чата, чтобы присоединиться к беседе и её темам.",
- invitesPadsHint: "Введите код пада, чтобы вместе писать в общем документе.",
- invitesCalendarsHint: "Введите код календаря, чтобы делиться датами и напоминаниями.",
- invitesEventsHint: "Введите код события, чтобы присоединиться к закрытому событию.",
- invitesForumsHint: "Введите код форума, чтобы читать и отвечать в закрытом форуме.",
- invitesMapsHint: "Введите код карты, чтобы видеть и добавлять места на общей карте.",
- invitesShopsHint: "Введите код магазина, чтобы присоединиться к магазину и его каталогу.",
- invitesInhabitantsHint: "Введите код жителя, чтобы подписаться друг на друга и обмениваться содержимым.",
invitesTribesTitle: "Племена",
- invitesTribeInviteCodePlaceholder: "Введите код приглашения племени",
- invitesTribeJoinButton: "Вступить в племя",
invitesChatsTitle: "Чаты",
- invitesChatInviteCodePlaceholder: "Введите код приглашения чата",
- invitesChatJoinButton: "Войти в чат",
invitesPadsTitle: "Пады",
- invitesPadInviteCodePlaceholder: "Введите код приглашения пада",
- invitesPadJoinButton: "Войти в пад",
invitesCalendarsTitle: "Календари",
- invitesCalendarInviteCodePlaceholder: "Введите код приглашения календаря",
- invitesCalendarJoinButton: "Войти в календарь",
invitesEventsTitle: "События",
- invitesEventInviteCodePlaceholder: "Введите код приглашения события",
- invitesEventJoinButton: "Войти в событие",
invitesForumsTitle: "Форумы",
- invitesForumInviteCodePlaceholder: "Введите код приглашения форума",
- invitesForumJoinButton: "Войти на форум",
invitesMapsTitle: "Карты",
- invitesMapInviteCodePlaceholder: "Введите код приглашения карты",
- invitesMapJoinButton: "Войти на карту",
invitesShopsTitle: "Магазины",
- invitesShopInviteCodePlaceholder: "Введите код приглашения магазина",
- invitesShopJoinButton: "Войти в магазин",
invitesPubsTitle: "PUB",
+ invitesSuggestedPubs: "Рекомендуемые PUB",
+ invitesFilterOthers: "Другие",
+ invitesJoinTitle: "Приглашения",
+ invitesJoinHint: "Вставьте любой пригласительный код, для чего бы он ни был, или Oasis ID жителя.",
+ invitesJoinPlaceholder: "Пригласительный код или Oasis ID",
+ invitesJoinButton: "Войти",
+ invitesUsedTitle: "Последние приглашения",
+ invitesUsedEmpty: "Вы ещё не использовали ни одного приглашения.",
+ invitesUsedType: "Тип",
+ invitesUsedName: "Название",
+ invitesUsedDate: "Дата",
invitesPubInviteCodePlaceholder: "Введите код приглашения PUB",
invitesAcceptInvite: "Присоединиться к PUB",
+ invitesPubUses: "Использовано приглашений",
+ invitesPubExhausted: "У этого PUB не осталось приглашений.",
invitesAlreadyFederated: "Вы уже федерированы с этим пабом.",
+ invitesJoinPubMode: "Этот Oasis работает как PUB в режиме только для чтения. Чтобы присоединить его к другому PUB, выполните в терминале: ./oasis.sh join <код>",
+ invitesJoinLocalOnly: "Приглашения можно принять только на устройстве, где работает Oasis, или по ссылке администратора, которую он показывает при запуске.",
invitesFederationsTitle: "Федерации",
invitesAcceptedInvites: "Федеративные",
invitesUnfollow: "Отписаться",
@@ -573,16 +690,12 @@ module.exports = {
invitesUnfollowedInvites: "Нефедеративные",
invitesNoFederatedPubs: "Нет федеративных pub-ов.",
invitesNoUnfollowed: "Нет нефедеративных pub-ов.",
- invitesUnreachablePubs: "Недоступные",
- invitesNoUnreachablePubs: "Нет недоступных pub-ов.",
invitesPubsRefresh: "Обновить",
- invitesPubsClearUnreachable: "Удалить недоступные",
+ invitesPubsClearUnreachable: "Очистить",
invitesPubsExport: "Экспорт",
invitesPubsImport: "Импорт",
invitesPubsImportTitle: "Импорт pub-ов",
invitesPubsImportPlaceholder: "Вставьте один multiserver-адрес или код приглашения на строку, или загрузите .txt файл…",
- currentlyUnreachable: "ОШИБКА!",
- errorDetails: "Подробности ошибки",
genericError: "Произошла ошибка.",
panicMode: "Режим паники!",
encryptData: "Установите пароль (минимум 32 символа) для шифрования вашего блокчейна",
@@ -609,7 +722,6 @@ module.exports = {
votesOptionNoLabel:"Против",
votesOptionAbstentionLabel:"Воздержание",
votesQuestionLabel:"Вопрос",
- votesCreatedByLabel:"Создано",
voteStatusOpen:"ОТКРЫТО",
voteStatusClosed:"ЗАКРЫТО",
commentDescription: ({ parentUrl }) => [
@@ -626,22 +738,22 @@ module.exports = {
searchSubmit: "Искать...",
votesLabel: "ГОЛОСОВАНИЯ",
pdfFallbackLabel: "PDF документ",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "МАГАЗИНЫ",
+ voteLabel: "ГОЛОСА",
submit: "Отправить",
editProfile: "Редактировать аватар",
oasisIdLabel: "OasisID",
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- /мультивселенной — Управляйте своими другими аккаунтами мультивселенной, включая отправку и получение контента.\n\nЭто сообщение было отправлено приватно от тебя самому себе, поэтому для его получения не требовалось соединение.",
+ welcomePmBody: "Добро пожаловать в Oasis — свободная, одноранговая, федеративная и зашифрованная социальная сеть с распределённой архитектурой только по приглашениям.\n\nНесколько интересных мест, с которых можно начать:\n\n- [/avatar](/profile) — Отредактируй аватар, имя, описание и какие модули видны на твоей публичной стороне.\n- /settings — Настройте локальный экземпляр: язык, тема, модули, приватность и синхронизация.\n- /invites — Добавь pub, чтобы федерироваться с остальной сетью.\n- /peers — Посмотри, кто на связи, пересканируй LAN, экспортируй или импортируй списки пиров.\n- /inhabitants — Открывай и заходи к аватарам других жителей.\n- /tribes — Создавай или вступай в приватные группы со сквозным шифрованием.\n- /search — Ищите содержимое сети по типу.\n\nНесколько интересных мест для подключения:\n\n- /мультивселенной — Управляйте своими другими аккаунтами мультивселенной, включая отправку и получение контента.\n\nЭто сообщение было отправлено приватно от тебя самому себе, поэтому для его получения не требовалось соединение.",
profileSensorsSectionTitle: "Сенсоры",
profileVisibilityActivity: "Уровень активности",
profileDeviceLockedHint: "Этот датчик всегда включён: он показывает другим, с какого устройства вы подключаетесь, и не может быть отключён.",
profileVisibilityKarma: "Карма",
- profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "Кошелёк ECOIN",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityUbi: "ББД",
+ profileVisibilityWallet: "Кошелёк ECOin",
+ profileVisibilityEcoTax: "ECO-налог",
+ profileVisibilityLarpSign: "Печать L.A.R.P.",
profileVisibilityGpg: "Ключ GPG",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "Магазины",
@@ -654,6 +766,10 @@ module.exports = {
profileClearnetImagesLabel: "Изображения",
profileClearnetDocumentsLabel: "Документы",
profileClearnetTorrentsLabel: "Торренты",
+ profileClearnetPodcastsLabel: "Подкасты",
+ profileClearnetMarketLabel: "Рынок",
+ profileClearnetFeedLabel: "Лента",
+ profileClearnetWikiLabel: "Вики",
editProfileDescription:
"",
profileName: "Имя",
@@ -679,7 +795,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "Подтв.",
walletConfirm: "Подтвердить",
- walletDescription: "Управляйте цифровыми активами: отправка и получение ECOin, просмотр баланса и история транзакций.",
+ walletDescription: "Управляйте своим кошельком ECOin.",
walletDate: "Дата",
walletFee: "Комиссия (чем выше комиссия, тем быстрее обработка транзакции)",
walletFeeLine: ({ fee }) => `Комиссия: ECO ${fee}`,
@@ -687,6 +803,86 @@ module.exports = {
walletReceive: "Получить",
walletReset: "Сбросить",
walletSend: "Отправить",
+ walletPayingTransfer: "Оплата перевода",
+ walletCreateTransferLabel: "Создать смарт-контракт (перевод)",
+ walletTransferNotifiedNote: "Другая сторона уведомлена об этом платеже",
+ walletTransferCreatedNote: "Для этого платежа создан перевод (квитанция)",
+ walletTransferNoPayeeNote: "Никто не опубликовал этот адрес, перевод не создан",
+ walletTransferReceiptConcept: "Платёж из кошелька",
+ walletPaymentPmText: "отправил(а) вам платёж",
+ walletPayeeLabel: "Получатель",
+ walletConceptLabel: "Назначение",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "Вы получили свой ББД.",
+ bankingBotPaymentTitle: "Вы получили платёж.",
+ bankingBotUbiPaidText: "Ваш безусловный базовый доход выплачен",
+ bankUbiPubThisNode: "Этот узел выплачивает ББД",
+ bankUbiPubConnected: "PUB ББД",
+ bankUbiPubNone: "Ни один PUB в вашей сети пока не объявляет ББД",
+ bankUbiAddressPublished: "Адрес ECOin опубликован",
+ bankUbiAddressMissing: "Опубликуйте адрес ECOin, чтобы получать ББД",
+ bankUbiClaimedThisMonth: "Запрошено в этом месяце",
+ bankUbiPubBalance: "Кошелёк PUB, доступный для ББД",
+ bankNoPubAddress: "PUB ББД ещё не опубликовал адрес ECOin.",
+ bankUbiTab: "ББД",
+ bankDonateEco: "ПОЖЕРТВОВАТЬ!",
+ donateTooltip: "Пожертвовать ECOin",
+ bankNoUserAddress: "Этот житель не делится адресом ECOin.",
+ bankUbiPubDefault: "По умолчанию",
+ bankUbiPool: "Фонд",
+ bankUbiLastSeen: "Последний раз в сети",
+ bankUbiLastPayout: "Последнее действие",
+ bankUbiPaidOut: "Выплачено",
+ bankRangeToday: "Сегодня",
+ bankRangeWeek: "Неделя",
+ bankRangeMonth: "Месяц",
+ bankRangeYear: "Год",
+ bankRangeFiveYears: "5 лет",
+ bankRangeAll: "Всё",
+ bankChartValueTitle: "Динамика стоимости ECOin",
+ bankChartValueHours: "Эквивалент во времени (ч)",
+ bankChartWealthTitle: "Перераспределение богатства ECOin",
+ bankChartDistributed: "Выплаченный ББД (ECO)",
+ bankChartRebalanceTitle: "Перераспределение богатства между PUB",
+ bankChartRebalanced: "ECO, переданные между PUB",
+ bankChartTaxes: "Удержанные налоги (ECO)",
+ bankChartNoDataRange: "Нет данных за этот период.",
+ bankChartNoDataYet: "Данных пока нет",
+ bankChartPerHour: "в час",
+ bankChartPerDay: "в день",
+ bankChartPerMonth: "в месяц",
+ bankTotalUbiDistributed: "Всего перераспределено ББД (сеть)",
+ bankTotalTaxesWithheld: "Всего удержано налогов (сеть)",
+ bankInflationIssuance: "Темп эмиссии (годовой, по награде за блок)",
+ bankRulesEligibilityTitle: "Кто может получать ББД",
+ bankRulesEligibility1: "Адрес ECOin, опубликованный в профиле (Профиль → Сенсоры → Кошелёк ECOin).",
+ bankRulesEligibility2: "Лента старше 30 дней с активностью в сети: карма выше нуля.",
+ bankRulesEligibility3: "Один запрос в месяц (эпоху), из Banking кнопкой Запросить ББД. От текущего месяца можно отказаться кнопкой Отказаться от ББД.",
+ bankRulesEligibility4: "Минимум в 1 ECO выплачивается всегда; налоги уменьшают только часть сверх него и никогда не взимаются отдельно.",
+ bankRulesEligibility5: "PUB платит в следующем цикле и публикует перевод ББД, который вы можете подтвердить.",
+ bankRulesEligibility6: "Если нет адреса, лента слишком молода, месяц отклонён или у PUB нет средств, запрос пропускается и записывается в журнал PUB.",
+ copyLinkTitle: "Скопировать ссылку",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "Отказаться от ББД",
+ bankUbiRefusedThisMonth: "Вы отказались от ББД этого месяца.",
+ bankingBotUbiAvailableTitle: "Вы можете запросить ББД.",
+ bankingBotUbiAvailableText: "Ваш ББД за этот месяц доступен",
+ bankingBotConfirmTitle: "У вас есть смарт-контракт, ожидающий подтверждения",
+ bankingBotConfirmText: "Смарт-контракты, ожидающие вашего подтверждения",
+ bankChartZoomHint: "Нажмите, чтобы увеличить",
+ bankChartPoolTitle: "Фонд ББД (во времени)",
+ bankChartNetworkUbiTitle: "Всего перераспределено ББД (сеть)",
+ bankChartSupplyTitle: "Оборотное предложение ECOin (во времени)",
+ bankChartInflationTitle: "Инфляция ECOin (во времени)",
+ bankChartInflationSeries: "Годовая ставка (%)",
+ bankChartPool: "Общий фонд (ECO)",
+ bankChartKarmaTitle: "KARMA Scoring (во времени)",
+ bankChartFundsTitle: "Ваши средства ECOin (во времени)",
+ bankChartKarma: "Карма",
+ bankWalletReady: "ECOin подключён",
+ bankWalletNotConfigured: "ECOin отключён",
+ transfersPayWithWallet: "ОПЛАТИТЬ!",
walletStatus: "Статус",
walletDisconnected: [
"ECOin ",
@@ -696,8 +892,11 @@ module.exports = {
" или состояние подключения.",
],
walletSentToLine: ({ destination, amount }) => `Отправлено ECO ${amount} на ${destination}`,
+ walletNotConfigured: "Ваш кошелёк ECOin ещё не настроен.",
walletSettingsDescription: "Интегрируйте Oasis с вашим кошельком ECOin.",
- walletSettingsDocLink: "Руководство по установке ECOin",
+ walletSettingsMobileDescription: "Свяжите Oasis с приложением ECOin Wallet на этом устройстве.",
+ walletDownloadEcoin: "Скачать ECOin!",
+ walletRpcUrl: "URL RPC",
walletStatusMessages: {
invalid_amount: "Неверная сумма",
invalid_dest: "Неверный адрес назначения",
@@ -713,6 +912,7 @@ module.exports = {
walletUser: "Имя пользователя",
walletPass: "Пароль",
walletConfiguration: "Настроить кошелёк",
+ walletDisconnectButton: "Отключить кошелёк",
cipher: "Шифратор",
cipherTitle: "Шифратор",
cipherDescription: "Симметричное шифрование и расшифровка текста (с использованием общего пароля).",
@@ -746,17 +946,16 @@ module.exports = {
bookmarkFilterRecent: "НЕДАВНИЕ",
bookmarkCreateButton: "Создать закладку",
bookmarkUpdateButton: "Обновить",
- bookmarkDeleteButton: "Удалить",
bookmarkAddFavoriteButton: "В избранное",
bookmarkRemoveFavoriteButton: "Из избранного",
bookmarkUrlLabel: "Ссылка",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "Описание",
bookmarkDescriptionPlaceholder: "Необязательно",
bookmarkTagsLabel: "Теги",
bookmarkTagsPlaceholder: "Введите теги через запятую",
bookmarkLastVisitLabel: "Последний визит",
- bookmarkSearchPlaceholder: "Искать URL, теги, категорию, автора...",
+ bookmarkSearchPlaceholder: "Поиск в Закладки...",
bookmarkSortRecent: "Новейшие",
bookmarkSortOldest: "Старейшие",
bookmarkSortTop: "Больше голосов",
@@ -795,7 +994,7 @@ module.exports = {
videoDescriptionPlaceholder: "Необязательно",
videoNoFile: "Видеофайл не указан",
noVideos: "Нет доступных видео.",
- videoSearchPlaceholder: "Искать название, теги, автора...",
+ videoSearchPlaceholder: "Поиск в Видео...",
videoSortRecent: "Новейшие",
videoSortOldest: "Старейшие",
videoSortTop: "Больше голосов",
@@ -818,7 +1017,6 @@ module.exports = {
documentFilterFavorites: "ИЗБРАННОЕ",
documentCreateButton: "Загрузить документ",
documentUpdateButton: "Обновить",
- documentDeleteButton: "Удалить",
documentAddFavoriteButton: "В избранное",
documentRemoveFavoriteButton: "Из избранного",
documentMessageAuthorButton: "ЛС",
@@ -831,7 +1029,7 @@ module.exports = {
documentDescriptionPlaceholder: "Необязательно",
documentNoFile: "Нет файла.",
noDocuments: "Нет доступных документов.",
- documentSearchPlaceholder: "Искать название, теги, описание, автора...",
+ documentSearchPlaceholder: "Поиск в Документы...",
documentSortRecent: "Новейшие",
documentSortOldest: "Старейшие",
documentSortTop: "Больше голосов",
@@ -852,19 +1050,19 @@ module.exports = {
audioFilterTop: "ЛУЧШИЕ",
audioCreateButton: "Загрузить аудио",
audioUpdateButton: "Обновить",
- audioDeleteButton: "Удалить",
audioAddFavoriteButton: "В избранное",
audioRemoveFavoriteButton: "Из избранного",
audioFileLabel: "Выберите аудиофайл (.mp3, .wav, .ogg)",
audioTagsLabel: "Теги",
audioTagsPlaceholder: "Введите теги через запятую",
+ tagsPlaceholder: "Введите теги через запятую",
audioTitleLabel: "Название",
audioTitlePlaceholder: "Необязательно",
audioDescriptionLabel: "Описание",
audioDescriptionPlaceholder: "Необязательно",
audioNoFile: "Аудиофайл не указан",
noAudios: "Нет доступных аудио.",
- audioSearchPlaceholder: "Искать название, теги, автора...",
+ audioSearchPlaceholder: "Поиск в Аудио...",
audioSortRecent: "Новейшие",
audioSortOldest: "Старейшие",
audioSortTop: "Больше голосов",
@@ -876,7 +1074,7 @@ module.exports = {
audioFilterFavorites: "ИЗБРАННОЕ",
favoritesTitle: "Избранное",
favoritesDescription: "Весь ваш избранный контент в одном месте.",
- favoritesSearchPlaceholder: "Поиск в избранном...",
+ favoritesSearchPlaceholder: "Поиск в Избранное...",
favoritesFilterAll: "ВСЕ",
favoritesFilterRecent: "НЕДАВНИЕ",
favoritesFilterAudios: "АУДИО",
@@ -888,13 +1086,12 @@ module.exports = {
favoritesFilterChats: "ЧАТЫ",
favoritesFilterCalendars: "КАЛЕНДАРИ",
favoritesFilterVideos: "ВИДЕО",
- favoritesRemoveButton: "Убрать из избранного",
favoritesNoItems: "Пока нет избранного.",
yourContacts: "Ваши контакты",
allInhabitants: "Жители",
allCVs: "Резюме",
discoverPeople: "Находите жителей в вашей сети.",
- searchInhabitantsPlaceholder: "ФИЛЬТР жителей ПО ИМЕНИ...",
+ searchInhabitantsPlaceholder: "Поиск в Жители...",
filterLocation: "ФИЛЬТР жителей ПО МЕСТОПОЛОЖЕНИЮ...",
filterLanguage: "ФИЛЬТР жителей ПО ЯЗЫКУ...",
filterSkills: "ФИЛЬТР жителей ПО НАВЫКАМ...",
@@ -918,7 +1115,6 @@ module.exports = {
topSectionTitle: "ТОП",
blockedLabel: "Заблокированный пользователь",
inhabitantviewDetails: "Подробнее",
- cvVisitButton: "Открыть резюме",
keepReading: "Продолжить чтение...",
oasisId: "ID",
noInhabitantsFound: "Жители пока не найдены.",
@@ -935,6 +1131,18 @@ module.exports = {
parliamentFilterLeaders: "ЛИДЕРЫ",
parliamentFilterRules: "ПРАВИЛА",
parliamentGovernmentCard: "Текущее правительство",
+ parliamentSeatsGovernment: "Правительство",
+ parliamentSeatsOpposition: "Оппозиция",
+ parliamentSeatsAbstention: "Воздержались",
+ parliamentSeatsQuorum: "Кворум выборов",
+ parliamentSeatsPass: "Порог одобрения",
+ parliamentSeatsByElection: "По выборам",
+ parliamentSeatsByHouses: "По домам LARP",
+ parliamentSeatsSeats: "мест",
+ parliamentSeatsSeat: "место",
+ parliamentSeatsLeader: "Лидер",
+ parliamentSeatsVotesFor: "голоса за",
+ parliamentSeatsNoHouse: "Без дома",
parliamentActorInPowerInhabitant: 'ПРАВЯЩИЙ ЖИТЕЛЬ',
parliamentActorInPowerTribe: 'ПРАВЯЩЕЕ ПЛЕМЯ',
parliamentHistoricalGovernmentsTitle: 'ПРАВИТЕЛЬСТВА',
@@ -1002,6 +1210,7 @@ module.exports = {
parliamentTimeRemaining: "Оставшееся время",
parliamentElectionsStatusTitle: "Следующее правительство",
parliamentProposalDeadlineLabel: "Крайний срок",
+ parliamentViewReport: "Посмотреть отчёт",
parliamentProposalTimeLeft: "Осталось времени",
parliamentRulesTitle: "Как работает Парламент",
parliamentRulesIntro: "Выборы проводятся каждые 2 месяца; кандидатуры подаются непрерывно и сбрасываются при выборе правительства.",
@@ -1016,6 +1225,7 @@ module.exports = {
parliamentRulesLaws: "Когда законопроект набирает необходимый порог, он становится Законом и появляется на вкладке «Законы» с датой принятия.",
parliamentRulesHistorical: "На вкладке «История» вы можете увидеть каждый цикл правления и данные о его управлении.",
parliamentRulesLeaders: "На вкладке «Лидеры» вы можете увидеть рейтинг жителей/племён, которые правили (или выдвигались), отсортированный по эффективности.",
+ parliamentRulesHemicycle: "Полукруг даёт одно место каждому жителю: блок правительства (избиратели победившей кандидатуры и лидер), по блоку оппозиции на каждую другую кандидатуру цикла и воздержавшиеся. Пунктирные отметки показывают кворум выборов (25 % от переписи) и порог одобрения текущего метода. «По домам LARP» раскрашивает те же места по домам.",
parliamentProposalVoteStatusLabel: "Статус голосования",
parliamentProposalOnTrackYes: "Порог достигнут",
parliamentProposalOnTrackNo: "Ниже порога",
@@ -1029,6 +1239,7 @@ module.exports = {
courtsCaseFormTitle: "Открыть дело",
courtsCaseRespondent: "Обвиняемый / Ответчик",
courtsCaseRespondentPh: "Oasis ID (@...) или название племени",
+ courtsCaseSubjectPlaceholder: "Тема или краткое описание",
courtsCaseMethod: "Метод разрешения",
courtsCaseSubmit: "Подать дело",
courtsNominateJudge: "Выдвинуть судью",
@@ -1062,15 +1273,30 @@ module.exports = {
courtsMethodDICTATOR: "Диктатор",
courtsMethodPOPULAR: "Народный",
courtsMethodKARMATOCRACY: "Карматократия",
+ courtsCaseType: "Тип дела",
+ courtsPresetMinorConflict: "Незначительный конфликт",
+ courtsPresetModerateConflict: "Умеренный конфликт",
+ courtsPresetSevereConflict: "Серьёзный конфликт",
+ courtsPresetHarassment: "Домогательства или злоупотребления",
+ courtsPresetContentModeration: "Модерация контента",
+ courtsPresetBanRestriction: "Бан или ограничение",
+ courtsPresetGovernanceDispute: "Спор об управлении",
+ courtsStatusOPEN: "Открыто",
+ courtsStatusIN_PROGRESS: "В процессе",
+ courtsStatusDECIDED: "Решено",
+ courtsStatusCLOSED: "Закрыто",
+ courtsStatusSOLVED: "Урегулировано",
+ courtsStatusUNSOLVED: "Не урегулировано",
+ courtsStatusDISCARDED: "Отклонено",
courtsRulesTitle: "Как работают Суды",
courtsRulesIntro: "Суды — это общественный процесс разрешения конфликтов и содействия восстановительному правосудию. Приоритет отдаётся диалогу, чётким доказательствам и соразмерным мерам.",
courtsRulesLifecycle: "Процесс: 1) Открытие дела 2) Выбор метода 3) Представление доказательств 4) Слушание и обсуждение 5) Вердикт и средства защиты 6) Исполнение и закрытие 7) Апелляция (при необходимости).",
- courtsRulesRoles: "Обвинитель: открывает дело. Защита: обвиняемое лицо или племя. Метод: механизм, выбранный сообществом для содействия, оценки доказательств и вынесения вердикта. Свидетель: предоставляет показания или доказательства. Посредники: нейтральные лица, приглашённые обвинителем и/или защитой, имеющие доступ ко всем деталям, которые помогают деэскалировать конфликт и совместно выработать соглашения.",
+ courtsRulesRoles: "Обвинитель: открывает дело. Защита: обвиняемый житель или племя. Метод: механизм, выбранный сообществом для содействия, оценки доказательств и вынесения вердикта. Свидетель: предоставляет показания или доказательства. Посредники: нейтральные жители, приглашённые обвинителем и/или защитой, имеющие доступ ко всем деталям, которые помогают деэскалировать конфликт и совместно выработать соглашения.",
courtsRulesEvidence: "Описание до 1000 символов. Прикрепляйте релевантные и законные изображения, аудио, видео и PDF-документы. Не передавайте конфиденциальные личные данные без согласия.",
courtsRulesDeliberation: "Слушания могут быть публичными или закрытыми. Судьи обеспечивают уважение, запрашивают уточнения и могут отклонить нерелевантные или незаконные материалы.",
courtsRulesVerdict: "Приоритет отдаётся восстановлению: извинения, соглашения о медиации, модерация контента, временные ограничения или другие соразмерные меры. Обоснование должно быть зафиксировано.",
courtsRulesAppeals: "Апелляция: допускается при наличии новых доказательств или явной процедурной ошибки. Должна быть подана в течение 7 дней, если не указано иное.",
- courtsRulesPrivacy: "Уважайте конфиденциальность и безопасность. Доксинг, ненависть или угрозы удаляются. Судьи могут редактировать или засекречивать части записи для защиты людей в зоне риска.",
+ courtsRulesPrivacy: "Уважайте конфиденциальность и безопасность. Доксинг, ненависть или угрозы удаляются. Судьи могут редактировать или засекречивать части записи для защиты жителей в зоне риска.",
courtsRulesMisconduct: "Преследование, манипуляции или фабрикация доказательств могут привести к немедленному негативному решению.",
courtsRulesGlossary: "Дело: запись о конфликте. Доказательство: материалы, подтверждающие утверждения. Вердикт: решение с мерой пресечения. Апелляция: запрос на пересмотр вердикта.",
courtsFilterActions: "ДЕЙСТВИЯ",
@@ -1086,12 +1312,16 @@ module.exports = {
exploreTrending: "Изучайте самый популярный контент в вашей сети.",
votesButton: "ГОЛОСОВАНИЯ",
shopProductButton: "МАГАЗИН",
+ podcastButton: "ПОДКАСТ",
+ podcastEpisodeButton: "ЭПИЗОД",
+ campaignButton: "КАМПАНИЯ",
+ logisticsRouteButton: "МАРШРУТ",
trendingTotalOpinions: "Всего мнений",
trendingNoContentMessage: "Трендов пока нет.",
trendingTotalCount: "Всего",
tasksTitle: "Задачи",
tasksDescription: "Находите и управляйте задачами в вашей сети.",
- taskSearchPlaceholder: "Поиск задач...",
+ taskSearchPlaceholder: "Поиск в Задачи...",
taskTitleLabel: "Название",
taskDescriptionLabel: "Описание",
taskStartTimeLabel: "Время начала",
@@ -1120,6 +1350,7 @@ module.exports = {
taskUpdateButton: "Обновить",
taskDeleteButton: "Удалить",
taskFilterAll: "ВСЕ",
+ taskFilterRecent: "НЕДАВНИЕ",
taskFilterMine: "МОИ",
taskFilterOpen: "ОТКРЫТЫЕ",
taskFilterInProgress: "В РАБОТЕ",
@@ -1147,14 +1378,13 @@ module.exports = {
eventUpcomingDates: "Ближайшие даты",
eventsTitle: "События",
eventsDescription: "Находите и управляйте событиями в вашей сети.",
- eventSearchPlaceholder: "Поиск событий...",
+ eventSearchPlaceholder: "Поиск в События...",
eventPrice: "Цена",
eventStatus: "Статус",
eventAllSectionTitle: "События",
eventMineSectionTitle: "Ваши события",
eventCreateSectionTitle: "Создать событие",
eventUpdateSectionTitle: "Обновить событие",
- eventDeleteButton: "Удалить",
eventCreateButton: "Создать событие",
eventAddToCalendar: "Добавить в календарь",
eventVisitCalendar: "Открыть календарь",
@@ -1196,6 +1426,7 @@ module.exports = {
eventDate: "Дата",
eventAttendButton: "Принять участие",
eventFilterAll: "ВСЕ",
+ eventFilterRecent: "НЕДАВНИЕ",
eventFilterMine: "МОИ",
eventFilterToday: "СЕГОДНЯ",
eventFilterWeek: "ЭТА НЕДЕЛЯ",
@@ -1222,7 +1453,7 @@ module.exports = {
tagsFilterTop: "ЛУЧШИЕ",
tagsFilterCloud: "ОБЛАКО",
tagsNoItems: "Нет доступных тегов.",
- tagsSearchPlaceholder: "Поиск тегов...",
+ tagsSearchPlaceholder: "Поиск в Теги...",
tagsTableHeaderTag: "ТЕГ/ССЫЛКА:",
tagsTableHeaderCount: "СЧЁТЧИК:",
transfersTitle: "Переводы",
@@ -1230,8 +1461,11 @@ module.exports = {
transfersFrom: "От",
transfersTo: "Кому",
transfersFilterAll: "ВСЕ",
+ transfersFilterRecent: "НЕДАВНИЕ",
transfersFilterMine: "МОИ",
- transfersFilterUBI: "UBI",
+ transfersFilterMinePending: "ОЖИДАЮТ",
+ transfersFilterMineConfirmed: "ПОДПИСАННЫЕ",
+ transfersFilterUBI: "ББД",
transfersFilterMarket: "РЫНОК",
transfersFilterTop: "ЛУЧШИЕ",
transfersFilterPending: "ОЖИДАЮЩИЕ",
@@ -1245,7 +1479,6 @@ module.exports = {
transfersCategoryEconomic: "Экономический",
transfersCategoryTime: "Время",
transfersCategoryTrust: "Доверие",
- transfersCategoryApply: "Применить",
transfersUnitEco: "ECO",
transfersUnitHours: "ч",
transfersUnitTrust: "доверие",
@@ -1275,7 +1508,7 @@ module.exports = {
transfersDiscardedSectionTitle: "Отменённые переводы",
transfersCreateSectionTitle: "Создать перевод",
transfersAllSectionTitle: "Переводы",
- transfersSearchPlaceholder: "Искать концепцию, теги, пользователей...",
+ transfersSearchPlaceholder: "Поиск в Переводы...",
transfersMinAmountLabel: "Мин. сумма",
transfersMaxAmountLabel: "Макс. сумма",
transfersSortRecent: "Новейшие",
@@ -1297,6 +1530,7 @@ module.exports = {
voteErrorTitle: "Проверьте форму",
voteErrorDeadlineMin: "Срок должен быть не менее {days} дней от текущего момента.",
voteErrorGeneric: "Не удалось сохранить голосование.",
+ voteLocked: "За это голосование уже голосовали или оставляли мнения, или оно принадлежит Парламенту или Судам: его больше нельзя изменить или удалить.",
voteUpdateButton: "Обновить",
voteDeleteButton: "Удалить",
voteOptionYes: "ЗА",
@@ -1306,6 +1540,7 @@ module.exports = {
voteFollowMajority: "СЛЕДОВАТЬ БОЛЬШИНСТВУ",
voteNotInterested: "НЕ ИНТЕРЕСНО",
voteFilterAll: "ВСЕ",
+ voteFilterRecent: "НЕДАВНИЕ",
voteFilterMine: "МОИ",
voteFilterOpen: "ОТКРЫТЫЕ",
voteFilterClosed: "ЗАКРЫТЫЕ",
@@ -1321,7 +1556,6 @@ module.exports = {
voteTags: "Теги",
voteOpinions: "Мнения",
novotes: "Нет доступных голосований.",
- voteBy: "Автор",
voteCreatedAt: "Создано",
voteNoQuestion: "Вопрос не указан",
voteUnknownCreator: "Неизвестный автор",
@@ -1331,6 +1565,7 @@ module.exports = {
voteCommentsForumButton: 'Открыть обсуждение',
voteCommentsSectionTitle: 'Открыть обсуждение',
voteNoCommentsYet: 'Комментариев пока нет. Будьте первым.',
+ commentsGoToLast: "Перейти к последнему комментарию",
voteNewCommentPlaceholder: 'Напишите ваш комментарий...',
voteNewCommentButton: 'Отправить комментарий',
voteNewCommentLabel: 'Добавить комментарий',
@@ -1341,6 +1576,8 @@ module.exports = {
cvNameLabel: "Полное имя",
cvDescriptionLabel: "Описание",
cvPhotoLabel: "Фото",
+ cvPdfLabel: "Резюме (PDF)",
+ cvVisitButton: "Открыть резюме",
cvPersonalExperiencesLabel: "Личный опыт",
cvPersonalSkillsLabel: "Личные навыки (через запятую)",
cvOasisExperiencesLabel: "Опыт вклада в Oasis",
@@ -1370,9 +1607,9 @@ module.exports = {
cvNoCV: "Резюме не найдено.",
blogSubject: "Тема",
blogMessage: "Сообщение",
- blogImage: "Загрузить медиа (макс: 50MB)",
+ blogImage: "Загрузить медиа (макс: 75MB)",
blogMedia: "Вложения (до 8 изображений и одно видео)",
- blogPublish: "Предварительный просмотр",
+ blogPublish: "Опубликовать",
pollsTitle: "Опросы",
dataTitle: "Совпадения",
dataDescription: "Исследуйте и визуализируйте совпадения в вашей сети.",
@@ -1391,12 +1628,23 @@ module.exports = {
dataKindTasks: "ЗАДАЧИ",
dataKindReports: "ОТЧЁТЫ",
dataKindVotes: "ГОЛОСОВАНИЯ",
- dataSearchPlaceholder: "Поиск по перекрёстным данным...",
+ dataSearchPlaceholder: "Поиск в Совпадения...",
dataCohesionTitle: "Коэффициент сплочённости (CC)",
dataCcShort: "CC",
dataCohesionHint: "Средняя близость между всем, что опубликовано в сети.",
dataAffinity: "Сходство",
dataCommonTerms: "Ключевое слово",
+ dataReasonFollowing: "Вы поддерживаете этого жителя",
+ dataReasonTribe: "Состоит с вами в одном племени",
+ dataReasonPinned: "Совпадает с тем, что вы закрепили",
+ dataReasonCv: "Совпадает с навыками из вашего резюме",
+ dataReasonContent: "Связано с тем, что вы публикуете",
+ dataReasonRelated: "Связано с вашими интересами",
+ dataReasonAlike: "Опубликовано близким вам по духу жителем",
+ dataReasonSupportsYou: "Поддерживает вас",
+ dataReasonMutual: "Взаимная поддержка",
+ dataReasonRated: "Высоко оценено сетью",
+ dataReasonNear: "Рядом с вами",
dataStatPeople: "Резюме",
dataStatConnected: "Связаны",
dataStatSkills: "Навыки",
@@ -1449,7 +1697,7 @@ module.exports = {
pollStatusLabel: "Статус",
pollStatusOpen: "ОТКРЫТ",
pollStatusClosed: "ЗАКРЫТ",
- pollSearchPlaceholder: "Поиск опросов...",
+ pollSearchPlaceholder: "Поиск в Опросы...",
pollsNoItems: "Опросы не найдены.",
viewPoll: "Смотреть опрос",
pollChatCreate: "Создать опрос",
@@ -1462,7 +1710,7 @@ module.exports = {
blogFilterFavorites: "ИЗБРАННОЕ",
blogFilterTop: "ТОП",
blogCreateButton: "Создать блог",
- blogSearchPlaceholder: "Поиск блогов...",
+ blogSearchPlaceholder: "Поиск в Блоги...",
blogComments: "Комментарии",
blogAllowComments: "Разрешить комментарии",
blogCommentsClosed: "Автор закрыл комментарии к этому блогу.",
@@ -1475,12 +1723,11 @@ module.exports = {
forumCreateButton: "Создать форум",
forumCreateSectionTitle: "Создать форум",
forumDescription: "Общайтесь открыто с другими жителями вашей сети.",
- forumSearchPlaceholder: "Поиск форумов...",
+ forumSearchPlaceholder: "Поиск в Форумы...",
forumFilterAll: "ВСЕ",
forumFilterMine: "МОИ",
forumFilterRecent: "НЕДАВНИЕ",
forumFilterTop: "ТОП",
- forumDeleteButton: "Удалить",
forumParticipants: "участники",
forumMessages: "сообщения",
forumMessageLabel: "Сообщение",
@@ -1507,7 +1754,6 @@ module.exports = {
imageFilterGallery: "ГАЛЕРЕЯ",
imageCreateButton: "Загрузить изображение",
imageUpdateButton: "Обновить",
- imageDeleteButton: "Удалить",
imageAddFavoriteButton: "Добавить в избранное",
imageRemoveFavoriteButton: "Удалить из избранного",
imageFileLabel: "Выбрать файл изображения (.jpeg, .jpg, .png, .gif)",
@@ -1519,18 +1765,20 @@ module.exports = {
imageDescriptionPlaceholder: "Необязательно",
imageNoFile: "Файл изображения не предоставлен",
noImages: "Изображений нет.",
- imageSearchPlaceholder: "Поиск по названию, тегам, описанию, автору...",
+ imageSearchPlaceholder: "Поиск в Изображения...",
imageSortRecent: "Самые новые",
imageSortOldest: "Самые старые",
imageSortTop: "С наибольшим рейтингом",
imageSearchButton: "Поиск",
imageUpdatedAt: "Обновлено",
imageNoMatch: "Изображения не найдены.",
+ feedSearchPlaceholder: "Поиск в Лента...",
feedTitle: "Лента",
createFeedTitle: "Создать пост",
createFeedButton: "Отправить пост!",
feedPlaceholder: "Что происходит? (макс 280 символов)",
ALLButton: "Посты",
+ RECENTButton: "НЕДАВНИЕ",
MINEButton: "Ваши посты",
TODAYButton: "СЕГОДНЯ",
TOPButton: "Топ постов",
@@ -1545,7 +1793,7 @@ module.exports = {
alreadyRefeeded: "Вы уже переопубликовали это.",
activityTitle: "Активность",
yourActivity: "Ваша активность",
- globalActivity: "Глобальная активность",
+ globalActivity: "Активность",
activityList: "Активность",
activityDesc: "Смотрите последнюю активность в вашей сети.",
allButton: "ВСЕ",
@@ -1560,7 +1808,8 @@ module.exports = {
meme: "Мем",
typeRecent: "НЕДАВНИЕ",
typeTop: "ТОП",
- typePost: "БЛОГИ",
+ typePost: "БЛОГ",
+ activityUpdateLabel: "ОБНОВЛЕНИЕ",
typeTribe: "ПЛЕМЕНА",
typeLarp: "L.A.R.P.",
typeInhabitants: "ЖИТЕЛИ",
@@ -1695,7 +1944,7 @@ module.exports = {
courtsNoCases: "Дел нет.",
reportsTitle: "Отчёты",
reportsDescription: "Управляйте отчётами вашей сети и следите за ними.",
- reportsSearchPlaceholder: "Поиск отчётов...",
+ reportsSearchPlaceholder: "Поиск в Отчёты...",
reportsFilterAll: "ВСЕ",
reportsFilterRecent: "НОВЫЕ",
reportsFilterTop: "ТОП",
@@ -1743,7 +1992,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "Отчёты на рассмотрении",
reportsResolvedSectionTitle: "Решённые отчёты",
reportsInvalidSectionTitle: "Недействительные отчёты",
- reportsTemplateSectionTitle: "Шаблон отчёта",
reportsBugTemplateTitle: "Детали воспроизведения (Ошибки)",
reportsFeatureTemplateTitle: "Детали (Функции)",
reportsAbuseTemplateTitle: "Детали (Злоупотребления)",
@@ -1803,17 +2051,15 @@ module.exports = {
tribeGallerySectionTitle: "Галерея племён",
tribeRecentSectionTitle: "Недавние племена",
tribeTopSectionTitle: "Популярные племена",
- tribeviewTribeButton: "Посетить племя",
- tribeviewSubTribeButton: "Посетить под-племя",
tribeRootLabel: "КОРЕНЬ",
tribeDescription: "Исследуйте или создавайте племена в вашей сети.",
tribeMainTribeLabel: "ГЛАВНОЕ ПЛЕМЯ",
tribeCreateButton: "Создать племя",
tribeUpdateButton: "Обновить",
tribeDeleteButton: "Удалить",
- tribeImageLabel: "Загрузить медиа (макс: 50MB)",
+ tribeImageLabel: "Загрузить медиа (макс: 75MB)",
tribeTitleLabel: "Название",
- searchTribesPlaceholder: "ФИЛЬТР племён ПО ИМЕНИ …",
+ searchTribesPlaceholder: "Поиск в Племена...",
tribeTitlePlaceholder: "Название племени",
tribeDescriptionLabel: "Описание",
tribeDescriptionPlaceholder: "Опишите это племя",
@@ -1826,6 +2072,15 @@ module.exports = {
tribeIsAnonymousLabel: "СТАТУС",
tribeMembersCount: "Участники",
tribeEnterInvite: "ВВЕСТИ КОД",
+ subscriptionTitle: "Подписки",
+ subscriptionOn: "Подписан",
+ subscriptionOff: "Не подписан",
+ subscriptionSubscribe: "Подписаться",
+ subscriptionUnsubscribe: "Отписаться",
+ subscriptionSubscribers: "Подписчики",
+ pmListLabel: "Отправить",
+ pmListNone: "— Без списка —",
+ pmListNoSubscribers: "Нет подписчиков",
tribeLeaveButton: "ПОКИНУТЬ",
tribePublic: "ПУБЛИЧНОЕ",
tribePrivate: "ЧАСТНОЕ",
@@ -1858,16 +2113,16 @@ module.exports = {
tribeSectionVideos: "ВИДЕО",
tribeSectionDocuments: "ДОКУМЕНТЫ",
tribeSectionBookmarks: "ЗАКЛАДКИ",
- tribeSectionMaps: "MAPS",
- tribeSectionPads: "PADS",
- tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionMaps: "КАРТЫ",
+ tribeSectionPads: "ПАДЫ",
+ tribeSectionChats: "ЧАТЫ",
+ tribeSectionCalendars: "КАЛЕНДАРИ",
+ tribePadCreate: "Создать пад",
+ tribeChatCreate: "Создать чат",
+ tribeCalendarCreate: "Создать календарь",
+ tribePadsEmpty: "Пока нет падов.",
+ tribeChatsEmpty: "Пока нет чатов.",
+ tribeCalendarsEmpty: "Пока нет календарей.",
tribeInhabitantsEmpty: "В этом племени пока нет жителей.",
tribeEventCreate: "Создать событие",
tribeEventsEmpty: "Событий пока нет.",
@@ -1922,9 +2177,14 @@ module.exports = {
tribeMediaTypeDocument: "Документ",
tribeMediaTypeBookmark: "Закладка",
tribeContentDelete: "УДАЛИТЬ",
+ tribeReachTribe: "ПЛЕМЯ",
+ tribeReachNotice: "OASIS показывает это всем жителям, а CLEARNET — ещё и в открытом вебе. Открытие оставляет читаемую копию вне племени: возврат к ПЛЕМЯ скрывает её, но уже распространённые копии удалить нельзя.",
+ tribeReachPrivate: "Содержимое частного племени может оставаться только внутри племени.",
+ tribeReachOpenedBy: "Открыл(а)",
+ tribeReachChange: "Где публикуется",
tribeInviteCodeText: "Код приглашения: ",
oasisVersionLabel: "Версия Oasis",
- tribeInviteCodeHint: "Поделитесь этим кодом с тем, кого хотите пригласить. Он может присоединиться через /invites → Tribes.",
+ tribeInviteCodeHint: "Поделитесь этим кодом с тем, кого хотите пригласить. Он может присоединиться через /invites.",
tribeStatusOpen: "ОТКРЫТОЕ",
tribeStatusClosed: "ЗАКРЫТОЕ",
tribeStatusInProgress: "В ПРОЦЕССЕ",
@@ -1964,7 +2224,7 @@ module.exports = {
tribeSearchMinChars: "Введите не менее 2 символов для поиска.",
agendaTitle: "Повестка дня",
agendaDescription: "Здесь вы можете найти все назначенные вам элементы.",
- agendaSearchPlaceholder: "Поиск в повестке...",
+ agendaSearchPlaceholder: "Поиск в Повестка дня...",
agendaFilterAll: "ВСЕ",
agendaFilterToday: "СЕГОДНЯ",
agendaFilterUpcoming: "БЛИЖАЙШИЕ",
@@ -1985,6 +2245,7 @@ module.exports = {
agendaNoItems: "Назначений не найдено.",
agendaDiscardButton: "Отклонить",
agendaRestoreButton: "Восстановить",
+ agendaRemoveButton: "Убрать",
agendaMembersCount: "Участники",
agendaLocationLabel: "Местоположение",
agendaYes: "ДА",
@@ -2048,8 +2309,8 @@ module.exports = {
pmComposeTitle: "Отправить сообщение",
pmRecipients: "Получатели",
pmRecipientsHint: "Введите Oasis ID через запятую",
- pmLimitsHint: "До 7 получателей на сообщение.",
- pmTextPlaceholder: "Текст ограничен 7000 символами.",
+ pmLimitsHint: "До 7 жителей на сообщение.",
+ pmTextPlaceholder: "Напишите ваше сообщение.",
pmSubject: "Тема",
pmSubjectHint: "Введите тему сообщения",
pmText: "Сообщение",
@@ -2098,7 +2359,7 @@ module.exports = {
inboxProjectPledgedTitle: "Новый взнос в ваш проект",
pmHasPledged: "внёс",
pmToYourProject: "в ваш проект",
- blockchain: "BlockExplorer",
+ blockchain: "Обозреватель блоков",
blockchainDescription: "Исследуйте и визуализируйте блоки в блокчейне.",
blockchainNoBlocks: "Блоков в блокчейне не найдено.",
blockchainStatsTitle: "Статистика",
@@ -2119,24 +2380,24 @@ module.exports = {
visitContent: "Открыть контент",
favoriteAdd: "Закрепить в избранном",
pmContentTooltip: "Отправить личное сообщение",
+ phoneCallTooltip: "Позвонить",
favoriteRemove: "Убрать из избранного",
reportContent: "Пожаловаться на контент",
banking: "Банкинг",
bankingTitle: "Банкинг",
- bankingDescription: "Экономика ECOin: баланс, базовый доход, налоги и ценность промышленности.",
+ bankingDescription: "Коллективная экономика ECOin.",
bankOverview: "Обзор",
bankEpochs: "Эпохи",
bankRules: "Правила",
pending: "В ожидании",
closed: "Закрыто",
- bankViewTx: "Просмотр транзакции",
bankClaimNow: "Получить сейчас",
- bankClaimUBI: "Получить UBI!",
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: "Получить UBI",
+ bankClaimAndPay: "Получить и оплатить",
+ bankClaimedPending: "Заявка в обработке...",
+ bankStatusClaimed: "Получено",
+ bankStatusExpired: "Истекло",
+ bankPubOnly: "Операция только для PUB",
bankEpoch: "Эпоха",
bankPool: "Пул (эта эпоха)",
bankWeightsSum: "Сумма весов",
@@ -2154,8 +2415,8 @@ module.exports = {
bankViewEpoch: "Просмотр эпохи",
bankYourIndustryBalance: "Ваша доля в промышленности",
bankYourUbiMonth: "Ваш БОД (в этом месяце)",
- bankYourFundsMonth: "Ваши средства (в этом месяце)",
- bankIndustryBalance: "Промышленное производство (оценка)",
+ bankYourFundsMonth: "Итого средства",
+ bankIndustryBalance: "Промышленное производство",
bankUserBalance: "Ваш баланс",
bankAddresses: "Адреса",
bankNoAddresses: "Адресов не найдено.",
@@ -2163,6 +2424,10 @@ module.exports = {
bankAddress: "Адрес",
bankAddAddressTitle: "Добавить адрес ECOIN",
bankAddAddressUser: "Oasis ID",
+ bankAddAddressLabel: "Метка (необязательно)",
+ bankAddAddressLabelPlaceholder: "Кошелёк Боба, магазин Алисы…",
+ bankAddAddressUserOptional: "Oasis ID (необязательно)",
+ bankAddressUnnamed: "Адрес без имени",
bankAddAddressAddress: "Адрес ECOIN",
bankAddAddressSave: "Сохранить",
bankAddressAdded: "Адрес добавлен",
@@ -2179,11 +2444,11 @@ module.exports = {
bankAddressSource: "Источник",
bankAddressDeleteConfirm: "Удалить этот адрес?",
bankLocal: "Локальный",
- bankFromOasis: "Oasis",
+ bankFromOasis: "Сеть",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "НЕТ СРЕДСТВ!",
bankUbiAvailableOk: "ДОСТУПНО!",
- bankUbiAvailability: "БОД (сеть)",
+ bankUbiAvailability: "ББД",
bankAlreadyClaimedThisMonth: "Уже получено в этом месяце",
bankUbiThisMonth: "БОД (этот месяц)",
bankUbiLastClaimed: "БОД (последнее получение)",
@@ -2213,6 +2478,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "Шифруется при передаче",
shopAddFavorite: "Добавить в избранное",
shopRemoveFavorite: "Убрать из избранного",
shopOpen: "ОТКРЫТ",
@@ -2220,6 +2486,13 @@ module.exports = {
shopMakePrivate: "СДЕЛАТЬ ПРИВАТНОЙ (E2E)",
shopMakePublic: "СДЕЛАТЬ ПУБЛИЧНОЙ",
shopProducts: "Товары",
+ shopFilterAll: "ВСЕ",
+ shopFilterRecent: "НЕДАВНИЕ",
+ shopFilterMine: "МОИ",
+ shopFilterTop: "ТОП",
+ shopFilterProducts: "ТОВАРЫ",
+ shopFilterPrices: "ЦЕНЫ",
+ shopFilterFavorites: "ИЗБРАННОЕ",
shopProductAdd: "Добавить товар",
shopProductTitle: "Товар",
shopProductUpdate: "Обновить товар",
@@ -2247,7 +2520,7 @@ module.exports = {
marketVisitItem: "ОТКРЫТЬ ТОВАР",
shopStatus: "СТАТУС",
shopCreatedAt: "СОЗДАН",
- shopSearchPlaceholder: "Поиск магазинов...",
+ shopSearchPlaceholder: "Поиск в Магазины...",
shopUrl: "URL",
shopLocation: "Местоположение",
shopTags: "Теги",
@@ -2257,33 +2530,35 @@ module.exports = {
shopTitlePlaceholder: "Название вашего магазина",
shopDescriptionPlaceholder: "Подробное описание вашего магазина",
shopLocationPlaceholder: "Город, Страна",
- shopTagsPlaceholder: "тег1, тег2, тег3",
+ shopTagsPlaceholder: "Введите теги через запятую",
mapTitlePlaceholder: "Название карты",
shopProductFeatured: "Рекомендуемый товар",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "Отправить на рынок",
typeShop: "МАГАЗИНЫ",
typeShopProduct: "ТОВАР МАГАЗИНА",
bankExchange: "Обмен",
bankExchangeCurrentValue: "Стоимость ECOin (1ч)",
- bankTotalSupply: "Общий объём ECOin",
- bankEcoinHours: "Эквивалент ECOin во времени",
+ bankTotalSupply: "Общее предложение ECOin",
+ bankPubsSupply: "Предложение ECOin в пуле PUB",
+ bankHoldingSupply: "Предложение ECOin вне ББД",
+ bankEcoinHours: "Эквивалент ECOin во времени (1 ECO)",
bankHoursOfWork: "часов",
bankUnitMs: "мс",
bankUnitSeconds: "секунды",
bankUnitMinutes: "минуты",
bankUnitDays: "дни",
bankExchangeNoData: "Данные недоступны",
- bankInflation: "Инфляция ECOin (anual)",
- bankInflationMonthly: "Инфляция ECOin (mensual)",
+ bankInflation: "Инфляция ECOin (годовая)",
+ bankInflationMonthly: "Инфляция ECOin (месячная)",
bankExchangeChartTitle: "Динамика стоимости ECOin со временем",
bankExchangeChartValue: "Стоимость (ECO/ч)",
bankExchangeChartSupply: "Предложение",
bankExchangeChartInflation: "Инфляция %",
bankExchangeChartEmpty: "Пока недостаточно данных — загляните позже",
- bankCurrentSupply: "Текущий объём ECOin",
+ bankCurrentSupply: "Текущее предложение ECOin",
bankingSyncStatus: "Статус ECOin",
bankingSyncStatusSynced: "Синхронизирован",
- bankingSyncStatusOutdated: "Устарел",
+ bankingSyncStatusOutdated: "Не синхронизирован",
statsTitle: "Статистика",
statistics: "Статистика",
statsDescription: "Откройте статистику вашей сети.",
@@ -2293,7 +2568,8 @@ module.exports = {
statsYourOpinions: "Мнения",
statsNetworkContent: "Контент",
statsNetworkOpinions: "Мнения",
- statsEcoWalletLabel: "Кошелёк ECOIN",
+ statsEcoWalletLabel: "Кошелёк ECOin",
+ walletAddressCopyHint: "Нажмите, чтобы выделить, затем скопируйте",
statsEcoWalletNotConfigured: "Не настроен!",
statsBookmark: "Закладки",
statsEvent: "События",
@@ -2316,6 +2592,8 @@ module.exports = {
statsTransfer: "Переводы",
statsAiExchange: "ИИ",
statsPUBs: "PUBs",
+ statsSyncedPeers: "Узлы",
+ statsTotalLabel: "Всего",
statsPost: "Посты",
statsSize: "Итого (размер)",
statsBlockchainSize: "Блокчейн (размер)",
@@ -2366,8 +2644,14 @@ module.exports = {
aiPrompt: "Предоставьте информативный и точный ответ.",
aiConfiguration: "Установить запрос",
aiPromptUsed: "Запрос",
- aiClearHistory: "Очистить историю чата",
- aiServerError: "ИИ не смог ответить. Пожалуйста, попробуйте снова.",
+ aiClearHistory: "Очистить историю",
+ aiServerError: "Я не могу ответить как следует. Попробуйте ещё раз.",
+ aiStatusLoading: "42 загружает модель. Спросите снова через мгновение.",
+ aiThinking: "Думает",
+ aiWaiting: "Ожидание",
+ aiStatusMissingModel: "Модель ИИ не установлена: отсутствует src/AI/oasis-42-1-chat.Q4_K_M.gguf.",
+ aiExportFineTuning: "Экспорт Fine-Tuning",
+ aiFactsTitle: "Данные из вашей сети",
typeAiExchange: "ИИ",
aiApproveTrain: "Добавить в коллективное обучение",
aiRejectTrain: "Не обучать",
@@ -2394,7 +2678,7 @@ module.exports = {
marketFilterDiscarded: "ОТКЛОНЁННЫЕ",
marketFilterRecent: "НЕДАВНИЕ",
marketFilterMyBids: "СТАВКИ",
- marketCreateButton: "Создать товар",
+ marketCreateButton: "Продать что-то",
marketItemType: "Тип",
marketItemTitle: "Название",
marketItemAvailable: "Срок",
@@ -2421,8 +2705,8 @@ module.exports = {
marketItemSeller: "Продавец",
marketNoItems: "Товаров пока нет.",
marketYourBid: "Ваша ставка",
- marketCreateFormImageLabel: "Загрузить медиа (макс: 50MB)",
- marketSearchPlaceholder: "Поиск по названию или тегам",
+ marketCreateFormImageLabel: "Загрузить медиа (макс: 75MB)",
+ marketSearchPlaceholder: "Поиск в Рынок...",
marketMinPriceLabel: "Мин. цена",
marketMaxPriceLabel: "Макс. цена",
marketSortRecent: "Самые новые",
@@ -2488,8 +2772,7 @@ module.exports = {
housingSetClosed: "Сделать недоступным",
housingCreateButton: "Создать место",
housingUpdateButton: "Обновить",
- housingDeleteButton: "Удалить",
- housingSearchPlaceholder: "Поиск мест...",
+ housingSearchPlaceholder: "Поиск в Жильё...",
housingSearchButton: "Искать",
housingMinPrice: "Мин. цена",
housingMaxPrice: "Макс. цена",
@@ -2546,7 +2829,7 @@ module.exports = {
jobLocationPresencial: "На месте",
jobLocationRemote: "Удалённо",
jobVacantsPlaceholder: "Количество позиций",
- jobImage: "Загрузить медиа (макс: 50MB)",
+ jobImage: "Загрузить медиа (макс: 75MB)",
jobTasks: "Задачи",
jobType: "Тип занятости",
jobTime: "Время занятости",
@@ -2568,12 +2851,11 @@ module.exports = {
jobsExchangeSkill: "Запрашиваемый навык в обмен",
jobTimePartial: "Неполная занятость",
jobTimeComplete: "Полная занятость",
- jobsDeleteButton: "УДАЛИТЬ",
jobsUpdateButton: "ОБНОВИТЬ",
jobsFilterApplied: "ПОДАННЫЕ",
jobsAppliedTitle: "Мои заявки",
jobsAppliedBadge: "Подано",
- jobsSearchPlaceholder: "Поиск по названию, тегам, описанию...",
+ jobsSearchPlaceholder: "Поиск в Вакансии...",
jobsMinSalaryLabel: "Мин. зарплата",
jobsMaxSalaryLabel: "Макс. зарплата",
jobsSortRecent: "Самые новые",
@@ -2584,7 +2866,7 @@ module.exports = {
jobsUpdatedAt: "Обновлено",
jobsTagsLabel: "Теги",
noJobsMatch: "Вакансий не найдено.",
- industrySearchPlaceholder: "Поиск фабрик…",
+ industrySearchPlaceholder: "Поиск в Промышленность...",
industryAllSectors: "Все секторы",
industryVisitButton: "Открыть промышленность",
industryAdvanceTo: "Перевести в",
@@ -2658,7 +2940,6 @@ module.exports = {
industryBuildStatus_FAILED: "ПРОВАЛЕНО",
pmBotIndustry: "IndustryBot",
pmBotHousing: "HousingBot",
- pmBotJobs: "JobsBot",
jobsBotMatchTitle: "Вакансия совпадает с вашим резюме",
jobsBotMatchIntro: "Вакансия совпадает с вашим резюме.",
jobsBotMatchJob: "Вакансия",
@@ -2685,7 +2966,7 @@ module.exports = {
industryRulesIntro: "Industry позволяет жителям коллективно владеть средствами производства: Фабрика — это принадлежащая сети мастерская, которой никто не владеет частно.",
industryRulesSteward: "Основатель — управляющий, хранитель, а не владелец: он не может в одиночку продать, приватизировать или распустить Фабрику.",
industryRulesMembership: "Политика членства задаёт способ вступления: Открытая (сразу), Голосованием (принимают голосом участников) или Только по приглашению (сначала должен пригласить участник).",
- industryRulesQuorum: "Кворум — минимальное число участников, которые должны проголосовать, чтобы решение засчиталось, чтобы маленькую Фабрику не решал один человек.",
+ industryRulesQuorum: "Кворум — минимальное число участников, которые должны проголосовать, чтобы решение засчиталось, чтобы маленькую Фабрику не решал один житель.",
industryRulesMajority: "Большинство — доля голосов для принятия (0,5 = половина, 1 = единогласие); решение проходит, когда голоса ЗА достигают хотя бы max(кворум, участники × большинство).",
industryRulesDecisions: "Участники голосуют за приём новых, одобрение сборок и роспуск Фабрики; управляющий не может обойти эти коллективные решения.",
industryRulesBlueprints: "Чертежи — свободные (COPYLEFT) рецепты: входы (материалы, часы труда, навыки) и выход (физический или цифровой продукт), и любой может их форкнуть.",
@@ -2711,6 +2992,7 @@ module.exports = {
modulesIndustryLabel: "Промышленность",
modulesIndustryDescription: "Модуль для коллективного управления средствами производства.",
industryFilterAll: "ВСЕ",
+ industryFilterRecent: "НЕДАВНИЕ",
industryFilterMember: "УЧАСТНИК",
industryFilterBlueprints: "ЧЕРТЕЖИ",
industryFilterBuilds: "ПРОИЗВОДСТВА",
@@ -2719,6 +3001,7 @@ module.exports = {
industryFilterPaused: "НА ПАУЗЕ",
industryFilterDissolved: "РАСПУЩЕННЫЕ",
industryAllTitle: "Промышленность",
+ industryRecentTitle: "Недавние фабрики",
industryMemberTitle: "Фабрики, где я состою",
industryMineTitle: "Мои фабрики",
industryActiveTitle: "Работает",
@@ -2766,7 +3049,7 @@ module.exports = {
industryPolicy_invite: "Только по приглашению",
projectsTitle: "Проекты",
projectsDescription: "Создавайте, финансируйте и следите за проектами сообщества в вашей сети.",
- projectSearchPlaceholder: "Поиск проектов...",
+ projectSearchPlaceholder: "Поиск в Проекты...",
projectCreateProject: "Создать проект",
projectCreateButton: "Создать проект",
projectUpdateButton: "ОБНОВИТЬ",
@@ -2789,7 +3072,7 @@ module.exports = {
projectRecentTitle: "Последние проекты",
projectTopTitle: "Топ по финансированию",
projectTitlePlaceholder: "Название проекта",
- projectImage: "Загрузить медиа (макс: 50MB)",
+ projectImage: "Загрузить медиа (макс: 75MB)",
projectDescription: "Описание",
projectDescriptionPlaceholder: "Расскажите историю и цели…",
projectGoal: "Цель (ECO)",
@@ -2861,15 +3144,13 @@ module.exports = {
modulesModuleName: "Имя",
modulesModuleDescription: "Описание",
modulesModuleStatus: "Статус",
- modulesTotalModulesLabel: "Загруженные модули",
+ modulesTotalModulesLabel: "Всего",
modulesEnabledModulesLabel: "Включённые",
modulesDisabledModulesLabel: "Отключённые",
modulesInvitesLabel: "Приглашения",
modulesInvitesDescription: "Модуль для управления и применения кодов приглашений.",
modulesWalletLabel: "Кошелёк",
modulesWalletDescription: "Модуль для управления вашими цифровыми активами (ECOin).",
- modulesLegacyLabel: "Наследие",
- modulesLegacyDescription: "Модуль для быстрого и безопасного управления вашим секретом (приватным ключом).",
modulesCipherLabel: "Шифр",
modulesCipherDescription: "Модуль для симметричного шифрования и расшифровки текста (с использованием общего пароля).",
modulesBookmarksLabel: "Закладки",
@@ -2931,20 +3212,23 @@ module.exports = {
modulesProjectsLabel: "Проекты",
modulesProjectsDescription: "Модуль для исследования, краудфандинга и управления проектами.",
modulesBankingLabel: "Банкинг",
- modulesBankingDescription: "Модуль для определения реальной стоимости ECOIN и распределения UBI из общей казны.",
+ modulesBankingDescription: "Модуль управления общей казной: стоимость ECOIN, налоги и БОД.",
modulesFavoritesLabel: "Избранное",
modulesFavoritesDescription: "Модуль для управления избранным контентом.",
fileTooLargeTitle: "Файл слишком большой",
fileTooLargeMessage: "Файл превышает максимально допустимый размер (50 МБ). Пожалуйста, выберите файл меньшего размера.",
goBack: "Назад",
+ errorDismiss: "ОК",
errorPageTitle: "Что-то пошло не так",
+ errorNoAllocation: "Распределение для этого запроса не найдено.",
+ errorInvalidClaim: "Это распределение нельзя получить.",
visibilityLabel: "Видимость",
+ clearnetPrivateConflict: "Приватный, скрытый, закрытый, доступный только по приглашению или платный контент нельзя опубликовать в CLEARNET. Выберите OASIS или сделайте его публичным.",
visibilityPublic: "Публичная",
visibilityHidden: "Скрытая",
visibilityMakePublic: "Сделать публичным",
visibilityMakeHidden: "Скрыть",
invitesInhabitantsTitle: "Жители",
- invitesInhabitantsFollow: "Подписаться",
aiNavPlaceholder: "Опишите, что вам нужно...",
aiNavDisabled: "Навигация с ИИ отключена.",
aiNavResultsTitle: "Подсказки AINav",
@@ -2955,7 +3239,7 @@ module.exports = {
modulesAINavDescription: "Модуль для запросов на естественном языке к содержимому сети.",
directConnectDescription: "Подключитесь напрямую к узлу, введя его IP-адрес, порт и публичный ключ. Узел будет добавлен как отслеживаемое соединение.",
peerHost: "IP",
- peerPort: "Порт (по умолчанию: 8008)",
+ peerPort: "Порт",
peerPublicKey: "Публичный ключ (@...ed25519)",
connectAndFollow: "Подключиться",
modulesPresetTitle: "Общие конфигурации",
@@ -2964,15 +3248,15 @@ module.exports = {
workflowsSet: "Применить режим",
workflow_default: "По умолчанию",
workflow_jobs: "Работа",
- workflow_ruling: "Управление",
- workflow_politics: "Политика",
workflow_social: "Общение",
workflow_business: "Бизнес",
workflow_night: "Ночь",
+ workflow_kids: "Дети",
+ workflow_activists: "Активизм",
workflow_mobile: "Мобильный",
statsCarbonFootprintTitle: "Углеродный след",
statsCarbonTombstone: "Углеродный след надгробий",
- uploadMedia: "Загрузить медиа (макс: 50MB)",
+ uploadMedia: "Загрузить медиа (макс: 75MB)",
feedOpenDiscussion: "Открыть обсуждение",
feedDetailTitle: "Лента",
feedPostComment: "Опубликовать комментарий",
@@ -2985,7 +3269,7 @@ module.exports = {
deviceLabel: "Устройство",
mapsLabel: "Карты",
mapTitle: "Карты",
- mapDescription: "Исследуйте и управляйте офлайн-картами в вашей сети.",
+ mapDescription: "Управляйте офлайн-картами и делитесь ими в вашей сети.",
mapMineSectionTitle: "Ваши Карты",
mapCreateSectionTitle: "Создать Карту",
mapUpdateSectionTitle: "Обновить Карту",
@@ -3025,9 +3309,22 @@ module.exports = {
markerImageLabel: "Изображение Маркера",
mapAddMarkerTitle: "Добавить Маркер",
mapAddMarkerButton: "Добавить Маркер",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "Очистить метку",
mapApplyZoom: "Применить масштаб",
- mapSearchPlaceholder: "Поиск по описанию, тегам, автору...",
+ mapPlaceSearchPlaceholder: "Найти место или страну...",
+ mapNoPlaces: "Места не найдены.",
+ mapClusterTitle: "меток здесь, нажмите для приближения",
+ mapDeleteMarker: "Удалить метку",
+ mapZoomIn: "Приблизить",
+ mapZoomOut: "Отдалить",
+ mapFitMarkers: "Показать все метки",
+ mapPanLabel: "Переместить карту",
+ mapCenterHere: "Центрировать здесь",
+ mapNear: "рядом с",
+ mapPickedSpot: "Выбранная точка",
+ mapPickHint: "Нажмите на карту, чтобы выбрать точку.",
+ mapClearPick: "Очистить",
+ mapSearchPlaceholder: "Поиск в Карты...",
mapSearchButton: "Искать",
mapUpdatedAt: "Обновлено",
mapNoMatch: "Нет карт, соответствующих вашему запросу.",
@@ -3038,6 +3335,465 @@ module.exports = {
typeMapMarker: "МАРКЕР КАРТЫ",
modulesMapLabel: "Карты",
modulesMapDescription: "Модуль для управления и обмена офлайн-картами.",
+ emergenciesTitle: "Чрезвычайные ситуации",
+ modulesEmergenciesLabel: "Чрезвычайные ситуации",
+ modulesEmergenciesDescription: "Модуль для объявления, подтверждения и отслеживания чрезвычайных ситуаций в сети.",
+ emergenciesDescription: "Модуль для объявления, подтверждения и отслеживания чрезвычайных ситуаций в сети.",
+ emergencyCreate: "Создать ЧС",
+ emergencyUpdate: "Обновить",
+ emergencyDelete: "Удалить",
+ emergencyTitleLabel: "Заголовок",
+ emergencyTitlePlaceholder: "Что происходит?",
+ emergencyTextLabel: "Подробности",
+ emergencyTextPlaceholder: "Где, с какого момента, что делать...",
+ emergencyCategoryLabel: "Категория",
+ emergencyCategoryWeather: "ПОГОДА",
+ emergencyCategoryInfrastructure: "ИНФРАСТРУКТУРА",
+ emergencyCategoryHealth: "ЗДОРОВЬЕ",
+ emergencyCategorySecurity: "БЕЗОПАСНОСТЬ",
+ emergencyCategoryLost: "ПОТЕРИ И НАХОДКИ",
+ emergencyCategoryNeighborhood: "СОСЕДСТВО",
+ emergencyExpiresLabel: "Истекает через",
+ emergencyExpires1d: "1 день",
+ emergencyExpires3d: "3 дня",
+ emergencyExpires7d: "1 неделя",
+ emergencyExpires30d: "1 месяц",
+ emergencyExpiresNone: "Не определено",
+ emergencyExpiresKeep: "Оставить текущую дату",
+ emergencyTagsLabel: "Теги",
+ emergencyTagsPlaceholder: "Введите теги через запятую",
+ emergencyFilterAll: "ВСЕ",
+ emergencyFilterMine: "МОИ",
+ emergencyFilterRecent: "НЕДАВНИЕ",
+ emergencySeverityUnverified: "НЕ ПОДТВЕРЖДЕНО",
+ emergencySeverityLow: "НИЗКАЯ",
+ emergencySeverityMedium: "СРЕДНЯЯ",
+ emergencySeverityHigh: "ВЫСОКАЯ",
+ emergencyStatusActive: "АКТИВНО",
+ emergencyStatusResolved: "РЕШЕНО",
+ emergencyStatusExpired: "ИСТЕКЛО",
+ emergencyConfirmations: "Подтверждения",
+ emergencyConfirmButton: "Подтвердить",
+ emergencyConfirmed: "Вы подтвердили эту чрезвычайную ситуацию",
+ emergencyResolveButton: "Закрыть",
+ emergencyReopenButton: "Открыть снова",
+ emergencyGenerateReport: "Создать отчёт",
+ emergencyUpdateEdited: "Изменено",
+ emergencyLastUpdate: "ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ",
+ emergencyUpdatesTitle: "Последние обновления:",
+ emergencyNoUpdates: "Обновлений пока нет.",
+ emergencyAddUpdate: "Опубликовать обновление",
+ emergencyUpdatePlaceholder: "Что изменилось?",
+ emergencyNoItems: "Чрезвычайные ситуации не найдены.",
+ emergencyExpiresAt: "Истекает",
+ emergencyBannerLabel: "Активная ЧС",
+ emergencyCreateSectionTitle: "Создать ЧС",
+ emergencyUpdateSectionTitle: "Обновить ЧС",
+ emergencySearchPlaceholder: "Поиск по чрезвычайным ситуациям...",
+ typeEmergency: "ЧС",
+ typeEmergencyConfirm: "ПОДТВЕРЖДЕНИЕ ЧС",
+ typeEmergencyUpdate: "ОБНОВЛЕНИЕ ЧС",
+ statsEmergency: "Чрезвычайные ситуации",
+ statsEmergencyConfirm: "Подтверждения ЧС",
+ statsEmergencyUpdate: "Обновления ЧС",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "В отслеживаемой вами ЧС появилось обновление.",
+ emergencyBotResolvedTitle: "Отслеживаемая вами ЧС разрешена.",
+ dataKindEmergencies: "ЧС",
+ mailingTitle: "Списки рассылки",
+ modulesMailingLabel: "Списки рассылки",
+ modulesMailingDescription: "Находите и управляйте списками рассылки в своей сети.",
+ modulesPhoneLabel: "Телефон",
+ modulesPhoneDescription: "Модуль для видеозвонков другим жителям со сквозным шифрованием.",
+ mailingDescription: "Находите и управляйте списками рассылки в своей сети.",
+ mailingCreate: "Создать список рассылки",
+ mailingUpdate: "Обновить",
+ mailingArchive: "В архив",
+ mailingActivate: "Активировать",
+ mailingCreateSectionTitle: "Создать список рассылки",
+ mailingUpdateSectionTitle: "Обновить список рассылки",
+ mailingTitleLabel: "Название",
+ mailingTitlePlaceholder: "Название списка рассылки",
+ mailingDescriptionLabel: "Описание",
+ mailingDescriptionPlaceholder: "О чём этот список?",
+ mailingTypeLabel: "Тип списка рассылки",
+ mailingTypeOpen: "ОТКРЫТЫЙ",
+ mailingTypeClosed: "ЗАКРЫТЫЙ",
+ mailingStatusLabel: "Статус",
+ mailingStatusActive: "АКТИВНЫЙ",
+ mailingStatusArchived: "В АРХИВЕ",
+ mailingMembersLabel: "Пригласить жителей",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "Подписчики",
+ mailingTagsLabel: "Теги",
+ mailingTagsPlaceholder: "Введите теги через запятую",
+ mailingFilterAll: "ВСЕ",
+ mailingFilterMine: "МОИ",
+ mailingFilterSubscribed: "ПОДПИСКИ",
+ mailingFilterRecent: "НЕДАВНИЕ",
+ mailingHistoryDate: "ДАТА",
+ mailingHistoryThreads: "ТЕМЫ",
+ mailingHistoryInhabitants: "ЖИТЕЛИ",
+ mailingHistorySearchPlaceholder: "Поиск по истории...",
+ mailingNoMessages: "Сообщений пока нет.",
+ mailingNoItems: "Списки рассылки не найдены.",
+ mailingSearchPlaceholder: "Поиск по спискам рассылки...",
+ mailingWriteButton: "Написать сообщение",
+ mailingWriteTitle: "Написать в список",
+ mailingReplyTitle: "Ответить в список",
+ mailingSend: "Отправить",
+ mailingTextPlaceholder: "Ваше сообщение получат все участники списка.",
+ mailingParticipants: "Участники",
+ inboxFilterMailing: "Списки рассылки",
+ mailingReplyPlaceholder: "Ответить в список...",
+ mailingReplyToList: "Ответить в список",
+ typeMailingList: "СПИСОК РАССЫЛКИ",
+ statsMailingList: "Списки рассылки",
+ mailingListLabel: "СПИСОК РАССЫЛКИ",
+ logisticsTitle: "Логистика",
+ modulesLogisticsLabel: "Логистика",
+ modulesLogisticsDescription: "Находите и управляйте логистическими планами в своей сети.",
+ logisticsDescription: "Находите и управляйте логистическими планами в своей сети.",
+ logisticsCreate: "Создать маршрут",
+ logisticsUpdate: "Обновить",
+ logisticsClose: "Закрыть",
+ logisticsReopen: "Открыть снова",
+ logisticsCreateSectionTitle: "Создать маршрут",
+ logisticsUpdateSectionTitle: "Обновить маршрут",
+ logisticsTitleLabel: "Название",
+ logisticsTitlePlaceholder: "Поездка на рынок, есть фургон...",
+ logisticsKindLabel: "Тип логистики",
+ logisticsKindTrip: "ПОЕЗДКА",
+ logisticsKindShipment: "ПЕРЕВОЗКА",
+ logisticsKindTrips: "ПОЕЗДКИ",
+ logisticsKindShipments: "ПЕРЕВОЗКИ",
+ logisticsModeLabel: "Режим",
+ logisticsModeOffer: "ПРЕДЛАГАЮ",
+ logisticsModeRequest: "ИЩУ",
+ logisticsModeOffers: "ПРЕДЛОЖЕНИЯ",
+ logisticsModeRequests: "ЗАПРОСЫ",
+ logisticsDescriptionLabel: "Описание",
+ logisticsDescriptionPlaceholder: "Место встречи, что везёте, условия...",
+ logisticsOriginLabel: "Откуда",
+ logisticsOriginPlaceholder: "Где начинается",
+ logisticsDestinationLabel: "Куда",
+ logisticsDestinationPlaceholder: "Где заканчивается",
+ logisticsDateLabel: "Дата и время",
+ logisticsRecurrenceLabel: "Повторение",
+ logisticsFrequencyLabel: "Периодичность",
+ logisticsRecurrenceNone: "ОДНОКРАТНО",
+ logisticsRecurrenceDaily: "ЕЖЕДНЕВНО",
+ logisticsRecurrenceWeekly: "ЕЖЕНЕДЕЛЬНО",
+ logisticsRecurrenceMonthly: "ЕЖЕМЕСЯЧНО",
+ logisticsSeatsLabel: "Места",
+ logisticsSizeLabel: "Размер",
+ logisticsSizePlaceholder: "напр. 2m x 1m",
+ logisticsWeightLabel: "Вес",
+ logisticsWeightPlaceholder: "напр. 40kg",
+ logisticsPriceFree: "БЕСПЛАТНО",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "ВРЕМЯ",
+ logisticsPriceLabel: "Цена",
+ logisticsHours: "ч",
+ logisticsOrderRefLabel: "Ссылка на заказ",
+ logisticsOrderRefPlaceholder: "/shops/... или /market/... заказа для доставки",
+ logisticsOrderLink: "Связанный заказ",
+ logisticsTagsLabel: "Теги",
+ logisticsTagsPlaceholder: "Введите теги через запятую",
+ logisticsFilterAll: "ВСЕ",
+ logisticsFilterMine: "МОИ",
+ logisticsFilterBooked: "ЗАБРОНИРОВАННЫЕ",
+ logisticsFilterRecent: "НЕДАВНИЕ",
+ logisticsFilterHistory: "ИСТОРИЯ",
+ logisticsFilterTop: "ТОП",
+ logisticsStatusOpen: "ОТКРЫТ",
+ logisticsStatusUpcoming: "ПРЕДСТОЯЩИЕ",
+ logisticsStatusPast: "ПРОШЕДШИЕ",
+ logisticsStatusClosed: "ЗАКРЫТЫЕ",
+ logisticsZoneLabel: "Зона",
+ logisticsSearchPlaceholder: "Поиск по логистике...",
+ logisticsNoItems: "Маршруты не найдены.",
+ logisticsBookingPending: "ОЖИДАЕТ",
+ logisticsBookingConfirmed: "ПОДТВЕРЖДЕНО",
+ logisticsBookingRejected: "ОТКЛОНЕНО",
+ logisticsBookingCancelled: "ОТМЕНЕНО",
+ logisticsBookingDelivered: "ДОСТАВЛЕНО",
+ logisticsConfirm: "Подтвердить",
+ logisticsReject: "Отклонить",
+ logisticsDeliver: "Доставить",
+ logisticsReceiptLabel: "Квитанция",
+ logisticsReceiptPlaceholder: "Примечание к доставке (необязательно)",
+ logisticsCancelBooking: "Отменить бронь",
+ logisticsBookTitle: "Забронировать маршрут",
+ logisticsNotesLabel: "Заметки",
+ logisticsNotesPlaceholder: "Что должен знать владелец",
+ logisticsBook: "Забронировать",
+ logisticsBookingsTitle: "Брони",
+ logisticsMyBookingTitle: "Ваша бронь",
+ logisticsRatingsTitle: "Оценки",
+ logisticsNoRatings: "Оценок пока нет.",
+ logisticsRatingsWhenClosed: "Оценки открываются после закрытия маршрута.",
+ logisticsScoreLabel: "Балл",
+ logisticsRatingPlaceholder: "Как всё прошло?",
+ logisticsRate: "Оценить",
+ typeLogisticsRoute: "МАРШРУТ",
+ typeLogisticsRating: "ОЦЕНКА МАРШРУТА",
+ statsLogisticsRoute: "Маршруты",
+ statsLogisticsRating: "Оценки маршрутов",
+ logisticsRouteLabel: "МАРШРУТ",
+ podcastsTitle: "Подкасты",
+ modulesPodcastsLabel: "Подкасты",
+ modulesPodcastsDescription: "Модуль для публикации подкаст-каналов.",
+ podcastsDescription: "Модуль для публикации подкаст-каналов.",
+ podcastCreate: "Создать подкаст",
+ podcastUpdate: "Обновить",
+ podcastDelete: "Удалить",
+ podcastCreateSectionTitle: "Создать подкаст",
+ podcastUpdateSectionTitle: "Обновить подкаст",
+ podcastTitleLabel: "Название",
+ podcastTitlePlaceholder: "Название канала",
+ podcastDescriptionLabel: "Описание",
+ podcastDescriptionPlaceholder: "О чём этот подкаст?",
+ podcastCategoryLabel: "Категория",
+ podcastCategoryNews: "НОВОСТИ",
+ podcastCategoryMusic: "МУЗЫКА",
+ podcastCategoryTalk: "БЕСЕДЫ",
+ podcastCategoryEducation: "ОБРАЗОВАНИЕ",
+ podcastCategoryTech: "ТЕХНОЛОГИИ",
+ podcastCategoryCulture: "КУЛЬТУРА",
+ podcastCategoryCommunity: "СООБЩЕСТВО",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "ДРУГОЕ",
+ podcastTagsLabel: "Теги",
+ podcastCoverLabel: "Обложка (изображение или видео)",
+ podcastEpisodeAudioLabel: "Аудио или видеофайл (макс: 75MB)",
+ podcastTagsPlaceholder: "Введите теги через запятую",
+ podcastFilterAll: "ВСЕ",
+ podcastFilterMine: "МОИ",
+ podcastFilterRecent: "НЕДАВНИЕ",
+ podcastFilterTop: "ТОП",
+ podcastFilterViewers: "СЛУШАТЕЛИ",
+ podcastSearchPlaceholder: "Поиск по подкастам...",
+ podcastNoItems: "Подкасты не найдены.",
+ podcastEpisodesLabel: "Выпуски",
+ podcastPlaysLabel: "Просмотры",
+ podcastLastEpisode: "Последний выпуск",
+ podcastEpisodesTitle: "Выпуски",
+ podcastNoEpisodes: "Выпусков пока нет.",
+ podcastEpisodeAdd: "Добавить выпуск",
+ podcastEpisodeCreateTitle: "Опубликовать выпуск",
+ podcastEpisodeUpdateTitle: "Обновить выпуск",
+ podcastEpisodeTitleLabel: "Название выпуска",
+ podcastEpisodeTitlePlaceholder: "Название выпуска",
+ podcastEpisodeDescriptionLabel: "Заметки",
+ podcastEpisodeDescriptionPlaceholder: "Что происходит в выпуске, ссылки, авторы...",
+ podcastEpisodePublish: "Опубликовать",
+ podcastPlayed: "Прослушано",
+ podcastMarkPlayed: "Отметить как прослушанное",
+ typePodcast: "ПОДКАСТ",
+ typePodcastEpisode: "ВЫПУСК",
+ typePodcastOpinion: "МНЕНИЕ О ВЫПУСКЕ",
+ typePodcastPlay: "ПРОСЛУШИВАНИЕ",
+ statsPodcast: "Подкасты",
+ statsPodcastEpisode: "Выпуски",
+ statsPodcastPlay: "Прослушивания",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "В блоге, на который вы подписаны, новая запись.",
+ podcastBotEpisodeTitle: "У подкаста, на который вы подписаны, новый выпуск.",
+ podcastLabel: "ПОДКАСТ",
+ podcastEpisodeLabel: "ВЫПУСК",
+ campaignsTitle: "Кампании",
+ modulesCampaignsLabel: "Кампании",
+ modulesCampaignsDescription: "Находите и управляйте кампаниями в своей сети.",
+ campaignsDescription: "Находите и управляйте кампаниями в своей сети.",
+ campaignCreate: "Создать кампанию",
+ campaignUpdate: "Обновить",
+ campaignDelete: "Удалить",
+ campaignClose: "Закрыть",
+ campaignReopen: "Открыть снова",
+ campaignCreateSectionTitle: "Создать кампанию",
+ campaignUpdateSectionTitle: "Обновить кампанию",
+ campaignTitleLabel: "Название",
+ campaignTitlePlaceholder: "Чего вы хотите добиться?",
+ campaignTextLabel: "Текст",
+ campaignTextPlaceholder: "Объясните суть, кто решает и чего вы требуете...",
+ campaignCategoryLabel: "Категория",
+ campaignCategoryEnvironment: "ЭКОЛОГИЯ",
+ campaignCategoryRights: "ПРАВА",
+ campaignCategoryHealth: "ЗДОРОВЬЕ",
+ campaignCategoryEducation: "ОБРАЗОВАНИЕ",
+ campaignCategoryInfrastructure: "ИНФРАСТРУКТУРА",
+ campaignCategoryCulture: "КУЛЬТУРА",
+ campaignCategoryEconomy: "ЭКОНОМИКА",
+ campaignCategoryOther: "ДРУГОЕ",
+ campaignGoalLabel: "Цель по подписям",
+ campaignDeadlineLabel: "Срок",
+ campaignTagsLabel: "Теги",
+ campaignTagsPlaceholder: "Введите теги через запятую",
+ campaignFilterAll: "ВСЕ",
+ campaignFilterMine: "МОИ",
+ campaignFilterSigned: "ПОДПИСАННЫЕ",
+ campaignFilterRecent: "НЕДАВНИЕ",
+ campaignFilterTop: "ТОП",
+ campaignStatusOpen: "ОТКРЫТА",
+ campaignStatusAchieved: "ДОСТИГНУТА",
+ campaignStatusUnachieved: "НЕ ДОСТИГНУТА",
+ campaignStatusClosed: "ЗАКРЫТА",
+ campaignSearchPlaceholder: "Поиск по кампаниям...",
+ campaignNoItems: "Кампании не найдены.",
+ campaignSignaturesLabel: "Подписи",
+ campaignSignaturesTitle: "Сторонники",
+ campaignNoSignatures: "Подписей пока нет.",
+ campaignSignTitle: "Подписать кампанию",
+ campaignSignPlaceholder: "Почему вы её поддерживаете? (необязательно)",
+ campaignSign: "Подписать",
+ campaignSigned: "Вы уже подписали!",
+ campaignNotSigned: "Вашей подписи ещё не хватает",
+ campaignElevate: "Передать в Парламент",
+ campaignElevated: "Передана в Парламент",
+ campaignUpdatesTitle: "Обновления",
+ campaignNoUpdates: "Обновлений пока нет.",
+ campaignUpdatePlaceholder: "Что произошло?",
+ campaignAddUpdate: "Опубликовать обновление",
+ campaignQrAlt: "QR для подписи кампании",
+ campaignQrCaption: "Отсканируйте, чтобы подписать",
+ typeCampaign: "КАМПАНИЯ",
+ typeCampaignSignature: "ПОДПИСЬ",
+ typeCampaignUpdate: "ОБНОВЛЕНИЕ КАМПАНИИ",
+ statsCampaign: "Кампании",
+ statsCampaignSignature: "Подписи кампаний",
+ statsCampaignUpdate: "Обновления кампаний",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "У кампании, за которой вы следите, есть обновление.",
+ campaignBotAchievedTitle: "Кампания, за которой вы следите, достигла цели.",
+ campaignBotRaisedTitle: "Кампания, которую вы подписали, вынесена в Парламент.",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "Забронированный вами маршрут изменился.",
+ logisticsBotClosedTitle: "Забронированный вами маршрут закрыт.",
+ logisticsBotBookedTitle: "Кто-то забронировал ваш маршрут.",
+ logisticsBotCancelledTitle: "Бронирование на вашем маршруте отменено.",
+ logisticsBotConfirmedTitle: "Ваше бронирование подтверждено: посылка в пути.",
+ logisticsBotRejectedTitle: "Ваше бронирование отклонено.",
+ logisticsBotDeliveredTitle: "Ваша посылка доставлена.",
+ campaignLabel: "КАМПАНИЯ",
+ campaignGenerateReport: "Создать отчёт",
+ logisticsGenerateReport: "Создать отчёт",
+ mailingGenerateReport: "Создать отчёт",
+ campaignUpdateEdited: "Изменено",
+ mailingMessagesLabel: "Сообщения",
+ logisticsBookingsLabel: "Брони",
+ backupTitle: "Резервная копия",
+ modulesBackupLabel: "Резервная копия",
+ modulesBackupDescription: "Модуль для экспорта и импорта ключей и создания зашифрованных резервных копий.",
+ backupDescription: "Модуль для экспорта и импорта ключей и создания зашифрованных резервных копий.",
+ backupTypeRecovery: "ВОССТАНОВЛЕНИЕ",
+ backupTypeKeys: "ЭКСПОРТ КЛЮЧЕЙ",
+ backupTypeFull: "ПОЛНАЯ КОПИЯ",
+ backupTypeRestore: "ВОССТАНОВИТЬ КОПИЮ",
+ backupTypeInstant: "МГНОВЕННО",
+ backupInstantDescription: "Обычный .zip со всем вашим журналом и файлами, без секретного ключа и без пароля. Быстро, но ",
+ backupInstantRisk: "тот, у кого окажется файл, прочтёт всё.",
+ backupKitPageDescription: "Набор для восстановления можно открыть только с этого устройства.",
+ backupKitId: "Oasis ID",
+ backupKitDate: "Создано",
+ backupKitQrAlt: "QR-код вашего секретного ключа",
+ backupKitStep1: "Распечатайте или перепишите и храните в надёжном месте офлайн.",
+ backupKitStep2: "Для восстановления установите Oasis на новом устройстве и импортируйте этот секрет в разделе Резервная копия › Ключи.",
+ backupKitStep3: "Уничтожьте эту страницу, если она когда-либо будет раскрыта.",
+ backupKitPdfButton: "Создать PDF",
+ backupScopeLabel: "Охват",
+ backupScopeAll: "ВСЁ",
+ backupScopeMine: "ТОЛЬКО МОЙ КОНТЕНТ",
+ backupSinceLabel: "С даты",
+ backupEstimateTitle: "Оценка",
+ backupFileInfo: "Зашифрованная копия будет загружена на устройство (имя: oasis-backup-ДАТА.oasisbk)",
+ backupExportButton: "Скачать копию",
+ backupRestorePassword: "Введите пароль, использованный при создании копии",
+ backupRestoreButton: "Восстановить копию",
+ backupRestoredLine: "Копия восстановлена.",
+ backupRestoredMessages: "Добавлено сообщений",
+ backupRestoredSkipped: "Уже были",
+ backupRestoredBlobs: "Добавлено файлов",
+ backupRestoredState: "Восстановлено настроек",
+ backupRestoredFailed: "Ошибок",
+ backupRestoredForked: "Расходятся",
+ backupRestoreRunning: "Восстановление копии. Страница обновляется автоматически; тем временем можно продолжать пользоваться Oasis.",
+ backupRestoreElapsed: "Прошло",
+ backupRestoreFailedLine: "Не удалось восстановить копию.",
+ backupRestoreForkMine: "Это устройство уже опубликовало сообщения с вашей идентичностью, которых нет в копии, поэтому применить её поверх них не удалось. Восстанавливайте на чистой установке сразу после импорта ключей, прежде чем делать что-либо ещё.",
+ verificationTitle: "Проверка",
+ verificationDescription: "Проверьте цепочку своей ленты, найдите ответвления и просмотрите осиротевшие или отсутствующие файлы.",
+ verificationRun: "Запустить проверку",
+ verificationTotalMessages: "сообщений в журнале",
+ verificationFeed: "Ваша лента",
+ verificationMessages: "сообщений",
+ verificationLastSequence: "последняя последовательность",
+ verificationGaps: "Пропуски",
+ verificationBrokenLinks: "Разорванные ссылки",
+ verificationBadHashes: "Неверные хеши",
+ verificationBadSignatures: "Неверные подписи",
+ verificationDuplicates: "Дублированные номера",
+ verificationForks: "Ответвления",
+ verificationBlobs: "Файлы",
+ verificationBlobsPresent: "есть",
+ verificationBlobsReferenced: "упомянуто",
+ verificationBlobsOrphan: "осиротевших",
+ verificationBlobsMissing: "отсутствует",
+ verificationBlobsMissingOwn: "Ваши файлы, отсутствующие на этом устройстве",
+ verificationBlobsMissingOthers: "Файлы других жителей ещё не загружены",
+ verificationBlobsUnavailable: "Не удалось получить список файлов на этом устройстве.",
+ wikiTitle: "Вики",
+ modulesWikiLabel: "Вики",
+ modulesWikiDescription: "Модуль для поиска и управления вики.",
+ wikiDescription: "Модуль для поиска и управления вики.",
+ wikiCreate: "Создать вики",
+ wikiUpdate: "Обновить",
+ wikiDelete: "Удалить",
+ wikiEdit: "Редактировать",
+ wikiTitleLabel: "Заголовок",
+ wikiTitlePlaceholder: "Название вики...",
+ wikiBodyLabel: "Содержимое",
+ wikiBodyPlaceholder: "Ссылайтесь на другие вики через [[Название вики]] или [[Название вики|своя подпись]].\n\nУпоминайте жителей через @id.\n\nСтавьте теги #oasis.\n\nВставляйте ссылки вроде https://solarnethub.com\n\nПустая строка начинает новый абзац; одиночные переносы сохраняются.\n\nПрикрепите любой поддерживаемый медиафайл — он встроится сюда.",
+ formatBarLabel: "Формат",
+ wikiStatusLabel: "Тип вики",
+ wikiStatusOpen: "ОТКРЫТА",
+ wikiStatusClosed: "ЗАКРЫТА",
+ wikiTagsLabel: "Теги",
+ wikiTagsPlaceholder: "Введите теги через запятую",
+ wikiSummaryLabel: "Описание изменения",
+ wikiSummaryPlaceholder: "Что изменилось?",
+ wikiFilterAll: "ВСЕ",
+ wikiFilterMine: "МОИ",
+ wikiFilterRecent: "НЕДАВНИЕ",
+ wikiFilterLinked: "СВЯЗАННЫЕ",
+ wikiChanges: "Последние изменения",
+ wikiNoPages: "Вики не найдены.",
+ wikiNoChanges: "Изменений пока нет.",
+ wikiHistory: "История",
+ wikiVersion: "Версия",
+ wikiVersions: "версий",
+ wikiRestore: "Восстановить",
+ wikiDiff: "Изменения",
+ wikiViewVersion: "Смотреть",
+ wikiLinkedPages: "Связанные страницы",
+ wikiNoLinkedPages: "Эта страница пока не связана ни с одной другой.",
+ wikiMissingLink: "Страница ещё не существует",
+ wikiDuplicateTitle: "Страница с таким названием уже существует. Измените название, чтобы создать другую страницу.",
+ wikiCreateSectionTitle: "Создать вики",
+ wikiUpdateSectionTitle: "Обновить вики",
+ wikiSearchPlaceholder: "Поиск по вики...",
+ wikiCurrentVersion: "Текущая версия",
+ wikiViewingVersion: "Вы смотрите старую версию",
+ wikiBackToPage: "Назад к странице",
+ wikiLinkedChip: "Связана",
+ wikiRestoredSummary: "Восстановленная версия",
+ wikiExportPdf: "Создать страницу",
+ wikiPreview: "Предпросмотр",
+ tribeSectionWiki: "ВИКИ",
+ tribeWikiCreate: "Создать вики",
+ tribeWikiEmpty: "Вики пока нет.",
+ typeWiki: "ВИКИ",
padsTitle: "Пады",
padTitle: "Пад",
modulesPadsLabel: "Пады",
@@ -3048,21 +3804,133 @@ module.exports = {
padTitleLabel: "Заголовок",
padTitlePlaceholder: "Введите заголовок пада...",
padStatusLabel: "Статус",
+ padTypeLabel: "Тип пада",
padStatusOpen: "ОТКРЫТ",
padStatusInviteOnly: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ",
padStatusClosed: "ЗАКРЫТ",
padDeadlineLabel: "Срок",
padTagsLabel: "Теги",
- padTagsPlaceholder: "тег1, тег2, ...",
+ padTagsPlaceholder: "Введите теги через запятую",
padMembersLabel: "Участники",
padCreated: "Создано",
- padStartEditing: "НАЧАТЬ РЕДАКТИРОВАНИЕ!",
+ padStartEditing: "Редактировать",
padEditorPlaceholder: "Начните писать...",
padSubmitEntry: "Отправить",
padNoEntries: "Записей пока нет.",
padAllSectionTitle: "Все Пады",
padMineSectionTitle: "Мои Пады",
padsDescription: "Управляйте совместными зашифрованными текстовыми редакторами в вашей сети.",
+ roomsTitle: "Комнаты",
+ roomsDescription: "Находите зашифрованные комнаты видеоконференций в вашей сети и присоединяйтесь к ним.",
+ modulesRoomsLabel: "Комнаты",
+ modulesRoomsDescription: "Модуль для поиска зашифрованных комнат видеоконференций и входа в них.",
+ roomFilterRecent: "НЕДАВНИЕ",
+ roomFilterMine: "МОИ",
+ roomFilterAll: "ВСЕ",
+ roomFilterLive: "В ЭФИРЕ",
+ roomFilterOpen: "ОТКРЫТЫЕ",
+ roomFilterInvite: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ",
+ roomFilterClosed: "ЗАКРЫТЫЕ",
+ roomCreate: "Создать комнату",
+ roomUpdate: "Обновить",
+ roomDelete: "Удалить",
+ roomClose: "Закрыть",
+ roomCreateSectionTitle: "Создать комнату",
+ roomUpdateSectionTitle: "Обновить комнату",
+ roomTitlePlaceholder: "Название комнаты",
+ roomDescriptionLabel: "Описание",
+ roomDescriptionPlaceholder: "О чём вы будете говорить?",
+ roomTypeLabel: "Тип комнаты",
+ roomTagsLabel: "Теги",
+ roomStatusOpen: "ОТКРЫТА",
+ roomStatusInviteOnly: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ",
+ roomStatusClosed: "ЗАКРЫТА",
+ roomParticipants: "Участники",
+ roomJoin: "Войти",
+ roomLeave: "Выйти",
+ roomFull: "Комната заполнена",
+ roomLiveChip: "В ЭФИРЕ",
+ roomMuted: "микрофон выключен",
+ roomRec: "Записать аудио",
+ roomRecStop: "Остановить запись",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} вошёл в комнату",
+ roomEventLeft: "{name} вышел из комнаты",
+ roomEventRecStart: "{name} начал запись",
+ roomEventRecStop: "{name} остановил запись",
+ roomEventMuted: "{name} выключил микрофон",
+ roomEventUnmuted: "{name} включил микрофон",
+ roomEventHand: "{name} поднял руку",
+ roomRaiseHand: "Поднять руку",
+ roomLowerHand: "Опустить руку",
+ confirmActionTitle: "Подтвердите это действие",
+ confirmActionButton: "Подтвердить",
+ confirmJoinText: "Вы собираетесь присоединиться по этому приглашению.",
+ confirmFollowText: "Вы собираетесь поддержать этого жителя.",
+ confirmSignText: "Вы собираетесь подписать эту кампанию.",
+ confirmDownloadText: "Вы собираетесь скачать этот файл на своё устройство.",
+ roomRecordings: "Записи",
+ roomClearNotices: "Очистить",
+ roomLineSwitchboard: "Коммутатор",
+ roomLineDndError: "Номер этой комнаты не принимает звонки.",
+ roomNumberHint: "Наберите этот номер в Телефоне, чтобы войти в комнату.",
+ liveRefresh: "Обновить",
+ roomNobody: "Сейчас в комнате никого нет.",
+ roomSomeone: "Сейчас в комнате: {n}.",
+ roomYou: "вы",
+ roomYouAreIn: "Вы внутри",
+ roomNobodyInside: "Сейчас в этой комнате никого нет.",
+ roomErrorFull: "Комната заполнена. Вы сможете войти, когда кто-нибудь выйдет.",
+ roomErrorUnreachable: "Сейчас до комнаты не достучаться. Попробуйте позже.",
+ roomErrorBusy: "Вы уже в звонке или в другой комнате.",
+ roomErrorClosed: "Эта комната закрыта.",
+ roomAccessDenied: "Эта комната только по приглашению. Чтобы войти, нужно приглашение.",
+ roomsNoItems: "Комнаты не найдены.",
+ roomSearchPlaceholder: "Искать комнаты...",
+ roomInviteMode: "Приглашение",
+ tribeSectionRooms: "КОМНАТЫ",
+ tribeRoomCreate: "Создать комнату",
+ tribeRoomsEmpty: "Пока нет комнат.",
+ typeRoom: "КОМНАТЫ",
+ typeRoomMember: "УЧАСТНИК КОМНАТЫ",
+ statsRoom: "Комнаты",
+ statsRoomMember: "Участники комнат",
+ favoritesFilterRooms: "КОМНАТЫ",
+ invitesRoomsTitle: "Комнаты",
+ inviteCodeInvalid: "Этот код приглашения недействителен или уже использован.",
+ inviteAlreadyMember: "Вы уже участвуете. Откройте его в соответствующем модуле.",
+ actionFailed: "Не удалось это сделать. Попробуйте ещё раз.",
+ publishTooShort: "Ваша публикация слишком короткая.",
+ walletSendFailed: "Не удалось отправить платёж: {reason}",
+ pixeliaCoordsError: "Эти координаты находятся за пределами сетки.",
+ courtsErrTitle: "Нужен заголовок.",
+ courtsErrRespondent: "Укажите, против кого дело.",
+ courtsErrRespondentId: "Это недействительный Oasis ID.",
+ courtsErrMethod: "Выберите, как будет решено дело.",
+ courtsErrCaseNotFound: "Это дело не найдено.",
+ courtsErrBrief: "Напишите свой ответ.",
+ courtsErrStance: "Выберите свою позицию.",
+ courtsErrResult: "Укажите результат.",
+ courtsErrTerms: "Укажите условия соглашения.",
+ courtsErrMediator: "Добавьте хотя бы одного посредника.",
+ courtsErrSelfMediator: "Вы не можете быть посредником в своём деле.",
+ courtsErrJudge: "Выберите судью.",
+ courtsErrSelfJudge: "Вы не можете быть судьёй в своём деле.",
+ courtsErrVisibility: "Выберите, кто может видеть дело.",
+ courtsErrNomination: "Эта номинация не найдена.",
+ opinionAlreadyGiven: "Вы уже высказали своё мнение.",
+ cipherPasswordShort: "Пароль должен содержать не менее 32 символов.",
+ errorForbidden: "У вас нет доступа к этому.",
+ errorNotFound: "Не найдено.",
+ errorClosed: "Это закрыто.",
+ errorInviteOnly: "Только по приглашению. Нужно приглашение.",
+ errorTooLong: "Этот текст слишком длинный.",
+ errorRequired: "Не хватает обязательных данных.",
+ errorInvalid: "Часть данных недействительна.",
+ errorNotAuthor: "Это может сделать только автор.",
+ panicRemoved: "Ваш блокчейн удалён.",
padRecentSectionTitle: "Недавние Пады",
padOpenSectionTitle: "Открытые Пады",
padClosedSectionTitle: "Закрытые Пады",
@@ -3074,18 +3942,18 @@ module.exports = {
padRemoveFavorite: "Удалить из Избранного",
padClose: "Закрыть",
padBackToEditor: "Назад к редактору",
- padSearchPlaceholder: "Поиск падов...",
+ padSearchPlaceholder: "Поиск в Пады...",
modulesChatsLabel: "Чаты",
- modulesChatsDescription: "Модуль для обнаружения и управления зашифрованными чатами.",
+ modulesChatsDescription: "Модуль для поиска и управления чатами.",
typeChat: "ЧАТЫ",
typeChatMessage: "СООБЩЕНИЕ ЧАТА",
chatsTitle: "Чаты",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "Ваши чаты",
+ chatRecentTitle: "Недавние чаты",
chatFavoritesTitle: "Избранное",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "Открытые чаты",
+ chatClosedTitle: "Закрытые чаты",
chatDescription: "Описание",
chatCategory: "Категория",
chatStatus: "СТАТУС",
@@ -3100,34 +3968,172 @@ module.exports = {
chatMessagesLabel: "Сообщения",
chatThreadsLabel: "Темы",
chatCreatedAt: "СОЗДАН",
- chatSearchPlaceholder: "Поиск чатов...",
+ chatSearchPlaceholder: "Поиск в Чаты...",
chatStatusOpen: "ОТКРЫТЫЙ",
chatStatusInviteOnly: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ",
chatStatusClosed: "ЗАКРЫТЫЙ",
chatSendMessage: "Отправить",
chatJumpLatest: "Последнее сообщение",
+ chatReply: "Ответить",
+ chatReplyCancel: "Отменить ответ",
+ chatPin: "Закрепить",
+ chatUnpin: "Открепить",
+ chatPinned: "Закреплённые",
chatPickChat: "Выберите чат, чтобы открыть его",
chatNoneYet: "Пока нет доступных чатов.",
- activitySearchPlaceholder: "Поиск по активности...",
- trendingSearchPlaceholder: "Поиск в трендах...",
- opinionsSearchPlaceholder: "Поиск в мнениях...",
- votesSearchPlaceholder: "Поиск в голосованиях...",
- welcomeStepUxTitle: "Выберите интерфейс",
- welcomeStepUxText: "Выберите вид Oasis. Потом можно изменить в настройках.",
- welcomeStepUxAction: "Использовать этот вид",
+ activitySearchPlaceholder: "Поиск в Активность...",
+ trendingSearchPlaceholder: "Поиск в В тренде...",
+ opinionsSearchPlaceholder: "Поиск в Мнения...",
+ votesSearchPlaceholder: "Поиск в Голосования...",
+ gamesSearchPlaceholder: "Поиск в Игры...",
+ schoolTitle: "Школа",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "Вики-страница, за которой вы следите, была изменена.",
+ wikiBotRestoredTitle: "Восстановлена более ранняя версия вики-страницы, за которой вы следите.",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "Новый студент записался на ваш курс.",
+ schoolBotInvitedTitle: "Вас пригласили на курс.",
+ schoolBotAdmittedTitle: "Вас приняли на курс.",
+ schoolBotCertificateTitle: "Вы получили сертификат.",
+ schoolBotPassedTitle: "Студент успешно прошёл ваш курс.",
+ schoolBotLessonTitle: "Опубликован новый урок.",
+ invitesSchoolTitle: "Школа",
+ schoolEnrollLabel: "Присоединиться к курсу",
+ schoolExamRetryLater: "Повторить можно через 24 часа.",
+ schoolApproved: "СДАНО",
+ schoolExamPassMark: "Проходной балл (0-10)",
+ schoolExamPassed: "СДАН",
+ schoolExamPending: "Ожидается",
+ schoolExamFailed: "НЕ СДАН",
+ schoolExamAddQuestion: "Добавить вопрос",
+ schoolExamCreateQuestion: "Создать вопрос",
+ schoolExamOption: "Вариант",
+ schoolExamCorrect: "Правильный вариант",
+ schoolExamPoints: "Баллы",
+ schoolMaterialTextPlaceholder: "Заметки к этому уроку...",
+ schoolMaterials: "Материалы",
+ schoolAddMaterial: "Добавить материал",
+ schoolNoMaterials: "Материалов пока нет.",
+ bankYourSchoolBalance: "Ваш доход от школы",
+ schoolProgress: "Прогресс",
+ schoolProgressMark: "Отметить как пройденный",
+ schoolProgressDone: "Пройден",
+ schoolExams: "Экзамены",
+ schoolExamCreate: "Создать экзамен",
+ schoolExamTitlePlaceholder: "Название экзамена",
+ schoolExamHelp: "Один вопрос в строке: Вопрос? ; вариант ; правильный вариант* ; вариант",
+ schoolExamQuestionsPlaceholder: "Что такое SSB? ; База данных ; P2P-протокол* ; Браузер",
+ schoolExamSubmit: "Отправить ответы",
+ schoolExamScore: "Ваш результат",
+ schoolNoScoresYet: "Результатов пока нет.",
+ schoolLessonUnit: "Раздел / фаза",
+ schoolLessonUnitPlaceholder: "напр. Фаза 1",
+ schoolLessonOrder: "Порядок",
+ profileClearnetSchoolLabel: "Школа",
+ schoolStartDate: "Дата начала",
+ schoolSessionDate: "Дата занятия",
+ schoolCourseChat: "Чат курса",
+ agendaFilterSchool: "ШКОЛА",
+ agendaFilterCampaigns: "КАМПАНИИ",
+ agendaFilterLogistics: "ЛОГИСТИКА",
+ schoolCourseType: "Тип курса",
+ schoolTypeOpen: "ОТКРЫТЫЙ",
+ schoolTypePaid: "ПЛАТНЫЙ",
+ schoolTypeInvite: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ",
+ schoolLessonLocked: "Урок зашифрован — запросите ключ курса у преподавателя.",
+ schoolGrantAccess: "Отправить ключ курса",
+ schoolKeySent: "Ключ отправлен",
+ schoolOngoing: "Идёт",
+ schoolFilterApplied: "ЗАПИСАН",
+ schoolFilterOpen: "ОТКРЫТЫЕ",
+ schoolFilterFavorites: "ИЗБРАННОЕ",
+ schoolPendingPayment: "Ожидается оплата",
+ schoolPendingStudents: "Ожидающие записи",
+ schoolViewBill: "Посмотреть счёт",
+ schoolPaymentNote: "Запись создаёт счёт в ECO (перевод). Запись подтверждается после подписания перевода.",
+ schoolCloseCourse: "Закрыть курс",
+ schoolReopenCourse: "Открыть курс снова",
+ schoolDescription: "Преподавайте и изучайте курсы в вашей сети.",
+ schoolFilterAll: "ВСЕ",
+ schoolFilterMine: "МОИ",
+ schoolFilterTop: "ТОП",
+ schoolFilterRecent: "НЕДАВНИЕ",
+ schoolCreateButton: "Создать Курс",
+ schoolCreateSectionTitle: "Создать курс",
+ schoolUpdateSectionTitle: "Обновить курс",
+ schoolCourseTitlePlaceholder: "Название вашего курса",
+ schoolCourseDescriptionPlaceholder: "Чему вы будете учить на этом курсе?",
+ schoolCourseImage: "Изображение курса (макс. размер: 75MB)",
+ schoolTags: "Теги",
+ schoolTagsPlaceholder: "Введите теги через запятую",
+ schoolPrice: "Цена (ECO)",
+ schoolVisibility: "Видимость",
+ schoolVisibilityPublic: "Публичный",
+ schoolVisibilityInvite: "По приглашению",
+ schoolStatus: "Статус",
+ schoolClosed: "Закрыт",
+ schoolFree: "Бесплатно",
+ schoolCreate: "Создать курс",
+ schoolUpdate: "Обновить курс",
+ schoolSearchPlaceholder: "Поиск в Школа...",
+ schoolSortTitle: "Название",
+ schoolNoCourses: "Курсы не найдены.",
+ schoolStudents: "Студенты",
+ schoolTeacher: "Преподаватель",
+ schoolCreatedAt: "СОЗДАН",
+ schoolLessons: "Уроки",
+ schoolNoLessons: "Уроков пока нет.",
+ schoolEnrollToSee: "Запишитесь, чтобы увидеть уроки этого курса.",
+ schoolEnrollButton: "ЗАПИСАТЬСЯ",
+ schoolUnenrollButton: "Покинуть курс",
+ schoolInviteRequired: "Этот курс по приглашению.",
+ schoolTeacherPanel: "Панель преподавателя",
+ schoolStudentPanel: "Панель студента",
+ schoolAddLesson: "Создать урок",
+ schoolLessonTitlePlaceholder: "Название урока",
+ schoolLessonTextPlaceholder: "Опишите, что изучается в этом уроке...",
+ schoolInviteStudents: "Пригласить студентов",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "ПРИГЛАСИТЬ",
+ schoolInvited: "Приглашённые",
+ schoolIssueCertificate: "Создать сертификат",
+ schoolCertified: "Сертифицирован",
+ schoolCertificateTextPlaceholder: "Примечание к сертификату (необязательно)",
+ schoolLessonOpen: "Открыть урок",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "Сертификаты",
+ schoolNoCertificates: "Сертификаты ещё не выданы.",
+ schoolEditButton: "Редактировать",
+ schoolDeleteButton: "Удалить",
+ typeSchool: "ШКОЛА",
+ schoolCourseLabel: "КУРС",
+ emergencyLabel: "ЧС",
+ wikiPageLabel: "ВИКИ",
+ statsSchoolCourse: "Курсы",
+ statsSchoolLesson: "Уроки",
+ statsSchoolEnroll: "Записи",
+ statsSchoolCertificate: "Сертификаты школы",
+ modulesSchoolLabel: "Школа",
+ modulesSchoolDescription: "Модуль для обмена знаниями.",
+ welcomeStepUxAction: "Сохранить вид",
+ welcomeStepWorkflowTitle: "Как вы собираетесь использовать OASIS?",
+ welcomeStepWorkflowText: "В Oasis много модулей. Выберите подходящую вам настройку, и включёнными останутся только полезные. Её можно изменить в любой момент в разделе «Модули».",
+ welcomeStepWorkflowAction: "Сохранить настройку",
+ welcomeWorkflow_full: "По умолчанию",
chatRateLimitTitle: "Слишком много сообщений",
chatRateLimitMessage: "Вы достигли лимита сообщений этой комнаты за час. Попробуйте позже.",
chatMessagePlaceholder: "Введите сообщение...",
chatNoMessages: "Сообщений пока нет.",
chatTitlePlaceholder: "Название чата",
chatDescriptionPlaceholder: "Описание чата",
- chatTagsPlaceholder: "тег1, тег2, тег3",
+ chatTagsPlaceholder: "Введите теги через запятую",
chatImageLabel: "Выбрать файл изображения (.jpeg, .jpg, .png, .gif)",
chatAuthor: "Автор",
chatAddFavorite: "Добавить в Избранное",
chatRemoveFavorite: "Убрать из Избранного",
chatPM: "ЛС",
chatStatusLabel: "Статус",
+ chatTypeLabel: "Тип чата",
chatCategoryLabel: "Категория",
gamesTitle: "Игры",
gamesDescription: "Откройте и играйте в игры.",
@@ -3158,22 +4164,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "Подбросьте монету и угадайте орёл или решку. Насколько вы удачливы?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "Бильярд с видом сверху. Щёлкните, чтобы прицелиться, удерживайте, чтобы набрать силу. Забейте все шары за наименьшее число ударов.",
+ gamesArtilleryTitle: "Артиллерия",
+ gamesArtilleryDesc: "Наведите пушку, учтите ветер и поразите цель. 5 раундов, побеждает тот, кто сделал меньше выстрелов.",
+ gamesLabyrinthTitle: "Лабиринт",
+ gamesLabyrinthDesc: "Выберитесь из лабиринта, пока не закончились ходы. Каждый уровень больше и сложнее.",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "Съешьте все точки и избегайте призраков. Призраки двигаются в реальном времени — не останавливайтесь!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "Звуковой маятник",
+ gamesAudioPendulumDesc: "Симулятор хаотической физики с синтезом звука в реальном времени. Угловые скорости превращаются в частоты, пики — в удары барабана. Ни одна симуляция не звучит одинаково.",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "Сводите визуалы вживую на двух деках: выберите узор для каждой, настройте скорость, цвет и масштаб, переходите между ними и пускайте вспышки в такт. Отбейте темп или доверьте пульс микрофону.",
+ gamesTetrisDesc: "Классические падающие блоки. Заполняйте линии, чтобы набирать очки. Сколько продержитесь?",
+ gamesMinesweeperTitle: "Сапёр",
+ gamesMinesweeperDesc: "Классическая охота на мины. Очистите поле, чтобы перейти на новый уровень — больше поле, больше мин, выше счёт.",
+ gamesFilterScoring: "ОЧКИ",
+ gamesHallOfFame: "Зал славы",
+ gamesHallPlayer: "Игрок",
+ gamesHallScore: "Счёт",
+ gamesNoScores: "Пока нет результатов.",
calendarsTitle: "Календари",
calendarTitle: "Календарь",
modulesCalendarsLabel: "Календари",
@@ -3181,15 +4191,15 @@ module.exports = {
typeCalendar: "КАЛЕНДАРИ",
calendarCreate: "Создать календарь",
calendarUpdate: "Обновить",
- calendarDelete: "Удалить",
calendarTitleLabel: "Название",
calendarTitlePlaceholder: "Название календаря...",
calendarStatusLabel: "Статус",
+ calendarTypeLabel: "Тип календаря",
calendarStatusOpen: "ОТКРЫТЫЙ",
calendarStatusClosed: "ЗАКРЫТЫЙ",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "Срок",
calendarTagsLabel: "Теги",
- calendarTagsPlaceholder: "тег1, тег2...",
+ calendarTagsPlaceholder: "Введите теги через запятую",
calendarParticipantsLabel: "Участники",
calendarCreated: "Создан",
calendarJoin: "Присоединиться",
@@ -3200,11 +4210,11 @@ module.exports = {
calendarNotePlaceholder: "Добавить заметку...",
calendarFirstDateLabel: "Дата",
calendarFirstNoteLabel: "Заметки",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "Интервал",
calendarIntervalNone: "Без повторения",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "Еженедельно",
+ calendarIntervalMonthly: "Ежемесячно",
+ calendarIntervalYearly: "Ежегодно",
calendarFormDescription: "Описание",
calendarNoDates: "Даты не добавлены.",
calendarNoNotes: "Заметок нет.",
@@ -3212,6 +4222,8 @@ module.exports = {
calendarsDescription: "Находите и управляйте календарями в вашей сети.",
calendarMonthPrev: "← Назад",
calendarMonthNext: "Вперёд →",
+ calendarMonthNames: "Январь,Февраль,Март,Апрель,Май,Июнь,Июль,Август,Сентябрь,Октябрь,Ноябрь,Декабрь",
+ calendarDayInitials: "Пн,Вт,Ср,Чт,Пт,Сб,Вс",
calendarAllSectionTitle: "Календари",
calendarRecentSectionTitle: "Недавние календари",
calendarFavoritesSectionTitle: "Избранное",
@@ -3221,9 +4233,9 @@ module.exports = {
calendarCreateSectionTitle: "Создать новый календарь",
calendarUpdateSectionTitle: "Обновить календарь",
calendarAddFavorite: "Добавить в избранное",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "Удалить",
calendarRemoveFavorite: "Убрать из избранного",
- calendarSearchPlaceholder: "Поиск календарей...",
+ calendarSearchPlaceholder: "Поиск в Календарь...",
calendarAddEntry: "Добавить запись",
statsCalendar: "Календари",
statsCalendarDate: "Даты календаря",
@@ -3235,6 +4247,146 @@ module.exports = {
tribeContentAccessDenied: "Доступ Запрещён",
tribeContentAccessDeniedMsg: "Этот контент принадлежит племени. Вы должны быть участником, чтобы получить к нему доступ.",
tribeViewTribes: "Посмотреть Племена",
+ tribeFilesEmpty: "Торрентов пока нет.",
+ filesLabel: "Торренты",
+ profileClearnetFilesLabel: "Торренты",
+ filesTitle: "Торренты",
+ filesDescription: "Исследуйте и управляйте торрентами в вашей сети.",
+ fileAllSectionTitle: "Торренты",
+ fileMineSectionTitle: "Ваши Торренты",
+ fileRecentSectionTitle: "Недавние Торренты",
+ fileTopSectionTitle: "Лучшие Торренты",
+ fileFavoritesSectionTitle: "Избранное",
+ fileFilterAll: "ВСЕ",
+ fileFilterMine: "МОИ",
+ fileFilterRecent: "НЕДАВНИЕ",
+ fileFilterTop: "ЛУЧШИЕ",
+ fileFilterFavorites: "ИЗБРАННОЕ",
+ fileCreateSectionTitle: "Загрузить Торрент",
+ fileUpdateSectionTitle: "Обновить Торрент",
+ fileCreateButton: "Загрузить Торрент",
+ fileUpdateButton: "Обновить",
+ fileAddFavoriteButton: "Добавить в Избранное",
+ fileRemoveFavoriteButton: "Убрать из Избранного",
+ fileFileLabel: "Выберите файл (макс: 75MB)",
+ calendarFilterRecent: "НЕДАВНИЕ",
+ calendarFilterAll: "ВСЕ",
+ calendarFilterMine: "МОИ",
+ calendarFilterFavorites: "ИЗБРАННОЕ",
+ calendarFilterOpen: "ОТКРЫТЫЕ",
+ calendarFilterClosed: "ЗАКРЫТЫЕ",
+ padFilterRecent: "НЕДАВНИЕ",
+ padFilterAll: "ВСЕ",
+ padFilterMine: "МОИ",
+ padFilterOpen: "ОТКРЫТЫЕ",
+ padFilterClosed: "ЗАКРЫТЫЕ",
+ chatFilterRecent: "НЕДАВНИЕ",
+ chatFilterAll: "ВСЕ",
+ chatFilterMine: "МОИ",
+ chatFilterFavorites: "ИЗБРАННОЕ",
+ chatFilterOpen: "ОТКРЫТЫЕ",
+ chatFilterClosed: "ЗАКРЫТЫЕ",
+ licenseLabel: "Лицензия",
+ phoneTitle: "Телефон",
+ phoneDescription: "Управляйте своими видеозвонками со сквозным шифрованием.",
+ phoneUnavailable: "Звонки недоступны на этом устройстве.",
+ phoneCallButton: "Позвонить",
+ profileVisibilityPhone: "Номер телефона",
+ phoneNumberUnknown: "Ни у кого в вашей сети нет номера {number}.",
+ phoneNumberChoose: "Проверьте, кому вы хотите позвонить по номеру {number}:",
+ phoneAnswer: "Ответить",
+ phoneSpeaker: "Динамик",
+ phoneEarpiece: "Наушник",
+ phoneReject: "Отклонить",
+ phoneHangup: "Завершить",
+ phoneMute: "Выключить микрофон",
+ phoneUnmute: "Включить микрофон",
+ phoneCameraOn: "Камера вкл",
+ phoneCameraOff: "Камера выкл",
+ settingsPhoneVideo: "Видео",
+ settingsPhoneVideoOn: "Разрешено в звонках и комнатах",
+ settingsPhoneVideoOff: "Только звук",
+ phoneSilence: "Не слышать",
+ phoneUnsilence: "Слышать снова",
+ phoneCalling: "Вызов:",
+ phoneIsCalling: "звонит вам",
+ notifyNewPmFrom: "Новое ЛС от",
+ notifyNewPamFrom: "Новое PaM от",
+ notifyUpdateLabel: "Обновление",
+ updateInstalledLabel: "Установленная версия",
+ updateAvailableLabel: "Доступная версия",
+ updateChangesLabel: "Изменения",
+ updateFilesLabel: "Файлы",
+ updateOriginLabel: "Источник",
+ phoneRecording: "Запись PaM для",
+ phoneLeaveMessage: "Никто не ответил: оставьте сообщение после сигнала.",
+ phoneLeaveMessageBusy: "Абонент разговаривает: оставьте сообщение после сигнала.",
+ phoneLeaveMessageUnreachable: "Не удалось связаться: оставьте сообщение после сигнала.",
+ phoneConnecting: "Соединение с",
+ phoneSendPam: "Отправить PaM",
+ phoneCancel: "Отмена",
+ phoneSearchPlaceholder: "Поиск в Телефоне...",
+ phonePamTitle: "Аудиозаписи",
+ phoneNew: "Новое",
+ phoneDelete: "Удалить",
+ phoneNoPams: "У вас нет аудиозаписей.",
+ phoneHistoryTitle: "История",
+ phoneLatestTitle: "Последние звонки",
+ phoneCreateButton: "Новый звонок",
+ phoneLimitsHint: "До 7 жителей на звонок; если больше одного — это совместный звонок.",
+ phoneErrorPub: "Пабам звонить нельзя.",
+ phoneJointCall: "Совместный звонок",
+ phoneWith: "С кем",
+ phoneResult: "Результат",
+ phoneWhen: "Когда",
+ phoneDuration: "Длительность",
+ phoneOutgoing: "Исходящий",
+ phoneIncoming: "Входящий",
+ phoneNoHistory: "Записей пока нет.",
+ phoneOutcomeEnded: "Принят",
+ phoneOutcomeMissed: "Пропущен",
+ phoneOutcomeRejected: "Отклонён",
+ phoneOutcomeNoanswer: "Нет ответа",
+ phoneOutcomeCancelled: "Отменён",
+ phoneOutcomePam: "PaM отправлен",
+ phoneOutcomeFailed: "Не удалось",
+ phoneDialAdd: "Добавить",
+ phoneDialBack: "Стереть",
+ phoneDialClear: "Очистить",
+ phoneDialPlaceholder: "Номер или Oasis ID",
+ phoneDialInhabitants: "Жители",
+ phoneDialRemove: "Убрать",
+ phoneOwnNumber: "Это ваш собственный номер.",
+ phoneSettingsDesc: "Выберите, кто может вам звонить.",
+ phoneDnd: "Не беспокоить",
+ phoneOpen: "Открыто",
+ phoneRecipientRefuses: "Житель, которому вы пытаетесь позвонить, не принимает звонки.",
+ phoneRefusedNotice: "Эти жители не принимают звонки, им не звонили:",
+ fileEmptyError: "Файл пустой. Выберите другой файл.",
+ fileTitleLabel: "Название",
+ fileTitlePlaceholder: "Название",
+ fileDescriptionLabel: "Описание",
+ fileDescriptionPlaceholder: "Описание",
+ fileTagsLabel: "Теги",
+ fileTagsPlaceholder: "Введите теги через запятую",
+ fileSizeLabel: "Размер",
+ fileDownloadButton: "СКАЧАТЬ",
+ fileDetailsButton: "ПОДРОБНОСТИ",
+ fileNoFile: "Нет торрент-файла",
+ fileSearchPlaceholder: "Поиск в Торренты...",
+ fileSearchButton: "Поиск",
+ fileSortRecent: "Самые новые",
+ fileSortOldest: "Самые старые",
+ fileSortTop: "Самые популярные",
+ fileNoMatch: "Совпадений не найдено.",
+ fileUpdatedAt: "Обновлено",
+ typeFile: "ТОРРЕНТЫ",
+ modulesFilesLabel: "Файлы",
+ modulesFilesDescription: "Модуль для открытия и управления аудио.",
+ tribeSectionFiles: "ТОРРЕНТЫ",
+ fileDescription: "Описание",
+ fileDownload: "Скачать",
+ fileTypeLabel: "Тип",
torrentsTitle: "Торренты",
torrentsDescription: "Исследуйте и управляйте торрентами в вашей сети.",
torrentAllSectionTitle: "Торренты",
@@ -3262,10 +4414,33 @@ module.exports = {
torrentTagsLabel: "Теги",
torrentTagsPlaceholder: "Введите теги через запятую",
torrentSizeLabel: "Размер",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "Создать торрент",
+ torrentFromContentMissing: "Файл ещё недоступен на этом узле. Попробуйте позже.",
+ torrentDownloads: "Загрузки",
+ torrentFetchOasis: "Скачать в Oasis",
+ torrentSaveFile: "Сохранить файл",
+ torrentSeeds: "сиды",
+ seedsLabel: "Сиды",
+ seedAction: "Поддержать",
+ torrentSourceFile: "Файл",
+ torrentStateQueued: "В очереди",
+ torrentStateProbing: "Поиск сидов",
+ torrentStateDownloading: "Загрузка",
+ torrentStateDone: "Завершено",
+ torrentStateFailed: "Ошибка",
+ torrentStateNoSource: "Нет подключённых сидов, ожидание",
+ torrentStateCancelled: "Отменено",
+ torrentNoDownloads: "Загрузок пока нет.",
+ torrentOriginalSection: "Оригинал",
+ torrentCancel: "Отмена",
+ torrentDownloadButton: "СКАЧАТЬ",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "ПОДРОБНОСТИ",
torrentNoFile: "Нет торрент-файла",
noTorrents: "Торренты не найдены.",
- torrentSearchPlaceholder: "Поиск по названию, тегам, автору...",
+ noFiles: "Торренты не найдены.",
+ torrentSearchPlaceholder: "Поиск в Торренты...",
torrentSearchButton: "Поиск",
torrentSortRecent: "Самые новые",
torrentSortOldest: "Самые старые",
@@ -3273,10 +4448,12 @@ module.exports = {
torrentNoMatch: "Совпадений не найдено.",
torrentUpdatedAt: "Обновлено",
statsTorrent: "Торренты",
+ statsFile: "Файлы",
typeTorrent: "ТОРРЕНТЫ",
modulesTorrentsLabel: "Торренты",
modulesTorrentsDescription: "Модуль для поиска и управления торрентами.",
favoritesFilterTorrents: "ТОРРЕНТЫ",
+ favoritesFilterFiles: "ФАЙЛЫ",
favoritesFilterMarket: "РЫНОК",
favoritesFilterEvents: "СОБЫТИЯ",
favoritesFilterForum: "ФОРУМ",
@@ -3290,15 +4467,17 @@ module.exports = {
favoritesFilterShopProducts: "ТОВАРЫ МАГАЗИНА",
tribeSectionTorrents: "ТОРРЕНТЫ",
tribeCreateTorrent: "Загрузить Торрент",
+ tribeCreateFile: "Загрузить файл",
settingsWishTitle: "Желание",
- settingsWishDesc: "Настройте желание вашего Аватара.",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "Определяет, как вы получаете доступ ко всему контенту и ваш опыт в сети Oasis.",
+ settingsWishWhole: "Мультивселенная",
+ settingsWishMutuals: "Только взаимная поддержка",
+ settingsWishOnlyLan: "Только LAN",
+ settingsWishLocal: "Локально",
settingsPmVisibilityTitle: "Личные сообщения",
settingsPmVisibilityDesc: "Настройте уровень открытости личных сообщений.",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "Мультивселенная",
+ settingsPmVisibilityMutuals: "Только взаимная поддержка",
pmMutualNotice: "Исходящие — защита UX. Входящие — фильтр внимания.",
inhabitantsPendingFollowsTitle: "Ожидающие запросы на поддержку",
inhabitantsPendingAccept: "Принять",
@@ -3342,7 +4521,7 @@ module.exports = {
tribeGovNoRevocations: "Пока нет ни одного отзыва",
tribeGovNoHistorical: "Пока нет ни одной записи",
logsTitle: "Журнал",
- logsDescription: "Записывайте свой опыт в сети.",
+ logsDescription: "Ведите личный дневник ваших впечатлений.",
logsViewTitle: "Журнал",
logsColumnType: "Тип",
logsView: "Смотреть",
@@ -3351,7 +4530,7 @@ module.exports = {
logsCreateTitle: "Создать запись",
logsWriteButton: "Написать",
logsTextPlaceholder: "Опишите ваши впечатления...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "ИИ-ассистент",
logsModeManual: "Вручную",
logsModeAI: "ИИ",
logsColumnLog: "Журнал",
@@ -3370,23 +4549,24 @@ module.exports = {
logsExportOne: "Экспортировать запись",
logsViewDetails: "Подробнее",
logsGenerateButton: "Сгенерировать текст",
- logsSearchText: "Искать в журналах...",
+ logsSearchText: "Поиск в Журнал...",
logsSearchAnyType: "Любой тип",
logsSearchButton: "Искать",
logsEmpty: "Записей пока нет.",
+ logsNothingNew: "Нет новых действий для записи.",
modulesLogsLabel: "Журнал",
- modulesLogsDescription: "Модуль для записи (с помощью ИИ-ассистента) ваших впечатлений.",
+ modulesLogsDescription: "Модуль для ведения личного дневника ваших впечатлений.",
statsLogsTitle: "Журнал",
typeLog: "ЖУРНАЛ",
larpTitle: "L.A.R.P.",
larpDescription: "Слой ролевой игры в реальном времени для совместных экспериментов.",
larpNoHousesMatch: "Нет домов, соответствующих запросу.",
- larpSearchPlaceholder: "Поиск домов...",
+ larpSearchPlaceholder: "Поиск в L.A.R.P....",
larpAllHouses: "Дома:",
larpFilterRuling: "ПРАВИТ",
larpFilterHouses: "ДОМА",
- larpFilterRules: "FAQ",
+ larpFilterRules: "ЧАВО",
larpRulesTitle: "L.A.R.P. FAQ",
larpRulesEntryText: "Каждый житель по умолчанию начинает в ACADEMIA. Из ACADEMIA выберите дом в панели «Вступить в дом»: это откроет вступительный тест. Ответьте на 10 вопросов и отправьте. Если вы преодолеете порог (7/10), вы будете автоматически приняты в этот дом; иначе вас отклонят, и вы останетесь в ACADEMIA. В любом случае система записывает ваш OasisID и цикл попытки и не даёт повторить попытку до окончания периода ожидания в 30 циклов.",
larpRulesGovernanceText: "В свой цикл правящий дом носит значок «Правит» и является единственным, чья Стена показывается публично под вкладкой ПРАВИТ.",
@@ -3397,118 +4577,117 @@ module.exports = {
larpPostPlaceholder: "Что должен сказать этот дом?",
larpPostSubmit: "Опубликовать",
larpCycleLabel: "Цикл:",
- audioBackToBcs: "Back to BCS",
+ audioBackToBcs: "Назад к BCS",
audioFilterBcs: "BCS",
- audioTranscodeButton: "TRANSCODE",
- audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.",
- audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.",
- audioTranscodeDetailTitle: "Transcode",
- audioTranscodeStegoEmpty: "(none)",
- audioTranscodeStegoMessage: "TEXT",
- audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.",
- audioTranscodeStegoOasisId: "By",
- audioTranscodeStegoTimestamp: "Generated at",
+ audioTranscodeButton: "ПЕРЕКОДИРОВАТЬ",
+ audioTranscodeCompositionEmpty: "Это аудио не содержит сохранённой композиции блокчейна.",
+ audioTranscodeDetailDescription: "Декодировать встроенную полезную нагрузку и исходную карту композиции блокчейна.",
+ audioTranscodeDetailTitle: "Перекодирование",
+ audioTranscodeStegoEmpty: "(нет)",
+ audioTranscodeStegoMessage: "ТЕКСТ",
+ audioTranscodeStegoNotFound: "Не удалось декодировать стеганографическую нагрузку из этого аудио.",
+ audioTranscodeStegoTimestamp: "Создано",
audioTranscodeStegoUnknown: "—",
- bankExchangeEcoTaxAnnual: "ECOin Taxes (annual)",
- bankExchangeEcoTaxMonthly: "ECOin Taxes (monthly)",
- bankOverviewYourTaxes: "Your taxes",
- bankRulesAlpha: "Alpha (max share of pub balance per epoch)",
+ bankExchangeEcoTaxAnnual: "Налоги ECOin (в год)",
+ bankExchangeEcoTaxMonthly: "Налоги ECOin (в месяц)",
+ bankOverviewYourTaxes: "Итого налоги",
+ bankRulesAlpha: "Alpha (макс. доля баланса паба за эпоху)",
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.",
- bankRulesArchTaxRate: "Rate",
- bankRulesArchTaxTitle: "ARCH Tax",
- bankRulesCapPerEpoch: "Cap per epoch (absolute)",
- bankRulesCapUser: "Cap per user per epoch",
- bankRulesCarbonFactor: "Carbon factor",
+ bankRulesArchTaxNote: "ARCH-налог отражает долгосрочную стоимость роста и поддержки архива сети: чем старше ваши данные в сети, тем больше ваша доля расходов на обслуживание.",
+ bankRulesArchTaxRate: "Ставка",
+ bankRulesArchTaxTitle: "ARCH-налог",
+ bankRulesCapPerEpoch: "Лимит на эпоху (абсолютный)",
+ bankRulesCapUser: "Лимит на пользователя за эпоху",
+ bankRulesCarbonFactor: "Углеродный коэффициент",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
- bankRulesChipTitle: "ECO Tax chip color band",
+ bankRulesChipNote: "Метка каждого элемента окрашивается относительно самого большого сообщения, когда-либо замеченного в сети, с поправкой на число активных жителей — более крупная сеть распределяет нагрузку и переводит больше элементов в зелёную зону.",
+ bankRulesChipTitle: "Цветовая шкала метки ECO-налога",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
- bankRulesEcoTaxRate: "Rate",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesEpochKind: "Epoch granularity",
- bankRulesFloor: "Floor per user (gross)",
- bankRulesGraceDays: "Claim grace period",
+ bankRulesEcoTaxNote: "ECO-налог вычитается из валового ББД при расчёте распределения эпохи. Вычтенные ECO не перераспределяются в этой эпохе — они остаются на балансе паба и пополняют фонд следующей эпохи через ограничения reserveMin / alpha.",
+ bankRulesEcoTaxRate: "Ставка",
+ bankRulesEcoTaxTitle: "ECO-налог",
+ bankRulesEpochKind: "Гранулярность эпохи",
+ bankRulesFloor: "Минимум на пользователя (брутто)",
+ bankRulesGraceDays: "Льготный период для заявки",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
- bankRulesKarmaTitle: "Karma (user engagement score)",
+ bankRulesKarmaNote: "Карма вычисляется по вашим действиям (публикации, голоса, участие в парламенте/судах и т. д.) с коэффициентом затухания во времени, за вычетом граммов углерода, созданных вашей лентой.",
+ bankRulesKarmaTitle: "Карма (оценка вовлечённости)",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
- bankRulesPoolTitle: "Monthly pool",
- bankRulesReserveMin: "Reserve minimum (kept in pub balance)",
+ bankRulesPoolTitle: "Ежемесячный фонд",
+ bankRulesReserveMin: "Минимальный резерв (остаётся на балансе паба)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
- bankRulesShareTitle: "Per-user share",
+ bankRulesShareTitle: "Доля на пользователя",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankRulesWMax: "Maximum weight (w_max)",
- bankRulesWMin: "Minimum weight (w_min)",
- bankTaxes: "Taxes",
- bankTaxesAnnualEcoin: "ECO Tax (annual)",
- bankTaxesArchTaxAnnual: "ARCH Tax (annual)",
- bankTaxesArchTaxFirstBlock: "Your first block age",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxLifetime: "ARCH Tax (lifetime)",
- bankTaxesArchTaxMonthly: "ARCH Tax (monthly)",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, and their ongoing contribution may be required by networking consensus.",
- bankTaxesArchTaxRate: "Rate",
- bankTaxesArchTaxTitle: "ARCH Tax",
- bankTaxesArchTaxUserAmount: "Your ARCH tax (price to return)",
- bankTaxesEcoTaxLifetime: "ECO Tax (lifetime)",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesLookupAuthor: "Author",
- bankTaxesLookupButton: "Inspect",
- bankTaxesLookupCarbon: "Carbon footprint",
- bankTaxesLookupEcoin: "ECO Tax",
- bankTaxesLookupNotFound: "No block found in your local feed with that ID.",
- bankTaxesLookupPlaceholder: "Block ID (e.g. %abc...=.sha256)",
- bankTaxesLookupSize: "Size",
- bankTaxesLookupTitle: "Inspect a block",
- bankTaxesLookupType: "Type",
- bankTaxesMonthlyEcoin: "ECO Tax (monthly)",
- bankTaxesRate: "Rate",
- bankTaxesSpan: "Sampling span",
- bankTaxesTotalAnnual: "Total (annual)",
- bankTaxesTotalBlocks: "Total blocks",
- bankTaxesTotalBytes: "Total bytes",
- bankTaxesTotalCarbon: "Total carbon",
- bankTaxesTotalEcoin: "Total ECO tax (lifetime)",
- bankTaxesTotalLifetime: "Total (lifetime)",
- bankTaxesTotalMonthly: "Total (monthly)",
- bankTaxesTypesApply: "Set my taxes",
- bankTaxesTypesLabel: "Select which taxes you want to pay",
- bankTaxesUserAmount: "Your ECO tax (price to return)",
- 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.",
- 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.",
- blockchainBackToBlockexplorer: "Back to blockexplorer",
- blockchainBlockNotAvailable: "This block is not available in your local feed. It may belong to a peer you are not yet replicating from.",
- ecoTaxLabel: "ECO Tax",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- melodyAllEmpty: "No BCS compositions from other inhabitants yet.",
- melodyByLabel: "By",
- melodyNoteUnavailable: "block not in your local feed",
- melodyUploadBcsButton: "Publish",
- melodyUploadBcsNameNote: "The audio will be published with the auto-generated name",
- melodyUploadBcsTitle: "Publish",
- melodyUploadStegoLabel: "Hidden message (steganography)",
- melodyUploadStegoMaxLabel: "max 280 characters",
- melodyUploadStegoPlaceholder: "Optional.",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
- statsPad: "Pads",
- statsPadEntry: "Pad entries",
- statsTombstoneEmpty: "No tombstones in the network yet.",
- typeGameScore: "GAME SCORES",
+ bankRulesWMax: "Максимальный вес (w_max)",
+ bankRulesWMin: "Минимальный вес (w_min)",
+ bankTaxes: "Налоги",
+ bankTaxesAnnualEcoin: "ECO-налог (в год)",
+ bankTaxesArchTaxAnnual: "ARCH-налог (в год)",
+ bankTaxesArchTaxFirstBlock: "Возраст вашего первого блока",
+ bankTaxesArchTaxFootprintNote: "ARCH-налог отражает стоимость роста и поддержки архива сети. Он рассчитывается по промежутку времени между вашим первым опубликованным блоком и самым новым блоком в сети — чем дольше ваша история живёт в архиве, тем больше ваша доля расходов на обслуживание.",
+ bankTaxesArchTaxLifetime: "ARCH-налог (за всё время)",
+ bankTaxesArchTaxMonthly: "ARCH-налог (в месяц)",
+ bankTaxesArchTaxNoteBold: "прямому снижению ARCH-налога",
+ bankTaxesArchTaxNoteIntro: "Ваш ARCH-налог вычитается из излишка, который сеть создаёт сверх вашего ББД; базовое значение ББД установлено как незыблемый минимум. Налог никогда не вычитается из фиксированной суммы, положенной каждому жителю в качестве ББД. Вычтенные средства питают алгоритм перераспределения богатства и возвращаются другим жителям через их заявки на ББД. У новых жителей и тех, кто специально занимается архивированием, репликацией и обслуживанием, скорее всего, будет задача поддерживать архив сети в порядке от вашего имени. Или они могут посвятить себя ",
+ bankTaxesArchTaxNoteOutro: " с помощью соглашений об обрезке, дедупликации избыточных данных и общей инфраструктуры обслуживания, а их постоянный вклад может потребоваться по консенсусу сети.",
+ bankTaxesArchTaxRate: "Ставка",
+ bankTaxesArchTaxTitle: "ARCH-налог",
+ bankTaxesArchTaxUserAmount: "Ваш ARCH-налог (сумма к возврату)",
+ bankTaxesEcoTaxLifetime: "ECO-налог (за всё время)",
+ bankTaxesEcoTaxTitle: "ECO-налог",
+ bankTaxesLookupAuthor: "Автор",
+ bankTaxesLookupButton: "Проверить",
+ bankTaxesLookupCarbon: "Углеродный след",
+ bankTaxesLookupEcoin: "ECO-налог",
+ bankTaxesLookupNotFound: "В вашей локальной ленте не найден блок с таким ID.",
+ bankTaxesLookupPlaceholder: "ID блока (напр. %abc...=.sha256)",
+ bankTaxesLookupSize: "Размер",
+ bankTaxesLookupTitle: "Проверить блок",
+ bankTaxesLookupType: "Тип",
+ bankTaxesMonthlyEcoin: "ECO-налог (в месяц)",
+ bankTaxesRate: "Ставка",
+ bankTaxesSpan: "Период выборки",
+ bankTaxesTotalAnnual: "Итого (в год)",
+ bankTaxesTotalBlocks: "Всего блоков",
+ bankTaxesTotalBytes: "Всего байт",
+ bankTaxesTotalCarbon: "Всего углерода",
+ bankTaxesTotalEcoin: "Итого ECO-налог (за всё время)",
+ bankTaxesTotalLifetime: "Итого (за всё время)",
+ bankTaxesTotalMonthly: "Итого (в месяц)",
+ bankTaxesTypesApply: "Установить мои налоги",
+ bankTaxesTypesLabel: "Выберите, какие налоги вы хотите платить",
+ bankTaxesUserAmount: "Ваш ECO-налог (сумма к возврату)",
+ bankTaxesUserNoteChips: "Метка ECO-налога рядом с каждым элементом меняет цвет (зелёный / жёлтый / красный) в зависимости от размера элемента относительно самого большого блока, когда-либо виденного в сети, с поправкой на число активных жителей — более крупная солнечно-панковская сеть распределяет нагрузку и переводит больше элементов в зелёную зону.",
+ bankTaxesUserNoteOtherParams: "Сейчас ECO-налог рассчитывается по углеродному следу каждого блока, но со временем может учитывать и другие параметры — энергию, затраченную на репликацию, избыточное хранение у узлов, пропускную способность для блобов, вычислительную стоимость расшифровки, майнинговый след связанных транзакций или любую другую измеримую нагрузку, которую сеть договорится учитывать.",
+ blockchainBackToBlockexplorer: "Назад к обозревателю блоков",
+ blockchainBlockNotAvailable: "Этот блок недоступен в вашей локальной ленте. Возможно, он принадлежит узлу, с которого вы ещё не реплицируете.",
+ ecoTaxLabel: "ECO-налог",
+ gamesHallDate: "Дата",
+ gamesNewRecord: "Новый рекорд!",
+ indexingRefreshNote: "Страница обновляется каждые 10 секунд.",
+ indexingMessage: "Oasis синхронизирует распределённую сеть узлов. Пожалуйста, подождите.",
+ indexingTitle: "Синхронизация",
+ melodyAllEmpty: "Пока нет BCS-композиций других жителей.",
+ melodyNoteUnavailable: "блока нет в вашей локальной ленте",
+ melodyUploadBcsButton: "Опубликовать",
+ melodyUploadBcsNameNote: "Аудио будет опубликовано с автоматически созданным именем",
+ melodyUploadBcsTitle: "Опубликовать",
+ melodyUploadStegoLabel: "Скрытое сообщение (стеганография)",
+ melodyUploadStegoMaxLabel: "не более 280 символов",
+ melodyUploadStegoPlaceholder: "Необязательно.",
+ padsNoItems: "Пады не найдены.",
+ padVersionHistory: "История версий",
+ padAttributionView: "По авторам",
+ padVersionView: "Просмотр",
+ statsChat: "Чаты",
+ statsChatMessage: "Сообщения чата",
+ statsGameScore: "Игры",
+ statsWiki: "Вики-страницы",
+ statsPad: "Пады",
+ statsPadEntry: "Записи падов",
+ statsTombstoneEmpty: "В сети пока нет удалений (tombstones).",
+ typeGameScore: "ИГРОВЫЕ ОЧКИ",
bankTaxesLookupNote: "Введите ID блока, чтобы найти его в вашем локальном канале.",
bankTaxesUserNoteChipsClick: "Нажмите на любой чип, чтобы проверить его блок в blockexplorer.",
mapUrlPlaceholder: "/maps/MAP_ID",
@@ -3523,6 +4702,14 @@ module.exports = {
settingsReplicationTitle: "Репликация",
settingsReplicationDesc: "Настройте количество переходов, которые ваш узел делает от вашего собственного канала при репликации содержимого.",
settingsReplicationHopsLabel: "Переходы",
+ settingsBlobCacheTitle: "Кэш медиа",
+ settingsBlobCacheDesc: "Контент других жителей хранится на этом устройстве. Выберите, сколько места он может занимать.",
+ settingsBlobCacheUsage: "Текущее использование",
+ settingsBlobCacheFiles: "файлов",
+ settingsBlobCacheLimit: "Лимит",
+ settingsBlobCacheUnlimited: "Без ограничения",
+ settingsBlobCacheCleanNow: "Очистить сейчас",
+ settingsBlobCacheCleaned: "Удалено файлов: {n}, освобождено {size}.",
aiApproveTagsLabel: "Теги (через запятую)",
aiApproveTagsPlaceholder: "напр. oasis, управление, экология",
aiApproveRatingLabel: "Оценка",
@@ -3550,8 +4737,6 @@ module.exports = {
larpInviteBannerHint: "Поделитесь этим кодом с кем-то в ACADEMIA. Срок действия — 30 циклов или одно использование.",
larpTestRankingTitle: "Очки по домам",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "Код приглашения дома",
- invitesHouseJoinButton: "Вступить в Дом",
larpLastAttemptTitle: "Ваша последняя попытка",
larpLastAttemptHouse: "Дом",
larpLastAttemptWhen: "Когда",
@@ -3569,7 +4754,7 @@ module.exports = {
larpBadgeYou: "Вы",
larpBadgeRuling: "Правит",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "Модуль слоя ролевой игры в реальном времени Oasis (9 Домов).",
+ modulesLarpDescription: "Модуль для слоя живой ролевой игры.",
larpProfileQ1: "Столкнувшись со сложной проблемой, что вы делаете в первую очередь?",
larpProfileQ1O1: "Говорить с другими, чтобы найти консенсус",
larpProfileQ1O2: "Создать прототип для проверки",
@@ -3643,7 +4828,52 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "Выберите режим UX-навигации для вашего интерфейса.",
uxModeMenus: "Блоки",
- uxModeAINav: "AI",
+ uxModeChats: "Беседы",
+ uxModeFeed: "Микроблогинг",
+ feedTrendingTitle: "Популярные теги",
+ feedActiveTitle: "Активные жители",
+ cnBrandSub: "Свободная · P2P · Федеративная",
+ cnSyncedPeers: "Синхронизированные узлы",
+ cnLicense: "Лицензия",
+ cnNotAccessible: "Контент сейчас недоступен.",
+ cnUntitled: "Без названия",
+ cnSearchPlaceholder: "Поиск…",
+ cnHubTitle: "Clearnet HUB",
+ cnHubDescription: "Публичный контент, которым делятся жители этой сети Oasis.",
+ cnHubEmpty: "В Clearnet пока не опубликовано публичного контента.",
+ cnPublicContent: "Контент",
+ cnTribesContent: "Племена",
+ cnNetworkContent: "Сеть",
+ cnCategoryEmpty: "В этой категории нет контента.",
+ cnInhabitantEmpty: "Этот житель пока не публиковал контент в Clearnet.",
+ cnPrevPage: "← Назад",
+ cnNextPage: "Далее →",
+ cnPageOf: "Страница {page} из {pages}",
+ cnMoreInfo: "Подробнее →",
+ cnOpenCourse: "Открытый курс",
+ cnAuction: "АУКЦИОН",
+ cnExchange: "ОБМЕН",
+ cnRssDescription: "опубликовано жителями этого HUB",
+ cnKindAudio: "Аудио",
+ cnKindBlog: "Блог",
+ cnKindBookmark: "Закладка",
+ cnKindDocument: "Документ",
+ cnKindEvent: "Событие",
+ cnKindFeed: "Лента",
+ cnKindImage: "Изображение",
+ cnKindJob: "Вакансия",
+ cnKindMarket: "Рынок",
+ cnKindPodcast: "Подкаст",
+ cnKindProject: "Проект",
+ cnKindCourse: "Курс",
+ cnKindShop: "Магазин",
+ cnKindTorrent: "Торрент",
+ cnKindFile: "Файл",
+ cnKindVideo: "Видео",
+ cnKindWiki: "Вики",
+ cnKindRoom: "Комната",
+ cnKindMap: "Карта",
+ uxModeAINav: "ИИ",
}
};
diff --git a/src/client/assets/translations/oasis_zh.js b/src/client/assets/translations/oasis_zh.js
index 4080916..f55987b 100644
--- a/src/client/assets/translations/oasis_zh.js
+++ b/src/client/assets/translations/oasis_zh.js
@@ -9,7 +9,7 @@ module.exports = {
shopPurchasesButton: "购买记录",
shopMyOrdersDescription: "你的购买订单。",
shopMyOrdersEmpty: "你还没有购买记录。",
- shopOrderPmSeller: "PM Seller",
+ shopOrderPmSeller: "PM 卖家",
shopOrderSeller: "卖家",
shopOrderInvoice: "发票",
shopOrderInvoiceConcept: "发票",
@@ -20,7 +20,7 @@ module.exports = {
shopOrderAccept: "接受",
shopOrderReject: "拒绝",
shopOrderMarkShipped: "标记为已发货",
- shopOrderPmBuyer: "PM Buyer",
+ shopOrderPmBuyer: "PM 买家",
shopOrderContractConcept: "商店订单",
shopOrdersPending: "待处理订单",
all: "全部",
@@ -54,13 +54,13 @@ module.exports = {
contentWarningLabel: "内容警告",
invalidPost: "无效内容",
invalidPostHint: "此消息文本无效或为空。",
- spreadBy: "由",
spreadChron: "传播",
spreaded: "已传播",
spreadContentUnavailable: "内容尚不可用(等待同步)",
filteredByTag: "按标签筛选",
filteredByTagTitle: "按标签筛选",
feedPublishedSuccess: "动态发布成功!",
+ feedMastodonFailed: "已在 Oasis 发布,但无法发送到 Mastodon。",
tribeFeedSent: "消息发送成功!",
tribeContentEncrypted: "加密内容",
tribeTorrentsEmpty: "暂无种子。",
@@ -77,8 +77,7 @@ module.exports = {
bookmarkLastVisit: "最近访问",
profileClearnetBookmarksLabel: "书签",
invitesPort: "端口",
- currentlyUnrecheable: "错误!",
- peerHostValidation: "有效的 IPv4(如 192.168.1.100)或主机名(如 pub.example.com)",
+ peerHostValidation: "有效的 IPv4(如 192.168.1.100)或主机名(如 pub.solarnethub.com)",
peerPortValidation: "端口 1-65535",
peerKeyValidation: "SSB ed25519 公钥 (@<44 字符 base64>=.ed25519)",
inboxJobUnsubscribedTitle: "取消订阅你的招聘",
@@ -105,7 +104,7 @@ module.exports = {
taskDescriptionPlaceholder: "任务描述",
exportPasswordLabel: "导出密码",
importPasswordPlaceholder: "输入密码",
- searchCasesPlaceholder: "搜索案件…",
+ searchCasesPlaceholder: "在法庭中搜索...",
shopBuyDeliveryAddressPlaceholder: "收货地址",
shopBuyNotesPlaceholder: "备注",
bankTaxesUserNoteBold: "直接降低 ECO 税",
@@ -126,11 +125,6 @@ module.exports = {
courtsSupportCase: "支持该案",
courtsSettlementAcceptBtn: "接受和解",
courtsSupportCount: "支持者",
- courtsVerdictVoteTitle: "对裁决投票",
- courtsVerdictVoteLabel: "裁决投票",
- courtsVerdictVoteAccept: "接受",
- courtsVerdictVoteReject: "拒绝",
- courtsVerdictVoteSubmit: "提交投票",
reportsSetStatus: "设置状态",
reportsStatusClosed: "已关闭",
statsAvgPerInhabitant: "人均",
@@ -189,9 +183,29 @@ module.exports = {
],
profile: "头像",
inhabitants: "居民",
- peersReplicatedFeeds: "复制的 Feed",
+ peersReplicatedFeeds: "已复制",
+ peersTorColumn: "TOR",
+ peersTorYes: "可通过 Tor 访问",
+ peersTorNo: "无法通过 Tor 访问",
+ peersOasisId: "Oasis ID",
+ peersOasisVersion: "版本",
graphos: "Graphos",
graphosDescription: "你周围网络的互动地图。",
+ graphosFederation: "联邦",
+ graphosFedPubs: "PUB",
+ graphosFedUnreachable: "无法访问",
+ graphosFedLinks: "双向链接",
+ graphosFedIsolated: "孤立",
+ graphosFedNoData: "无数据",
+ graphosFedMutual: "双向",
+ graphosFedOneWay: "单向",
+ graphosFedTransport: "网络",
+ graphosFedWith: "联邦对象",
+ graphosZoom: "放大",
+ graphosFedInhabitants: "居民",
+ graphosFedClearnet: "互联网",
+ graphosFedBoth: "互联网 + TOR",
+ graphosFedEmpty: "你的节点还不知道任何 PUB。",
graphosViewingGraphOf: "正在查看",
graphosBackToMine: "← 我的网络",
graphosShowing: "显示",
@@ -203,8 +217,24 @@ module.exports = {
"。",
],
noMentions: "你还没有收到@提及。",
- mentionsSearchPlaceholder: "搜索提及...",
+ mentionsSearchPlaceholder: "在提及中搜索...",
privateReminders: "提醒",
+ inboxFilterPms: "私信",
+ inboxFilterNotifications: "通知",
+ inboxMarkRead: "标为已读",
+ inboxMarkUnread: "标为未读",
+ inboxUnreadChip: "未读",
+ inboxMarkAllRead: "全部标为已读",
+ inboxDeleteShown: "全部删除",
+ inboxArchive: "归档",
+ inboxUnarchive: "取消归档",
+ inboxFilterArchived: "已归档",
+ inboxEarlierMessages: "条较早的消息",
+ inboxSortThread: "按会话",
+ inboxSortRecent: "最新优先",
+ inboxAllBots: "机器人",
+ settingsInboxBotsTitle: "收件箱通知",
+ settingsInboxBotsDesc: "选择哪些机器人可以在收件箱中通知你。未勾选的机器人将被隐藏,其通知不计入计数。",
inboxFiltersLabel: "筛选:",
inboxToggleToMutuals: "切换为相互关注",
inboxToggleToWhole: "切换为所有人",
@@ -212,6 +242,7 @@ module.exports = {
pmReply: "回复",
pmReplies: "回复",
inReplyTo: "回复",
+ forumInThread: "主题内",
pmPreview: "预览",
pmPreviewTitle: "消息预览",
peers: "节点",
@@ -219,8 +250,9 @@ module.exports = {
searchFromLabel: "从",
searchToLabel: "到",
searchQueryLabel: "查询",
- searchPerPageLabel: "每页结果数",
+ searchPerPageLabel: "结果",
settings: "设置",
+ settingsDescription: "设置你的网络环境。",
continueReading: "继续阅读",
moreComments: "更多评论",
readThread: "阅读剩余讨论串",
@@ -241,7 +273,6 @@ module.exports = {
profileClearnetHelp: '可以从 Oasis 外部访问的模块。',
profileHubAll: '全部',
footerLicenseLabel: '许可证',
- profileSwitchToOasis: '返回 Oasis',
profileVisibilityFediverse: "多元宇宙",
contributorsTitle: "贡献者",
colorLabel: '选择颜色',
@@ -251,6 +282,7 @@ module.exports = {
modulesViewTitle: "模块",
modulesViewDescription: "通过启用或禁用模块来设置你的环境。",
inbox: "收件箱",
+ inboxSearchPlaceholder: "在收件箱中搜索...",
multiverse: "多元宇宙",
fediverse: "多元宇宙",
fediverseDescription: "管理你的其他多元宇宙账户,包括发送和接收内容。",
@@ -259,9 +291,17 @@ module.exports = {
fediverseSettingsTitle: "多元宇宙",
fediverseInstanceLabel: "地址",
fediverseTokenLabel: "访问令牌",
- fediverseTokenHelp: "设置你的访问令牌。它将用于在 Oasis 中管理你的 Mastodon 账户。",
fediverseConnect: "连接",
fediverseConnectedAs: "已连接为",
+ nextcloudServerLabel: "服务器",
+ nextcloudUserLabel: "用户",
+ nextcloudFolderLabel: "文件夹",
+ nextcloudUploadButton: "上传",
+ nextcloudFileLabel: "选择文件",
+ fileExternalLink: "外部链接",
+ nextcloudErrConnect: "无法用这些信息连接到 Nextcloud。",
+ nextcloudErrUpload: "上传到 Nextcloud 失败。",
+ nextcloudErrShare: "Nextcloud 没有为该文件提供公开链接。",
fediverseDisconnect: "断开连接",
fediverseEmptyLink: "设置",
fediverseComposePlaceholder: "在想什么?",
@@ -290,6 +330,76 @@ module.exports = {
fediverseErrPost: "无法发布。",
fediverseErrMedia: "无法上传文件。",
fediverseErrEmpty: "写点什么或添加文件。",
+ telegramApiIdLabel: "ID",
+ telegramApiHashLabel: "API hash",
+ telegramPhoneLabel: "手机号",
+ telegramSendCode: "发送验证码",
+ telegramCodeHelp: "输入 Telegram 刚发送的登录码(应用或短信)。",
+ telegramCodeLabel: "登录码",
+ telegramPasswordHelp: "该账号启用了两步验证,请输入云密码。",
+ telegramPasswordLabel: "密码",
+ telegramVerify: "验证",
+ telegramCancel: "取消",
+ telegramChats: "聊天",
+ telegramUnread: "未读",
+ telegramOpen: "打开",
+ telegramSend: "发送",
+ telegramYou: "你",
+ telegramNoChats: "还没有聊天。",
+ telegramNoMessages: "还没有消息。",
+ telegramComposePlaceholder: "输入消息…",
+ telegramChannel: "频道",
+ telegramGroup: "群组",
+ telegramPrivate: "私聊",
+ telegramErrConnect: "无法连接 Telegram。",
+ telegramErrTimeout: "Telegram 响应超时。",
+ telegramErrAuth: "Telegram 会话无效或已过期,请重新连接。",
+ telegramErrFetch: "无法加载聊天。",
+ telegramErrSend: "无法发送消息。",
+ telegramErrMissing: "需要 API ID、API hash 和手机号。",
+ telegramErrCode: "验证码无效,请重试。",
+ telegramErrCodeExpired: "验证码已过期,请重新开始。",
+ telegramErrPassword: "密码错误。",
+ telegramErrPhone: "手机号无效。",
+ telegramErrApi: "API ID 或 API hash 无效。",
+ telegramErrFlood: "尝试次数过多,请稍后再试。",
+ telegramErrNoLogin: "没有进行中的登录,请重新开始。",
+ peertubeUsernameLabel: "用户名",
+ peertubePasswordLabel: "密码",
+ peertubeSubscriptions: "订阅",
+ peertubeMyVideos: "我的视频",
+ peertubeVideos: "视频",
+ peertubeFollowers: "关注者",
+ peertubeViews: "次观看",
+ peertubeLikes: "赞",
+ peertubeQuota: "配额",
+ peertubeUpload: "上传视频",
+ peertubeUploadHelp: "选择一个视频文件。它会上传到你的频道,随后由 PeerTube 处理。",
+ peertubeTitleLabel: "标题",
+ peertubeDescriptionLabel: "描述",
+ peertubePrivacyLabel: "隐私",
+ peertubePrivacyPublic: "公开",
+ peertubePrivacyUnlisted: "不公开列出",
+ peertubePrivacyPrivate: "私密",
+ peertubeNoVideos: "还没有视频。",
+ peertubeComments: "评论",
+ peertubeComment: "评论",
+ peertubeCommentPlaceholder: "写下评论…",
+ peertubeNoComments: "还没有评论。",
+ peertubeOpen: "在 PeerTube 打开",
+ peertubeWatch: "观看",
+ peertubeChannel: "频道",
+ peertubeNoStream: "此视频暂时无法在这里播放。请在 PeerTube 打开。",
+ peertubeUploaded: "视频已上传。PeerTube 正在处理。",
+ peertubeErrConnect: "无法连接 PeerTube。",
+ peertubeErrAuth: "用户名或密码错误,或会话已过期。请重新连接。",
+ peertubeErrInstance: "实例地址无效。",
+ peertubeErrMissing: "需要实例、用户名和密码。",
+ peertubeErrFetch: "无法加载视频。",
+ peertubeErrUpload: "无法上传视频。",
+ peertubeErrTitle: "需要标题。",
+ peertubeErrComment: "无法发布评论。",
+ peertubeErrNoFile: "请选择视频文件。",
bookmarksLabel: "书签",
videosLabel: "视频",
torrentsLabel: "种子",
@@ -312,7 +422,6 @@ module.exports = {
comment: "评论",
subtopic: "子话题",
json: "JSON",
- createdBy: "作者",
unfollow: "取消支持",
follow: "支持",
block: "屏蔽",
@@ -328,12 +437,15 @@ module.exports = {
relationshipNone: "你未支持",
relationshipBlockingPost: "已屏蔽的帖子",
viewLikes: "查看传播",
+ viewSupporters: "查看支持者",
spreadedDescription: "该居民传播的帖子列表。",
preview: "预览",
publish: "写作",
contentWarningPlaceholder: "为帖子添加主题(可选)",
- publishWarningPlaceholder: "正文上限 7000 个字符。",
+ publishWarningPlaceholder: "写下你的文章正文。",
publishTooLong: "你的帖子太长了,请缩短。",
+ keepTextRetry: "重新发送",
+ dateInPastError: "日期不能早于今天",
publishCustomDescription: [
"提醒:由于区块链技术,帖子一旦发布就无法编辑或删除。",
],
@@ -363,9 +475,8 @@ module.exports = {
mentionsMatching: "匹配的提及",
mentionsName: "名称",
mentionsRelationship: "关系",
- updateit: "获取更新!",
updateBannerText: "Oasis 有新版本可用。",
- updateBannerAction: "立即更新 →",
+ updateBannerAction: "立即更新!",
info: "信息",
settingsIntro: ({ version }) => [
`[SNH] ꖒ OASIS [ v.${version} ]`,
@@ -373,16 +484,14 @@ module.exports = {
timeAgo: "前",
sendTime: "大约 ",
theme: "主题",
- legacy: "密钥",
- legacyTitle: "密钥",
- legacyDescription: "快速安全地管理你的密钥(私钥)。",
- legacyExportButton: "导出",
- legacyImportButton: "导入",
+ backupKeysExportButton: "导出",
+ backupKeysImportButton: "导入",
ssbLogStream: "区块链",
ssbLogStreamDescription: "配置区块链流的消息限制。",
+ logWindowChip: "最近 {n} 条区块链流",
saveSettings: "保存设置",
exportDescription: "设置密码(至少32个字符)以加密你的密钥",
- exportDataTitle: "备份",
+ exportDataTitle: "即时备份",
exportDataDescription: "下载你的数据(不包含私钥!)",
exportDataButton: "下载数据库",
importDescription: "导入你的加密私钥以启用你的头像",
@@ -391,38 +500,33 @@ module.exports = {
fileInfo: "你的加密私钥将下载到你的设备(文件名:oasis.enc)",
developer: "开发",
devTitle: "开发",
- welcomeBannerText: "欢迎来到 OASIS。按这几个步骤设置你的化身。",
+ welcomeBannerText: "你的头像还没有设置。",
aiSuggestionBanner: "建议:",
aiSuggestionsEnable: "AI 建议",
- welcomeBannerAction: "开始设置!",
+ welcomeBannerAction: "开始",
welcomeTitle: "欢迎",
+ welcomeStepIdentity: "身份",
+ welcomeStepType: "类型",
+ welcomeStepUse: "用途",
+ welcomeStepLook: "外观",
+ welcomeStepCommunity: "社区",
+ welcomeStepIntro: "欢迎",
+ welcomeHintIdentity: "你的名字和头像。",
+ welcomeHintType: "Oasis 为你打开的方式。",
+ welcomeHintUse: "保留哪些模块。",
+ welcomeHintLook: "Oasis 使用的主题。",
+ welcomeHintCommunity: "加入一个 PUB 认识其他居民。",
+ welcomeHintIntro: "向社区发送第一条问候。",
+ welcomeStepThemeAction: "使用此主题",
+ welcomeJoinPubs: "加入 PUB",
+ welcomeNoFederation: "不加入联邦",
welcomeStepGreetingAction: "发送",
- welcomeJoinPubButton: "加入 pub",
- welcomeStepLarpAction: "加入「学院」",
- welcomeStepLarpText: "加入我们的实境角色扮演游戏。",
- welcomeStepLarpTitle: "加入 L.A.R.P.",
- welcomeStepGreetingTitle: "发送一句「Hello world!」",
- welcomeStepGreetingText: "发一条消息,让其他居民能发现你。",
- welcomeJoinPub: "加入",
welcomeDescription: "开始之前值得做的几件事。",
- welcomeProgress: "已完成",
- welcomeStepDone: "完成",
- welcomeStepPending: "待办",
welcomeSkip: "暂不设置",
- welcomeStepLanguageTitle: "选择你的语言",
- welcomeStepLanguageText: "Oasis 支持多种语言,随时都可以更改。",
- welcomeStepProfileTitle: "编辑你的资料",
- welcomeStepProfileText: "取个名字、写段介绍并设置头像,让其他居民认得你。",
welcomeStepProfileAction: "保存资料",
- welcomeStepFederationTitle: "加入主网络",
- welcomeStepFederationText: "连接到我们的 pub,认识其他居民并开始同步。",
- welcomeStepFederationAction: "前往邀请",
- welcomeStepBackupTitle: "备份你的 ID",
- welcomeStepBackupText: "你的身份就是本机上的一个密钥文件。",
- welcomeStepBackupWarning: "一旦丢失,没有任何人能帮你找回。",
- welcomeStepBackupAction: "立即备份!",
+ welcomeBootstrapRunning: "正在加载 pub 的快照。完成后会自动加入该 pub;在此期间你可以继续使用 Oasis。",
welcomeCompleteTitle: "全部就绪。",
- welcomeCompleteText: "你的节点已经就绪。从这里开始,网络随着你关注的人一起成长。",
+ welcomeCompleteText: "你的节点已经就绪。从这里开始,网络随着你支持的居民一起成长。",
welcomeFindPeople: "寻找居民",
devFilterFiles: "文件",
devFilterSearch: "搜索",
@@ -432,7 +536,7 @@ module.exports = {
devFilterTests: "测试",
devVersion: "版本",
devNodeVersion: "Node",
- devStatsTests: "测试套件",
+ devStatsTests: "测试",
devParentFolder: "上级文件夹",
devOpenFolder: "打开",
devDescription: "浏览本节点上运行的源代码。",
@@ -476,6 +580,27 @@ module.exports = {
"如果你想使用其他语言,请在此选择。",
setLanguage: "设置语言",
peerConnectionsIntro: "管理与其他节点的所有连接。",
+ peersConnectFailed: "无法连接:{reason}。",
+ peerStateLabel: "状态",
+ peerAddressLabel: "地址",
+ peerLastChangeLabel: "最后变更",
+ peerStateConnected: "已连接",
+ peerStateConnecting: "正在连接",
+ peerStateStaged: "可用",
+ peerErrSilent: "无活动",
+ peerErrTimeout: "无响应",
+ peerErrRefused: "拒绝连接",
+ peerErrNotFound: "未知地址",
+ peerErrUnreachable: "网络不可达",
+ peerErrKeys: "使用不同的密钥",
+ peerErrIdentity: "不接受你的连接",
+ peerErrTor: "仅限 TOR",
+ peerErrDropped: "连接中断",
+ peerErrPaused: "网络已暂停",
+ peerErrOther: "连接错误",
+ peerOutdated: "已过时",
+ peerVersionUnannounced: "未公布其版本:旧版 Oasis",
+ peersTorMissing: "此 PUB 仅允许通过 TOR 连接。",
peerConnectionsTitle: "连接",
online: "在线",
offline: "离线",
@@ -494,22 +619,25 @@ module.exports = {
noConnections: "没有已连接的节点。",
noDiscovered: "没有已发现的节点。",
noUnknownPeers: "好友图中没有未知节点。",
- peersTechnicalEmpty: "No peers registered yet.",
- peerConnect: "Connect",
- peerDisconnect: "Disconnect",
+ peersTechnicalEmpty: "尚未登记任何节点。",
+ peerConnect: "连接",
+ peerDisconnect: "断开",
peerRefresh: "刷新",
peerPruneIdle: "移除空闲",
+ peersPause: "暂停",
+ peersResume: "继续",
+ peersPausedNote: "已暂停:Oasis 不会连接任何人,也没有人能连接到它。",
+ peersPauseHint: "停止所有连接:在你恢复之前,Oasis 不会连接其他节点,也不接受它们的连接。",
peerExport: "导出",
peerImport: "导入",
peerImportTitle: "导入对等节点列表",
peerImportPlaceholder: "每行粘贴一个 multiserver 地址,或上传 .txt 文件……",
connectionActionIntro:
"",
- startNetworking: "启动网络",
- stopNetworking: "停止网络",
- restartNetworking: "重启网络",
- sync: "同步网络",
indexes: "索引",
+ indexesRebuilt: "索引已重建",
+ indexesRebuildFailed: "无法重建索引",
+ indexesFiles: "索引文件",
indexesDescription:
"重建索引是安全的,可能修复某些类型的错误。",
homePageTitle: "主页",
@@ -519,44 +647,33 @@ module.exports = {
invitesDescription: "管理和应用你网络中的邀请码。",
invitesPubsHint: "粘贴 pub 邀请码,与它建立联邦并开始复制其居民。",
invitesFederationsHint: "已联邦的 pub:刷新、移除无法连接的,或导出列表。",
- invitesHousesHint: "输入房屋代码以加入 LARP 房屋并参与其经济。",
- invitesTribesHint: "输入部落代码以成为成员并访问其私有内容。",
- invitesChatsHint: "输入聊天代码以加入对话及其话题。",
- invitesPadsHint: "输入协作页代码,与他人共同编辑同一份文档。",
- invitesCalendarsHint: "输入日历代码以共享日期与提醒。",
- invitesEventsHint: "输入活动代码以加入私密活动。",
- invitesForumsHint: "输入论坛代码以在私密论坛中阅读与回复。",
- invitesMapsHint: "输入地图代码,在共享地图上查看和添加地点。",
- invitesShopsHint: "输入店铺代码以加入店铺及其目录。",
- invitesInhabitantsHint: "输入居民代码以互相关注并交换内容。",
invitesTribesTitle: "部落",
- invitesTribeInviteCodePlaceholder: "输入部落邀请码",
- invitesTribeJoinButton: "加入部落",
invitesChatsTitle: "聊天",
- invitesChatInviteCodePlaceholder: "输入聊天邀请码",
- invitesChatJoinButton: "加入聊天",
invitesPadsTitle: "协作板",
- invitesPadInviteCodePlaceholder: "输入协作板邀请码",
- invitesPadJoinButton: "加入协作板",
invitesCalendarsTitle: "日历",
- invitesCalendarInviteCodePlaceholder: "输入日历邀请码",
- invitesCalendarJoinButton: "加入日历",
invitesEventsTitle: "活动",
- invitesEventInviteCodePlaceholder: "输入活动邀请码",
- invitesEventJoinButton: "加入活动",
invitesForumsTitle: "论坛",
- invitesForumInviteCodePlaceholder: "输入论坛邀请码",
- invitesForumJoinButton: "加入论坛",
invitesMapsTitle: "地图",
- invitesMapInviteCodePlaceholder: "输入地图邀请码",
- invitesMapJoinButton: "加入地图",
invitesShopsTitle: "商店",
- invitesShopInviteCodePlaceholder: "输入商店邀请码",
- invitesShopJoinButton: "加入商店",
invitesPubsTitle: "PUBs",
+ invitesSuggestedPubs: "推荐的 PUB",
+ invitesFilterOthers: "其他",
+ invitesJoinTitle: "邀请",
+ invitesJoinHint: "粘贴任何邀请码(无论用于什么),或某位居民的 Oasis ID。",
+ invitesJoinPlaceholder: "邀请码或 Oasis ID",
+ invitesJoinButton: "加入",
+ invitesUsedTitle: "最近的邀请",
+ invitesUsedEmpty: "你还没有使用过任何邀请。",
+ invitesUsedType: "类型",
+ invitesUsedName: "名称",
+ invitesUsedDate: "日期",
invitesPubInviteCodePlaceholder: "输入 PUB 邀请码",
invitesAcceptInvite: "加入 PUB",
+ invitesPubUses: "已用邀请",
+ invitesPubExhausted: "此 PUB 已没有可用的邀请。",
invitesAlreadyFederated: "您已与该 pub 建立联邦。",
+ invitesJoinPubMode: "此 Oasis 以只读模式作为 PUB 运行。要将其加入另一个 PUB,请在终端中使用:./oasis.sh join <邀请码>",
+ invitesJoinLocalOnly: "只能在运行 Oasis 的设备上接受邀请,或使用其启动时显示的管理链接。",
invitesFederationsTitle: "联邦",
invitesAcceptedInvites: "已联邦",
invitesUnfollow: "取消关注",
@@ -564,16 +681,12 @@ module.exports = {
invitesUnfollowedInvites: "未联邦",
invitesNoFederatedPubs: "没有已联邦的 pub。",
invitesNoUnfollowed: "没有未联邦的 pub。",
- invitesUnreachablePubs: "不可达",
- invitesNoUnreachablePubs: "没有不可达的 pub。",
invitesPubsRefresh: "刷新",
- invitesPubsClearUnreachable: "移除不可达",
+ invitesPubsClearUnreachable: "清理",
invitesPubsExport: "导出",
invitesPubsImport: "导入",
invitesPubsImportTitle: "导入 pubs",
invitesPubsImportPlaceholder: "每行粘贴一个 multiserver 地址或邀请码,或上传 .txt 文件……",
- currentlyUnreachable: "错误!",
- errorDetails: "错误详情",
genericError: "发生了一个错误。",
panicMode: "紧急模式!",
encryptData: "设置密码(至少32个字符)以加密你的区块链",
@@ -600,7 +713,6 @@ module.exports = {
votesOptionNoLabel:"反对",
votesOptionAbstentionLabel:"弃权",
votesQuestionLabel:"问题",
- votesCreatedByLabel:"创建者",
voteStatusOpen:"进行中",
voteStatusClosed:"已关闭",
commentDescription: ({ parentUrl }) => [
@@ -618,22 +730,22 @@ module.exports = {
searchSubmit: "搜索...",
votesLabel: "投票",
pdfFallbackLabel: "PDF 文档",
- shopLabel: "SHOPS",
- voteLabel: "VOTES",
+ shopLabel: "商店",
+ voteLabel: "投票",
submit: "提交",
editProfile: "编辑头像",
oasisIdLabel: "OasisID",
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- /multiverse — 管理你的其他多元宇宙账户,包括发送和接收内容。\n\n这条消息是私下从你发给你自己的,因此无需任何连接即可接收。",
+ welcomePmBody: "欢迎来到 Oasis — 一个自由、点对点、联邦化且加密的社交网络,采用仅限邀请的分布式架构。\n\n一些值得开始探索的地方:\n\n- [/avatar](/profile) —— 编辑你的头像、名字、简介以及在公开侧显示哪些模块。\n- /settings — 调整你的本地实例:语言、主题、模块、隐私和同步。\n- /invites —— 添加一个 pub,与更广泛的网络联邦。\n- /peers —— 查看谁已连接,重新扫描局域网,导出或导入对等节点列表。\n- /inhabitants —— 发现并访问其他居民的头像。\n- /tribes —— 创建或加入端到端加密的私人小组。\n- /search — 按类型搜索网络内容。\n\n一些值得连接的地方:\n\n- /multiverse — 管理你的其他多元宇宙账户,包括发送和接收内容。\n\n这条消息是私下从你发给你自己的,因此无需任何连接即可接收。",
profileSensorsSectionTitle: "传感器",
profileVisibilityActivity: "活跃度",
profileDeviceLockedHint: "此传感器始终开启:它让其他人看到你从哪个设备连接,并且无法关闭。",
profileVisibilityKarma: "KARMA 评分",
profileVisibilityUbi: "UBI",
- profileVisibilityWallet: "ECOIN 钱包",
- profileVisibilityEcoTax: "ECO Tax",
- profileVisibilityLarpSign: "L.A.R.P. Sign",
+ profileVisibilityWallet: "ECOin 钱包",
+ profileVisibilityEcoTax: "ECO 税",
+ profileVisibilityLarpSign: "L.A.R.P. 徽记",
profileVisibilityGpg: "GPG 密钥",
clearnetSectionTitle: "Clearnet",
profileClearnetShopsLabel: "店铺",
@@ -646,6 +758,10 @@ module.exports = {
profileClearnetImagesLabel: "图片",
profileClearnetDocumentsLabel: "文档",
profileClearnetTorrentsLabel: "种子",
+ profileClearnetPodcastsLabel: "播客",
+ profileClearnetMarketLabel: "市场",
+ profileClearnetFeedLabel: "动态",
+ profileClearnetWikiLabel: "维基",
editProfileDescription:
"",
profileName: "名称",
@@ -671,7 +787,7 @@ module.exports = {
walletBalanceLine: ({ balance }) => `${balance} ECO`,
walletCnfrs: "确认数",
walletConfirm: "确认",
- walletDescription: "管理你的数字资产,包括发送和接收 ECOin、查看余额和访问交易历史。",
+ walletDescription: "管理您的 ECOin 钱包。",
walletDate: "日期",
walletFee: "手续费(手续费越高,交易处理越快)",
walletFeeLine: ({ fee }) => `手续费:ECO ${fee}`,
@@ -679,6 +795,86 @@ module.exports = {
walletReceive: "接收",
walletReset: "重置",
walletSend: "发送",
+ walletPayingTransfer: "正在支付转账",
+ walletCreateTransferLabel: "生成智能合约(转账)",
+ walletTransferNotifiedNote: "已通知对方本次付款",
+ walletTransferCreatedNote: "已为本次付款创建转账(收据)",
+ walletTransferNoPayeeNote: "没有居民发布过此地址,因此未创建转账",
+ walletTransferReceiptConcept: "钱包付款",
+ walletPaymentPmText: "向你发送了一笔付款",
+ walletPayeeLabel: "收款人",
+ walletConceptLabel: "事由",
+ pmBotBanking: "BankingBot",
+ bankingBotUbiPaidTitle: "您已收到 UBI。",
+ bankingBotPaymentTitle: "您已收到一笔付款。",
+ bankingBotUbiPaidText: "您的全民基本收入已发放",
+ bankUbiPubThisNode: "本节点负责发放 UBI",
+ bankUbiPubConnected: "UBI PUB",
+ bankUbiPubNone: "您的网络中尚无 PUB 宣告 UBI",
+ bankUbiAddressPublished: "ECOin 地址已发布",
+ bankUbiAddressMissing: "发布您的 ECOin 地址以领取 UBI",
+ bankUbiClaimedThisMonth: "本月已领取",
+ bankUbiPubBalance: "可用于 UBI 的 PUB 钱包",
+ bankNoPubAddress: "UBI PUB 尚未发布 ECOin 地址。",
+ bankUbiTab: "UBI",
+ bankDonateEco: "捐赠!",
+ donateTooltip: "捐赠 ECOin",
+ bankNoUserAddress: "该居民未公开 ECOin 地址。",
+ bankUbiPubDefault: "默认",
+ bankUbiPool: "资金池",
+ bankUbiLastSeen: "最后在线",
+ bankUbiLastPayout: "最近操作",
+ bankUbiPaidOut: "已发放",
+ bankRangeToday: "今天",
+ bankRangeWeek: "本周",
+ bankRangeMonth: "本月",
+ bankRangeYear: "本年",
+ bankRangeFiveYears: "5 年",
+ bankRangeAll: "全部",
+ bankChartValueTitle: "ECOin 价值演变",
+ bankChartValueHours: "时间等值(小时)",
+ bankChartWealthTitle: "ECOin 财富再分配",
+ bankChartDistributed: "已发放 UBI(ECO)",
+ bankChartRebalanceTitle: "PUB 之间的财富再分配",
+ bankChartRebalanced: "在 PUB 之间转移的 ECO",
+ bankChartTaxes: "已扣税款(ECO)",
+ bankChartNoDataRange: "此范围内没有数据。",
+ bankChartNoDataYet: "暂无数据",
+ bankChartPerHour: "每小时",
+ bankChartPerDay: "每天",
+ bankChartPerMonth: "每月",
+ bankTotalUbiDistributed: "已重新分配的 UBI 总额(全网)",
+ bankTotalTaxesWithheld: "已扣税款总额(全网)",
+ bankInflationIssuance: "发行率(年化,按区块奖励)",
+ bankRulesEligibilityTitle: "谁可以领取 UBI",
+ bankRulesEligibility1: "在个人资料中发布的 ECOin 地址(资料 → 传感器 → ECOin 钱包)。",
+ bankRulesEligibility2: "超过 30 天且在网络中有活动的 feed:业力大于零。",
+ bankRulesEligibility3: "每月(每个周期)一次领取,在 Banking 中点击领取 UBI。可用拒绝 UBI 放弃当月。",
+ bankRulesEligibility4: "1 ECO 的底线始终发放;税款只减少超出部分,从不另行收取。",
+ bankRulesEligibility5: "PUB 在下一周期支付并发布一笔可供确认的 UBI 转账。",
+ bankRulesEligibility6: "若缺少地址、feed 太新、已拒绝当月或 PUB 无资金,领取将被跳过并记录在 PUB 上。",
+ copyLinkTitle: "复制链接",
+ linkBoxOasis: "Oasis",
+ linkBoxClearnet: "Clearnet",
+ bankRefuseUBI: "拒绝 UBI",
+ bankUbiRefusedThisMonth: "您已拒绝本月的 UBI。",
+ bankingBotUbiAvailableTitle: "您可以领取 UBI 了。",
+ bankingBotUbiAvailableText: "您本月的 UBI 已可领取",
+ bankingBotConfirmTitle: "您有一份等待确认的智能合约",
+ bankingBotConfirmText: "等待您确认的智能合约",
+ bankChartZoomHint: "点击放大",
+ bankChartPoolTitle: "UBI 资金池(变化)",
+ bankChartNetworkUbiTitle: "已重新分配的 UBI 总额(全网)",
+ bankChartSupplyTitle: "ECOin 流通供应量(变化)",
+ bankChartInflationTitle: "ECOin 通胀(变化)",
+ bankChartInflationSeries: "年化率(%)",
+ bankChartPool: "资金池总额(ECO)",
+ bankChartKarmaTitle: "KARMA Scoring(变化)",
+ bankChartFundsTitle: "你的 ECOin 资金(变化)",
+ bankChartKarma: "业力",
+ bankWalletReady: "ECOin 已连接",
+ bankWalletNotConfigured: "ECOin 未连接",
+ transfersPayWithWallet: "支付!",
walletStatus: "状态",
walletDisconnected: [
"ECOin ",
@@ -688,8 +884,11 @@ module.exports = {
" 或连接状态。",
],
walletSentToLine: ({ destination, amount }) => `已发送 ECO ${amount} 至 ${destination}`,
+ walletNotConfigured: "你的 ECOin 钱包尚未配置。",
walletSettingsDescription: "将 Oasis 与你的 ECOin 钱包集成。",
- walletSettingsDocLink: "ECOin 安装指南",
+ walletSettingsMobileDescription: "将 Oasis 与此设备上的 ECOin Wallet 应用关联。",
+ walletDownloadEcoin: "下载 ECOin!",
+ walletRpcUrl: "RPC 地址",
walletStatusMessages: {
invalid_amount: "无效金额",
invalid_dest: "无效目标地址",
@@ -705,6 +904,7 @@ module.exports = {
walletUser: "用户名",
walletPass: "密码",
walletConfiguration: "设置钱包",
+ walletDisconnectButton: "断开钱包",
cipher: "加密器",
cipherTitle: "加密器",
cipherDescription: "使用共享密码对文本进行对称加密和解密。",
@@ -738,17 +938,16 @@ module.exports = {
bookmarkFilterRecent: "最近",
bookmarkCreateButton: "创建书签",
bookmarkUpdateButton: "更新",
- bookmarkDeleteButton: "删除",
bookmarkAddFavoriteButton: "添加收藏",
bookmarkRemoveFavoriteButton: "取消收藏",
bookmarkUrlLabel: "链接",
- bookmarkUrlPlaceholder: "https://example.com",
+ bookmarkUrlPlaceholder: "https://solarnethub.com",
bookmarkDescriptionLabel: "描述",
bookmarkDescriptionPlaceholder: "可选",
bookmarkTagsLabel: "标签",
bookmarkTagsPlaceholder: "输入标签,用逗号分隔",
bookmarkLastVisitLabel: "上次访问",
- bookmarkSearchPlaceholder: "搜索 URL、标签、类别、作者...",
+ bookmarkSearchPlaceholder: "在书签中搜索...",
bookmarkSortRecent: "最近",
bookmarkSortOldest: "最早",
bookmarkSortTop: "最多投票",
@@ -787,7 +986,7 @@ module.exports = {
videoDescriptionPlaceholder: "可选",
videoNoFile: "未提供视频文件",
noVideos: "没有可用的视频。",
- videoSearchPlaceholder: "搜索标题、标签、作者...",
+ videoSearchPlaceholder: "在视频中搜索...",
videoSortRecent: "最近",
videoSortOldest: "最早",
videoSortTop: "最多投票",
@@ -810,7 +1009,6 @@ module.exports = {
documentFilterFavorites: "收藏",
documentCreateButton: "上传文档",
documentUpdateButton: "更新",
- documentDeleteButton: "删除",
documentAddFavoriteButton: "添加收藏",
documentRemoveFavoriteButton: "取消收藏",
documentMessageAuthorButton: "私信",
@@ -823,7 +1021,7 @@ module.exports = {
documentDescriptionPlaceholder: "可选",
documentNoFile: "无文件。",
noDocuments: "没有可用的文档。",
- documentSearchPlaceholder: "搜索标题、标签、描述、作者...",
+ documentSearchPlaceholder: "在文档中搜索...",
documentSortRecent: "最近",
documentSortOldest: "最早",
documentSortTop: "最多投票",
@@ -844,19 +1042,19 @@ module.exports = {
audioFilterTop: "热门",
audioCreateButton: "上传音频",
audioUpdateButton: "更新",
- audioDeleteButton: "删除",
audioAddFavoriteButton: "添加收藏",
audioRemoveFavoriteButton: "取消收藏",
audioFileLabel: "选择音频文件 (.mp3, .wav, .ogg)",
audioTagsLabel: "标签",
audioTagsPlaceholder: "输入标签,用逗号分隔",
+ tagsPlaceholder: "输入标签,用逗号分隔",
audioTitleLabel: "标题",
audioTitlePlaceholder: "可选",
audioDescriptionLabel: "描述",
audioDescriptionPlaceholder: "可选",
audioNoFile: "未提供音频文件",
noAudios: "没有可用的音频。",
- audioSearchPlaceholder: "搜索标题、标签、作者...",
+ audioSearchPlaceholder: "在音频中搜索...",
audioSortRecent: "最近",
audioSortOldest: "最早",
audioSortTop: "最多投票",
@@ -868,7 +1066,7 @@ module.exports = {
audioFilterFavorites: "收藏",
favoritesTitle: "收藏",
favoritesDescription: "所有你收藏的内容集中在一处。",
- favoritesSearchPlaceholder: "搜索收藏...",
+ favoritesSearchPlaceholder: "在收藏中搜索...",
favoritesFilterAll: "全部",
favoritesFilterRecent: "最近",
favoritesFilterAudios: "音频",
@@ -880,13 +1078,12 @@ module.exports = {
favoritesFilterChats: "聊天",
favoritesFilterCalendars: "日历",
favoritesFilterVideos: "视频",
- favoritesRemoveButton: "取消收藏",
favoritesNoItems: "还没有收藏。",
yourContacts: "你的联系人",
allInhabitants: "居民",
allCVs: "简历",
discoverPeople: "发现你网络中的居民。",
- searchInhabitantsPlaceholder: "按名称筛选居民...",
+ searchInhabitantsPlaceholder: "在居民中搜索...",
filterLocation: "按位置筛选居民...",
filterLanguage: "按语言筛选居民...",
filterSkills: "按技能筛选居民...",
@@ -910,7 +1107,6 @@ module.exports = {
topSectionTitle: "排行",
blockedLabel: "已屏蔽用户",
inhabitantviewDetails: "查看详情",
- cvVisitButton: "查看简历",
keepReading: "继续阅读...",
oasisId: "ID",
noInhabitantsFound: "尚未找到居民。",
@@ -928,6 +1124,18 @@ module.exports = {
parliamentFilterLeaders: "领导",
parliamentFilterRules: "规则",
parliamentGovernmentCard: "现任政府",
+ parliamentSeatsGovernment: "政府",
+ parliamentSeatsOpposition: "反对派",
+ parliamentSeatsAbstention: "弃权",
+ parliamentSeatsQuorum: "选举法定人数",
+ parliamentSeatsPass: "通过门槛",
+ parliamentSeatsByElection: "按选举",
+ parliamentSeatsByHouses: "按 LARP 家族",
+ parliamentSeatsSeats: "席",
+ parliamentSeatsSeat: "席",
+ parliamentSeatsLeader: "领袖",
+ parliamentSeatsVotesFor: "投给",
+ parliamentSeatsNoHouse: "无家族",
parliamentActorInPowerInhabitant: '执政居民',
parliamentActorInPowerTribe: '执政部落',
parliamentHistoricalGovernmentsTitle: '政府',
@@ -979,7 +1187,7 @@ module.exports = {
parliamentThId: "ID",
parliamentThProposalDate: "提议日期",
parliamentThMethod: "方式",
- parliamentThKarma: "Karma",
+ parliamentThKarma: "业力",
parliamentThSupports: "支持",
parliamentThVote: "投票",
parliamentCurrentProposalsTitle: "当前提案",
@@ -995,6 +1203,7 @@ module.exports = {
parliamentTimeRemaining: "剩余时间",
parliamentElectionsStatusTitle: "下届政府",
parliamentProposalDeadlineLabel: "截止日期",
+ parliamentViewReport: "查看报告",
parliamentProposalTimeLeft: "剩余时间",
parliamentRulesTitle: "议会运作方式",
parliamentRulesIntro: "选举每2个月进行一次;候选是持续的,在政府选定后重置。",
@@ -1009,6 +1218,7 @@ module.exports = {
parliamentRulesLaws: "当提案达到其门槛时,它成为法律并出现在法律标签中,附有生效日期。",
parliamentRulesHistorical: "在历史标签中,你可以看到已发生的每个政府周期及其管理数据。",
parliamentRulesLeaders: "在领袖标签中,你可以看到曾经执政(或作为候选人)的居民/部落排名,按效率排序。",
+ parliamentRulesHemicycle: "半圆议席图为每位居民分配一席:政府席(获胜候选的投票者与领袖)、每个其他候选各一个反对席,以及弃权席。虚线标记显示选举法定人数(人口的 25%)和当前方法的通过门槛。“按 LARP 家族”以家族为同一批席位着色。",
parliamentProposalVoteStatusLabel: "投票状态",
parliamentProposalOnTrackYes: "已达门槛",
parliamentProposalOnTrackNo: "低于门槛",
@@ -1022,6 +1232,7 @@ module.exports = {
courtsCaseFormTitle: "开立案件",
courtsCaseRespondent: "被告/答辩人",
courtsCaseRespondentPh: "Oasis ID (@...) 或部落名称",
+ courtsCaseSubjectPlaceholder: "主题或简短描述",
courtsCaseMethod: "解决方式",
courtsCaseSubmit: "提交案件",
courtsNominateJudge: "提名法官",
@@ -1055,15 +1266,30 @@ module.exports = {
courtsMethodDICTATOR: "独裁者",
courtsMethodPOPULAR: "民意",
courtsMethodKARMATOCRACY: "Karma 制",
+ courtsCaseType: "案件类型",
+ courtsPresetMinorConflict: "轻微冲突",
+ courtsPresetModerateConflict: "中度冲突",
+ courtsPresetSevereConflict: "严重冲突",
+ courtsPresetHarassment: "骚扰或虐待",
+ courtsPresetContentModeration: "内容审核",
+ courtsPresetBanRestriction: "封禁或限制",
+ courtsPresetGovernanceDispute: "治理争议",
+ courtsStatusOPEN: "开放",
+ courtsStatusIN_PROGRESS: "进行中",
+ courtsStatusDECIDED: "已裁决",
+ courtsStatusCLOSED: "已关闭",
+ courtsStatusSOLVED: "已解决",
+ courtsStatusUNSOLVED: "未解决",
+ courtsStatusDISCARDED: "已驳回",
courtsRulesTitle: "法庭运作方式",
courtsRulesIntro: "法庭是社区驱动的冲突解决和恢复性司法流程。优先考虑对话、清晰证据和适当补救。",
courtsRulesLifecycle: "流程:1) 开立案件 2) 选择方式 3) 提交证据 4) 听证和审议 5) 裁决和补救 6) 执行和结案 7) 上诉(如适用)。",
- courtsRulesRoles: "原告:开立案件。辩护方:被告人或部落。方式:社区选择的用于促进、评估证据和发布裁决的机制。证人:提供证词或证据。调解员:由原告和/或辩护方邀请的中立人士,可访问所有细节,帮助缓和冲突并共同达成协议。",
+ courtsRulesRoles: "原告:开立案件。辩护方:被告居民或部落。方式:社区选择的用于促进、评估证据和发布裁决的机制。证人:提供证词或证据。调解员:由原告和/或辩护方邀请的中立居民,可访问所有细节,帮助缓和冲突并共同达成协议。",
courtsRulesEvidence: "描述不超过1000字。附加相关合法的图片、音频、视频和 PDF 文档。未经同意不要分享敏感私人数据。",
courtsRulesDeliberation: "听证可以是公开的或私密的。法官确保尊重、要求澄清,并可能排除不相关或不合法的材料。",
courtsRulesVerdict: "优先考虑修复:道歉、调解协议、内容审核、临时限制或其他适当措施。必须记录推理过程。",
courtsRulesAppeals: "上诉:在有新证据或明显程序错误时允许。除非另有规定,必须在7天内提出。",
- courtsRulesPrivacy: "尊重隐私和安全。人肉搜索、仇恨或威胁将被删除。法官可以编辑或封存记录的部分内容以保护有风险的人。",
+ courtsRulesPrivacy: "尊重隐私和安全。人肉搜索、仇恨或威胁将被删除。法官可以编辑或封存记录的部分内容以保护有风险的居民。",
courtsRulesMisconduct: "骚扰、操纵或伪造证据可能导致立即不利裁决。",
courtsRulesGlossary: "案件:冲突记录。证据:支持诉求的材料。裁决:附有补救措施的决定。上诉:请求审查裁决。",
courtsFilterActions: "操作",
@@ -1079,12 +1305,16 @@ module.exports = {
exploreTrending: "探索你网络中最受欢迎的内容。",
votesButton: "投票",
shopProductButton: "商店",
+ podcastButton: "播客",
+ podcastEpisodeButton: "单集",
+ campaignButton: "活动",
+ logisticsRouteButton: "路线",
trendingTotalOpinions: "总观点数",
trendingNoContentMessage: "暂时还没有热门内容。",
trendingTotalCount: "总计",
tasksTitle: "任务",
tasksDescription: "发现和管理你网络中的任务。",
- taskSearchPlaceholder: "搜索任务...",
+ taskSearchPlaceholder: "在任务中搜索...",
taskTitleLabel: "标题",
taskDescriptionLabel: "描述",
taskStartTimeLabel: "开始时间",
@@ -1103,7 +1333,7 @@ module.exports = {
taskStatusOpen: "开放",
taskStatusInProgress: "进行中",
taskStatusClosed: "已关闭",
- taskAssignedTo: "分配给",
+ taskAssignedTo: "分配",
taskAssignedChip: "已认领",
taskUnassignedChip: "未认领",
taskAssignees: "被分配者",
@@ -1113,6 +1343,7 @@ module.exports = {
taskUpdateButton: "更新",
taskDeleteButton: "删除",
taskFilterAll: "全部",
+ taskFilterRecent: "最近",
taskFilterMine: "我的",
taskFilterOpen: "开放",
taskFilterInProgress: "进行中",
@@ -1140,14 +1371,13 @@ module.exports = {
eventUpcomingDates: "接下来的日期",
eventsTitle: "活动",
eventsDescription: "发现和管理你网络中的活动。",
- eventSearchPlaceholder: "搜索活动...",
+ eventSearchPlaceholder: "在活动中搜索...",
eventPrice: "价格",
eventStatus: "状态",
eventAllSectionTitle: "活动",
eventMineSectionTitle: "你的活动",
eventCreateSectionTitle: "创建活动",
eventUpdateSectionTitle: "更新活动",
- eventDeleteButton: "删除",
eventCreateButton: "创建活动",
eventAddToCalendar: "添加到日历",
eventVisitCalendar: "查看日历",
@@ -1165,11 +1395,11 @@ module.exports = {
viewPlace: "查看地点",
generatePdf: "生成 PDF",
sharePm: "通过私信分享",
- galleryImages: "图片(每张最大 50MB)",
+ galleryImages: "图片(每张最大 75MB)",
galleryPhotos: "图片",
galleryAddPhoto: "添加图片",
galleryRemovePhoto: "移除",
- galleryVideo: "视频(最大 50MB)",
+ galleryVideo: "视频(最大 75MB)",
galleryAddVideo: "添加视频",
galleryRemoveVideo: "移除视频",
viewVotation: "查看投票",
@@ -1189,6 +1419,7 @@ module.exports = {
eventDate: "日期",
eventAttendButton: "参加活动",
eventFilterAll: "全部",
+ eventFilterRecent: "最近",
eventFilterMine: "我的",
eventFilterToday: "今天",
eventFilterWeek: "本周",
@@ -1215,7 +1446,7 @@ module.exports = {
tagsFilterTop: "热门",
tagsFilterCloud: "标签云",
tagsNoItems: "没有可用的标签。",
- tagsSearchPlaceholder: "搜索标签...",
+ tagsSearchPlaceholder: "在标签中搜索...",
tagsTableHeaderTag: "标签/链接:",
tagsTableHeaderCount: "计数:",
transfersTitle: "转账",
@@ -1223,7 +1454,10 @@ module.exports = {
transfersFrom: "发起人",
transfersTo: "接收人",
transfersFilterAll: "全部",
+ transfersFilterRecent: "最近",
transfersFilterMine: "我的",
+ transfersFilterMinePending: "待确认",
+ transfersFilterMineConfirmed: "已签署",
transfersFilterUBI: "UBI",
transfersFilterMarket: "市场",
transfersFilterTop: "热门",
@@ -1238,7 +1472,6 @@ module.exports = {
transfersCategoryEconomic: "经济",
transfersCategoryTime: "时间",
transfersCategoryTrust: "信任",
- transfersCategoryApply: "应用",
transfersUnitEco: "ECO",
transfersUnitHours: "小时",
transfersUnitTrust: "信任",
@@ -1268,7 +1501,7 @@ module.exports = {
transfersDiscardedSectionTitle: "已废弃转账",
transfersCreateSectionTitle: "创建转账",
transfersAllSectionTitle: "转账",
- transfersSearchPlaceholder: "搜索概念、标签、用户...",
+ transfersSearchPlaceholder: "在转账中搜索...",
transfersMinAmountLabel: "最低金额",
transfersMaxAmountLabel: "最高金额",
transfersSortRecent: "最近",
@@ -1290,6 +1523,7 @@ module.exports = {
voteErrorTitle: "请检查表单",
voteErrorDeadlineMin: "截止时间至少要在 {days} 天之后。",
voteErrorGeneric: "无法保存投票。",
+ voteLocked: "此投票已收到投票或意见,或属于议会或法院:无法再编辑或删除。",
voteUpdateButton: "更新",
voteDeleteButton: "删除",
voteOptionYes: "赞成",
@@ -1299,6 +1533,7 @@ module.exports = {
voteFollowMajority: "跟随多数",
voteNotInterested: "不感兴趣",
voteFilterAll: "全部",
+ voteFilterRecent: "最近",
voteFilterMine: "我的",
voteFilterOpen: "进行中",
voteFilterClosed: "已关闭",
@@ -1314,7 +1549,6 @@ module.exports = {
voteTags: "标签",
voteOpinions: "观点",
novotes: "没有可用的投票提案。",
- voteBy: "作者",
voteCreatedAt: "创建于",
voteNoQuestion: "未提供问题",
voteUnknownCreator: "未知创建者",
@@ -1324,6 +1558,7 @@ module.exports = {
voteCommentsForumButton: '公开讨论',
voteCommentsSectionTitle: '公开讨论',
voteNoCommentsYet: '还没有评论。成为第一个回复的人。',
+ commentsGoToLast: "跳到最后一条评论",
voteNewCommentPlaceholder: '在此写下你的评论…',
voteNewCommentButton: '发表评论',
voteNewCommentLabel: '添加评论',
@@ -1334,6 +1569,8 @@ module.exports = {
cvNameLabel: "全名",
cvDescriptionLabel: "摘要",
cvPhotoLabel: "照片",
+ cvPdfLabel: "简历 (PDF)",
+ cvVisitButton: "查看简历",
cvPersonalExperiencesLabel: "个人经历",
cvPersonalSkillsLabel: "个人技能(逗号分隔)",
cvOasisExperiencesLabel: "Oasis 贡献经历",
@@ -1363,9 +1600,9 @@ module.exports = {
cvNoCV: "未找到简历。",
blogSubject: "主题",
blogMessage: "消息",
- blogImage: "上传媒体(最大:50MB)",
+ blogImage: "上传媒体(最大:75MB)",
blogMedia: "附件(最多 8 张图片和 1 个视频)",
- blogPublish: "预览",
+ blogPublish: "发布",
pollsTitle: "投票",
dataTitle: "匹配",
dataDescription: "探索并可视化你的网络中的匹配。",
@@ -1384,12 +1621,23 @@ module.exports = {
dataKindTasks: "任务",
dataKindReports: "报告",
dataKindVotes: "投票",
- dataSearchPlaceholder: "搜索交叉数据...",
+ dataSearchPlaceholder: "在匹配中搜索...",
dataCohesionTitle: "凝聚系数 (CC)",
dataCcShort: "CC",
dataCohesionHint: "网络已发布内容之间的平均相近度。",
dataAffinity: "匹配度",
dataCommonTerms: "关键词",
+ dataReasonFollowing: "你正在支持这位居民",
+ dataReasonTribe: "与你同属一个部落",
+ dataReasonPinned: "与你置顶的内容相符",
+ dataReasonCv: "与你简历中的技能相符",
+ dataReasonContent: "与你发布的内容相关",
+ dataReasonRelated: "与你的兴趣相关",
+ dataReasonAlike: "由与你相似的居民发布",
+ dataReasonSupportsYou: "支持你",
+ dataReasonMutual: "相互支持",
+ dataReasonRated: "网络评价很高",
+ dataReasonNear: "在你附近",
dataStatPeople: "简历",
dataStatConnected: "已连接",
dataStatSkills: "技能",
@@ -1442,7 +1690,7 @@ module.exports = {
pollStatusLabel: "状态",
pollStatusOpen: "进行中",
pollStatusClosed: "已结束",
- pollSearchPlaceholder: "搜索投票...",
+ pollSearchPlaceholder: "在投票中搜索...",
pollsNoItems: "未找到投票。",
viewPoll: "查看投票",
pollChatCreate: "创建投票",
@@ -1455,7 +1703,7 @@ module.exports = {
blogFilterFavorites: "收藏",
blogFilterTop: "热门",
blogCreateButton: "创建博客",
- blogSearchPlaceholder: "搜索博客...",
+ blogSearchPlaceholder: "在博客中搜索...",
blogComments: "评论",
blogAllowComments: "允许评论",
blogCommentsClosed: "作者已关闭此博客的评论。",
@@ -1468,12 +1716,11 @@ module.exports = {
forumCreateButton: "创建论坛",
forumCreateSectionTitle: "创建论坛",
forumDescription: "与你网络中的其他居民公开交流。",
- forumSearchPlaceholder: "搜索论坛...",
+ forumSearchPlaceholder: "在论坛中搜索...",
forumFilterAll: "全部",
forumFilterMine: "我的",
forumFilterRecent: "最近",
forumFilterTop: "热门",
- forumDeleteButton: "删除",
forumParticipants: "参与者",
forumMessages: "消息",
forumMessageLabel: "消息",
@@ -1500,7 +1747,6 @@ module.exports = {
imageFilterGallery: "画廊",
imageCreateButton: "上传图片",
imageUpdateButton: "更新",
- imageDeleteButton: "删除",
imageAddFavoriteButton: "添加收藏",
imageRemoveFavoriteButton: "取消收藏",
imageFileLabel: "选择图片文件 (.jpeg, .jpg, .png, .gif)",
@@ -1512,13 +1758,14 @@ module.exports = {
imageDescriptionPlaceholder: "可选",
imageNoFile: "未提供图片文件",
noImages: "没有可用的图片。",
- imageSearchPlaceholder: "搜索标题、标签、描述、作者...",
+ imageSearchPlaceholder: "在图片中搜索...",
imageSortRecent: "最近",
imageSortOldest: "最早",
imageSortTop: "最多投票",
imageSearchButton: "搜索",
imageUpdatedAt: "已更新",
imageNoMatch: "没有匹配的图片。",
+ feedSearchPlaceholder: "在动态中搜索...",
feedTitle: "动态",
createFeedTitle: "创建动态",
createFeedButton: "发送动态!",
@@ -1533,7 +1780,7 @@ module.exports = {
alreadyRefeeded: "你已经转发过了。",
activityTitle: "活动记录",
yourActivity: "你的活动",
- globalActivity: "全局活动",
+ globalActivity: "动态",
activityList: "活动记录",
activityDesc: "查看你网络中的最新活动。",
allButton: "全部",
@@ -1549,6 +1796,7 @@ module.exports = {
typeRecent: "最近",
typeTop: "排行",
typePost: "博客",
+ activityUpdateLabel: "更新",
typeTribe: "部落",
typeLarp: "L.A.R.P.",
typeInhabitants: "居民",
@@ -1683,7 +1931,7 @@ module.exports = {
courtsNoCases: '没有案件。',
reportsTitle: "报告",
reportsDescription: "管理并跟踪你的网络中的报告。",
- reportsSearchPlaceholder: "搜索举报...",
+ reportsSearchPlaceholder: "在报告中搜索...",
reportsFilterAll: "全部",
reportsFilterRecent: "最新",
reportsFilterTop: "热门",
@@ -1731,7 +1979,6 @@ module.exports = {
reportsUnderReviewSectionTitle: "审查中的报告",
reportsResolvedSectionTitle: "已解决的报告",
reportsInvalidSectionTitle: "无效报告",
- reportsTemplateSectionTitle: '报告模板',
reportsBugTemplateTitle: '复现详情(漏洞)',
reportsFeatureTemplateTitle: '详情(功能)',
reportsAbuseTemplateTitle: '详情(滥用)',
@@ -1791,17 +2038,15 @@ module.exports = {
tribeGallerySectionTitle: "部落画廊",
tribeRecentSectionTitle: "最近的部落",
tribeTopSectionTitle: "热门部落",
- tribeviewTribeButton: "访问部落",
- tribeviewSubTribeButton: "访问子部落",
tribeRootLabel: "根",
tribeDescription: "探索或创建你网络中的部落。",
tribeMainTribeLabel: "主部落",
tribeCreateButton: "创建部落",
tribeUpdateButton: "更新",
tribeDeleteButton: "删除",
- tribeImageLabel: "上传媒体(最大:50MB)",
+ tribeImageLabel: "上传媒体(最大:75MB)",
tribeTitleLabel: "标题",
- searchTribesPlaceholder: "按名称筛选部落...",
+ searchTribesPlaceholder: "在部落中搜索...",
tribeTitlePlaceholder: "部落名称",
tribeDescriptionLabel: "描述",
tribeDescriptionPlaceholder: "描述这个部落",
@@ -1814,6 +2059,15 @@ module.exports = {
tribeIsAnonymousLabel: "状态",
tribeMembersCount: "成员",
tribeEnterInvite: "输入邀请码",
+ subscriptionTitle: "订阅",
+ subscriptionOn: "已订阅",
+ subscriptionOff: "未订阅",
+ subscriptionSubscribe: "订阅",
+ subscriptionUnsubscribe: "取消订阅",
+ subscriptionSubscribers: "订阅者",
+ pmListLabel: "发送至",
+ pmListNone: "— 无列表 —",
+ pmListNoSubscribers: "没有订阅者",
tribeLeaveButton: "离开",
tribePublic: "公开",
tribePrivate: "私密",
@@ -1846,16 +2100,16 @@ module.exports = {
tribeSectionVideos: "视频",
tribeSectionDocuments: "文档",
tribeSectionBookmarks: "书签",
- tribeSectionMaps: "MAPS",
- tribeSectionPads: "PADS",
- tribeSectionChats: "CHATS",
- tribeSectionCalendars: "CALENDARS",
- tribePadCreate: "Create Pad",
- tribeChatCreate: "Create Chat",
- tribeCalendarCreate: "Create Calendar",
- tribePadsEmpty: "No pads, yet.",
- tribeChatsEmpty: "No chats, yet.",
- tribeCalendarsEmpty: "No calendars, yet.",
+ tribeSectionMaps: "地图",
+ tribeSectionPads: "协作板",
+ tribeSectionChats: "聊天",
+ tribeSectionCalendars: "日历",
+ tribePadCreate: "创建协作板",
+ tribeChatCreate: "创建聊天",
+ tribeCalendarCreate: "创建日历",
+ tribePadsEmpty: "暂无协作板。",
+ tribeChatsEmpty: "暂无聊天。",
+ tribeCalendarsEmpty: "暂无日历。",
tribeInhabitantsEmpty: "此部落中还没有居民。",
tribeEventCreate: "创建活动",
tribeEventsEmpty: "还没有活动。",
@@ -1910,9 +2164,14 @@ module.exports = {
tribeMediaTypeDocument: "文档",
tribeMediaTypeBookmark: "书签",
tribeContentDelete: "删除",
+ tribeReachTribe: "部落",
+ tribeReachNotice: "OASIS 会向所有居民显示,CLEARNET 还会在开放网络上显示。公开后会在部落之外留下可读副本:改回部落会将其隐藏,但已经分享出去的副本无法删除。",
+ tribeReachPrivate: "私密部落的内容只能留在部落内部。",
+ tribeReachOpenedBy: "公开者",
+ tribeReachChange: "发布位置",
tribeInviteCodeText: "邀请码:",
oasisVersionLabel: "Oasis 版本",
- tribeInviteCodeHint: "将此邀请码分享给你想邀请的人,他们可在 /invites → Tribes 加入。",
+ tribeInviteCodeHint: "将此邀请码分享给你想邀请的人,他们可在 /invites 加入。",
tribeStatusOpen: "开放",
tribeStatusClosed: "已关闭",
tribeStatusInProgress: "进行中",
@@ -1952,7 +2211,7 @@ module.exports = {
tribeSearchMinChars: "请输入至少2个字符进行搜索。",
agendaTitle: "日程",
agendaDescription: "在这里你可以找到所有分配给你的项目。",
- agendaSearchPlaceholder: "搜索议程...",
+ agendaSearchPlaceholder: "在日程中搜索...",
agendaFilterAll: "全部",
agendaFilterToday: "今天",
agendaFilterUpcoming: "即将到来",
@@ -1973,6 +2232,7 @@ module.exports = {
agendaNoItems: "未找到分配项目。",
agendaDiscardButton: "丢弃",
agendaRestoreButton: "恢复",
+ agendaRemoveButton: "移除",
agendaMembersCount: "成员",
agendaLocationLabel: "位置",
agendaYes: "是",
@@ -2039,8 +2299,8 @@ module.exports = {
pmComposeTitle: "发送消息",
pmRecipients: "收件人",
pmRecipientsHint: "输入 Oasis ID,用逗号分隔",
- pmLimitsHint: "每条消息最多 7 个收件人。",
- pmTextPlaceholder: "正文上限 7000 个字符。",
+ pmLimitsHint: "每条消息最多 7 位居民。",
+ pmTextPlaceholder: "写下你的消息。",
pmSubject: "主题",
pmSubjectHint: "输入消息主题",
pmText: "消息",
@@ -2062,8 +2322,8 @@ module.exports = {
pmCrypterCharsLabel: "字符",
pmInvalidRecipients: "无效的 Oasis ID(应形如 @…=.ed25519)。",
pmEncryptionLabel: "加密",
- private: "私密",
- privateDescription: "你的加密消息。",
+ private: "收件箱",
+ privateDescription: "管理你的私信。",
privateInbox: "收件箱",
privateSent: "已发送",
privateDelete: "删除",
@@ -2119,24 +2379,24 @@ module.exports = {
visitContent: "查看内容",
favoriteAdd: "固定到收藏",
pmContentTooltip: "发送私信",
+ phoneCallTooltip: "拨打电话",
favoriteRemove: "从收藏移除",
reportContent: "举报内容",
banking: '银行',
bankingTitle: '银行',
- bankingDescription: "ECOin 经济:余额、全民基本收入、税收与工业价值。",
+ bankingDescription: "ECOin 集体经济。",
bankOverview: '概览',
bankEpochs: '纪元',
bankRules: '规则',
pending: '待处理',
closed: '已关闭',
- bankViewTx: '查看交易',
bankClaimNow: '立即领取',
- bankClaimUBI: '领取 UBI!',
- bankClaimAndPay: 'Claim & Pay',
- bankClaimedPending: 'Claim pending...',
- bankStatusClaimed: 'Claimed',
- bankStatusExpired: 'Expired',
- bankPubOnly: 'PUB-only operation',
+ bankClaimUBI: '领取 UBI',
+ bankClaimAndPay: "领取并支付",
+ bankClaimedPending: "领取处理中...",
+ bankStatusClaimed: "已领取",
+ bankStatusExpired: "已过期",
+ bankPubOnly: "仅限 PUB 的操作",
bankEpoch: '纪元',
bankPool: '资金池(本纪元)',
bankWeightsSum: '权重总和',
@@ -2155,8 +2415,8 @@ module.exports = {
bankViewEpoch: '查看纪元',
bankYourIndustryBalance: "你的工业份额",
bankYourUbiMonth: "你本月的全民基本收入",
- bankYourFundsMonth: "你本月的资金",
- bankIndustryBalance: "工业产值(估算)",
+ bankYourFundsMonth: "资金合计",
+ bankIndustryBalance: "工业产值",
bankUserBalance: '你的余额',
bankAddresses: '地址',
bankNoAddresses: '未找到地址。',
@@ -2164,6 +2424,10 @@ module.exports = {
bankAddress: '地址',
bankAddAddressTitle: '添加 ECOIN 地址',
bankAddAddressUser: 'Oasis ID',
+ bankAddAddressLabel: "标签(可选)",
+ bankAddAddressLabelPlaceholder: "Bob 的钱包、Alice 的商店…",
+ bankAddAddressUserOptional: "Oasis ID(可选)",
+ bankAddressUnnamed: "未命名地址",
bankAddAddressAddress: 'ECOIN 地址',
bankAddAddressSave: '保存',
bankAddressAdded: '地址已添加',
@@ -2181,11 +2445,11 @@ module.exports = {
bankAddressDeleteConfirm: '删除此地址?',
search: '搜索!',
bankLocal: '本地',
- bankFromOasis: 'Oasis',
+ bankFromOasis: "网络",
pubIdLabel: "PUB ID",
bankUbiAvailableNo: "资金不足!",
bankUbiAvailableOk: "可用!",
- bankUbiAvailability: "全民基本收入(网络)",
+ bankUbiAvailability: "UBI",
bankAlreadyClaimedThisMonth: "本月已领取",
bankUbiThisMonth: "UBI(本月)",
bankUbiLastClaimed: "UBI(上次领取)",
@@ -2215,6 +2479,7 @@ module.exports = {
shopReachClearnet: "Clearnet",
shopReachOasis: "Oasis",
encryptedChipLabel: "E2E",
+ transportChipLabel: "传输加密",
shopAddFavorite: "添加收藏",
shopRemoveFavorite: "取消收藏",
shopOpen: "开放",
@@ -2222,6 +2487,13 @@ module.exports = {
shopMakePrivate: "设为私密 (E2E)",
shopMakePublic: "设为公开",
shopProducts: "产品",
+ shopFilterAll: "全部",
+ shopFilterRecent: "最近",
+ shopFilterMine: "我的",
+ shopFilterTop: "热门",
+ shopFilterProducts: "产品",
+ shopFilterPrices: "价格",
+ shopFilterFavorites: "收藏",
shopProductAdd: "添加产品",
shopProductTitle: "产品",
shopProductUpdate: "更新产品",
@@ -2249,7 +2521,7 @@ module.exports = {
marketVisitItem: "查看商品",
shopStatus: "状态",
shopCreatedAt: "创建时间",
- shopSearchPlaceholder: "搜索商店...",
+ shopSearchPlaceholder: "在商店中搜索...",
shopUrl: "网址",
shopLocation: "位置",
shopTags: "标签",
@@ -2259,37 +2531,40 @@ module.exports = {
shopTitlePlaceholder: "您的店铺名称",
shopDescriptionPlaceholder: "您的店铺详细描述",
shopLocationPlaceholder: "城市,国家",
- shopTagsPlaceholder: "标签1, 标签2, 标签3",
+ shopTagsPlaceholder: "输入标签,用逗号分隔",
mapTitlePlaceholder: "地图标题",
shopProductFeatured: "推荐产品",
- shopSendToMarket: "Send to Market",
+ shopSendToMarket: "发送到市场",
typeShop: "商店",
typeShopProduct: "店铺商品",
bankExchange: '交易所',
bankExchangeCurrentValue: 'ECOin 价值(1小时)',
- bankTotalSupply: 'ECOin 总供应量',
- bankEcoinHours: "ECOin 时间等价",
+ bankTotalSupply: "ECOin 总供应量",
+ bankPubsSupply: "PUB 资金池的 ECOin 供应量",
+ bankHoldingSupply: "UBI 之外的 ECOin 供应量",
+ bankEcoinHours: "ECOin 时间等价 (1 ECO)",
bankHoursOfWork: '小时',
bankUnitMs: "毫秒",
bankUnitSeconds: "秒",
bankUnitMinutes: "分钟",
bankUnitDays: "天",
bankExchangeNoData: '无可用数据',
- bankInflation: 'ECOin 通胀率 (anual)',
- bankInflationMonthly: 'ECOin 通胀率 (mensual)',
+ bankInflation: "ECOin 通胀率 (年)",
+ bankInflationMonthly: "ECOin 通胀率 (月)",
bankExchangeChartTitle: 'ECOin 价值随时间的演进',
bankExchangeChartValue: '价值 (ECO/小时)',
bankExchangeChartSupply: '供应量',
bankExchangeChartInflation: '通胀率 %',
bankExchangeChartEmpty: '采样不足 — 稍后再来',
- bankCurrentSupply: 'ECOin 当前供应量',
+ bankCurrentSupply: "ECOin 当前供应量",
bankingSyncStatus: 'ECOin 状态',
bankingSyncStatusSynced: '已同步',
- bankingSyncStatusOutdated: '已过时',
+ bankingSyncStatusOutdated: "未同步",
statsTitle: '统计',
statistics: "统计",
statsDescription: "发现你网络的统计数据。",
ALLButton: "全部",
+ RECENTButton: "最近",
MINEButton: "我的",
TOMBSTONEButton: "墓碑",
statsCreatedAt: "创建于",
@@ -2297,7 +2572,8 @@ module.exports = {
statsYourOpinions: "观点",
statsNetworkContent: "内容",
statsNetworkOpinions: "观点",
- statsEcoWalletLabel: "ECOIN 钱包",
+ statsEcoWalletLabel: "ECOin 钱包",
+ walletAddressCopyHint: "点击选中后复制",
statsEcoWalletNotConfigured: "未配置!",
statsBookmark: "书签",
statsEvent: "活动",
@@ -2319,6 +2595,8 @@ module.exports = {
statsTransfer: "转账",
statsAiExchange: "AI",
statsPUBs: 'PUB',
+ statsSyncedPeers: "节点",
+ statsTotalLabel: "总数",
statsPost: "帖子",
statsSize: "总计(大小)",
statsBlockchainSize: "区块链(大小)",
@@ -2370,8 +2648,14 @@ module.exports = {
aiPrompt: "提供信息丰富且精确的回答。",
aiConfiguration: "设置提示语",
aiPromptUsed: "提示语",
- aiClearHistory: "清除聊天记录",
- aiServerError: "AI 无法回答。请重试。",
+ aiClearHistory: "清除历史",
+ aiServerError: "我无法正常回答,请再试一次。",
+ aiStatusLoading: "42 正在加载模型,请稍后再问。",
+ aiThinking: "思考中",
+ aiWaiting: "等待中",
+ aiStatusMissingModel: "AI 模型未安装:缺少 src/AI/oasis-42-1-chat.Q4_K_M.gguf。",
+ aiExportFineTuning: "导出微调数据",
+ aiFactsTitle: "来自你网络的数据",
aiInputPlaceholder: "什么是 Oasis?",
typeAiExchange: "AI",
aiApproveTrain: "添加到集体训练",
@@ -2400,7 +2684,7 @@ module.exports = {
marketFilterDiscarded: "已废弃",
marketFilterRecent: "最近",
marketFilterMyBids: "出价",
- marketCreateButton: "创建商品",
+ marketCreateButton: "出售物品",
marketItemType: "类型",
marketItemTitle: "标题",
marketItemAvailable: "截止日期",
@@ -2427,8 +2711,8 @@ module.exports = {
marketItemSeller: "卖家",
marketNoItems: "暂无可用商品。",
marketYourBid: "你的出价",
- marketCreateFormImageLabel: "上传媒体(最大:50MB)",
- marketSearchPlaceholder: "搜索标题或标签",
+ marketCreateFormImageLabel: "上传媒体(最大:75MB)",
+ marketSearchPlaceholder: "在市场中搜索...",
marketMinPriceLabel: "最低价格",
marketMaxPriceLabel: "最高价格",
marketSortRecent: "最近",
@@ -2494,8 +2778,7 @@ module.exports = {
housingSetClosed: "设为不可入住",
housingCreateButton: "创建住所",
housingUpdateButton: "更新",
- housingDeleteButton: "删除",
- housingSearchPlaceholder: "搜索住所...",
+ housingSearchPlaceholder: "在住所中搜索...",
housingSearchButton: "搜索",
housingMinPrice: "最低价格",
housingMaxPrice: "最高价格",
@@ -2551,7 +2834,7 @@ module.exports = {
jobLocationPresencial: "现场",
jobLocationRemote: "远程",
jobVacantsPlaceholder: "职位数量",
- jobImage: "上传媒体(最大:50MB)",
+ jobImage: "上传媒体(最大:75MB)",
jobTasks: "任务",
jobType: "工作类型",
jobTime: "工作时间",
@@ -2573,12 +2856,11 @@ module.exports = {
jobsExchangeSkill: "交换需要的技能",
jobTimePartial: "兼职",
jobTimeComplete: "全职",
- jobsDeleteButton: "删除",
jobsUpdateButton: "更新",
jobsFilterApplied: "已申请",
jobsAppliedTitle: "我的申请",
jobsAppliedBadge: "已申请",
- jobsSearchPlaceholder: "搜索标题、标签、描述...",
+ jobsSearchPlaceholder: "在工作中搜索...",
jobsMinSalaryLabel: "最低薪资",
jobsMaxSalaryLabel: "最高薪资",
jobsSortRecent: "最近",
@@ -2590,7 +2872,7 @@ module.exports = {
jobSetOpen: "设为开放",
jobsTagsLabel: "标签",
noJobsMatch: "没有匹配的工作。",
- industrySearchPlaceholder: "搜索工厂…",
+ industrySearchPlaceholder: "在工业中搜索...",
industryAllSectors: "所有部门",
industryVisitButton: "访问工业",
industryAdvanceTo: "设为",
@@ -2664,7 +2946,6 @@ module.exports = {
industryBuildStatus_FAILED: "已失败",
pmBotIndustry: "IndustryBot",
pmBotHousing: "HousingBot",
- pmBotJobs: "JobsBot",
jobsBotMatchTitle: "有一份工作与你的简历匹配",
jobsBotMatchIntro: "有一份工作与你的简历匹配。",
jobsBotMatchJob: "工作",
@@ -2691,7 +2972,7 @@ module.exports = {
industryRulesIntro: "Industry 让居民集体拥有生产资料:一家工厂是网络所有的作坊,无人私有。",
industryRulesSteward: "创始人是管理人——托管者,而非所有者:不能独自出售、私有化或解散工厂。",
industryRulesMembership: "成员政策决定如何加入:开放(立即加入)、投票(由成员投票接纳)或仅邀请(需成员先邀请)。",
- industryRulesQuorum: "法定人数是一项决定生效所需投票的最少成员数,以免小工厂由一人决定。",
+ industryRulesQuorum: "法定人数是一项决定生效所需投票的最少成员数,以免小工厂由一位居民决定。",
industryRulesMajority: "多数是通过所需的投票比例(0.5=一半,1=全体一致);当赞成票达到至少 max(法定人数, 成员×多数) 时决定通过。",
industryRulesDecisions: "成员投票接纳新人、批准构建和解散工厂;管理人不能凌驾于这些集体决定之上。",
industryRulesBlueprints: "蓝图是自由(COPYLEFT)配方——投入(材料、工时、技能)与产出(实体或数字商品)——任何人都可以复刻。",
@@ -2717,6 +2998,7 @@ module.exports = {
modulesIndustryLabel: "工业",
modulesIndustryDescription: "用于集体管理生产资料的模块。",
industryFilterAll: "全部",
+ industryFilterRecent: "最近",
industryFilterMember: "成员",
industryFilterBlueprints: "蓝图",
industryFilterBuilds: "生产",
@@ -2725,6 +3007,7 @@ module.exports = {
industryFilterPaused: "已暂停",
industryFilterDissolved: "已解散",
industryAllTitle: "工业",
+ industryRecentTitle: "最近的工厂",
industryMemberTitle: "我参与的工厂",
industryMineTitle: "我的工厂",
industryActiveTitle: "运行中",
@@ -2772,7 +3055,7 @@ module.exports = {
industryPolicy_invite: "仅邀请",
projectsTitle: "项目",
projectsDescription: "创建、资助和关注你网络中的社区驱动项目。",
- projectSearchPlaceholder: "搜索项目...",
+ projectSearchPlaceholder: "在项目中搜索...",
projectCreateProject: "创建项目",
projectCreateButton: "创建项目",
projectUpdateButton: "更新",
@@ -2795,7 +3078,7 @@ module.exports = {
projectRecentTitle: "最近的项目",
projectTopTitle: "最高筹资",
projectTitlePlaceholder: "项目名称",
- projectImage: "上传媒体(最大:50MB)",
+ projectImage: "上传媒体(最大:75MB)",
projectDescription: "描述",
projectDescriptionPlaceholder: "讲述故事和目标…",
projectGoal: "目标 (ECO)",
@@ -2867,15 +3150,13 @@ module.exports = {
modulesModuleName: "名称",
modulesModuleDescription: "描述",
modulesModuleStatus: "状态",
- modulesTotalModulesLabel: "已加载模块",
+ modulesTotalModulesLabel: "总计",
modulesEnabledModulesLabel: "已启用",
modulesDisabledModulesLabel: "已禁用",
modulesInvitesLabel: "邀请",
modulesInvitesDescription: "管理和应用邀请码的模块。",
modulesWalletLabel: "钱包",
modulesWalletDescription: "管理你的数字资产 (ECOin) 的模块。",
- modulesLegacyLabel: "密钥",
- modulesLegacyDescription: "快速安全地管理你的私钥的模块。",
modulesCipherLabel: "加密器",
modulesCipherDescription: "使用共享密码对文本进行对称加密和解密的模块。",
modulesBookmarksLabel: "书签",
@@ -2937,20 +3218,23 @@ module.exports = {
modulesProjectsLabel: "项目",
modulesProjectsDescription: "探索、众筹和管理项目的模块。",
modulesBankingLabel: "银行",
- modulesBankingDescription: "确定 ECOIN 真实价值并使用公共金库分配 UBI 的模块。",
+ modulesBankingDescription: "用于管理共同金库的模块:ECOIN 价值、税收与全民基本收入。",
modulesFavoritesLabel: "收藏",
modulesFavoritesDescription: "管理你收藏内容的模块。",
fileTooLargeTitle: "文件过大",
- fileTooLargeMessage: "文件超过了允许的最大大小(50 MB)。请选择较小的文件。",
+ fileTooLargeMessage: "文件超过了允许的最大大小(75 MB)。请选择较小的文件。",
goBack: "返回",
+ errorDismiss: "好",
errorPageTitle: "出现了问题",
+ errorNoAllocation: "未找到与此申领对应的分配。",
+ errorInvalidClaim: "此分配无法申领。",
visibilityLabel: "可见性",
+ clearnetPrivateConflict: "私密、隐藏、关闭、仅限邀请或付费的内容不能发布到 CLEARNET。请选择 OASIS 或将其设为公开。",
visibilityPublic: "公开",
visibilityHidden: "隐藏",
visibilityMakePublic: "设为公开",
visibilityMakeHidden: "设为隐藏",
invitesInhabitantsTitle: "居民",
- invitesInhabitantsFollow: "关注",
aiNavPlaceholder: "描述你需要什么...",
aiNavDisabled: "AI 导航已停用。",
aiNavResultsTitle: "AINav 建议",
@@ -2961,7 +3245,7 @@ module.exports = {
modulesAINavDescription: "用于以自然语言查询网络内容的模块。",
directConnectDescription: "通过输入对方的 IP 地址、端口和公钥直接连接到节点。该节点将被添加为已关注的连接。",
peerHost: "IP",
- peerPort: "端口(默认:8008)",
+ peerPort: "端口",
peerPublicKey: "公钥 (@...ed25519)",
connectAndFollow: "连接",
modulesPresetTitle: "常用配置",
@@ -2970,15 +3254,15 @@ module.exports = {
workflowsSet: "应用工作模式",
workflow_default: "默认",
workflow_jobs: "工作",
- workflow_ruling: "治理",
- workflow_politics: "政治",
workflow_social: "社交",
workflow_business: "商务",
workflow_night: "夜间",
+ workflow_kids: "儿童",
+ workflow_activists: "活动人士",
workflow_mobile: "移动端",
statsCarbonFootprintTitle: "碳足迹",
statsCarbonTombstone: "墓碑碳足迹",
- uploadMedia: "上传媒体(最大:50MB)",
+ uploadMedia: "上传媒体(最大:75MB)",
feedOpenDiscussion: "公开讨论",
feedDetailTitle: "动态",
feedPostComment: "发表评论",
@@ -2986,7 +3270,7 @@ module.exports = {
noComments: "还没有评论",
mapsLabel: "地图",
mapTitle: "地图",
- mapDescription: "在您的网络中探索和管理离线地图。",
+ mapDescription: "在您的网络中管理和分享离线地图。",
mapMineSectionTitle: "我的地图",
mapCreateSectionTitle: "创建地图",
mapUpdateSectionTitle: "更新地图",
@@ -3015,7 +3299,7 @@ module.exports = {
mapTypeOpen: "开放",
mapTypeClosed: "封闭",
mapTagsLabel: "标签",
- mapTagsPlaceholder: "输入以逗号分隔的标签",
+ mapTagsPlaceholder: "输入标签,用逗号分隔",
mapUrlLabel: "地图链接",
mapMarkersTitle: "标记",
mapMarkerDefault: "标记",
@@ -3026,9 +3310,22 @@ module.exports = {
markerImageLabel: "标记图片",
mapAddMarkerTitle: "添加标记",
mapAddMarkerButton: "添加标记",
- mapCleanMarkerButton: "Clean Marker",
+ mapCleanMarkerButton: "清除标记",
mapApplyZoom: "应用缩放",
- mapSearchPlaceholder: "搜索描述、标签、作者...",
+ mapPlaceSearchPlaceholder: "查找地点或国家...",
+ mapNoPlaces: "未找到地点。",
+ mapClusterTitle: "个标记在此,点击放大",
+ mapDeleteMarker: "删除标记",
+ mapZoomIn: "放大",
+ mapZoomOut: "缩小",
+ mapFitMarkers: "显示所有标记",
+ mapPanLabel: "移动地图",
+ mapCenterHere: "在此居中",
+ mapNear: "靠近",
+ mapPickedSpot: "所选地点",
+ mapPickHint: "点击地图选择一个地点。",
+ mapClearPick: "清除",
+ mapSearchPlaceholder: "在地图中搜索...",
mapSearchButton: "搜索",
mapUpdatedAt: "已更新",
mapNoMatch: "没有匹配的地图。",
@@ -3039,31 +3336,602 @@ module.exports = {
typeMapMarker: "地图标记",
modulesMapLabel: "地图",
modulesMapDescription: "管理和分享离线地图的模块。",
+ emergenciesTitle: "紧急情况",
+ modulesEmergenciesLabel: "紧急情况",
+ modulesEmergenciesDescription: "用于在网络中发布、确认和跟进紧急情况的模块。",
+ emergenciesDescription: "用于在网络中发布、确认和跟进紧急情况的模块。",
+ emergencyCreate: "创建紧急情况",
+ emergencyUpdate: "更新",
+ emergencyDelete: "删除",
+ emergencyTitleLabel: "标题",
+ emergencyTitlePlaceholder: "发生了什么?",
+ emergencyTextLabel: "详情",
+ emergencyTextPlaceholder: "地点、开始时间、应对措施...",
+ emergencyCategoryLabel: "类别",
+ emergencyCategoryWeather: "天气",
+ emergencyCategoryInfrastructure: "基础设施",
+ emergencyCategoryHealth: "健康",
+ emergencyCategorySecurity: "安全",
+ emergencyCategoryLost: "失物招领",
+ emergencyCategoryNeighborhood: "社区",
+ emergencyExpiresLabel: "有效期",
+ emergencyExpires1d: "1 天",
+ emergencyExpires3d: "3 天",
+ emergencyExpires7d: "1 周",
+ emergencyExpires30d: "1 个月",
+ emergencyExpiresNone: "未定",
+ emergencyExpiresKeep: "保留当前日期",
+ emergencyTagsLabel: "标签",
+ emergencyTagsPlaceholder: "输入标签,用逗号分隔",
+ emergencyFilterAll: "全部",
+ emergencyFilterMine: "我的",
+ emergencyFilterRecent: "最近",
+ emergencySeverityUnverified: "未核实",
+ emergencySeverityLow: "低",
+ emergencySeverityMedium: "中",
+ emergencySeverityHigh: "高",
+ emergencyStatusActive: "进行中",
+ emergencyStatusResolved: "已解决",
+ emergencyStatusExpired: "已过期",
+ emergencyConfirmations: "确认数",
+ emergencyConfirmButton: "确认",
+ emergencyConfirmed: "你已确认此紧急情况",
+ emergencyResolveButton: "标记为已解决",
+ emergencyReopenButton: "重新开放",
+ emergencyGenerateReport: "生成报告",
+ emergencyUpdateEdited: "已编辑",
+ emergencyLastUpdate: "最新更新",
+ emergencyUpdatesTitle: "最新更新:",
+ emergencyNoUpdates: "暂无更新。",
+ emergencyAddUpdate: "发布更新",
+ emergencyUpdatePlaceholder: "有什么变化?",
+ emergencyNoItems: "未找到紧急情况。",
+ emergencyExpiresAt: "到期",
+ emergencyBannerLabel: "进行中的紧急情况",
+ emergencyCreateSectionTitle: "创建紧急情况",
+ emergencyUpdateSectionTitle: "更新紧急情况",
+ emergencySearchPlaceholder: "在紧急情况中搜索...",
+ typeEmergency: "紧急情况",
+ typeEmergencyConfirm: "紧急情况确认",
+ typeEmergencyUpdate: "紧急情况更新",
+ statsEmergency: "紧急情况",
+ statsEmergencyConfirm: "紧急情况确认",
+ statsEmergencyUpdate: "紧急情况更新",
+ pmBotEmergencies: "EmergencyBot",
+ emergencyBotUpdatedTitle: "你关注的紧急情况有更新。",
+ emergencyBotResolvedTitle: "你关注的紧急情况已解决。",
+ dataKindEmergencies: "紧急情况",
+ mailingTitle: "邮件列表",
+ modulesMailingLabel: "邮件列表",
+ modulesMailingDescription: "在你的网络中发现和管理邮件列表。",
+ modulesPhoneLabel: "电话",
+ modulesPhoneDescription: "与其他居民进行端到端加密视频通话的模块。",
+ mailingDescription: "在你的网络中发现和管理邮件列表。",
+ mailingCreate: "创建邮件列表",
+ mailingUpdate: "更新",
+ mailingArchive: "归档",
+ mailingActivate: "激活",
+ mailingCreateSectionTitle: "创建邮件列表",
+ mailingUpdateSectionTitle: "更新邮件列表",
+ mailingTitleLabel: "标题",
+ mailingTitlePlaceholder: "邮件列表名称",
+ mailingDescriptionLabel: "描述",
+ mailingDescriptionPlaceholder: "这个列表是关于什么的?",
+ mailingTypeLabel: "邮件列表类型",
+ mailingTypeOpen: "开放",
+ mailingTypeClosed: "封闭",
+ mailingStatusLabel: "状态",
+ mailingStatusActive: "活跃",
+ mailingStatusArchived: "已归档",
+ mailingMembersLabel: "邀请居民",
+ mailingMembersPlaceholder: "@id1.ed25519, @id2.ed25519, ...",
+ mailingSubscribers: "订阅者",
+ mailingTagsLabel: "标签",
+ mailingTagsPlaceholder: "输入标签,用逗号分隔",
+ mailingFilterAll: "全部",
+ mailingFilterMine: "我的",
+ mailingFilterSubscribed: "已订阅",
+ mailingFilterRecent: "最近",
+ mailingHistoryDate: "日期",
+ mailingHistoryThreads: "话题",
+ mailingHistoryInhabitants: "居民",
+ mailingHistorySearchPlaceholder: "在历史中搜索...",
+ mailingNoMessages: "还没有消息。",
+ mailingNoItems: "未找到邮件列表。",
+ mailingSearchPlaceholder: "在邮件列表中搜索...",
+ mailingWriteButton: "写消息",
+ mailingWriteTitle: "写信给列表",
+ mailingReplyTitle: "回复列表",
+ mailingSend: "发送",
+ mailingTextPlaceholder: "你的消息会送达列表中的每个参与者。",
+ mailingParticipants: "参与者",
+ inboxFilterMailing: "邮件列表",
+ mailingReplyPlaceholder: "回复列表...",
+ mailingReplyToList: "回复列表",
+ typeMailingList: "邮件列表",
+ statsMailingList: "邮件列表",
+ mailingListLabel: "邮件列表",
+ logisticsTitle: "物流",
+ modulesLogisticsLabel: "物流",
+ modulesLogisticsDescription: "在你的网络中发现和管理物流计划。",
+ logisticsDescription: "在你的网络中发现和管理物流计划。",
+ logisticsCreate: "创建路线",
+ logisticsUpdate: "更新",
+ logisticsClose: "关闭",
+ logisticsReopen: "重新开放",
+ logisticsCreateSectionTitle: "创建路线",
+ logisticsUpdateSectionTitle: "更新路线",
+ logisticsTitleLabel: "标题",
+ logisticsTitlePlaceholder: "去市场的顺风车,有货车...",
+ logisticsKindLabel: "物流类型",
+ logisticsKindTrip: "出行",
+ logisticsKindShipment: "运送",
+ logisticsKindTrips: "出行",
+ logisticsKindShipments: "运送",
+ logisticsModeLabel: "模式",
+ logisticsModeOffer: "提供",
+ logisticsModeRequest: "寻求",
+ logisticsModeOffers: "提供",
+ logisticsModeRequests: "请求",
+ logisticsDescriptionLabel: "描述",
+ logisticsDescriptionPlaceholder: "集合地点、携带物品、条件...",
+ logisticsOriginLabel: "起点",
+ logisticsOriginPlaceholder: "从哪里出发",
+ logisticsDestinationLabel: "终点",
+ logisticsDestinationPlaceholder: "到哪里结束",
+ logisticsDateLabel: "日期和时间",
+ logisticsRecurrenceLabel: "重复",
+ logisticsFrequencyLabel: "频率",
+ logisticsRecurrenceNone: "单次",
+ logisticsRecurrenceDaily: "每天",
+ logisticsRecurrenceWeekly: "每周",
+ logisticsRecurrenceMonthly: "每月",
+ logisticsSeatsLabel: "座位",
+ logisticsSizeLabel: "尺寸",
+ logisticsSizePlaceholder: "例如 2m x 1m",
+ logisticsWeightLabel: "重量",
+ logisticsWeightPlaceholder: "例如 40kg",
+ logisticsPriceFree: "免费",
+ logisticsPriceEco: "ECO",
+ logisticsPriceTime: "时间",
+ logisticsPriceLabel: "价格",
+ logisticsHours: "小时",
+ logisticsOrderRefLabel: "订单链接",
+ logisticsOrderRefPlaceholder: "待送达订单的 /shops/... 或 /market/...",
+ logisticsOrderLink: "关联订单",
+ logisticsTagsLabel: "标签",
+ logisticsTagsPlaceholder: "输入标签,用逗号分隔",
+ logisticsFilterAll: "全部",
+ logisticsFilterMine: "我的",
+ logisticsFilterBooked: "已预订",
+ logisticsFilterRecent: "最近",
+ logisticsFilterHistory: "历史",
+ logisticsFilterTop: "热门",
+ logisticsStatusOpen: "开放",
+ logisticsStatusUpcoming: "即将",
+ logisticsStatusPast: "已过",
+ logisticsStatusClosed: "已关闭",
+ logisticsZoneLabel: "区域",
+ logisticsSearchPlaceholder: "在物流中搜索...",
+ logisticsNoItems: "未找到路线。",
+ logisticsBookingPending: "待处理",
+ logisticsBookingConfirmed: "已确认",
+ logisticsBookingRejected: "已拒绝",
+ logisticsBookingCancelled: "已取消",
+ logisticsBookingDelivered: "已送达",
+ logisticsConfirm: "确认",
+ logisticsReject: "拒绝",
+ logisticsDeliver: "送达",
+ logisticsReceiptLabel: "收据",
+ logisticsReceiptPlaceholder: "送达备注(可选)",
+ logisticsCancelBooking: "取消预订",
+ logisticsBookTitle: "预订此路线",
+ logisticsNotesLabel: "备注",
+ logisticsNotesPlaceholder: "负责人需要了解的信息",
+ logisticsBook: "预订",
+ logisticsBookingsTitle: "预订",
+ logisticsMyBookingTitle: "你的预订",
+ logisticsRatingsTitle: "评价",
+ logisticsNoRatings: "还没有评价。",
+ logisticsRatingsWhenClosed: "路线关闭后开放评价。",
+ logisticsScoreLabel: "评分",
+ logisticsRatingPlaceholder: "进行得如何?",
+ logisticsRate: "评价",
+ typeLogisticsRoute: "路线",
+ typeLogisticsRating: "路线评价",
+ statsLogisticsRoute: "路线",
+ statsLogisticsRating: "路线评价",
+ logisticsRouteLabel: "路线",
+ podcastsTitle: "播客",
+ modulesPodcastsLabel: "播客",
+ modulesPodcastsDescription: "用于发布播客频道的模块。",
+ podcastsDescription: "用于发布播客频道的模块。",
+ podcastCreate: "创建播客",
+ podcastUpdate: "更新",
+ podcastDelete: "删除",
+ podcastCreateSectionTitle: "创建播客",
+ podcastUpdateSectionTitle: "更新播客",
+ podcastTitleLabel: "标题",
+ podcastTitlePlaceholder: "频道名称",
+ podcastDescriptionLabel: "描述",
+ podcastDescriptionPlaceholder: "这个播客是关于什么的?",
+ podcastCategoryLabel: "分类",
+ podcastCategoryNews: "新闻",
+ podcastCategoryMusic: "音乐",
+ podcastCategoryTalk: "谈话",
+ podcastCategoryEducation: "教育",
+ podcastCategoryTech: "科技",
+ podcastCategoryCulture: "文化",
+ podcastCategoryCommunity: "社区",
+ podcastCategoryOasis: "OASIS",
+ podcastCategoryOther: "其他",
+ podcastTagsLabel: "标签",
+ podcastCoverLabel: "封面(图片或视频)",
+ podcastEpisodeAudioLabel: "音频或视频文件(最大 75MB)",
+ podcastTagsPlaceholder: "输入标签,用逗号分隔",
+ podcastFilterAll: "全部",
+ podcastFilterMine: "我的",
+ podcastFilterRecent: "最近",
+ podcastFilterTop: "热门",
+ podcastFilterViewers: "听众",
+ podcastSearchPlaceholder: "在播客中搜索...",
+ podcastNoItems: "未找到播客。",
+ podcastEpisodesLabel: "剧集",
+ podcastPlaysLabel: "观看次数",
+ podcastLastEpisode: "最新剧集",
+ podcastEpisodesTitle: "剧集",
+ podcastNoEpisodes: "还没有剧集。",
+ podcastEpisodeAdd: "添加剧集",
+ podcastEpisodeCreateTitle: "发布剧集",
+ podcastEpisodeUpdateTitle: "更新剧集",
+ podcastEpisodeTitleLabel: "剧集标题",
+ podcastEpisodeTitlePlaceholder: "剧集标题",
+ podcastEpisodeDescriptionLabel: "节目笔记",
+ podcastEpisodeDescriptionPlaceholder: "本集内容、链接、致谢...",
+ podcastEpisodePublish: "发布",
+ podcastPlayed: "已播放",
+ podcastMarkPlayed: "标记为已播放",
+ typePodcast: "播客",
+ typePodcastEpisode: "剧集",
+ typePodcastOpinion: "剧集评价",
+ typePodcastPlay: "剧集播放",
+ statsPodcast: "播客",
+ statsPodcastEpisode: "剧集",
+ statsPodcastPlay: "剧集播放",
+ pmBotPodcasts: "PodcastBot",
+ pmBotBlogs: "BlogsBot",
+ blogBotNewTitle: "你关注的博客有新文章。",
+ podcastBotEpisodeTitle: "你关注的播客有新剧集。",
+ podcastLabel: "播客",
+ podcastEpisodeLabel: "剧集",
+ campaignsTitle: "倡议",
+ modulesCampaignsLabel: "倡议",
+ modulesCampaignsDescription: "在你的网络中发现和管理倡议。",
+ campaignsDescription: "在你的网络中发现和管理倡议。",
+ campaignCreate: "发起倡议",
+ campaignUpdate: "更新",
+ campaignDelete: "删除",
+ campaignClose: "关闭",
+ campaignReopen: "重新开放",
+ campaignCreateSectionTitle: "发起倡议",
+ campaignUpdateSectionTitle: "更新倡议",
+ campaignTitleLabel: "标题",
+ campaignTitlePlaceholder: "你想达成什么?",
+ campaignTextLabel: "正文",
+ campaignTextPlaceholder: "说明诉求、由谁决定以及你要求什么...",
+ campaignCategoryLabel: "分类",
+ campaignCategoryEnvironment: "环境",
+ campaignCategoryRights: "权利",
+ campaignCategoryHealth: "健康",
+ campaignCategoryEducation: "教育",
+ campaignCategoryInfrastructure: "基础设施",
+ campaignCategoryCulture: "文化",
+ campaignCategoryEconomy: "经济",
+ campaignCategoryOther: "其他",
+ campaignGoalLabel: "签名目标",
+ campaignDeadlineLabel: "截止日期",
+ campaignTagsLabel: "标签",
+ campaignTagsPlaceholder: "输入标签,用逗号分隔",
+ campaignFilterAll: "全部",
+ campaignFilterMine: "我的",
+ campaignFilterSigned: "已签名",
+ campaignFilterRecent: "最近",
+ campaignFilterTop: "热门",
+ campaignStatusOpen: "进行中",
+ campaignStatusAchieved: "已达成",
+ campaignStatusUnachieved: "未达成",
+ campaignStatusClosed: "已关闭",
+ campaignSearchPlaceholder: "在倡议中搜索...",
+ campaignNoItems: "未找到倡议。",
+ campaignSignaturesLabel: "签名",
+ campaignSignaturesTitle: "支持者",
+ campaignNoSignatures: "还没有签名。",
+ campaignSignTitle: "签署此倡议",
+ campaignSignPlaceholder: "你为什么支持?(可选)",
+ campaignSign: "签名",
+ campaignSigned: "你已签名!",
+ campaignNotSigned: "还缺你的签名",
+ campaignElevate: "提交议会",
+ campaignElevated: "已提交议会",
+ campaignUpdatesTitle: "进展",
+ campaignNoUpdates: "还没有进展。",
+ campaignUpdatePlaceholder: "发生了什么?",
+ campaignAddUpdate: "发布进展",
+ campaignQrAlt: "签署此倡议的二维码",
+ campaignQrCaption: "扫码签名",
+ typeCampaign: "倡议",
+ typeCampaignSignature: "签名",
+ typeCampaignUpdate: "倡议进展",
+ statsCampaign: "倡议",
+ statsCampaignSignature: "倡议签名",
+ statsCampaignUpdate: "倡议进展",
+ pmBotCampaigns: "CampaignBot",
+ campaignBotUpdatedTitle: "你关注的倡议有新进展。",
+ campaignBotAchievedTitle: "你关注的倡议已达成目标。",
+ campaignBotRaisedTitle: "你签署的一个活动已提交议会。",
+ pmBotLogistics: "LogisticsBot",
+ logisticsBotUpdatedTitle: "你预订的路线已更改。",
+ logisticsBotClosedTitle: "你预订的路线已关闭。",
+ logisticsBotBookedTitle: "有人预订了你的路线。",
+ logisticsBotCancelledTitle: "你路线上的一个预订已取消。",
+ logisticsBotConfirmedTitle: "你的预订已确认:包裹已在途中。",
+ logisticsBotRejectedTitle: "你的预订已被拒绝。",
+ logisticsBotDeliveredTitle: "你的包裹已送达。",
+ campaignLabel: "倡议",
+ campaignGenerateReport: "生成报告",
+ logisticsGenerateReport: "生成报告",
+ mailingGenerateReport: "生成报告",
+ campaignUpdateEdited: "已编辑",
+ mailingMessagesLabel: "消息",
+ logisticsBookingsLabel: "预订",
+ backupTitle: "备份",
+ modulesBackupLabel: "备份",
+ modulesBackupDescription: "用于导出和导入密钥并创建加密备份的模块。",
+ backupDescription: "用于导出和导入密钥并创建加密备份的模块。",
+ backupTypeRecovery: "恢复",
+ backupTypeKeys: "导出密钥",
+ backupTypeFull: "完整备份",
+ backupTypeRestore: "恢复备份",
+ backupTypeInstant: "即时",
+ backupInstantDescription: "一个普通的 .zip,包含你全部的日志与文件,不含你的私钥,也没有密码。很快,但",
+ backupInstantRisk: "拿到文件的人能读到里面的一切。",
+ backupKitPageDescription: "恢复工具包只能在本设备上打开。",
+ backupKitId: "Oasis ID",
+ backupKitDate: "生成时间",
+ backupKitQrAlt: "你的私钥二维码",
+ backupKitStep1: "打印或手抄,并离线存放在安全的地方。",
+ backupKitStep2: "恢复时,在新设备上安装 Oasis,并在 备份 › 密钥 中导入此私钥。",
+ backupKitStep3: "如果此页面泄露,请立即销毁。",
+ backupKitPdfButton: "生成 PDF",
+ backupScopeLabel: "范围",
+ backupScopeAll: "全部",
+ backupScopeMine: "仅我的内容",
+ backupSinceLabel: "起始日期",
+ backupEstimateTitle: "估算",
+ backupFileInfo: "加密副本将下载到你的设备(文件名:oasis-backup-日期.oasisbk)",
+ backupExportButton: "下载备份",
+ backupRestorePassword: "输入创建备份时使用的密码",
+ backupRestoreButton: "恢复备份",
+ backupRestoredLine: "备份已恢复。",
+ backupRestoredMessages: "新增消息",
+ backupRestoredSkipped: "已存在",
+ backupRestoredBlobs: "新增文件",
+ backupRestoredState: "已恢复设置",
+ backupRestoredFailed: "失败",
+ backupRestoredForked: "分叉",
+ backupRestoreRunning: "正在恢复备份。此页面会自动刷新;期间你可以继续使用 Oasis。",
+ backupRestoreElapsed: "已用时",
+ backupRestoreFailedLine: "无法恢复备份。",
+ backupRestoreForkMine: "此设备已用你的身份发布了备份中没有的消息,因此无法在其之上应用备份。请在全新安装中导入密钥后立即恢复,且不要先做其他操作。",
+ verificationTitle: "校验",
+ verificationDescription: "检查你的动态链、检测分叉,并查看孤立或缺失的文件。",
+ verificationRun: "运行校验",
+ verificationTotalMessages: "日志中的消息",
+ verificationFeed: "你的动态",
+ verificationMessages: "条消息",
+ verificationLastSequence: "最后序号",
+ verificationGaps: "缺口",
+ verificationBrokenLinks: "断链",
+ verificationBadHashes: "错误哈希",
+ verificationBadSignatures: "错误签名",
+ verificationDuplicates: "重复序号",
+ verificationForks: "分叉",
+ verificationBlobs: "文件",
+ verificationBlobsPresent: "存在",
+ verificationBlobsReferenced: "被引用",
+ verificationBlobsOrphan: "孤立",
+ verificationBlobsMissing: "缺失",
+ verificationBlobsMissingOwn: "此设备上缺失的你自己的文件",
+ verificationBlobsMissingOthers: "其他居民的文件尚未下载",
+ verificationBlobsUnavailable: "无法在此设备上列出文件。",
+ wikiTitle: "维基",
+ modulesWikiLabel: "维基",
+ modulesWikiDescription: "用于发现和管理维基的模块。",
+ wikiDescription: "用于发现和管理维基的模块。",
+ wikiCreate: "创建维基",
+ wikiUpdate: "更新",
+ wikiDelete: "删除",
+ wikiEdit: "编辑",
+ wikiTitleLabel: "标题",
+ wikiTitlePlaceholder: "维基标题...",
+ wikiBodyLabel: "内容",
+ wikiBodyPlaceholder: "用 [[维基标题]] 或 [[维基标题|自定义文字]] 链接其他维基。\n\n用 @id 提及居民。\n\n用 #oasis 添加标签。\n\n粘贴链接,如 https://solarnethub.com\n\n空行开始新段落;单个换行会被保留。\n\n附加任何受支持的媒体,它会嵌入到这里。",
+ formatBarLabel: "格式",
+ wikiStatusLabel: "维基类型",
+ wikiStatusOpen: "开放",
+ wikiStatusClosed: "关闭",
+ wikiTagsLabel: "标签",
+ wikiTagsPlaceholder: "输入标签,用逗号分隔",
+ wikiSummaryLabel: "修改摘要",
+ wikiSummaryPlaceholder: "改了什么?",
+ wikiFilterAll: "全部",
+ wikiFilterMine: "我的",
+ wikiFilterRecent: "最近",
+ wikiFilterLinked: "已关联",
+ wikiChanges: "最近更改",
+ wikiNoPages: "未找到维基。",
+ wikiNoChanges: "暂无更改。",
+ wikiHistory: "历史",
+ wikiVersion: "版本",
+ wikiVersions: "个版本",
+ wikiRestore: "恢复",
+ wikiDiff: "更改",
+ wikiViewVersion: "查看",
+ wikiLinkedPages: "关联页面",
+ wikiNoLinkedPages: "此页面尚未与其他页面互链。",
+ wikiMissingLink: "页面尚不存在",
+ wikiDuplicateTitle: "已存在使用该标题的页面。请修改标题以创建另一个页面。",
+ wikiCreateSectionTitle: "创建维基",
+ wikiUpdateSectionTitle: "更新维基",
+ wikiSearchPlaceholder: "在维基中搜索...",
+ wikiCurrentVersion: "当前版本",
+ wikiViewingVersion: "你正在查看旧版本",
+ wikiBackToPage: "返回页面",
+ wikiLinkedChip: "已关联",
+ wikiRestoredSummary: "已恢复的版本",
+ wikiExportPdf: "生成页面",
+ wikiPreview: "预览",
+ tribeSectionWiki: "维基",
+ tribeWikiCreate: "创建维基",
+ tribeWikiEmpty: "还没有维基。",
+ typeWiki: "维基",
padsTitle: "协作板",
padTitle: "协作板",
modulesPadsLabel: "协作板",
- modulesPadsDescription: "管理协作文本编辑器的模块。",
+ modulesPadsDescription: "用于管理协作文本编辑器的模块。",
padCreate: "创建协作板",
padUpdate: "更新",
padDelete: "删除",
padTitleLabel: "标题",
padTitlePlaceholder: "输入协作板标题...",
padStatusLabel: "状态",
+ padTypeLabel: "Pad 类型",
padStatusOpen: "开放",
padStatusInviteOnly: "仅限受邀者",
padStatusClosed: "关闭",
padDeadlineLabel: "截止日期",
padTagsLabel: "标签",
- padTagsPlaceholder: "标签1, 标签2, ...",
+ padTagsPlaceholder: "输入标签,用逗号分隔",
padMembersLabel: "成员",
padCreated: "创建时间",
- padStartEditing: "开始编辑!",
+ padStartEditing: "编辑",
padEditorPlaceholder: "开始写作...",
padSubmitEntry: "提交",
padNoEntries: "暂无内容。",
padAllSectionTitle: "全部协作板",
padMineSectionTitle: "我的协作板",
padsDescription: "在您的网络中管理协作加密的文本编辑器。",
+ roomsTitle: "房间",
+ roomsDescription: "发现并加入您网络中的加密视频会议房间。",
+ modulesRoomsLabel: "房间",
+ modulesRoomsDescription: "用于发现并加入加密视频会议房间的模块。",
+ roomFilterRecent: "最近",
+ roomFilterMine: "我的",
+ roomFilterAll: "全部",
+ roomFilterLive: "直播中",
+ roomFilterOpen: "开放",
+ roomFilterInvite: "仅限受邀者",
+ roomFilterClosed: "已关闭",
+ roomCreate: "创建房间",
+ roomUpdate: "更新",
+ roomDelete: "删除",
+ roomClose: "关闭",
+ roomCreateSectionTitle: "创建房间",
+ roomUpdateSectionTitle: "更新房间",
+ roomTitlePlaceholder: "房间标题",
+ roomDescriptionLabel: "描述",
+ roomDescriptionPlaceholder: "你们要聊什么?",
+ roomTypeLabel: "房间类型",
+ roomTagsLabel: "标签",
+ roomStatusOpen: "开放",
+ roomStatusInviteOnly: "仅限受邀者",
+ roomStatusClosed: "已关闭",
+ roomParticipants: "参与者",
+ roomJoin: "加入",
+ roomLeave: "离开",
+ roomFull: "房间已满",
+ roomLiveChip: "直播中",
+ roomMuted: "已静音",
+ roomRec: "录制音频",
+ roomRecStop: "停止录音",
+ roomRecording: "REC",
+ roomNotificationsOn: "ON",
+ roomNotificationsOff: "OFF",
+ roomEventJoined: "{name} 进入了房间",
+ roomEventLeft: "{name} 离开了房间",
+ roomEventRecStart: "{name} 开始录音",
+ roomEventRecStop: "{name} 停止录音",
+ roomEventMuted: "{name} 已静音",
+ roomEventUnmuted: "{name} 已取消静音",
+ roomEventHand: "{name} 举手了",
+ roomRaiseHand: "举手",
+ roomLowerHand: "放下手",
+ confirmActionTitle: "确认此操作",
+ confirmActionButton: "确认",
+ confirmJoinText: "你即将使用此邀请加入。",
+ confirmFollowText: "你即将支持这位居民。",
+ confirmSignText: "你即将签署此活动。",
+ confirmDownloadText: "你即将把此文件下载到你的设备。",
+ roomRecordings: "录音记录",
+ roomClearNotices: "清除",
+ roomLineSwitchboard: "总机",
+ roomLineDndError: "此房间的号码不接受来电。",
+ roomNumberHint: "在电话中拨打此号码即可进入房间。",
+ liveRefresh: "刷新",
+ roomNobody: "目前房间里没有人。",
+ roomSomeone: "目前房间里有 {n} 人。",
+ roomYou: "你",
+ roomYouAreIn: "你已在其中",
+ roomNobodyInside: "此房间现在没有人。",
+ roomErrorFull: "房间已满。有人离开后即可加入。",
+ roomErrorUnreachable: "目前无法连接到该房间,请稍后再试。",
+ roomErrorBusy: "你已在通话中或在另一个房间里。",
+ roomErrorClosed: "此房间已关闭。",
+ roomAccessDenied: "此房间仅限受邀者。你需要邀请才能加入。",
+ roomsNoItems: "未找到房间。",
+ roomSearchPlaceholder: "搜索房间……",
+ roomInviteMode: "邀请",
+ tribeSectionRooms: "房间",
+ tribeRoomCreate: "创建房间",
+ tribeRoomsEmpty: "暂无房间。",
+ typeRoom: "房间",
+ typeRoomMember: "房间参与者",
+ statsRoom: "房间",
+ statsRoomMember: "房间参与者",
+ favoritesFilterRooms: "房间",
+ invitesRoomsTitle: "房间",
+ inviteCodeInvalid: "此邀请码无效或已被使用。",
+ inviteAlreadyMember: "你已经加入了,可以在对应模块中打开。",
+ actionFailed: "无法完成此操作,请重试。",
+ publishTooShort: "你的帖子太短了。",
+ walletSendFailed: "无法发送付款:{reason}",
+ pixeliaCoordsError: "这些坐标超出了网格范围。",
+ courtsErrTitle: "需要填写标题。",
+ courtsErrRespondent: "请说明案件针对谁。",
+ courtsErrRespondentId: "这不是有效的 Oasis ID。",
+ courtsErrMethod: "请选择案件的解决方式。",
+ courtsErrCaseNotFound: "找不到该案件。",
+ courtsErrBrief: "请填写你的答复。",
+ courtsErrStance: "请选择你的立场。",
+ courtsErrResult: "请填写结果。",
+ courtsErrTerms: "请填写协议条款。",
+ courtsErrMediator: "请至少添加一名调解人。",
+ courtsErrSelfMediator: "你不能在自己的案件中担任调解人。",
+ courtsErrJudge: "请选择一名法官。",
+ courtsErrSelfJudge: "你不能担任自己案件的法官。",
+ courtsErrVisibility: "请选择谁可以查看该案件。",
+ courtsErrNomination: "找不到该提名。",
+ opinionAlreadyGiven: "你已经发表过意见了。",
+ cipherPasswordShort: "密码长度至少为 32 个字符。",
+ errorForbidden: "你无权访问此内容。",
+ errorNotFound: "未找到。",
+ errorClosed: "已关闭。",
+ errorInviteOnly: "仅限受邀者,你需要邀请。",
+ errorTooLong: "文本太长。",
+ errorRequired: "缺少必填信息。",
+ errorInvalid: "部分信息无效。",
+ errorNotAuthor: "只有作者可以执行此操作。",
+ panicRemoved: "你的区块链已被删除。",
padRecentSectionTitle: "最近协作板",
padOpenSectionTitle: "开放协作板",
padClosedSectionTitle: "关闭协作板",
@@ -3075,18 +3943,18 @@ module.exports = {
padRemoveFavorite: "从收藏中移除",
padClose: "关闭",
padBackToEditor: "返回编辑器",
- padSearchPlaceholder: "搜索共享文本...",
+ padSearchPlaceholder: "在协作板中搜索...",
modulesChatsLabel: "聊天",
- modulesChatsDescription: "发现和管理加密聊天室的模块。",
+ modulesChatsDescription: "用于发现和管理聊天的模块。",
typeChat: "聊天",
typeChatMessage: "聊天消息",
chatsTitle: "聊天",
- chatMineSectionTitle: "Your Chats",
- chatRecentTitle: "Recent Chats",
+ chatMineSectionTitle: "你的聊天",
+ chatRecentTitle: "最近的聊天",
chatFavoritesTitle: "收藏",
- chatOpenTitle: "Open Chats",
- chatClosedTitle: "Closed Chats",
+ chatOpenTitle: "开放的聊天",
+ chatClosedTitle: "已关闭的聊天",
chatDescription: "描述",
chatCategory: "类别",
chatStatus: "状态",
@@ -3101,34 +3969,172 @@ module.exports = {
chatMessagesLabel: "消息",
chatThreadsLabel: "话题",
chatCreatedAt: "创建时间",
- chatSearchPlaceholder: "搜索聊天...",
+ chatSearchPlaceholder: "在聊天中搜索...",
chatStatusOpen: "开放",
chatStatusInviteOnly: "仅限邀请",
chatStatusClosed: "已关闭",
chatSendMessage: "发送",
chatJumpLatest: "最新消息",
+ chatReply: "回复",
+ chatReplyCancel: "取消回复",
+ chatPin: "置顶",
+ chatUnpin: "取消置顶",
+ chatPinned: "已置顶",
chatPickChat: "选择一个聊天以打开",
chatNoneYet: "目前还没有可用的聊天。",
- activitySearchPlaceholder: "在动态中搜索...",
+ activitySearchPlaceholder: "在活动记录中搜索...",
trendingSearchPlaceholder: "在热门中搜索...",
opinionsSearchPlaceholder: "在观点中搜索...",
- votesSearchPlaceholder: "在表决中搜索...",
- welcomeStepUxTitle: "选择你的界面",
- welcomeStepUxText: "决定 Oasis 的外观。之后可在设置中更改。",
- welcomeStepUxAction: "使用此视图",
+ votesSearchPlaceholder: "在投票中搜索...",
+ gamesSearchPlaceholder: "在游戏中搜索...",
+ schoolTitle: "学校",
+ pmBotWiki: "WikiBot",
+ wikiBotEditedTitle: "你关注的维基页面已被编辑。",
+ wikiBotRestoredTitle: "你关注的维基页面已恢复到较早的版本。",
+ pmBotSchool: "EducaBot",
+ schoolBotEnrolledTitle: "一名新学生报名了您的课程。",
+ schoolBotInvitedTitle: "您已被邀请加入课程。",
+ schoolBotAdmittedTitle: "您已被课程录取。",
+ schoolBotCertificateTitle: "您已获得证书。",
+ schoolBotPassedTitle: "一名学生通过了您的课程。",
+ schoolBotLessonTitle: "已发布新课时。",
+ invitesSchoolTitle: "学校",
+ schoolEnrollLabel: "加入课程",
+ schoolExamRetryLater: "24 小时后可重试。",
+ schoolApproved: "已通过",
+ schoolExamPassMark: "及格分(0-10)",
+ schoolExamPassed: "通过",
+ schoolExamPending: "待完成",
+ schoolExamFailed: "未通过",
+ schoolExamAddQuestion: "添加问题",
+ schoolExamCreateQuestion: "创建问题",
+ schoolExamOption: "选项",
+ schoolExamCorrect: "正确选项",
+ schoolExamPoints: "分数",
+ schoolMaterialTextPlaceholder: "本课时的备注...",
+ schoolMaterials: "资料",
+ schoolAddMaterial: "添加资料",
+ schoolNoMaterials: "暂无资料。",
+ bankYourSchoolBalance: "您的学校收入",
+ schoolProgress: "进度",
+ schoolProgressMark: "标记为已完成",
+ schoolProgressDone: "已完成",
+ schoolExams: "考试",
+ schoolExamCreate: "创建考试",
+ schoolExamTitlePlaceholder: "考试标题",
+ schoolExamHelp: "每行一个问题:问题?; 选项 ; 正确选项* ; 选项",
+ schoolExamQuestionsPlaceholder: "SSB 是什么?; 一个数据库 ; 一个 P2P 协议* ; 一个浏览器",
+ schoolExamSubmit: "提交答案",
+ schoolExamScore: "您的得分",
+ schoolNoScoresYet: "暂无成绩。",
+ schoolLessonUnit: "单元/阶段",
+ schoolLessonUnitPlaceholder: "例如:阶段 1",
+ schoolLessonOrder: "顺序",
+ profileClearnetSchoolLabel: "学校",
+ schoolStartDate: "开始日期",
+ schoolSessionDate: "课次日期",
+ schoolCourseChat: "课程聊天",
+ agendaFilterSchool: "学校",
+ agendaFilterCampaigns: "活动",
+ agendaFilterLogistics: "物流",
+ schoolCourseType: "课程类型",
+ schoolTypeOpen: "开放",
+ schoolTypePaid: "付费",
+ schoolTypeInvite: "仅限邀请",
+ schoolLessonLocked: "课时已加密——请向教师索取课程密钥。",
+ schoolGrantAccess: "发送课程密钥",
+ schoolKeySent: "密钥已发送",
+ schoolOngoing: "进行中",
+ schoolFilterApplied: "已报名",
+ schoolFilterOpen: "开放",
+ schoolFilterFavorites: "收藏",
+ schoolPendingPayment: "待付款",
+ schoolPendingStudents: "待确认报名",
+ schoolViewBill: "查看账单",
+ schoolPaymentNote: "报名会生成一张 ECO 账单(转账)。转账签署后,您的报名即被确认。",
+ schoolCloseCourse: "关闭课程",
+ schoolReopenCourse: "重新开放课程",
+ schoolDescription: "在您的网络中教授和学习课程。",
+ schoolFilterAll: "全部",
+ schoolFilterMine: "我的",
+ schoolFilterTop: "热门",
+ schoolFilterRecent: "最新",
+ schoolCreateButton: "创建课程",
+ schoolCreateSectionTitle: "创建课程",
+ schoolUpdateSectionTitle: "更新课程",
+ schoolCourseTitlePlaceholder: "课程名称",
+ schoolCourseDescriptionPlaceholder: "你将在这门课程中教什么?",
+ schoolCourseImage: "课程图片(最大:75MB)",
+ schoolTags: "标签",
+ schoolTagsPlaceholder: "输入标签,用逗号分隔",
+ schoolPrice: "价格(ECO)",
+ schoolVisibility: "可见性",
+ schoolVisibilityPublic: "公开",
+ schoolVisibilityInvite: "邀请制",
+ schoolStatus: "状态",
+ schoolClosed: "关闭",
+ schoolFree: "免费",
+ schoolCreate: "创建课程",
+ schoolUpdate: "更新课程",
+ schoolSearchPlaceholder: "在学校中搜索...",
+ schoolSortTitle: "标题",
+ schoolNoCourses: "未找到课程。",
+ schoolStudents: "学生",
+ schoolTeacher: "教师",
+ schoolCreatedAt: "创建时间",
+ schoolLessons: "课时",
+ schoolNoLessons: "暂无课时。",
+ schoolEnrollToSee: "报名后即可查看本课程的课时。",
+ schoolEnrollButton: "报名",
+ schoolUnenrollButton: "退出课程",
+ schoolInviteRequired: "本课程为邀请制。",
+ schoolTeacherPanel: "教师面板",
+ schoolStudentPanel: "学生面板",
+ schoolAddLesson: "创建课时",
+ schoolLessonTitlePlaceholder: "课时标题",
+ schoolLessonTextPlaceholder: "描述本课时涵盖的内容...",
+ schoolInviteStudents: "邀请学生",
+ schoolInvitePlaceholder: "@id1, @id2...",
+ schoolInviteButton: "邀请",
+ schoolInvited: "已邀请",
+ schoolIssueCertificate: "创建证书",
+ schoolCertified: "已认证",
+ schoolCertificateTextPlaceholder: "证书备注(可选)",
+ schoolLessonOpen: "打开课程",
+ schoolCertificatePdf: "PDF",
+ schoolCertificates: "证书",
+ schoolNoCertificates: "尚未颁发证书。",
+ schoolEditButton: "编辑",
+ schoolDeleteButton: "删除",
+ typeSchool: "学校",
+ schoolCourseLabel: "课程",
+ emergencyLabel: "紧急情况",
+ wikiPageLabel: "维基",
+ statsSchoolCourse: "课程",
+ statsSchoolLesson: "课时",
+ statsSchoolEnroll: "报名",
+ statsSchoolCertificate: "学校证书",
+ modulesSchoolLabel: "学校",
+ modulesSchoolDescription: "知识交流模块。",
+ welcomeStepUxAction: "保存视图",
+ welcomeStepWorkflowTitle: "你打算如何使用 OASIS?",
+ welcomeStepWorkflowText: "Oasis 有很多模块。选择适合你的配置,只保留有用的模块。之后随时可以在“模块”中调整。",
+ welcomeStepWorkflowAction: "保存配置",
+ welcomeWorkflow_full: "默认",
chatRateLimitTitle: "消息过多",
chatRateLimitMessage: "你已达到该房间每小时的消息上限,请稍后再试。",
chatMessagePlaceholder: "输入您的消息...",
chatNoMessages: "暂无消息。",
chatTitlePlaceholder: "聊天标题",
chatDescriptionPlaceholder: "聊天描述",
- chatTagsPlaceholder: "标签1, 标签2",
+ chatTagsPlaceholder: "输入标签,用逗号分隔",
chatImageLabel: "选择图片文件 (.jpeg, .jpg, .png, .gif)",
chatAuthor: "作者",
chatAddFavorite: "添加到收藏",
chatRemoveFavorite: "从收藏中移除",
chatPM: "私信",
chatStatusLabel: "状态",
+ chatTypeLabel: "聊天类型",
chatCategoryLabel: "类别",
gamesTitle: "游戏",
gamesDescription: "发现并玩一些游戏。",
@@ -3159,22 +4165,26 @@ module.exports = {
gamesFlipFlopTitle: "FlipFlop",
gamesFlipFlopDesc: "抛硬币,猜正面还是反面。你有多幸运?",
games8BallTitle: "8Ball Pool",
- games8BallDesc: "Top-down pool. Click to aim, hold to charge power. Pot all balls in the fewest shots.",
- gamesArtilleryTitle: "Artillery",
- gamesArtilleryDesc: "Aim your cannon, factor in the wind, and hit the target. 5 rounds, fewest shots wins.",
- gamesLabyrinthTitle: "Labyrinth",
- gamesLabyrinthDesc: "Escape the maze before your moves run out. Each level gets bigger and harder.",
+ games8BallDesc: "俯视视角台球。点击瞄准,按住蓄力。用最少的击球次数打进所有球。",
+ gamesArtilleryTitle: "炮兵",
+ gamesArtilleryDesc: "瞄准你的大炮,考虑风向,击中目标。共 5 回合,用炮最少者获胜。",
+ gamesLabyrinthTitle: "迷宫",
+ gamesLabyrinthDesc: "在步数用完之前逃出迷宫。每一关都更大、更难。",
gamesCocomanTitle: "Cocoman",
- gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.",
+ gamesCocomanDesc: "吃掉所有豆子,避开幽灵。幽灵实时移动——别停下来!",
gamesTetrisTitle: "Tetris",
- 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?",
- gamesFilterScoring: "SCORING",
- gamesHallOfFame: "Hall of Fame",
- gamesHallPlayer: "Player",
- gamesHallScore: "Score",
- gamesNoScores: "No scores yet.",
+ gamesAudioPendulumTitle: "声音摆",
+ gamesAudioPendulumDesc: "带有实时音频合成的混沌物理模拟器。角速度变成频率,峰值变成鼓点。没有两次模拟听起来相同。",
+ gamesVisualDjTitle: "Visual DJ",
+ gamesVisualDjDesc: "在两个唱盘上现场混合视觉效果:为每个唱盘选择图案,调节速度、色彩和缩放,在两者之间推拉切换,并随节拍闪光。点击打拍子,或让麦克风驱动脉动。",
+ gamesTetrisDesc: "经典的下落方块。消除整行得分。你能坚持多久?",
+ gamesMinesweeperTitle: "扫雷",
+ gamesMinesweeperDesc: "经典扫雷。清空棋盘即可升级——更大的网格、更多的地雷、更高的分数。",
+ gamesFilterScoring: "得分",
+ gamesHallOfFame: "名人堂",
+ gamesHallPlayer: "玩家",
+ gamesHallScore: "得分",
+ gamesNoScores: "暂无得分。",
calendarsTitle: "日历",
calendarTitle: "日历",
modulesCalendarsLabel: "日历",
@@ -3182,15 +4192,15 @@ module.exports = {
typeCalendar: "日历",
calendarCreate: "创建日历",
calendarUpdate: "更新",
- calendarDelete: "删除",
calendarTitleLabel: "标题",
calendarTitlePlaceholder: "日历标题...",
calendarStatusLabel: "状态",
+ calendarTypeLabel: "日历类型",
calendarStatusOpen: "开放",
calendarStatusClosed: "关闭",
- calendarDeadlineLabel: "Deadline",
+ calendarDeadlineLabel: "截止日期",
calendarTagsLabel: "标签",
- calendarTagsPlaceholder: "标签1, 标签2...",
+ calendarTagsPlaceholder: "输入标签,用逗号分隔",
calendarParticipantsLabel: "参与者",
calendarCreated: "已创建",
calendarJoin: "加入",
@@ -3201,11 +4211,11 @@ module.exports = {
calendarNotePlaceholder: "添加笔记...",
calendarFirstDateLabel: "日期",
calendarFirstNoteLabel: "备注",
- calendarIntervalLabel: "Interval",
+ calendarIntervalLabel: "间隔",
calendarIntervalNone: "不重复",
- calendarIntervalWeekly: "Weekly",
- calendarIntervalMonthly: "Monthly",
- calendarIntervalYearly: "Yearly",
+ calendarIntervalWeekly: "每周",
+ calendarIntervalMonthly: "每月",
+ calendarIntervalYearly: "每年",
calendarFormDescription: "描述",
calendarNoDates: "尚未添加日期。",
calendarNoNotes: "暂无笔记。",
@@ -3213,6 +4223,8 @@ module.exports = {
calendarsDescription: "在您的网络中发现和管理日历。",
calendarMonthPrev: "← 上一月",
calendarMonthNext: "下一月 →",
+ calendarMonthNames: "一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月",
+ calendarDayInitials: "一,二,三,四,五,六,日",
calendarAllSectionTitle: "日历",
calendarRecentSectionTitle: "最近的日历",
calendarFavoritesSectionTitle: "收藏",
@@ -3222,9 +4234,9 @@ module.exports = {
calendarCreateSectionTitle: "创建新日历",
calendarUpdateSectionTitle: "更新日历",
calendarAddFavorite: "添加到收藏",
- calendarDeleteNote: "Delete",
+ calendarDeleteNote: "删除",
calendarRemoveFavorite: "从收藏移除",
- calendarSearchPlaceholder: "搜索日历...",
+ calendarSearchPlaceholder: "在日历中搜索...",
calendarAddEntry: "添加条目",
statsCalendar: "日历",
statsCalendarDate: "日历日期",
@@ -3236,6 +4248,146 @@ module.exports = {
tribeContentAccessDenied: "访问被拒绝",
tribeContentAccessDeniedMsg: "此内容属于一个部落。您必须是成员才能访问它。",
tribeViewTribes: "查看部落",
+ tribeFilesEmpty: "暂无种子。",
+ filesLabel: "种子",
+ profileClearnetFilesLabel: "种子",
+ filesTitle: "种子",
+ filesDescription: "浏览和管理网络中的种子。",
+ fileAllSectionTitle: "种子",
+ fileMineSectionTitle: "我的种子",
+ fileRecentSectionTitle: "最近的种子",
+ fileTopSectionTitle: "热门种子",
+ fileFavoritesSectionTitle: "收藏",
+ fileFilterAll: "全部",
+ fileFilterMine: "我的",
+ fileFilterRecent: "最近",
+ fileFilterTop: "热门",
+ fileFilterFavorites: "收藏",
+ fileCreateSectionTitle: "上传种子",
+ fileUpdateSectionTitle: "更新种子",
+ fileCreateButton: "上传种子",
+ fileUpdateButton: "更新",
+ fileAddFavoriteButton: "添加到收藏",
+ fileRemoveFavoriteButton: "从收藏移除",
+ fileFileLabel: "选择文件(最大:75MB)",
+ calendarFilterRecent: "最近",
+ calendarFilterAll: "全部",
+ calendarFilterMine: "我的",
+ calendarFilterFavorites: "收藏",
+ calendarFilterOpen: "开放",
+ calendarFilterClosed: "已关闭",
+ padFilterRecent: "最近",
+ padFilterAll: "全部",
+ padFilterMine: "我的",
+ padFilterOpen: "开放",
+ padFilterClosed: "已关闭",
+ chatFilterRecent: "最近",
+ chatFilterAll: "全部",
+ chatFilterMine: "我的",
+ chatFilterFavorites: "收藏",
+ chatFilterOpen: "开放",
+ chatFilterClosed: "已关闭",
+ licenseLabel: "许可协议",
+ phoneTitle: "电话",
+ phoneDescription: "管理你的端到端加密视频通话。",
+ phoneUnavailable: "此设备上无法使用通话。",
+ phoneCallButton: "呼叫",
+ profileVisibilityPhone: "电话号码",
+ phoneNumberUnknown: "你的网络中没有人使用号码 {number}。",
+ phoneNumberChoose: "请确认你要拨打 {number} 联系的人:",
+ phoneAnswer: "接听",
+ phoneSpeaker: "扬声器",
+ phoneEarpiece: "听筒",
+ phoneReject: "拒绝",
+ phoneHangup: "挂断",
+ phoneMute: "静音",
+ phoneUnmute: "取消静音",
+ phoneCameraOn: "摄像头 开",
+ phoneCameraOff: "摄像头 关",
+ settingsPhoneVideo: "视频",
+ settingsPhoneVideoOn: "通话和房间中允许",
+ settingsPhoneVideoOff: "仅音频",
+ phoneSilence: "不再收听",
+ phoneUnsilence: "恢复收听",
+ phoneCalling: "正在呼叫",
+ phoneIsCalling: "正在呼叫你",
+ notifyNewPmFrom: "新私信,来自",
+ notifyNewPamFrom: "新 PaM,来自",
+ notifyUpdateLabel: "更新",
+ updateInstalledLabel: "已安装版本",
+ updateAvailableLabel: "可用版本",
+ updateChangesLabel: "更改",
+ updateFilesLabel: "文件",
+ updateOriginLabel: "来源",
+ phoneRecording: "正在录制 PaM,发给",
+ phoneLeaveMessage: "无人接听:请在提示音后留言。",
+ phoneLeaveMessageBusy: "对方正在通话中:请在提示音后留言。",
+ phoneLeaveMessageUnreachable: "无法联系到对方:请在提示音后留言。",
+ phoneConnecting: "正在连接",
+ phoneSendPam: "发送 PaM",
+ phoneCancel: "取消",
+ phoneSearchPlaceholder: "在电话中搜索...",
+ phonePamTitle: "音频录音",
+ phoneNew: "新",
+ phoneDelete: "删除",
+ phoneNoPams: "你没有音频录音。",
+ phoneHistoryTitle: "历史记录",
+ phoneLatestTitle: "最近通话",
+ phoneCreateButton: "新通话",
+ phoneLimitsHint: "每次通话最多 7 位居民;多于一位即为联合通话。",
+ phoneErrorPub: "不能呼叫 pub。",
+ phoneJointCall: "联合通话",
+ phoneWith: "对象",
+ phoneResult: "结果",
+ phoneWhen: "时间",
+ phoneDuration: "时长",
+ phoneOutgoing: "呼出",
+ phoneIncoming: "呼入",
+ phoneNoHistory: "暂无记录。",
+ phoneOutcomeEnded: "已接听",
+ phoneOutcomeMissed: "未接",
+ phoneOutcomeRejected: "已拒绝",
+ phoneOutcomeNoanswer: "无人接听",
+ phoneOutcomeCancelled: "已取消",
+ phoneOutcomePam: "已发送 PaM",
+ phoneOutcomeFailed: "失败",
+ phoneDialAdd: "添加",
+ phoneDialBack: "删除",
+ phoneDialClear: "清空",
+ phoneDialPlaceholder: "号码或 Oasis ID",
+ phoneDialInhabitants: "居民",
+ phoneDialRemove: "移除",
+ phoneOwnNumber: "这是你自己的号码。",
+ phoneSettingsDesc: "选择谁可以呼叫你。",
+ phoneDnd: "免打扰",
+ phoneOpen: "开放",
+ phoneRecipientRefuses: "你要呼叫的居民不接受来电。",
+ phoneRefusedNotice: "这些居民不接受来电,未被呼叫:",
+ fileEmptyError: "文件为空。请选择其他文件。",
+ fileTitleLabel: "标题",
+ fileTitlePlaceholder: "标题",
+ fileDescriptionLabel: "描述",
+ fileDescriptionPlaceholder: "描述",
+ fileTagsLabel: "标签",
+ fileTagsPlaceholder: "输入标签,用逗号分隔",
+ fileSizeLabel: "大小",
+ fileDownloadButton: "下载",
+ fileDetailsButton: "详情",
+ fileNoFile: "没有种子文件",
+ fileSearchPlaceholder: "在种子中搜索...",
+ fileSearchButton: "搜索",
+ fileSortRecent: "最新",
+ fileSortOldest: "最旧",
+ fileSortTop: "最多投票",
+ fileNoMatch: "没有匹配的种子。",
+ fileUpdatedAt: "已更新",
+ typeFile: "种子",
+ modulesFilesLabel: "文件",
+ modulesFilesDescription: "发现和管理文件的模块。",
+ tribeSectionFiles: "种子",
+ fileDescription: "描述",
+ fileDownload: "下载",
+ fileTypeLabel: "类型",
torrentsTitle: "种子",
torrentsDescription: "浏览和管理网络中的种子。",
torrentAllSectionTitle: "种子",
@@ -3261,12 +4413,35 @@ module.exports = {
torrentDescriptionLabel: "描述",
torrentDescriptionPlaceholder: "描述",
torrentTagsLabel: "标签",
- torrentTagsPlaceholder: "输入以逗号分隔的标签",
+ torrentTagsPlaceholder: "输入标签,用逗号分隔",
torrentSizeLabel: "大小",
- torrentDownloadButton: "DOWNLOAD IT!",
+ torrentFromContent: "生成种子",
+ torrentFromContentMissing: "该文件在本节点尚不可用,请稍后再试。",
+ torrentDownloads: "下载",
+ torrentFetchOasis: "在 Oasis 中下载",
+ torrentSaveFile: "保存文件",
+ torrentSeeds: "做种",
+ seedsLabel: "做种数",
+ seedAction: "支持",
+ torrentSourceFile: "文件",
+ torrentStateQueued: "排队中",
+ torrentStateProbing: "正在寻找做种者",
+ torrentStateDownloading: "下载中",
+ torrentStateDone: "已完成",
+ torrentStateFailed: "失败",
+ torrentStateNoSource: "暂无在线做种者,等待中",
+ torrentStateCancelled: "已取消",
+ torrentNoDownloads: "还没有下载。",
+ torrentOriginalSection: "原始文件",
+ torrentCancel: "取消",
+ torrentDownloadButton: "下载",
+ torrentOasisButton: "OASIS",
+ torrentExternalButton: "EXTERNAL",
+ torrentDetailsButton: "详情",
torrentNoFile: "没有种子文件",
noTorrents: "未找到种子。",
- torrentSearchPlaceholder: "搜索标题、标签、作者...",
+ noFiles: "未找到种子。",
+ torrentSearchPlaceholder: "在种子中搜索...",
torrentSearchButton: "搜索",
torrentSortRecent: "最新",
torrentSortOldest: "最旧",
@@ -3274,10 +4449,12 @@ module.exports = {
torrentNoMatch: "没有匹配的种子。",
torrentUpdatedAt: "已更新",
statsTorrent: "种子",
+ statsFile: "文件",
typeTorrent: "种子",
modulesTorrentsLabel: "种子",
modulesTorrentsDescription: "发现和管理种子的模块。",
favoritesFilterTorrents: "种子",
+ favoritesFilterFiles: "文件",
favoritesFilterMarket: "市场",
favoritesFilterEvents: "活动",
favoritesFilterForum: "论坛",
@@ -3291,15 +4468,17 @@ module.exports = {
favoritesFilterShopProducts: "商店商品",
tribeSectionTorrents: "种子",
tribeCreateTorrent: "上传种子",
+ tribeCreateFile: "上传文件",
settingsWishTitle: "愿望",
- settingsWishDesc: "配置您的头像愿望。",
- settingsWishWhole: "Multiverse",
- settingsWishMutuals: "Only mutual-support",
- settingsWishOnlyLan: "Only LAN",
+ settingsWishDesc: "决定你如何访问全部内容以及你在 Oasis 网络中的体验。",
+ settingsWishWhole: "多元宇宙",
+ settingsWishMutuals: "仅限互相支持",
+ settingsWishOnlyLan: "仅限局域网",
+ settingsWishLocal: "本地",
settingsPmVisibilityTitle: "私信",
settingsPmVisibilityDesc: "配置您希望在网络中的私信曝光级别。",
- settingsPmVisibilityWhole: "Multiverse",
- settingsPmVisibilityMutuals: "Only mutual-support",
+ settingsPmVisibilityWhole: "多元宇宙",
+ settingsPmVisibilityMutuals: "仅限互相支持",
pmMutualNotice: "出站是 UX 保护。入站是关注过滤器。",
inhabitantsPendingFollowsTitle: "待处理的支持请求",
inhabitantsPendingAccept: "接受",
@@ -3343,7 +4522,7 @@ module.exports = {
tribeGovNoRevocations: "暂无任何撤销",
tribeGovNoHistorical: "暂无任何记录",
logsTitle: "日志",
- logsDescription: "记录您在网络中的体验。",
+ logsDescription: "记录你个人经历的私人日记。",
logsViewTitle: "日志",
logsColumnType: "类型",
logsView: "查看",
@@ -3352,7 +4531,7 @@ module.exports = {
logsCreateTitle: "创建条目",
logsWriteButton: "撰写",
logsTextPlaceholder: "描述您的体验...",
- logsModeAIWritten: "AI-Assistant",
+ logsModeAIWritten: "AI 助手",
logsModeManual: "手动",
logsModeAI: "AI",
logsColumnLog: "日志",
@@ -3375,19 +4554,20 @@ module.exports = {
logsSearchAnyType: "任意类型",
logsSearchButton: "搜索",
logsEmpty: "暂无条目。",
+ logsNothingNew: "没有可记录的新操作。",
modulesLogsLabel: "日志",
- modulesLogsDescription: "用于(通过 AI 助手)记录体验的模块。",
+ modulesLogsDescription: "用于记录你个人经历的私人日记模块。",
statsLogsTitle: "日志",
typeLog: "日志",
larpTitle: "L.A.R.P.",
larpDescription: "用于协作实验的实时角色扮演层。",
larpNoHousesMatch: "没有匹配的家族。",
- larpSearchPlaceholder: "搜索家族...",
+ larpSearchPlaceholder: "在L.A.R.P.中搜索...",
larpAllHouses: "家族:",
larpFilterRuling: "执政",
larpFilterHouses: "家族",
- larpFilterRules: "FAQ",
+ larpFilterRules: "常见问题",
larpRulesTitle: "L.A.R.P. FAQ",
larpRulesEntryText: "每位居民默认从 ACADEMIA 开始。在 ACADEMIA 中,从“加入家族”面板选择一个家族:这将打开其入会测试。回答 10 道问题并提交。若达到阈值(7/10),你将被自动接纳进入该家族;否则将被拒绝,留在 ACADEMIA 中。无论如何,系统会记录你的 OasisID 和尝试周期,并在 30 个周期的冷却期结束前阻止再次尝试。",
larpRulesGovernanceText: "在其执政周期内,执政家族佩戴“执政”徽章,是唯一其墙面在“执政”标签下公开显示的家族。",
@@ -3398,117 +4578,116 @@ module.exports = {
larpPostPlaceholder: "这个家族想说什么?",
larpPostSubmit: "发布",
larpCycleLabel: "周期:",
- audioBackToBcs: "Back to BCS",
+ audioBackToBcs: "返回 BCS",
audioFilterBcs: "BCS",
- audioTranscodeButton: "TRANSCODE",
- audioTranscodeCompositionEmpty: "This audio does not include a stored blockchain composition.",
- audioTranscodeDetailDescription: "Decode the embedded payload and the original blockchain composition map.",
- audioTranscodeDetailTitle: "Transcode",
- audioTranscodeStegoEmpty: "(none)",
- audioTranscodeStegoMessage: "TEXT",
- audioTranscodeStegoNotFound: "No steganographic payload could be decoded from this audio.",
- audioTranscodeStegoOasisId: "By",
- audioTranscodeStegoTimestamp: "Generated at",
+ audioTranscodeButton: "转码",
+ audioTranscodeCompositionEmpty: "此音频不包含已保存的区块链作曲。",
+ audioTranscodeDetailDescription: "解码嵌入的载荷和原始区块链作曲图。",
+ audioTranscodeDetailTitle: "转码",
+ audioTranscodeStegoEmpty: "(无)",
+ audioTranscodeStegoMessage: "文本",
+ audioTranscodeStegoNotFound: "无法从此音频中解码出隐写载荷。",
+ audioTranscodeStegoTimestamp: "生成时间",
audioTranscodeStegoUnknown: "—",
- bankExchangeEcoTaxAnnual: "ECOin Taxes (annual)",
- bankExchangeEcoTaxMonthly: "ECOin Taxes (monthly)",
- bankOverviewYourTaxes: "Your taxes",
- bankRulesAlpha: "Alpha (max share of pub balance per epoch)",
+ bankExchangeEcoTaxAnnual: "ECOin 税费(年)",
+ bankExchangeEcoTaxMonthly: "ECOin 税费(月)",
+ bankOverviewYourTaxes: "税款合计",
+ bankRulesAlpha: "Alpha(每个周期 pub 余额的最大份额)",
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.",
- bankRulesArchTaxRate: "Rate",
- bankRulesArchTaxTitle: "ARCH Tax",
- bankRulesCapPerEpoch: "Cap per epoch (absolute)",
- bankRulesCapUser: "Cap per user per epoch",
- bankRulesCarbonFactor: "Carbon factor",
+ bankRulesArchTaxNote: "ARCH 税反映了扩展和维护网络档案的长期成本:你的数据在网络中存在得越久,你分担的维护成本就越大。",
+ bankRulesArchTaxRate: "税率",
+ bankRulesArchTaxTitle: "ARCH 税",
+ bankRulesCapPerEpoch: "每个周期上限(绝对值)",
+ bankRulesCapUser: "每位用户每个周期的上限",
+ bankRulesCarbonFactor: "碳系数",
bankRulesChipFormula: "band = ratio / reducer, where ratio = sizeBytes / maxBlockBytes, reducer = 1 + log10(inhabitants). high ≥ 0.66, mid ≥ 0.33, otherwise low.",
- 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.",
- bankRulesChipTitle: "ECO Tax chip color band",
+ bankRulesChipNote: "每个项目的标签颜色取决于它相对于网络中观察到的最大消息的大小,并按活跃居民数量进行平滑——更大的网络会分摊负载,让更多项目进入绿色区间。",
+ bankRulesChipTitle: "ECO 税标签颜色区间",
bankRulesEcoTaxFormula: "ECO Tax(user) = (userBytes / 1 MiB) × 0.095 × ecoinPerGramCO2",
- bankRulesEcoTaxNote: "ECO Tax is deducted from the gross UBI when the epoch allocation is computed. The deducted ECO are not redistributed in this epoch — they remain in the pub balance and feed the next epoch's pool through reserveMin / alpha caps.",
- bankRulesEcoTaxRate: "Rate",
- bankRulesEcoTaxTitle: "ECO Tax",
- bankRulesEpochKind: "Epoch granularity",
- bankRulesFloor: "Floor per user (gross)",
- bankRulesGraceDays: "Claim grace period",
+ bankRulesEcoTaxNote: "在计算每个周期(epoch)的分配时,ECO 税从 UBI 总额中扣除。扣除的 ECO 不会在本周期重新分配——它们留在 pub 余额中,并通过 reserveMin / alpha 上限注入下一周期的资金池。",
+ bankRulesEcoTaxRate: "税率",
+ bankRulesEcoTaxTitle: "ECO 税",
+ bankRulesEpochKind: "周期粒度",
+ bankRulesFloor: "每位用户的保底(总额)",
+ bankRulesGraceDays: "领取宽限期",
bankRulesKarmaFormula: "karma = max(0, round(scoreFromActions − carbonGramsForUser))",
- bankRulesKarmaNote: "Karma is derived from your actions (posts, votes, parliament/courts participation, etc.) with a time-decay factor, minus the carbon grams generated by your feed.",
- bankRulesKarmaTitle: "Karma (user engagement score)",
+ bankRulesKarmaNote: "业力来自你的行为(发帖、投票、参与议会/法庭等),带有随时间衰减的系数,并减去你的动态所产生的碳克数。",
+ bankRulesKarmaTitle: "业力(用户参与度评分)",
bankRulesNetFormula: "net_UBI(user) = max(0, gross_UBI − ECO Tax)",
bankRulesPoolFormula: "Pool = min(pubBal − reserveMin, capPerEpoch, alpha × pubBal)",
- bankRulesPoolTitle: "Monthly pool",
- bankRulesReserveMin: "Reserve minimum (kept in pub balance)",
+ bankRulesPoolTitle: "月度资金池",
+ bankRulesReserveMin: "最低储备(保留在 pub 余额中)",
bankRulesShareFormula: "gross_UBI(user) = clamp(Pool × w / Σw, floor_user, cap_user_epoch)",
- bankRulesShareTitle: "Per-user share",
+ bankRulesShareTitle: "每位用户的份额",
bankRulesWeightFormula: "w = clamp(1 + karma/100, w_min, w_max)",
- bankRulesWMax: "Maximum weight (w_max)",
- bankRulesWMin: "Minimum weight (w_min)",
- bankTaxes: "Taxes",
- bankTaxesAnnualEcoin: "ECO Tax (annual)",
- bankTaxesArchTaxAnnual: "ARCH Tax (annual)",
- bankTaxesArchTaxFirstBlock: "Your first block age",
- bankTaxesArchTaxFootprintNote: "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.",
- bankTaxesArchTaxLifetime: "ARCH Tax (lifetime)",
- bankTaxesArchTaxMonthly: "ARCH Tax (monthly)",
- bankTaxesArchTaxNoteBold: "reducing the ARCH tax directly",
- 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 ",
- bankTaxesArchTaxNoteOutro: " through pruning agreements, deduplication of redundant data, and shared maintenance infrastructure, and their ongoing contribution may be required by networking consensus.",
- bankTaxesArchTaxRate: "Rate",
- bankTaxesArchTaxTitle: "ARCH Tax",
- bankTaxesArchTaxUserAmount: "Your ARCH tax (price to return)",
- bankTaxesEcoTaxLifetime: "ECO Tax (lifetime)",
- bankTaxesEcoTaxTitle: "ECO Tax",
- bankTaxesLookupAuthor: "Author",
- bankTaxesLookupButton: "Inspect",
- bankTaxesLookupCarbon: "Carbon footprint",
- bankTaxesLookupEcoin: "ECO Tax",
- bankTaxesLookupNotFound: "No block found in your local feed with that ID.",
- bankTaxesLookupPlaceholder: "Block ID (e.g. %abc...=.sha256)",
- bankTaxesLookupSize: "Size",
- bankTaxesLookupTitle: "Inspect a block",
- bankTaxesLookupType: "Type",
- bankTaxesMonthlyEcoin: "ECO Tax (monthly)",
- bankTaxesRate: "Rate",
- bankTaxesSpan: "Sampling span",
- bankTaxesTotalAnnual: "Total (annual)",
- bankTaxesTotalBlocks: "Total blocks",
- bankTaxesTotalBytes: "Total bytes",
- bankTaxesTotalCarbon: "Total carbon",
- bankTaxesTotalEcoin: "Total ECO tax (lifetime)",
- bankTaxesTotalLifetime: "Total (lifetime)",
- bankTaxesTotalMonthly: "Total (monthly)",
- bankTaxesTypesApply: "Set my taxes",
- bankTaxesTypesLabel: "Select which taxes you want to pay",
- bankTaxesUserAmount: "Your ECO tax (price to return)",
- 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.",
- 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.",
- blockchainBackToBlockexplorer: "Back to blockexplorer",
- blockchainBlockNotAvailable: "This block is not available in your local feed. It may belong to a peer you are not yet replicating from.",
- ecoTaxLabel: "ECO Tax",
- gamesHallDate: "Date",
- gamesNewRecord: "New Record",
- indexingEditProfileLink: "Set up my avatar",
- indexingMessage: "Oasis is trying to syncronize a huge network of inhabitants. Just wait!",
- indexingRefreshNote: "This page refreshes every 10 seconds.",
- indexingTitle: "Synchronizing",
- melodyAllEmpty: "No BCS compositions from other inhabitants yet.",
- melodyByLabel: "By",
- melodyNoteUnavailable: "block not in your local feed",
- melodyUploadBcsButton: "Publish",
- melodyUploadBcsNameNote: "The audio will be published with the auto-generated name",
- melodyUploadBcsTitle: "Publish",
- melodyUploadStegoLabel: "Hidden message (steganography)",
- melodyUploadStegoMaxLabel: "max 280 characters",
- melodyUploadStegoPlaceholder: "Optional.",
- padsNoItems: "No pads found.",
- padVersionHistory: "Version History",
- padVersionView: "View",
- statsChat: "Chats",
- statsChatMessage: "Chat messages",
- statsGameScore: "Gaming",
- statsPad: "Pads",
- statsPadEntry: "Pad entries",
- statsTombstoneEmpty: "No tombstones in the network yet.",
+ bankRulesWMax: "最大权重 (w_max)",
+ bankRulesWMin: "最小权重 (w_min)",
+ bankTaxes: "税费",
+ bankTaxesAnnualEcoin: "ECO 税(年)",
+ bankTaxesArchTaxAnnual: "ARCH 税(年)",
+ bankTaxesArchTaxFirstBlock: "你的首个区块的时长",
+ bankTaxesArchTaxFootprintNote: "ARCH 税反映了扩展和维护网络档案的成本。它根据你发布的第一个区块与网络中最新区块之间的时间差计算——你的历史在档案中存在得越久,你分担的维护成本就越大。",
+ bankTaxesArchTaxLifetime: "ARCH 税(累计)",
+ bankTaxesArchTaxMonthly: "ARCH 税(月)",
+ bankTaxesArchTaxNoteBold: "直接降低 ARCH 税",
+ bankTaxesArchTaxNoteIntro: "你的 ARCH 税从网络在你的 UBI 之上产生的盈余中扣除;UBI 的基础值被设定为不可动摇的最低值。该税绝不会从每位居民作为 UBI 应得的固定金额中扣除。扣除的资金会注入财富再分配算法,并通过其他居民的 UBI 领取重新流向他们。较新的居民以及专门从事归档、复制和维护任务的居民,很可能会有专门的任务代你保持网络档案的健康。或者,他们可以致力于",
+ bankTaxesArchTaxNoteOutro: ",方式包括修剪协议、冗余数据去重以及共享维护基础设施,而他们的持续贡献可能会由网络共识提出要求。",
+ bankTaxesArchTaxRate: "税率",
+ bankTaxesArchTaxTitle: "ARCH 税",
+ bankTaxesArchTaxUserAmount: "你的 ARCH 税(需返还的金额)",
+ bankTaxesEcoTaxLifetime: "ECO 税(累计)",
+ bankTaxesEcoTaxTitle: "ECO 税",
+ bankTaxesLookupAuthor: "作者",
+ bankTaxesLookupButton: "检查",
+ bankTaxesLookupCarbon: "碳足迹",
+ bankTaxesLookupEcoin: "ECO 税",
+ bankTaxesLookupNotFound: "在你的本地动态中未找到该 ID 的区块。",
+ bankTaxesLookupPlaceholder: "区块 ID(例如 %abc...=.sha256)",
+ bankTaxesLookupSize: "大小",
+ bankTaxesLookupTitle: "检查区块",
+ bankTaxesLookupType: "类型",
+ bankTaxesMonthlyEcoin: "ECO 税(月)",
+ bankTaxesRate: "税率",
+ bankTaxesSpan: "采样区间",
+ bankTaxesTotalAnnual: "总计(年)",
+ bankTaxesTotalBlocks: "区块总数",
+ bankTaxesTotalBytes: "总字节数",
+ bankTaxesTotalCarbon: "碳总量",
+ bankTaxesTotalEcoin: "ECO 税总计(累计)",
+ bankTaxesTotalLifetime: "总计(累计)",
+ bankTaxesTotalMonthly: "总计(月)",
+ bankTaxesTypesApply: "设置我的税",
+ bankTaxesTypesLabel: "选择你要缴纳的税种",
+ bankTaxesUserAmount: "你的 ECO 税(需返还的金额)",
+ bankTaxesUserNoteChips: "每个项目旁显示的 ECO 税标签会根据该项目相对于网络中见过的最大区块的大小改变颜色(绿 / 黄 / 红),并按活跃居民数量进行平滑——更大的太阳朋克网络会分摊负载,让更多项目进入绿色区间。",
+ bankTaxesUserNoteOtherParams: "ECO 税目前根据每个区块的碳足迹计算,但随着时间推移可能纳入其他参数——复制所消耗的能量、节点间的冗余存储、blob 带宽、解密的计算成本、相关交易的挖矿足迹,或网络同意计价的任何其他可衡量负载。",
+ blockchainBackToBlockexplorer: "返回区块浏览器",
+ blockchainBlockNotAvailable: "此区块在你的本地动态中不可用。它可能属于你尚未从其复制的节点。",
+ ecoTaxLabel: "ECO 税",
+ gamesHallDate: "日期",
+ gamesNewRecord: "新纪录!",
+ indexingRefreshNote: "本页面每 10 秒刷新一次。",
+ indexingMessage: "Oasis 正在同步分布式节点网络。请稍候。",
+ indexingTitle: "正在同步",
+ melodyAllEmpty: "暂无其他居民的 BCS 作品。",
+ melodyNoteUnavailable: "该区块不在你的本地动态中",
+ melodyUploadBcsButton: "发布",
+ melodyUploadBcsNameNote: "音频将以自动生成的名称发布",
+ melodyUploadBcsTitle: "发布",
+ melodyUploadStegoLabel: "隐藏消息(隐写术)",
+ melodyUploadStegoMaxLabel: "最多 280 个字符",
+ melodyUploadStegoPlaceholder: "可选。",
+ padsNoItems: "未找到协作板。",
+ padVersionHistory: "版本历史",
+ padAttributionView: "按作者",
+ padVersionView: "查看",
+ statsChat: "聊天",
+ statsChatMessage: "聊天消息",
+ statsGameScore: "游戏",
+ statsWiki: "维基页面",
+ statsPad: "协作板",
+ statsPadEntry: "协作板条目",
+ statsTombstoneEmpty: "网络中暂无已删除记录(tombstone)。",
typeGameScore: "GAME SCORE",
bankTaxesLookupNote: "输入区块 ID 在本地数据流中查询。",
bankTaxesUserNoteChipsClick: "点击任何标签以在 blockexplorer 中检查其区块。",
@@ -3524,6 +4703,14 @@ module.exports = {
settingsReplicationTitle: "复制",
settingsReplicationDesc: "配置在复制内容时,你的节点从自己的信息流出发跟随的跳数。",
settingsReplicationHopsLabel: "跳数",
+ settingsBlobCacheTitle: "媒体缓存",
+ settingsBlobCacheDesc: "其他居民的内容会保存在本设备上。请选择它最多可占用的空间。",
+ settingsBlobCacheUsage: "当前占用",
+ settingsBlobCacheFiles: "个文件",
+ settingsBlobCacheLimit: "上限",
+ settingsBlobCacheUnlimited: "不限",
+ settingsBlobCacheCleanNow: "立即清理",
+ settingsBlobCacheCleaned: "已删除 {n} 个文件,释放 {size}。",
aiApproveTagsLabel: "标签(逗号分隔)",
aiApproveTagsPlaceholder: "例如 oasis、治理、生态",
aiApproveRatingLabel: "评分",
@@ -3551,8 +4738,6 @@ module.exports = {
larpInviteBannerHint: "将此代码分享给 ACADEMIA 中的某人。30 个周期后过期,或使用一次后失效。",
larpTestRankingTitle: "各家族分数",
invitesHousesTitle: "L.A.R.P.",
- invitesHouseInviteCodePlaceholder: "家族邀请码",
- invitesHouseJoinButton: "加入家族",
larpLastAttemptTitle: "你最近的尝试",
larpLastAttemptHouse: "家族",
larpLastAttemptWhen: "时间",
@@ -3570,14 +4755,14 @@ module.exports = {
larpBadgeYou: "你",
larpBadgeRuling: "执政",
modulesLarpLabel: "L.A.R.P.",
- modulesLarpDescription: "Oasis 实时角色扮演层(9 个家族)的模块。",
+ modulesLarpDescription: "用于实景角色扮演层的模块。",
larpProfileQ1: "面对复杂问题时,你首先做什么?",
larpProfileQ1O1: "与他人交谈以达成共识",
larpProfileQ1O2: "构建原型进行测试",
larpProfileQ1O3: "研究相关文献",
larpProfileQ1O4: "颠覆产生它的系统",
larpProfileQ2: "什么赋予你日常工作意义?",
- larpProfileQ2O1: "保护我所爱的人",
+ larpProfileQ2O1: "保护我所爱的居民",
larpProfileQ2O2: "创造有形之物",
larpProfileQ2O3: "疗愈或滋养生命",
larpProfileQ2O4: "雕琢文字与想法",
@@ -3644,6 +4829,51 @@ module.exports = {
uxModeTitle: "UX",
uxModeDescription: "选择你想要的 UX 导航模式。",
uxModeMenus: "块",
+ uxModeChats: "对话",
+ uxModeFeed: "微博客",
+ feedTrendingTitle: "热门标签",
+ feedActiveTitle: "活跃居民",
+ cnBrandSub: "自由 · P2P · 联邦",
+ cnSyncedPeers: "已同步节点",
+ cnLicense: "许可证",
+ cnNotAccessible: "该内容目前无法访问。",
+ cnUntitled: "无标题",
+ cnSearchPlaceholder: "搜索…",
+ cnHubTitle: "Clearnet 中心",
+ cnHubDescription: "由本 Oasis 网络的居民分享的公开内容。",
+ cnHubEmpty: "尚未有公开内容分享到 Clearnet。",
+ cnPublicContent: "内容",
+ cnTribesContent: "部落",
+ cnNetworkContent: "网络",
+ cnCategoryEmpty: "此分类下没有内容。",
+ cnInhabitantEmpty: "该居民尚未在 Clearnet 发布内容。",
+ cnPrevPage: "← 上一页",
+ cnNextPage: "下一页 →",
+ cnPageOf: "第 {page} 页,共 {pages} 页",
+ cnMoreInfo: "更多信息 →",
+ cnOpenCourse: "开放课程",
+ cnAuction: "拍卖",
+ cnExchange: "交换",
+ cnRssDescription: "由本中心的居民发布",
+ cnKindAudio: "音频",
+ cnKindBlog: "博客",
+ cnKindBookmark: "书签",
+ cnKindDocument: "文档",
+ cnKindEvent: "活动",
+ cnKindFeed: "动态",
+ cnKindImage: "图片",
+ cnKindJob: "职位",
+ cnKindMarket: "市场",
+ cnKindPodcast: "播客",
+ cnKindProject: "项目",
+ cnKindCourse: "课程",
+ cnKindShop: "商店",
+ cnKindTorrent: "种子",
+ cnKindFile: "文件",
+ cnKindVideo: "视频",
+ cnKindWiki: "维基",
+ cnKindRoom: "房间",
+ cnKindMap: "地图",
uxModeAINav: "AI",
}
diff --git a/src/client/gui.js b/src/client/gui.js
index dfe02ae..bc4374b 100644
--- a/src/client/gui.js
+++ b/src/client/gui.js
@@ -10,10 +10,13 @@ const { printMetadata } = require('../server/ssb_metadata');
const updateFlagPath = path.join(__dirname, "../server/.update_required");
let internalSSB = null;
-try {
- const { server } = require('../server/SSB_server');
- internalSSB = server;
-} catch {}
+let internalOpen = null;
+if (!process.env.OASIS_TEST) {
+ try {
+ const SSB_server = require('../server/SSB_server');
+ internalOpen = () => SSB_server.open().then((srv) => { internalSSB = srv; return srv; });
+ } catch {}
+}
if (process.env.OASIS_TEST) {
ssbConfig.path = fs.mkdtempSync(path.join(os.tmpdir(), "oasis-"));
@@ -24,10 +27,33 @@ const socketPath = path.join(ssbConfig.path, "socket");
const publicInteger = ssbConfig.keys.public.replace(".ed25519", "");
const remote = `unix:${socketPath}~noauth:${publicInteger}`;
+const windowLogStream = (ssb) => {
+ if (!ssb || ssb._logStreamWindowed || typeof ssb.createLogStream !== "function") return ssb;
+ const pull = require("../server/node_modules/pull-stream");
+ const defer = require("../server/node_modules/pull-defer");
+ const orig = ssb.createLogStream;
+ ssb.createLogStream = function (opts) {
+ const o = opts || {};
+ const plain = o.limit && !o.reverse && !o.live && !o.raw && o.old === undefined && !o.gt && !o.lt;
+ if (!plain) return orig.call(ssb, opts);
+ const src = defer.source();
+ pull(
+ orig.call(ssb, { ...o, reverse: true }),
+ pull.collect((err, msgs) => {
+ if (err) return src.abort(err);
+ src.resolve(pull.values(msgs.reverse()));
+ })
+ );
+ return src;
+ };
+ ssb._logStreamWindowed = true;
+ return ssb;
+};
+
const connect = (options) =>
new Promise((resolve, reject) => {
ssbClient(process.env.OASIS_TEST ? ssbConfig.keys : null, options)
- .then(resolve)
+ .then((ssb) => resolve(windowLogStream(ssb)))
.catch(reject);
});
@@ -89,8 +115,15 @@ module.exports = ({ offline, port = 3000, host = 'localhost', isPublic = false }
return new Promise((resolve, reject) => {
if (internalSSB) {
const { printMetadata, colors } = require('../server/ssb_metadata');
- printMetadata('OASIS GUI', colors.yellow, port, host, offline, isPublic);
- return resolve(internalSSB);
+ printMetadata('OASIS UX', colors.yellow, port, host, offline, isPublic);
+ return resolve(windowLogStream(internalSSB));
+ }
+ if (internalOpen) {
+ return internalOpen().then((srv) => {
+ const { printMetadata, colors } = require('../server/ssb_metadata');
+ printMetadata('OASIS UX', colors.yellow, port, host, offline, isPublic);
+ resolve(windowLogStream(srv));
+ }).catch(reject);
}
if (clientHandle && clientHandle.closed === false) {
@@ -105,7 +138,7 @@ module.exports = ({ offline, port = 3000, host = 'localhost', isPublic = false }
reject(new Error("Closing Oasis"));
} else {
const { printMetadata, colors } = require('../server/ssb_metadata');
- printMetadata('OASIS GUI', colors.yellow, port, host, offline, isPublic);
+ printMetadata('OASIS UX', colors.yellow, port, host, offline, isPublic);
resolve(ssb);
}
}).catch(reject);
diff --git a/src/client/middleware.js b/src/client/middleware.js
index 86147d0..a804895 100644
--- a/src/client/middleware.js
+++ b/src/client/middleware.js
@@ -8,20 +8,21 @@ const mount = require(path.join(__dirname, "../server/node_modules/koa-mount"));
function obfuscateClearnetHtml(html) {
if (typeof html !== 'string' || html.length === 0) return html;
const preserve = [];
+ const tag = require('crypto').randomBytes(12).toString('hex');
const stash = (re) => {
html = html.replace(re, (m) => {
preserve.push(m);
- return `${preserve.length - 1}`;
+ return `\u0001${tag}:${preserve.length - 1}\u0001`;
});
};
stash(//gi);
stash(/