From 9764a0c162a50676310604271abb68614b236323 Mon Sep 17 00:00:00 2001 From: SITO Date: Mon, 4 May 2026 15:59:46 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20merge=20oasis=200.7.5=20upstream=20?= =?UTF-8?q?=E2=80=94=20tribes=20ACL,=204=20new=20languages,=20model/view?= =?UTF-8?q?=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Manual merge of epsylon/oasis 0.7.5 preserving our mobile-specific work: - tribes_model: upstream ACL security (validMembershipDelta, structuralFieldsEqual) + our inviteLog feature re-applied in generateInvite/joinByInvite - tribes_view: isSubEdit hides isAnonymous/isLARP when editing subtribes - blockchain_view: new block types (calendarDate, calendarNote, padEntry, chatMessage), bd-type-* CSS classes replacing inline styles, encrypted payload filter - style.css: removed old tribe-parent classes, added bd-type-* and stats utility classes (mobile.css/OasisMobile.css untouched — our mobile work) - backend.js: calendarsModel/torrentsModel/mapsModel now receive tribeCrypto+tribesModel, moved after tribesModel init; ensureFollowTribeMembers call in /tribe/:tribeId route - translations: updated de/en/es/eu/fr/it/pt + 4 new languages ar/hi/ru/zh - models (safe copy): calendars, chats, maps, pads, parliament, torrents, tribe_crypto, tribes_content - views (safe copy): chats, pads, torrents, stats - package.json: bumped to 0.7.5 Co-Authored-By: Claude Sonnet 4.6 --- .../nodejs-project/src/backend/backend.js | 7 +- .../src/client/assets/styles/style.css | 108 +- .../src/client/assets/themes/Clear-SNH.css | 3 - .../src/client/assets/themes/Dark-SNH.css | 3 - .../src/client/assets/themes/Matrix-SNH.css | 3 - .../src/client/assets/themes/Purple-SNH.css | 3 - .../client/assets/translations/oasis_ar.js | 3218 ++++++++++++++++ .../client/assets/translations/oasis_de.js | 24 + .../client/assets/translations/oasis_en.js | 23 + .../client/assets/translations/oasis_es.js | 24 + .../client/assets/translations/oasis_eu.js | 24 + .../client/assets/translations/oasis_fr.js | 24 + .../client/assets/translations/oasis_hi.js | 3218 ++++++++++++++++ .../client/assets/translations/oasis_it.js | 24 + .../client/assets/translations/oasis_pt.js | 24 + .../client/assets/translations/oasis_ru.js | 3181 ++++++++++++++++ .../client/assets/translations/oasis_zh.js | 3219 +++++++++++++++++ .../src/models/calendars_model.js | 334 +- .../nodejs-project/src/models/chats_model.js | 11 +- .../nodejs-project/src/models/maps_model.js | 143 +- .../nodejs-project/src/models/pads_model.js | 10 +- .../src/models/parliament_model.js | 106 +- .../src/models/torrents_model.js | 120 +- .../nodejs-project/src/models/tribe_crypto.js | 117 +- .../src/models/tribes_content_model.js | 61 +- .../nodejs-project/src/models/tribes_model.js | 473 ++- .../nodejs-project/src/server/package.json | 2 +- .../nodejs-project/src/server/ssb_config.js | 1 - .../src/views/blockchain_view.js | 10 +- .../nodejs-project/src/views/chats_view.js | 4 +- .../nodejs-project/src/views/pads_view.js | 6 +- .../nodejs-project/src/views/stats_view.js | 54 +- .../nodejs-project/src/views/torrents_view.js | 2 + .../nodejs-project/src/views/tribes_view.js | 24 +- 34 files changed, 14235 insertions(+), 373 deletions(-) create mode 100644 nodejs-project/nodejs-project/src/client/assets/translations/oasis_ar.js create mode 100644 nodejs-project/nodejs-project/src/client/assets/translations/oasis_hi.js create mode 100644 nodejs-project/nodejs-project/src/client/assets/translations/oasis_ru.js create mode 100644 nodejs-project/nodejs-project/src/client/assets/translations/oasis_zh.js diff --git a/nodejs-project/nodejs-project/src/backend/backend.js b/nodejs-project/nodejs-project/src/backend/backend.js index 4b1361e5..3fcd8b4d 100644 --- a/nodejs-project/nodejs-project/src/backend/backend.js +++ b/nodejs-project/nodejs-project/src/backend/backend.js @@ -345,13 +345,11 @@ const tasksModel = require('../models/tasks_model')({ cooler, isPublic: config.p const votesModel = require('../models/votes_model')({ cooler, isPublic: config.public }); const reportsModel = require('../models/reports_model')({ cooler, isPublic: config.public }); const transfersModel = require('../models/transfers_model')({ cooler, isPublic: config.public }); -const calendarsModel = require('../models/calendars_model')({ cooler, pmModel }); const cvModel = require('../models/cv_model')({ cooler, isPublic: config.public }); const inhabitantsModel = require('../models/inhabitants_model')({ cooler, isPublic: config.public }); const feedModel = require('../models/feed_model')({ cooler, isPublic: config.public }); const imagesModel = require("../models/images_model")({ cooler, isPublic: config.public }); const audiosModel = require("../models/audios_model")({ cooler, isPublic: config.public }); -const torrentsModel = require("../models/torrents_model")({ cooler, isPublic: config.public }); const videosModel = require("../models/videos_model")({ cooler, isPublic: config.public }); const documentsModel = require("../models/documents_model")({ cooler, isPublic: config.public }); const agendaModel = require("../models/agenda_model")({ cooler, isPublic: config.public }); @@ -370,8 +368,10 @@ const blockchainModel = require('../models/blockchain_model')({ cooler, isPublic const jobsModel = require('../models/jobs_model')({ cooler, isPublic: config.public, tribeCrypto }); const shopsModel = require('../models/shops_model')({ cooler, isPublic: config.public, tribeCrypto }); const chatsModel = require('../models/chats_model')({ cooler, tribeCrypto, tribesModel }); +const calendarsModel = require('../models/calendars_model')({ cooler, pmModel, tribeCrypto, tribesModel }); +const torrentsModel = require("../models/torrents_model")({ cooler, tribeCrypto, tribesModel }); const projectsModel = require("../models/projects_model")({ cooler, isPublic: config.public }); -const mapsModel = require("../models/maps_model")({ cooler, isPublic: config.public }); +const mapsModel = require("../models/maps_model")({ cooler, tribeCrypto, tribesModel }); const gamesModel = require('../models/games_model')({ cooler }); const bankingModel = require("../models/banking_model")({ services: { cooler }, isPublic: config.public }); const logsModel = require("../models/logs_model")({ cooler }); @@ -1379,6 +1379,7 @@ router return results.flat().filter(item => { const k = item.id || item.key; if (seen.has(k)) return false; seen.add(k); return true; }); }; const tribe = await tribesModel.getTribeById(ctx.params.tribeId); + tribesModel.ensureFollowTribeMembers(ctx.params.tribeId).catch(() => {}); const uid = getViewerId(); const query = { feedFilter: 'TOP', ...ctx.query }; if (!tribe.members.includes(uid)) { diff --git a/nodejs-project/nodejs-project/src/client/assets/styles/style.css b/nodejs-project/nodejs-project/src/client/assets/styles/style.css index a8a18770..c08fa11c 100644 --- a/nodejs-project/nodejs-project/src/client/assets/styles/style.css +++ b/nodejs-project/nodejs-project/src/client/assets/styles/style.css @@ -3642,17 +3642,6 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0; font-style: italic; } -.tribe-card-subtribes { - border: 1px solid #555; - border-radius: 4px; - padding: 8px; - margin: 6px 0; - background: #1e1f23; - display: flex; - flex-direction: column; - gap: 4px; -} - .tribe-card-members { border: none; border-radius: 4px; @@ -3737,26 +3726,6 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0; align-self: flex-end; } -.tribe-parent-box { - margin-bottom: 12px; - text-align: center; -} - -.tribe-parent-box h2 { - margin: 0 0 8px 0; -} - -.tribe-parent-link { - display: block; -} - -.tribe-parent-image { - width: 100%; - max-width: 200px; - border-radius: 8px; - border: 2px solid #444; -} - .tribe-card-meta-row { display: flex; gap: .5em; @@ -4154,42 +4123,49 @@ width:100%; max-width:200px; max-height:300px; object-fit:cover; margin:16px 0; align-self: flex-end; } -.tribe-parent-box { - margin-bottom: 12px; - text-align: center; -} +.no-border{border:none} +.tribe-card-padded{padding:12px 16px} +.tribe-content-list-spaced{display:flex;flex-direction:column;gap:16px} +.tribe-banner{padding:12px 16px;margin-bottom:16px;text-align:center} +.bold{font-weight:bold} +.inline-form{display:inline} -.tribe-parent-box h2 { - margin: 0 0 8px 0; -} - -.tribe-parent-link { - display: block; -} - -.tribe-parent-image { - width: 100%; - max-width: 200px; - border-radius: 8px; - border: 2px solid #444; -} - -.tribe-card-parent { - padding: 8px 12px; - display: flex; - align-items: center; - gap: 8px; -} - -.tribe-parent-card-link { - color: #FFA500; - font-weight: bold; - text-decoration: none; -} - -.tribe-parent-card-link:hover { - text-decoration: underline; -} +.bd-type-post{border-color:#3498db}.bd-type-post .block-diagram-ruler{border-bottom-color:#3498db} +.bd-type-vote,.bd-type-votes,.bd-type-pixelia,.bd-type-parliamentTerm,.bd-type-parliamentProposal,.bd-type-parliamentLaw,.bd-type-parliamentCandidature,.bd-type-parliamentRevocation{border-color:#9b59b6} +.bd-type-vote .block-diagram-ruler,.bd-type-votes .block-diagram-ruler,.bd-type-pixelia .block-diagram-ruler,.bd-type-parliamentTerm .block-diagram-ruler,.bd-type-parliamentProposal .block-diagram-ruler,.bd-type-parliamentLaw .block-diagram-ruler,.bd-type-parliamentCandidature .block-diagram-ruler,.bd-type-parliamentRevocation .block-diagram-ruler{border-bottom-color:#9b59b6} +.bd-type-about,.bd-type-forum,.bd-type-curriculum{border-color:#1abc9c} +.bd-type-about .block-diagram-ruler,.bd-type-forum .block-diagram-ruler,.bd-type-curriculum .block-diagram-ruler{border-bottom-color:#1abc9c} +.bd-type-contact{border-color:#16a085}.bd-type-contact .block-diagram-ruler{border-bottom-color:#16a085} +.bd-type-pub,.bd-type-project,.bd-type-pad,.bd-type-map,.bd-type-mapMarker{border-color:#2ecc71} +.bd-type-pub .block-diagram-ruler,.bd-type-project .block-diagram-ruler,.bd-type-pad .block-diagram-ruler,.bd-type-map .block-diagram-ruler,.bd-type-mapMarker .block-diagram-ruler{border-bottom-color:#2ecc71} +.bd-type-tribe,.bd-type-market,.bd-type-shop,.bd-type-shopProduct{border-color:#e67e22} +.bd-type-tribe .block-diagram-ruler,.bd-type-market .block-diagram-ruler,.bd-type-shop .block-diagram-ruler,.bd-type-shopProduct .block-diagram-ruler{border-bottom-color:#e67e22} +.bd-type-event,.bd-type-transfer,.bd-type-calendar{border-color:#e74c3c} +.bd-type-event .block-diagram-ruler,.bd-type-transfer .block-diagram-ruler,.bd-type-calendar .block-diagram-ruler{border-bottom-color:#e74c3c} +.bd-type-task,.bd-type-banking,.bd-type-bankWallet,.bd-type-bankClaim,.bd-type-gameScore{border-color:#f39c12} +.bd-type-task .block-diagram-ruler,.bd-type-banking .block-diagram-ruler,.bd-type-bankWallet .block-diagram-ruler,.bd-type-bankClaim .block-diagram-ruler,.bd-type-gameScore .block-diagram-ruler{border-bottom-color:#f39c12} +.bd-type-report,.bd-type-courtsCase,.bd-type-courtsEvidence,.bd-type-courtsAnswer,.bd-type-courtsVerdict,.bd-type-courtsSettlement,.bd-type-courtsNomination{border-color:#c0392b} +.bd-type-report .block-diagram-ruler,.bd-type-courtsCase .block-diagram-ruler,.bd-type-courtsEvidence .block-diagram-ruler,.bd-type-courtsAnswer .block-diagram-ruler,.bd-type-courtsVerdict .block-diagram-ruler,.bd-type-courtsSettlement .block-diagram-ruler,.bd-type-courtsNomination .block-diagram-ruler{border-bottom-color:#c0392b} +.bd-type-image,.bd-type-job,.bd-type-aiExchange,.bd-type-chat{border-color:#3498db} +.bd-type-image .block-diagram-ruler,.bd-type-job .block-diagram-ruler,.bd-type-aiExchange .block-diagram-ruler,.bd-type-chat .block-diagram-ruler{border-bottom-color:#3498db} +.bd-type-audio{border-color:#8e44ad}.bd-type-audio .block-diagram-ruler{border-bottom-color:#8e44ad} +.bd-type-video{border-color:#d35400}.bd-type-video .block-diagram-ruler{border-bottom-color:#d35400} +.bd-type-document{border-color:#27ae60}.bd-type-document .block-diagram-ruler{border-bottom-color:#27ae60} +.bd-type-bookmark{border-color:#f1c40f}.bd-type-bookmark .block-diagram-ruler{border-bottom-color:#f1c40f} +.bd-type-feed,.bd-type-tombstone{border-color:#95a5a6} +.bd-type-feed .block-diagram-ruler,.bd-type-tombstone .block-diagram-ruler{border-bottom-color:#95a5a6} +.stats-link{color:#007bff;text-decoration:none} +.stats-link-break{color:#007bff;text-decoration:none;word-break:break-all} +.stats-muted-555{color:#555} +.stats-muted-888{color:#888} +.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:16px;margin-bottom:24px} +.stats-section-h{font-size:18px;color:#555;margin:8px 0;font-weight:600} +.stats-list-reset{list-style-type:none;padding:0;margin:0} +.stats-mb-16{margin-bottom:16px} +.stats-w-100{width:100%} +.stats-table{width:100%;border-collapse:collapse} +.stats-table-mt8{width:100%;border-collapse:collapse;margin-top:8px} +.stats-h-row{font-size:18px;color:#555;margin:8px 0} .comment-submit-btn { width: auto; diff --git a/nodejs-project/nodejs-project/src/client/assets/themes/Clear-SNH.css b/nodejs-project/nodejs-project/src/client/assets/themes/Clear-SNH.css index 7bd7340e..b3bffbee 100644 --- a/nodejs-project/nodejs-project/src/client/assets/themes/Clear-SNH.css +++ b/nodejs-project/nodejs-project/src/client/assets/themes/Clear-SNH.css @@ -428,7 +428,6 @@ a.user-link:focus { .tribe-info-label { color: #2D2D2D !important; background: #FFFFFF !important; } .tribe-info-value { color: #007BFF !important; background: #FFFFFF !important; } .tribe-info-empty { color: #999 !important; } -.tribe-card-subtribes { border-color: #E0E0E0 !important; background: #F8F8F8 !important; } .tribe-card-members { border-color: #E0E0E0 !important; background: #F8F8F8 !important; } .tribe-members-count { color: #FF6F00 !important; } .tribe-card-actions { border-color: #E0E0E0 !important; background: #F8F8F8 !important; } @@ -440,5 +439,3 @@ a.user-link:focus { .tribe-subtribe-link:hover { background: #E0E0E0 !important; } .tribe-parent-image { border-color: #E0E0E0 !important; } .tribe-parent-box { background: #FFFFFF !important; } -.tribe-card-parent { background: #F8F8F8 !important; border-color: #E0E0E0 !important; } -.tribe-parent-card-link { color: #FF6F00 !important; } diff --git a/nodejs-project/nodejs-project/src/client/assets/themes/Dark-SNH.css b/nodejs-project/nodejs-project/src/client/assets/themes/Dark-SNH.css index a5689233..42df4198 100644 --- a/nodejs-project/nodejs-project/src/client/assets/themes/Dark-SNH.css +++ b/nodejs-project/nodejs-project/src/client/assets/themes/Dark-SNH.css @@ -343,7 +343,6 @@ a.user-link:focus { .tribe-info-label { color: #ffa300 !important; background: #1e1f23 !important; } .tribe-info-value { color: #FFD700 !important; background: #1e1f23 !important; } .tribe-info-empty { color: #9aa3b2 !important; } -.tribe-card-subtribes { border-color: #444 !important; background: #1e1f23 !important; } .tribe-card-members { border-color: #444 !important; background: #1e1f23 !important; } .tribe-members-count { color: #ffa300 !important; } .tribe-card-actions { border-color: #444 !important; background: #1e1f23 !important; } @@ -355,5 +354,3 @@ a.user-link:focus { .tribe-subtribe-link:hover { background: #333 !important; } .tribe-parent-image { border-color: #ffa300 !important; } .tribe-parent-box { background: #1e1f23 !important; } -.tribe-card-parent { background: #1e1f23 !important; border-color: #444 !important; } -.tribe-parent-card-link { color: #ffa300 !important; } diff --git a/nodejs-project/nodejs-project/src/client/assets/themes/Matrix-SNH.css b/nodejs-project/nodejs-project/src/client/assets/themes/Matrix-SNH.css index 9b1af9d4..55f6eac8 100644 --- a/nodejs-project/nodejs-project/src/client/assets/themes/Matrix-SNH.css +++ b/nodejs-project/nodejs-project/src/client/assets/themes/Matrix-SNH.css @@ -439,7 +439,6 @@ a.user-link:focus { .tribe-info-label { color: #00FF00 !important; background: #1A1A1A !important; } .tribe-info-value { color: #00FF00 !important; background: #1A1A1A !important; } .tribe-info-empty { color: #006600 !important; } -.tribe-card-subtribes { border-color: #00FF00 !important; background: #1A1A1A !important; } .tribe-card-members { border-color: #00FF00 !important; background: #1A1A1A !important; } .tribe-members-count { color: #00FF00 !important; } .tribe-card-actions { border-color: #00FF00 !important; background: #1A1A1A !important; } @@ -451,5 +450,3 @@ a.user-link:focus { .tribe-subtribe-link:hover { background: #00FF00 !important; color: #000 !important; } .tribe-parent-image { border-color: #00FF00 !important; } .tribe-parent-box { background: #1A1A1A !important; } -.tribe-card-parent { background: #1A1A1A !important; border-color: #00FF00 !important; } -.tribe-parent-card-link { color: #00FF00 !important; } diff --git a/nodejs-project/nodejs-project/src/client/assets/themes/Purple-SNH.css b/nodejs-project/nodejs-project/src/client/assets/themes/Purple-SNH.css index bf29f166..d361702a 100644 --- a/nodejs-project/nodejs-project/src/client/assets/themes/Purple-SNH.css +++ b/nodejs-project/nodejs-project/src/client/assets/themes/Purple-SNH.css @@ -474,7 +474,6 @@ a.user-link:focus { .tribe-info-label { color: #B86ADE !important; background: #3C1360 !important; } .tribe-info-value { color: #FFEEDB !important; background: #3C1360 !important; } .tribe-info-empty { color: #8844aa !important; } -.tribe-card-subtribes { border-color: #B86ADE !important; background: #2D0B47 !important; } .tribe-card-members { border-color: #B86ADE !important; background: #2D0B47 !important; } .tribe-members-count { color: #FFD600 !important; } .tribe-card-actions { border-color: #B86ADE !important; background: #2D0B47 !important; } @@ -486,5 +485,3 @@ a.user-link:focus { .tribe-subtribe-link:hover { background: #5A1A85 !important; } .tribe-parent-image { border-color: #B86ADE !important; } .tribe-parent-box { background: #3C1360 !important; } -.tribe-card-parent { background: #4B1A72 !important; border-color: #B86ADE !important; } -.tribe-parent-card-link { color: #FFD600 !important; } diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_ar.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_ar.js new file mode 100644 index 00000000..482c30eb --- /dev/null +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_ar.js @@ -0,0 +1,3218 @@ +const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); +module.exports = { + ar: { + languageName: "العربية", + extended: "الكون المتعدد", + extendedDescription: [ + "عندما تدعم شخصًا ما، قد تقوم بتنزيل منشورات من السكان الذين يدعمونهم، وتظهر تلك المنشورات هنا، مرتبة حسب الأحدث.", + ], + popular: "أبرز المنشورات", + popularDescription: [ + "منشورات من سكان شبكتك، ", + strong("مرتبة حسب الانتشار"), + ". اختر الفترة الزمنية للحصول على القائمة.", + ], + day: "يوم", + week: "أسبوع", + month: "شهر", + year: "سنة", + latest: "الأحدث", + latestDescription: [ + strong("منشورات"), + " منك ومن السكان الذين تدعمهم، مرتبة حسب الأحدث.", + ], + topics: "المواضيع", + topicsDescription: [ + strong("مواضيع"), + " منك ومن السكان الذين تدعمهم، مرتبة حسب الأحدث.", + ], + summaries: "الملخصات", + summariesDescription: [ + strong("مواضيع تحتوي على تعليقات"), + " منك ومن السكان الذين تدعمهم، مرتبة حسب الأحدث.", + ], + threads: "المحادثات", + threadsDescription: [ + strong("منشورات تحتوي على تعليقات"), + " من السكان الذين تدعمهم (بما في ذلك من الكون المتعدد)، مرتبة حسب الأحدث.", + ], + profile: "الصورة الرمزية", + inhabitants: "السكان", + manualMode: "الوضع اليدوي", + mentions: "الإشارات", + mentionsDescription: [ + strong("منشورات تُشير إليك @"), + "، مرتبة حسب الأحدث.", + ], + nextPage: "التالي", + previousPage: "السابق", + noMentions: "لم تتلقَّ إشارات @ بعد.", + private: "صندوق الوارد", + privateDescription: "عرض وإدارة رسائلك الخاصة.", + privateInbox: "الوارد", + privateSent: "المُرسَل", + privateFrom: "من", + privateTo: "إلى", + privateDate: "التاريخ", + privateDelete: "حذف", + pmCreateButton: "كتابة رسالة خاصة", + pmReply: "رد", + pmReplies: "ردود", + pmNew: "جديد", + pmMarkRead: "تعيين كمقروء", + inReplyTo: "ردًا على", + pmPreview: "معاينة", + pmPreviewTitle: "معاينة الرسالة", + noPrivateMessages: "لم تتلقَّ أي رسالة خاصة بعد.", + peers: "الأقران", + privateDescription: [strong("الرسائل الخاصة مشفرة بمفتاحك العام")," ويمكن إرسالها لـ 7 مستلمين كحد أقصى."], + search: "بحث", + searchDescription: "الوصف", + imageSearch: "بحث عن الصور", + searchPlaceholder: "ابحث عن @سكان و#وسوم وكلمات مفتاحية...", + settings: "الإعدادات", + continueReading: "متابعة القراءة", + moreComments: "تعليق إضافي", + readThread: "اقرأ بقية المحادثة", + pixeliaTitle: 'بكسيليا', + pixeliaDescription: 'ارسم بكسلات على الشبكة وتعاون فنيًا مع الآخرين في شبكتك.', + coordLabel: 'الإحداثي (مثال: A3)', + coordPlaceholder: 'أدخل الإحداثي', + contributorsTitle: "المساهمون", + pixeliaBy: "بواسطة", + colorLabel: 'اختر لونًا', + paintButton: 'ارسم!', + invalidCoordinate: 'إحداثي غير صحيح', + goToMuralButton: "عرض الجدارية", + totalPixels: 'إجمالي البكسلات', + modules: "الوحدات", + modulesViewTitle: "الوحدات", + modulesViewDescription: "اضبط بيئتك بتفعيل أو تعطيل الوحدات.", + inbox: "صندوق الوارد", + multiverse: "الكون المتعدد", + popularLabel: "أبرز المنشورات", + topicsLabel: "المواضيع", + latestLabel: "الأحدث", + summariesLabel: "الملخصات", + threadsLabel: "المحادثات", + multiverseLabel: "الكون المتعدد", + inboxLabel: "صندوق الوارد", + invitesLabel: "الدعوات", + walletLabel: "المحفظة", + legacyLabel: "المفاتيح", + cipherLabel: "التشفير", + bookmarksLabel: "العلامات المرجعية", + videosLabel: "الفيديوهات", + torrentsLabel: "التورنت", + docsLabel: "المستندات", + audiosLabel: "الملفات الصوتية", + tagsLabel: "الوسوم", + imagesLabel: "الصور", + inhabitantsLabel: "السكان", + trendingLabel: "الرائج", + eventsLabel: "الأحداث", + tasksLabel: "المهام", + transfersTitle: "التحويلات", + marketTitle: "السوق", + opinionsTitle: "الآراء", + saveSettings: "حفظ الإعدادات", + apply: "تطبيق", + menuPersonal: "شخصي", + menuContent: "المحتوى", + menuGovernance: "الحوكمة", + menuOffice: "المكتب", + menuMultiverse: "الكون المتعدد", + menuNetwork: "الشبكة", + menuCreative: "إبداعي", + menuEconomy: "الاقتصاد", + menuMedia: "الوسائط", + menuTools: "الأدوات", + comment: "تعليق", + subtopic: "موضوع فرعي", + json: "JSON", + createdAt: "أُنشئ في", + createdBy: "بواسطة", + unfollow: "إلغاء الدعم", + follow: "دعم", + block: "حظر", + unblock: "إلغاء الحظر", + newerPosts: "منشورات أحدث", + olderPosts: "منشورات أقدم", + feedRangeEmpty: "النطاق المحدد فارغ لهذا التغذية. جرّب عرض ", + seeFullFeed: "التغذية الكاملة", + feedEmpty: "لم تشهد شبكة Oasis أي منشورات من هذا الحساب.", + beginningOfFeed: "هذه بداية التغذية", + noNewerPosts: "لم يتم استقبال منشورات أحدث بعد.", + relationshipNotFollowing: "أنت غير مدعوم", + relationshipTheyFollow: "يدعمك", + relationshipMutuals: "دعم متبادل", + relationshipFollowing: "أنت تدعم", + relationshipYou: "أنت", + relationshipBlocking: "أنت تحظر", + relationshipBlockedBy: "أنت محظور", + relationshipMutualBlock: "حظر متبادل", + relationshipNone: "أنت لا تدعم", + relationshipConflict: "تعارض", + relationshipBlockingPost: "منشور محظور", + viewLikes: "عرض الانتشارات", + spreadedDescription: "قائمة المنشورات التي نشرها الساكن.", + totalspreads: "إجمالي الانتشارات", + attachFiles: "إرفاق ملفات", + preview: "معاينة", + publish: "كتابة", + contentWarningPlaceholder: "أضف موضوعًا للمنشور (اختياري)", + privateWarningPlaceholder: "أضف سكانًا لإرسال منشور خاص (اختياري)", + publishWarningPlaceholder: "...", + publishCustomDescription: [ + "تذكّر: بسبب تقنية البلوكتشين، بمجرد نشر المنشور لا يمكن تعديله أو حذفه.", + ], + commentWarning: [ + "تذكّر: بسبب تقنية البلوكتشين، بمجرد نشر المنشور لا يمكن تعديله أو حذفه.", + ], + commentPublic: "عام", + commentPrivate: "خاص", + commentLabel: ({ publicOrPrivate, markdownUrl }) => [ + ], + publishLabel: ({ markdownUrl, linkTarget }) => [ + "تذكّر: بسبب تقنية البلوكتشين، بمجرد نشر المنشور لا يمكن تعديله أو حذفه.", + ], + replyLabel: ({ markdownUrl }) => [ + "تذكّر: بسبب تقنية البلوكتشين، بمجرد نشر المنشور لا يمكن تعديله أو حذفه.", + ], + publishCustomInfo: ({ href }) => [ + "إذا كانت لديك خبرة، يمكنك أيضًا ", + a({ href }, "كتابة منشور متقدم"), + ".", + ], + publishBasicInfo: ({ href }) => [ + "إذا لم تكن لديك خبرة، يجب عليك ", + a({ href }, "كتابة منشور"), + ".", + ], + publishCustom: "كتابة منشور متقدم", + subtopicLabel: "إنشاء موضوع فرعي من هذا المنشور", + messagePreview: "معاينة المنشور", + mentionsMatching: "الإشارات المطابقة", + mentionsName: "الاسم", + mentionsRelationship: "العلاقة", + updateit: "احصل على التحديثات!", + updateBannerText: "يتوفر إصدار جديد من Oasis.", + updateBannerAction: "حدّث الآن →", + info: "معلومات", + settingsIntro: ({ version }) => [ + `[SNH] ꖒ OASIS [ v.${version} ]`, + ], + timeAgo: "مضت", + sendTime: "حوالي ", + theme: "السمة", + legacy: "المفاتيح", + legacyTitle: "المفاتيح", + legacyDescription: "إدارة مفتاحك السري (المفتاح الخاص) بسرعة وأمان.", + legacyExportButton: "تصدير", + legacyImportButton: "استيراد", + ssbLogStream: "البلوكتشين", + ssbLogStreamDescription: "تكوين حد الرسائل لتدفقات البلوكتشين.", + saveSettings: "حفظ الإعدادات", + exportTitle: "تصدير البيانات", + exportDescription: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير مفتاحك", + exportDataTitle: "نسخة احتياطية", + exportDataDescription: "تنزيل بياناتك (بدون المفتاح السري!)", + exportDataButton: "تنزيل قاعدة البيانات", + pubWallet: "محفظة PUB", + pubWalletDescription: "عيّن عنوان محفظة PUB. سيُستخدم لمعاملات PUB (بما في ذلك الدخل الأساسي الشامل).", + pubWalletConfiguration: "حفظ الإعدادات", + importTitle: "استيراد البيانات", + importDescription: "استورد مفتاحك السري المشفر (المفتاح الخاص) لتفعيل صورتك الرمزية", + importAttach: "إرفاق ملف مشفر (.enc)", + passwordLengthInfo: "يجب أن تكون كلمة المرور 32 حرفًا على الأقل.", + passwordImport: "اكتب كلمة المرور لفك تشفير البيانات التي سيتم حفظها في مجلد النظام الرئيسي (الاسم: secret)", + randomPassword: "كلمة مرور عشوائية", + exportPasswordPlaceholder: "استخدم أحرفًا صغيرة وكبيرة وأرقامًا ورموزًا", + fileInfo: "سيتم حفظ مفتاحك السري المشفر في مجلد النظام الرئيسي (الاسم: oasis.enc)", + themeIntro: + "اختر سمة.", + setTheme: "تعيين السمة", + language: "اللغة", + languageDescription: + "إذا كنت ترغب في استخدام لغة أخرى، اخترها هنا.", + setLanguage: "تعيين اللغة", + status: "الحالة", + peerConnections: "الأقران", + peerConnectionsIntro: "إدارة جميع اتصالاتك مع الأقران الآخرين.", + online: "متصل", + offline: "غير متصل", + discovered: 'مُكتشَف', + unknown: 'غير معروف', + pub: 'PUB', + supported: "مدعوم", + recommended: "مُوصى به", + blocked: "محظور", + noConnections: "لا يوجد أقران متصلون.", + noDiscovered: "لم يتم اكتشاف أقران.", + noSupportedConnections: "لا يوجد أقران مدعومون.", + noBlockedConnections: "لا يوجد أقران محظورون.", + noRecommendedConnections: "لا يوجد أقران مُوصى بهم.", + connectionActionIntro: + "", + startNetworking: "بدء الشبكة", + stopNetworking: "إيقاف الشبكة", + restartNetworking: "إعادة تشغيل الشبكة", + sync: "مزامنة الشبكة", + indexes: "الفهارس", + indexesDescription: + "إعادة بناء الفهارس آمنة، وقد تصلح بعض أنواع الأخطاء.", + homePageTitle: "الصفحة الرئيسية", + homePageDescription: "اختر الوحدة التي تريدها كصفحتك الرئيسية.", + saveHomePage: "تعيين الرئيسية", + invites: "الدعوات", + invitesTitle: "الدعوات", + invitesInvites: "الدعوات", + invitesDescription: "إدارة وتطبيق رموز الدعوة في شبكتك.", + invitesTribesTitle: "القبائل", + invitesTribeInviteCodePlaceholder: "أدخل رمز دعوة القبيلة", + invitesTribeJoinButton: "انضم إلى القبيلة", + invitesPubsTitle: "PUBs", + invitesPubInviteCodePlaceholder: "أدخل رمز دعوة PUB", + invitesAcceptInvite: "انضم إلى PUB", + invitesAcceptedInvites: "الشبكات المتحدة", + invitesNoInvites: "لم يتم قبول أي دعوات بعد.", + invitesUnfollow: "إلغاء المتابعة", + invitesFollow: "متابعة", + invitesUnfollowedInvites: "الشبكات غير المتحدة", + invitesNoFederatedPubs: "لا توجد شبكات متحدة.", + invitesNoUnfollowed: "لا توجد شبكات غير متحدة.", + invitesUnreachablePubs: "شبكات يتعذر الوصول إليها", + invitesNoUnreachablePubs: "لا توجد شبكات يتعذر الوصول إليها.", + currentlyUnreachable: "خطأ!", + errorDetails: "تفاصيل الخطأ", + genericError: "حدث خطأ.", + panicMode: "وضع الطوارئ!", + encryptData: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير البلوكتشين الخاص بك", + decryptData: "أدخل كلمة المرور لفك تشفير البلوكتشين الخاص بك", + panicModeDescription: "تشفير/فك تشفير أو حذف البلوكتشين الخاص بك", + removeDataDescription: "تحذير: لا يمكن التراجع عن هذه العملية.", + encryptPanicButton: "تشفير البلوكتشين", + decryptPanicButton: "فك تشفير البلوكتشين", + removePanicButton: "حذف جميع بياناتك!", + searchTitle: "بحث", + searchDescriptionLabel: "ابحث عن محتوى في شبكتك.", + searchLanguagesLabel: "اللغات", + searchSkillsLabel: "المهارات", + searchPlaceholder:"ابحث عن محتوى...", + searchSubmit:"ابحث!", + tribeLocationLabel:"الموقع", + tribeModeLabel:"وضع الدعوة", + tribeMembersCount:"عدد الأعضاء", + searchDateLabel:"التاريخ", + searchLocationLabel:"الموقع", + searchPriceLabel:"السعر", + searchUrlLabel:"الرابط", + searchCategoryLabel:"الفئة", + searchStartLabel:"وقت البدء", + searchEndLabel:"وقت الانتهاء", + searchPriorityLabel:"الأولوية", + searchStatusLabel:"الحالة", + statusLabel:"الحالة", + totalVotesLabel:"إجمالي الأصوات", + votesLabel:"الأصوات", + noResultsFound:"لم يتم العثور على نتائج.", + author:"المؤلف", + createdAtLabel:"أُنشئ في", + hashtagDescription:"استكشف المحتوى المرتبط بهذا الوسم", + tribeDescriptionLabel:"الوصف", + votesOption:"خيارات التصويت", + voteYesLabel:"نعم", + voteNoLabel:"لا", + allTypesLabel: "غير محدود", + ABSTENTIONLabel:"امتناع", + YESLabel:"نعم", + NOLabel:"لا", + FOLLOW_MAJORITYLabel: "اتباع الأغلبية", + CONFUSEDLabel: "مرتبك", + NOT_INTERESTEDLabel: "غير مهتم", + voteOptionYes:"نعم", + voteOptionNo:"لا", + voteOptionAbstention:"امتناع", + StatusLabel:"الحالة", + votesOptionYesLabel:"نعم", + votesOptionNoLabel:"لا", + votesOptionAbstentionLabel:"امتناع", + votesQuestionLabel:"السؤال", + votesCreatedByLabel:"أنشأه", + voteStatusOpen:"مفتوح", + voteStatusClosed:"مغلق", + imageSearchLabel: "أدخل كلمات للبحث عن صور مُعلَّمة بها.", + commentDescription: ({ parentUrl }) => [ + " علّق على ", + a({ href: parentUrl }, " المحادثة"), + ], + commentTitle: ({ authorName }) => [`تعليق على منشور @${authorName}`], + subtopicDescription: ({ parentUrl }) => [ + " أنشأ موضوعًا فرعيًا من ", + a({ href: parentUrl }, " منشور"), + ], + subtopicTitle: ({ authorName }) => [`موضوع فرعي على منشور @${authorName}`], + mysteryDescription: "نشر منشورًا غامضًا", + oasisDescription: "شبكة مشروع OASIS", + searchSubmit: "لنبحث...", + hashtagDescription: "منشورات مُوسَمة بهذا الوسم.", + postLabel: "المنشورات", + aboutLabel: "السكان", + feedLabel: "التغذيات", + votesLabel: "التصويتات", + reportLabel: "التقارير", + imageLabel: "الصور", + videoLabel: "الفيديوهات", + audioLabel: "الملفات الصوتية", + documentLabel: "المستندات", + torrentLabel: "التورنت", + pdfFallbackLabel: "مستند PDF", + eventLabel: "الأحداث", + taskLabel: "المهام", + transferLabel: "التحويلات", + curriculumLabel: "السيرة الذاتية", + bookmarkLabel: "العلامات المرجعية", + tribeLabel: "القبائل", + marketLabel: "السوق", + shopLabel: "SHOPS", + shopProductLabel: "SHOP PRODUCTS", + mapLabel: "MAPS", + jobLabel: "JOBS", + forumLabel: "FORUMS", + projectLabel: "PROJECTS", + bankWalletLabel: "المحافظ", + bankClaimLabel: "UBI CLAIMS", + voteLabel: "VOTES", + contactLabel: "CONTACTS", + pubLabel: "PUBS", + cvLabel: "السير الذاتية", + submit: "إرسال", + subjectLabel: "الموضوع", + editProfile: "تعديل الصورة الرمزية", + editProfileDescription: + "", + profileName: "الاسم", + profileImage: "صورة الصورة الرمزية", + profileDescription: "الوصف", + hashtagDescription: + "منشورات من سكان شبكتك تشير إلى هذا #الوسم، مرتبة حسب الأحدث.", + rebuildName: "إعادة بناء قاعدة البيانات", + wallet: "المحفظة", + walletAddress: "العنوان", + walletAmount: "المبلغ", + walletAddressLine: ({ address }) => `العنوان: ${address}`, + walletAmountLine: ({ amount }) => `المبلغ: ${amount} ECO`, + walletBack: "رجوع", + walletBalanceTitle: "الرصيد", + walletWalletSendTitle: "إرسال", + walletReceiveTitle: "استقبال", + walletHistoryTitle: "السجل", + walletBalanceLine: ({ balance }) => `${balance} ECO`, + walletCnfrs: "تأكيدات", + walletConfirm: "تأكيد", + walletDescription: "إدارة أصولك الرقمية، بما في ذلك إرسال واستقبال ECOin، وعرض رصيدك، والوصول إلى سجل معاملاتك.", + walletDate: "التاريخ", + walletFee: "الرسوم (كلما ارتفعت الرسوم، زادت سرعة معالجة معاملتك)", + walletFeeLine: ({ fee }) => `الرسوم: ECO ${fee}`, + walletHistory: "السجل", + walletReceive: "استقبال", + walletReset: "إعادة تعيين", + walletSend: "إرسال", + walletStatus: "الحالة", + walletDisconnected: [ + "محفظة ECOin ", + strong("غير متصلة"), + ". تحقق من ", + a({ href: '/settings' }, "إعداداتك"), + " أو حالة الاتصال.", + ], + walletSentToLine: ({ destination, amount }) => `تم إرسال ECO ${amount} إلى ${destination}`, + walletSettingsTitle: "المحفظة", + walletSettingsDescription: "دمج Oasis مع محفظة ECOin الخاصة بك.", + walletSettingsDocLink: "دليل تثبيت ECOin", + walletStatusMessages: { + invalid_amount: "مبلغ غير صالح", + invalid_dest: "عنوان وجهة غير صالح", + invalid_fee: "رسوم غير صالحة", + validation_errors: "أخطاء في التحقق", + send_tx_success: "تمت المعاملة بنجاح", + }, + walletTitle: "المحفظة", + walletTotalCostLine: ({ totalCost }) => `التكلفة الإجمالية: ECO ${totalCost}`, + walletTransactionId: "معرّف المعاملة", + walletTxId: "معرف المعاملة", + walletType: "النوع", + walletUser: "اسم المستخدم", + walletPass: "كلمة المرور", + walletConfiguration: "تعيين المحفظة", + cipher: "التشفير", + cipherTitle: "التشفير", + cipherDescription: "تشفير وفك تشفير نصك بشكل متماثل (باستخدام كلمة مرور مشتركة).", + randomPassword: "كلمة مرور عشوائية", + cipherEncryptTitle: "تشفير النص", + cipherEncryptDescription: "أدخل النص للتشفير", + cipherTextLabel: "النص للتشفير", + cipherTextPlaceholder: "أدخل النص للتشفير...", + cipherPasswordLabel: "عيّن كلمة مرور (32 حرفًا على الأقل) لتشفير نصك", + cipherPasswordDecryptLabel: "عيّن كلمة مرور (32 حرفًا على الأقل) لفك تشفير نصك", + cipherPasswordPlaceholder: "أدخل كلمة مرور...", + cipherEncryptButton: "تشفير", + cipherDecryptTitle: "فك تشفير النص", + cipherDecryptDescription: "أدخل النص لفك التشفير", + cipherEncryptedMessageLabel: "النص المشفر", + cipherDecryptedMessageLabel: "النص المفكوك", + cipherPasswordUsedLabel: "كلمة المرور المستخدمة للتشفير (احتفظ بها!)", + cipherEncryptedTextPlaceholder: "أدخل النص المشفر...", + cipherIvLabel: "IV", + cipherIvPlaceholder: "أدخل متجه التهيئة...", + cipherDecryptButton: "فك التشفير", + password: "كلمة المرور", + text: "النص", + encryptedText: "النص المشفر", + iv: "متجه التهيئة (IV)", + encryptTitle: "تشفير نصك", + encryptDescription: "أدخل النص الذي تريد تشفيره وقدّم كلمة مرور.", + encryptButton: "تشفير", + decryptTitle: "فك تشفير نصك", + decryptDescription: "أدخل النص المشفر وقدّم نفس كلمة المرور المستخدمة للتشفير.", + decryptButton: "فك التشفير", + passwordLengthError: "يجب أن تكون كلمة المرور 32 حرفًا على الأقل.", + missingFieldsError: "لم يتم تقديم النص أو كلمة المرور أو IV.", + encryptionError: "خطأ في تشفير النص.", + decryptionError: "خطأ في فك تشفير النص.", + bookmarkTitle: "العلامات المرجعية", + bookmarkDescription: "اكتشف وأدِر العلامات المرجعية في شبكتك.", + bookmarkAllSectionTitle: "العلامات المرجعية", + bookmarkMineSectionTitle: "علاماتك المرجعية", + bookmarkRecentSectionTitle: "العلامات المرجعية الأخيرة", + bookmarkTopSectionTitle: "أفضل العلامات المرجعية", + bookmarkFavoritesSectionTitle: "المفضلة", + bookmarkCreateSectionTitle: "إنشاء علامة مرجعية", + bookmarkUpdateSectionTitle: "تحديث علامة مرجعية", + bookmarkFilterAll: "الكل", + bookmarkFilterMine: "خاصتي", + bookmarkFilterTop: "الأفضل", + bookmarkFilterFavorites: "المفضلة", + bookmarkFilterRecent: "الأخيرة", + bookmarkCreateButton: "إنشاء علامة مرجعية", + bookmarkUpdateButton: "تحديث", + bookmarkDeleteButton: "حذف", + bookmarkAddFavoriteButton: "إضافة للمفضلة", + bookmarkRemoveFavoriteButton: "إزالة من المفضلة", + bookmarkUrlLabel: "الرابط", + bookmarkUrlPlaceholder: "https://example.com", + bookmarkDescriptionLabel: "الوصف", + bookmarkDescriptionPlaceholder: "اختياري", + bookmarkTagsLabel: "الوسوم", + bookmarkTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + bookmarkCategoryLabel: "الفئة", + bookmarkCategoryPlaceholder: "اختياري", + bookmarkLastVisitLabel: "آخر زيارة", + bookmarkSearchPlaceholder: "ابحث عن رابط، وسوم، فئة، مؤلف...", + bookmarkSortRecent: "الأحدث", + bookmarkSortOldest: "الأقدم", + bookmarkSortTop: "الأكثر تصويتًا", + bookmarkSearchButton: "بحث", + bookmarkUpdatedAt: "تم التحديث", + bookmarkNoMatch: "لا توجد علامات مرجعية تطابق بحثك.", + noBookmarks: "لا توجد علامات مرجعية متاحة.", + noUrl: "لا يوجد رابط", + noCategory: "لا توجد فئة", + noLastVisit: "لا توجد زيارة أخيرة", + videoTitle: "الفيديوهات", + videoDescription: "استكشف وأدِر محتوى الفيديو في شبكتك.", + videoPluginTitle: "العنوان", + videoPluginDescription: "الوصف", + videoMineSectionTitle: "فيديوهاتك", + videoCreateSectionTitle: "رفع فيديو", + videoUpdateSectionTitle: "تحديث الفيديو", + videoAllSectionTitle: "الفيديوهات", + videoRecentSectionTitle: "الفيديوهات الأخيرة", + videoTopSectionTitle: "أفضل الفيديوهات", + videoFavoritesSectionTitle: "المفضلة", + videoFilterAll: "الكل", + videoFilterMine: "خاصتي", + videoFilterRecent: "الأخيرة", + videoFilterTop: "الأفضل", + videoFilterFavorites: "المفضلة", + videoCreateButton: "رفع فيديو", + videoUpdateButton: "تحديث", + videoDeleteButton: "حذف", + videoAddFavoriteButton: "إضافة للمفضلة", + videoRemoveFavoriteButton: "إزالة من المفضلة", + videoFileLabel: "اختر ملف فيديو (.mp4, .webm, .ogv, .mov)", + videoTagsLabel: "الوسوم", + videoTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + videoTitleLabel: "العنوان", + videoTitlePlaceholder: "اختياري", + videoDescriptionLabel: "الوصف", + videoDescriptionPlaceholder: "اختياري", + videoNoFile: "لم يتم تقديم ملف فيديو", + noVideos: "لا توجد فيديوهات متاحة.", + videoSearchPlaceholder: "ابحث عن عنوان، وسوم، مؤلف...", + videoSortRecent: "الأحدث", + videoSortOldest: "الأقدم", + videoSortTop: "الأكثر تصويتًا", + videoSearchButton: "بحث", + videoMessageAuthorButton: "رسالة خاصة", + videoUpdatedAt: "تم التحديث", + videoNoMatch: "لا توجد فيديوهات تطابق بحثك.", + documentTitle: "المستندات", + documentDescription: "اكتشف وأدِر المستندات في شبكتك.", + documentAllSectionTitle: "المستندات", + documentMineSectionTitle: "مستنداتك", + documentRecentSectionTitle: "المستندات الأخيرة", + documentTopSectionTitle: "أفضل المستندات", + documentFavoritesSectionTitle: "المفضلة", + documentCreateSectionTitle: "رفع مستند", + documentUpdateSectionTitle: "تعديل المستند", + documentFilterAll: "الكل", + documentFilterMine: "خاصتي", + documentFilterRecent: "الأخيرة", + documentFilterTop: "الأفضل", + documentFilterFavorites: "المفضلة", + documentCreateButton: "رفع مستند", + documentUpdateButton: "تحديث", + documentDeleteButton: "حذف", + documentAddFavoriteButton: "إضافة للمفضلة", + documentRemoveFavoriteButton: "إزالة من المفضلة", + documentMessageAuthorButton: "رسالة خاصة", + documentFileLabel: "رفع مستند (.pdf)", + documentTagsLabel: "الوسوم", + documentTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + documentTitleLabel: "العنوان", + documentTitlePlaceholder: "اختياري", + documentDescriptionLabel: "الوصف", + documentDescriptionPlaceholder: "اختياري", + documentNoFile: "لا يوجد ملف.", + noDocuments: "لا توجد مستندات متاحة.", + documentSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف، مؤلف...", + documentSortRecent: "الأحدث", + documentSortOldest: "الأقدم", + documentSortTop: "الأكثر تصويتًا", + documentSearchButton: "بحث", + documentNoMatch: "لا توجد مستندات تطابق بحثك.", + documentUpdatedAt: "تم التحديث", + audioTitle: "الملفات الصوتية", + audioDescription: "استكشف وأدِر المحتوى الصوتي في شبكتك.", + audioPluginTitle: "العنوان", + audioPluginDescription: "الوصف", + audioMineSectionTitle: "ملفاتك الصوتية", + audioCreateSectionTitle: "رفع ملف صوتي", + audioUpdateSectionTitle: "تحديث الملف الصوتي", + audioAllSectionTitle: "الملفات الصوتية", + audioRecentSectionTitle: "الملفات الصوتية الأخيرة", + audioTopSectionTitle: "أفضل الملفات الصوتية", + audioFilterAll: "الكل", + audioFilterMine: "خاصتي", + audioFilterRecent: "الأخيرة", + audioFilterTop: "الأفضل", + audioCreateButton: "رفع ملف صوتي", + audioUpdateButton: "تحديث", + audioDeleteButton: "حذف", + audioAddFavoriteButton: "إضافة للمفضلة", + audioRemoveFavoriteButton: "إزالة من المفضلة", + audioFileLabel: "اختر ملفًا صوتيًا (.mp3, .wav, .ogg)", + audioTagsLabel: "الوسوم", + audioTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + audioTitleLabel: "العنوان", + audioTitlePlaceholder: "اختياري", + audioDescriptionLabel: "الوصف", + audioDescriptionPlaceholder: "اختياري", + audioNoFile: "لم يتم تقديم ملف صوتي", + noAudios: "لا توجد ملفات صوتية متاحة.", + audioSearchPlaceholder: "ابحث عن عنوان، وسوم، مؤلف...", + audioSortRecent: "الأحدث", + audioSortOldest: "الأقدم", + audioSortTop: "الأكثر تصويتًا", + audioSearchButton: "بحث", + audioMessageAuthorButton: "رسالة خاصة", + audioUpdatedAt: "تم التحديث", + audioNoMatch: "لا توجد ملفات صوتية تطابق بحثك.", + audioFavoritesSectionTitle: "المفضلة", + audioFilterFavorites: "المفضلة", + favoritesTitle: "المفضلة", + favoritesDescription: "جميع وسائطك المفضلة في مكان واحد.", + favoritesFilterAll: "الكل", + favoritesFilterRecent: "الأخيرة", + favoritesFilterAudios: "الملفات الصوتية", + favoritesFilterBookmarks: "العلامات المرجعية", + favoritesFilterDocuments: "المستندات", + favoritesFilterImages: "الصور", + favoritesFilterMaps: "خرائط", + favoritesFilterPads: "اللوحات", + favoritesFilterChats: "الدردشات", + favoritesFilterCalendars: "التقويمات", + favoritesFilterVideos: "الفيديوهات", + favoritesRemoveButton: "إزالة من المفضلة", + favoritesNoItems: "لا توجد مفضلات بعد.", + yourContacts: "جهات اتصالك", + allInhabitants: "السكان", + allCVs: "جميع السير الذاتية", + discoverPeople: "اكتشف السكان في شبكتك.", + allInhabitantsButton: "الكل", + contactsButton: "المدعومون", + CVsButton: "السير الذاتية", + matchSkills: "مطابقة المهارات", + matchSkillsButton: "مطابقة المهارات", + suggestedButton: "المقترحون", + searchInhabitantsPlaceholder: "تصفية السكان حسب الاسم …", + filterLocation: "تصفية السكان حسب الموقع …", + filterLanguage: "تصفية السكان حسب اللغة …", + filterSkills: "تصفية السكان حسب المهارات …", + applyFilters: "تطبيق الفلاتر", + locationLabel: "الموقع", + languagesLabel: "اللغات", + skillsLabel: "المهارات", + commonSkills: "المهارات المشتركة", + mutualFollowers: "المتابعون المتبادلون", + latestInteractions: "آخر التفاعلات", + viewAvatar: "عرض الصورة الرمزية", + viewCV: "عرض السيرة الذاتية", + suggestedSectionTitle: "المقترحون", + topkarmaSectionTitle: "أفضل كارما", + topactivitySectionTitle: "الأكثر نشاطًا", + blockedSectionTitle: "المحظورون", + gallerySectionTitle: "المعرض", + blockedButton: "المحظورون", + blockedLabel: "مستخدم محظور", + inhabitantviewDetails: "عرض التفاصيل", + viewDetails: "عرض التفاصيل", + keepReading: "متابعة القراءة...", + oasisId: "المعرّف", + noInhabitantsFound: "لم يتم العثور على سكان بعد.", + inhabitantActivityLevel: "مستوى النشاط", + deviceLabel: "الجهاز", + parliamentTitle: "البرلمان", + parliamentDescription: "استكشف أشكال الحكم وقوانين الإدارة الجماعية.", + parliamentFilterGovernment: "الحكومة", + parliamentFilterCandidatures: "الترشيحات", + parliamentFilterProposals: "المقترحات", + parliamentFilterLaws: "القوانين", + parliamentFilterHistorical: "السجل التاريخي", + parliamentFilterLeaders: "القادة", + parliamentFilterRules: "القواعد", + parliamentGovernmentCard: "الحكومة الحالية", + parliamentGovMethod: "طريقة الحكم", + parliamentActorInPowerInhabitant: 'الساكن الحاكم', + parliamentActorInPowerTribe: 'القبيلة الحاكمة', + parliamentHistoricalGovernmentsTitle: 'الحكومات', + parliamentHistoricalElectionsTitle: 'دورات الانتخاب', + parliamentHistoricalLawsTitle: 'السجل التاريخي', + parliamentHistoricalLeadersTitle: 'القادة', + parliamentThCycles: 'الدورات', + parliamentThTimesInPower: 'فترات الحكم', + parliamentThTotalCandidatures: 'الترشيحات', + parliamentThProposed: 'القوانين المقترحة', + parliamentThApproved: 'القوانين المعتمدة', + parliamentThDeclined: 'القوانين المرفوضة', + parliamentThDiscarded: 'القوانين الملغاة', + parliamentVotesReceived: "الأصوات المُستلَمة", + parliamentMembers: "الأعضاء", + parliamentLegSince: "بداية الدورة", + parliamentLegEnd: "نهاية الدورة", + parliamentPoliciesProposal: "مقترحات القوانين", + parliamentPoliciesApproved: "القوانين المعتمدة", + parliamentPoliciesDeclined: "القوانين المرفوضة", + parliamentPoliciesDiscarded: "القوانين الملغاة", + parliamentEfficiency: "% الكفاءة", + parliamentFilterRevocations: 'الإلغاءات', + parliamentRevocationFormTitle: 'إلغاء قانون', + parliamentRevocationLaw: 'القانون', + parliamentRevocationTitle: 'العنوان', + parliamentRevocationReasons: 'الأسباب', + parliamentRevocationPublish: 'نشر الإلغاء', + parliamentCurrentRevocationsTitle: 'الإلغاءات الحالية', + parliamentFutureRevocationsTitle: 'الإلغاءات المستقبلية', + parliamentPoliciesRevocated: 'القوانين الملغاة', + parliamentPoliciesTitle: 'السجل التاريخي', + parliamentLawsTitle: 'القوانين المعتمدة', + parliamentRulesRevocations: 'يمكن إلغاء أي قانون معتمد باستخدام طريقة الحكم الحالية.', + parliamentNoStableGov: "لم يتم اختيار حكومة بعد.", + parliamentNoGovernments: "لا توجد حكومات بعد.", + parliamentCandidatureFormTitle: "اقتراح ترشيح", + parliamentCandidatureId: "الترشيح", + parliamentCandidatureIdPh: "معرّف Oasis (@...) أو اسم القبيلة", + parliamentCandidatureSlogan: "الشعار (140 حرفًا كحد أقصى)", + parliamentCandidatureSloganPh: "شعار قصير", + parliamentCandidatureMethod: "الطريقة", + parliamentCandidatureProposeBtn: "نشر الترشيح", + parliamentThType: "النوع", + parliamentThId: "المعرّف", + parliamentThDate: "تاريخ الاقتراح", + parliamentThSlogan: "الشعار", + parliamentThMethod: "الطريقة", + parliamentThKarma: "كارما", + parliamentThSince: "تاريخ الملف الشخصي", + parliamentThVotes: "الأصوات المُستلَمة", + parliamentThVoteAction: "تصويت", + parliamentTypeUser: "ساكن", + parliamentTypeTribe: "قبيلة", + parliamentVoteBtn: "تصويت", + parliamentProposalFormTitle: "اقتراح قانون", + parliamentProposalTitle: "العنوان", + parliamentProposalDescription: "الوصف (≤1000)", + parliamentProposalPublish: "نشر الاقتراح", + parliamentOpenVote: "تصويت مفتوح", + parliamentFinalize: "إنهاء", + parliamentDeadline: "الموعد النهائي", + parliamentStatus: "الحالة", + parliamentNoProposals: "لا توجد مقترحات قوانين بعد.", + parliamentNoLaws: "لا توجد قوانين معتمدة بعد.", + parliamentLawMethod: "الطريقة", + parliamentLawProposer: "مقترح من", + parliamentLawVotes: "نعم/الإجمالي", + parliamentLawEnacted: "تم سنّه في", + parliamentMethodDEMOCRACY: "ديمقراطية", + parliamentMethodMAJORITY: "أغلبية (80%)", + parliamentMethodMINORITY: "أقلية (20%)", + parliamentMethodDICTATORSHIP: "ديكتاتورية", + parliamentMethodKARMATOCRACY: "كارماتوقراطية", + parliamentMethodANARCHY: "فوضوية", + parliamentThId: "المعرّف", + parliamentThProposalDate: "تاريخ الاقتراح", + parliamentThMethod: "الطريقة", + parliamentThKarma: "الكارما", + parliamentThSupports: "الداعمون", + parliamentThVote: "تصويت", + parliamentCurrentProposalsTitle: "المقترحات الحالية", + parliamentVotesSlashTotal: "الأصوات/الإجمالي", + parliamentVotesNeeded: "الأصوات المطلوبة", + parliamentFutureLawsTitle: "القوانين المستقبلية", + parliamentNoFutureLaws: "لا توجد قوانين مستقبلية بعد.", + parliamentVoteAction: "تصويت", + parliamentLeadersTitle: "القادة", + parliamentThLeader: "الصورة الرمزية", + parliamentPopulation: "عدد السكان", + parliamentThType: "النوع", + parliamentThInPower: "في السلطة", + parliamentThPresented: "الترشيحات", + parliamentNoLeaders: "لا يوجد قادة بعد.", + typeParliament: "البرلمان", + typeParliamentCandidature: "البرلمان · ترشيح", + typeParliamentTerm: "البرلمان · فترة", + typeParliamentProposal: "البرلمان · اقتراح", + typeParliamentLaw: "البرلمان · قانون جديد", + typeCourts: "المحاكم", + parliamentLawQuestion: "السؤال", + parliamentStatus: "الحالة", + parliamentCandidaturesListTitle: "قائمة الترشيحات", + parliamentElectionsEnd: "نهاية الانتخابات", + parliamentTimeRemaining: "الوقت المتبقي", + parliamentCurrentLeader: "الترشيح الفائز", + parliamentNoLeader: "لا يوجد ترشيح فائز بعد.", + parliamentElectionsStatusTitle: "الحكومة القادمة", + parliamentElectionsStart: "بداية الانتخابات", + parliamentProposalDeadlineLabel: "الموعد النهائي", + parliamentProposalTimeLeft: "الوقت المتبقي", + parliamentProposalOnTrack: "في طريقه للتمرير", + parliamentProposalOffTrack: "لا يوجد دعم كافٍ بعد", + parliamentRulesTitle: "كيف يعمل البرلمان", + parliamentRulesIntro: "تُحسم الانتخابات كل شهرين؛ الترشيحات مستمرة وتُعاد عند اختيار حكومة.", + parliamentRulesCandidates: "يمكن لأي ساكن ترشيح نفسه أو ساكن آخر أو أي قبيلة. يمكن لكل ساكن تقديم 3 ترشيحات كحد أقصى لكل دورة؛ تُرفض التكرارات في نفس الدورة.", + parliamentRulesElection: "الفائز هو الترشيح الذي يحصل على أكبر عدد من الأصوات وقت الحسم.", + parliamentRulesTies: "ترتيب كسر التعادل: أعلى كارما للساكن؛ إذا تعادلوا، أقدم ملف شخصي؛ إذا لا يزال متعادلاً، أقدم ترشيح؛ ثم ترتيب أبجدي حسب المعرّف.", + parliamentRulesFallback: "إذا لم يصوّت أحد، يفوز آخر ترشيح مقدّم. إذا لم تكن هناك ترشيحات، تُختار قبيلة عشوائية.", + parliamentRulesTerm: "يعرض تبويب الحكومة الحكومة الحالية والإحصائيات.", + parliamentRulesMethods: "الأشكال: فوضوية (أغلبية بسيطة)، ديمقراطية (50%+1)، أغلبية (80%)، أقلية (20%)، كارماتوقراطية (مقترحات أعلى كارما)، ديكتاتورية (موافقة فورية).", + parliamentRulesAnarchy: "الفوضوية هي الوضع الافتراضي: إذا لم يُنتخب أي ترشيح عند الحسم، تُعلن الفوضوية. في ظل الفوضوية، يمكن لأي ساكن اقتراح قوانين.", + parliamentRulesProposals: "إذا كنت الساكن الحاكم أو عضوًا في القبيلة الحاكمة، يمكنك نشر مقترحات قوانين. الطرق غير الديكتاتورية تنشئ تصويتًا عامًا.", + parliamentRulesLimit: "يمكن لكل ساكن نشر 3 مقترحات قوانين كحد أقصى لكل دورة.", + parliamentRulesLaws: "عندما يصل اقتراح إلى حده الأدنى، يصبح قانونًا ويظهر في تبويب القوانين مع تاريخ سنّه.", + parliamentRulesHistorical: "في تبويب السجل التاريخي يمكنك رؤية كل دورة حكومية حدثت وبيانات عن إدارتها.", + parliamentRulesLeaders: "في تبويب القادة يمكنك رؤية ترتيب السكان/القبائل التي حكمت (أو ترشحت)، مرتبة حسب الكفاءة.", + parliamentProposalVoteStatusLabel: "حالة التصويت", + parliamentProposalOnTrackYes: "تم الوصول للحد الأدنى", + parliamentProposalOnTrackNo: "دون الحد الأدنى", + courtsTitle: "المحاكم", + courtsDescription: "استكشف أشكال حل النزاعات وإدارة العدالة الجماعية.", + courtsFilterCases: "القضايا", + courtsFilterMyCases: "خاصتي", + courtsFilterJudges: "القضاة", + courtsFilterHistory: "السجل", + courtsFilterRules: "القواعد", + courtsFilterOpenCase: "فتح قضية", + courtsCaseFormTitle: "فتح قضية", + courtsCaseTitle: "العنوان", + courtsCaseRespondent: "المتهم / المدعى عليه", + courtsCaseRespondentPh: "معرّف Oasis (@...) أو اسم القبيلة", + courtsCaseMediatorsAccuser: "الوسطاء (المدعي)", + courtsCaseMediatorsPh: "معرّفات Oasis، مفصولة بفاصلة", + courtsCaseMethod: "طريقة الحل", + courtsCaseDescription: "الوصف (1000 حرف كحد أقصى)", + courtsCaseEvidenceTitle: "أدلة القضية", + courtsCaseEvidenceHelp: "أرفق صورًا أو ملفات صوتية أو مستندات (PDF) أو فيديوهات تدعم قضيتك.", + courtsCaseSubmit: "رفع القضية", + courtsNominateJudge: "ترشيح قاضٍ", + courtsJudgeId: "القاضي", + courtsJudgeIdPh: "معرّف Oasis (@...) أو اسم الساكن", + courtsNominateBtn: "ترشيح", + courtsAddEvidence: "إضافة دليل", + courtsEvidenceText: "نص", + courtsEvidenceLink: "رابط", + courtsEvidenceLinkPh: "https://…", + courtsEvidenceSubmit: "إرفاق", + courtsAnswerTitle: "الرد على الدعوى", + courtsAnswerText: "مذكرة الرد", + courtsAnswerSubmit: "إرسال الرد", + courtsStanceDENY: "إنكار", + courtsStanceADMIT: "اعتراف", + courtsStancePARTIAL: "جزئي", + courtsVerdictTitle: "إصدار الحكم", + courtsVerdictResult: "النتيجة", + courtsVerdictOrders: "الأوامر", + courtsVerdictOrdersPh: "إجراءات، مواعيد نهائية، خطوات تصحيحية ...", + courtsIssueVerdict: "إصدار الحكم", + courtsMediationPropose: "اقتراح تسوية", + courtsSettlementText: "الشروط", + courtsSettlementProposeBtn: "اقتراح", + courtsNominationsTitle: "ترشيحات القضاء", + courtsThJudge: "القاضي", + courtsThSupports: "الداعمون", + courtsThDate: "التاريخ", + courtsThVote: "تصويت", + courtsNoNominations: "لا توجد ترشيحات بعد.", + courtsAccuser: "المدعي", + courtsRespondent: "المدعى عليه", + courtsThStatus: "الحالة", + courtsThAnswerBy: "الرد بواسطة", + courtsThEvidenceBy: "الدليل بواسطة", + courtsThDecisionBy: "القرار بواسطة", + courtsThCase: "القضية", + courtsThCreatedAt: "تاريخ البدء", + courtsThActions: "الإجراءات", + courtsCaseMediatorsRespondentTitle: "إضافة وسطاء الدفاع", + courtsCaseMediatorsRespondent: "الوسطاء (الدفاع)", + courtsMediatorsAccuserLabel: "الوسطاء (المدعي)", + courtsMediatorsRespondentLabel: "الوسطاء (الدفاع)", + courtsMediatorsSubmit: "حفظ الوسطاء", + courtsVotesNeeded: "الأصوات المطلوبة", + courtsVotesSlashTotal: "نعم / الإجمالي", + courtsOpenVote: "تصويت مفتوح", + courtsPublicPrefLabel: "الظهور بعد الحل", + courtsPublicPrefYes: "أوافق على أن تكون هذه القضية علنية بالكامل", + courtsPublicPrefNo: "أفضل إبقاء التفاصيل خاصة", + courtsPublicPrefSubmit: "حفظ تفضيل الظهور", + courtsNoCases: "لا توجد قضايا.", + courtsNoMyCases: "ليس لديك نزاعات بعد.", + courtsNoHistory: "لا توجد محاكمات مسجلة بعد.", + courtsMethodJUDGE: "قاضٍ", + courtsMethodDICTATOR: "ديكتاتور", + courtsMethodPOPULAR: "شعبي", + courtsMethodMEDIATION: "وساطة", + courtsMethodKARMATOCRACY: "كارماتوقراطية", + courtsMethod: "الطريقة", + courtsRulesTitle: "كيف تعمل المحاكم", + courtsRulesIntro: "المحاكم هي عملية يديرها المجتمع لحل النزاعات وتعزيز العدالة التصالحية. يُعطى الأولوية للحوار والأدلة الواضحة والعلاجات المتناسبة.", + courtsRulesLifecycle: "العملية: 1) فتح قضية 2) اختيار الطريقة 3) تقديم الأدلة 4) الاستماع والمداولة 5) الحكم والعلاج 6) الامتثال والإغلاق 7) الاستئناف (إن وُجد).", + courtsRulesRoles: "المدعي: يفتح القضية. الدفاع: الشخص أو القبيلة المتهمة. الطريقة: الآلية التي يختارها المجتمع لتسهيل وتقييم الأدلة وإصدار الحكم. الشاهد: يقدم شهادة أو دليلاً. الوسطاء: أشخاص محايدون يدعوهم المدعي و/أو الدفاع، لديهم حق الوصول لجميع التفاصيل، يساعدون في تهدئة النزاع والمشاركة في صنع الاتفاقيات.", + courtsRulesEvidence: "الوصف حتى 1000 حرف. أرفق صورًا وملفات صوتية وفيديوهات ومستندات PDF ذات صلة وقانونية. لا تشارك بيانات خاصة حساسة دون موافقة.", + courtsRulesDeliberation: "قد تكون الجلسات علنية أو خاصة. يضمن القضاة الاحترام ويطلبون التوضيحات وقد يتجاهلون المواد غير ذات الصلة أو غير القانونية.", + courtsRulesVerdict: "يُعطى الأولوية للتصالح: الاعتذارات، اتفاقيات الوساطة، إدارة المحتوى، القيود المؤقتة، أو تدابير متناسبة أخرى. يجب تسجيل الأسباب.", + courtsRulesAppeals: "الاستئناف: مسموح عند وجود أدلة جديدة أو خطأ إجرائي واضح. يجب تقديمه خلال 7 أيام ما لم يُذكر خلاف ذلك.", + courtsRulesPrivacy: "احترم الخصوصية والأمان. يتم إزالة التشهير والكراهية والتهديدات. قد يعدل القضاة أو يختمون أجزاء من السجل لحماية الأشخاص المعرضين للخطر.", + courtsRulesMisconduct: "قد يؤدي التحرش أو التلاعب أو تلفيق الأدلة إلى حكم سلبي فوري.", + courtsRulesGlossary: "القضية: سجل نزاع. الدليل: مواد تدعم الادعاءات. الحكم: قرار مع علاج. الاستئناف: طلب مراجعة الحكم.", + courtsFilterActions: "الإجراءات", + courtsNoActions: "لا توجد إجراءات معلقة لدورك.", + courtsCaseTitlePlaceholder: "وصف مختصر للنزاع", + courtsCaseSeverity: "الخطورة", + courtsCaseSeverityNone: "بدون تصنيف خطورة", + courtsCaseSeverityLOW: "منخفضة", + courtsCaseSeverityMEDIUM: "متوسطة", + courtsCaseSeverityHIGH: "عالية", + courtsCaseSeverityCRITICAL: "حرجة", + courtsCaseSubject: "الموضوع", + courtsCaseSubjectNone: "بدون تصنيف موضوع", + courtsCaseSubjectBEHAVIOUR: "سلوك", + courtsCaseSubjectCONTENT: "محتوى", + courtsCaseSubjectGOVERNANCE: "حوكمة / قواعد", + courtsCaseSubjectFINANCIAL: "مالي / موارد", + courtsCaseSubjectOTHER: "أخرى", + courtsHiddenRespondent: "مخفي (مرئي فقط للأدوار المعنية).", + courtsThRole: "الدور", + courtsRoleAccuser: "المدعي", + courtsRoleDefence: "الدفاع", + courtsRoleMediator: "الوسيط", + courtsRoleJudge: "القاضي", + courtsRoleDictator: "الديكتاتور", + courtsAssignJudgeTitle: "اختيار قاضٍ", + courtsAssignJudgeBtn: "اختيار قاضٍ", + trendingTitle: "الرائج", + exploreTrending: "استكشف المحتوى الأكثر شعبية في شبكتك.", + ALLButton: "الكل", + MINEButton: "خاصتي", + RECENTButton: "الأخيرة", + TOPButton: "الأفضل", + bookmarkButton: "العلامات المرجعية", + transferButton: "التحويلات", + eventButton: "الأحداث", + taskButton: "المهام", + votesButton: "التصويتات", + reportButton: "التقارير", + feedButton: "التغذية", + marketButton: "السوق", + imageButton: "الصور", + audioButton: "الملفات الصوتية", + videoButton: "الفيديوهات", + documentButton: "المستندات", + torrentButton: "التورنت", + author: "بواسطة", + createdAtLabel: "أُنشئ في", + totalVotes: "إجمالي الأصوات", + noTrendingFound: "لم يتم العثور على محتوى رائج.", + noContentMessage: "لا يتوفر محتوى رائج بعد.", + trendingDescription: "الوصف", + trendingDate: "التاريخ", + trendingLocation: "الموقع", + trendingPrice: "السعر", + trendingUrl: "الرابط", + trendingCategory: "الفئة", + trendingStart: "البداية", + trendingEnd: "النهاية", + trendingPriority: "الأولوية", + trendingStatus: "الحالة", + trendingFrom: "من", + trendingTo: "إلى", + trendingConcept: "المفهوم", + trendingAmount: "المبلغ", + trendingDeadline: "الموعد النهائي", + trendingItemStatus: "حالة العنصر", + trendingTotalVotes: "إجمالي الأصوات", + trendingTotalOpinions: "إجمالي الآراء", + trendingNoContentMessage: "لا يتوفر محتوى رائج بعد.", + trendingAuthor: "بواسطة", + trendingCreatedAtLabel: "أُنشئ في", + trendingTotalCount: "العدد الإجمالي", + tasksTitle: "المهام", + tasksDescription: "اكتشف وأدِر المهام في شبكتك.", + taskTitleLabel: "العنوان", + taskDescriptionLabel: "الوصف", + taskStartTimeLabel: "وقت البدء", + taskEndTimeLabel: "وقت الانتهاء", + taskPriorityLabel: "الأولوية", + taskPrioritySelect: "اختر الأولوية", + taskPriorityUrgent: "عاجل", + taskPriorityHigh: "عالية", + taskPriorityMedium: "متوسطة", + taskPriorityLow: "منخفضة", + taskLocationLabel: "الموقع", + taskTagsLabel: "الوسوم", + taskVisibilityLabel: "الظهور", + taskPublic: "عام", + taskPrivate: "خاص", + taskCreatedAt: "أُنشئ في", + taskBy: "بواسطة", + taskStatus: "الحالة", + taskStatusOpen: "مفتوح", + taskStatusInProgress: "قيد التنفيذ", + taskStatusClosed: "مغلق", + taskAssignedTo: "مُسنَد إلى", + taskAssignees: "المُكلَّفون", + taskAssignButton: "إسناد لي", + taskUnassignButton: "إلغاء الإسناد", + taskCreateButton: "إنشاء مهمة", + taskUpdateButton: "تحديث", + taskDeleteButton: "حذف", + taskFilterAll: "الكل", + taskFilterMine: "خاصتي", + taskFilterOpen: "مفتوح", + taskFilterInProgress: "قيد التنفيذ", + taskFilterClosed: "مغلق", + taskFilterAssigned: "مُسنَد", + taskFilterArchived: "مؤرشف", + taskFilterUrgent: "عاجل", + taskFilterHigh: "عالية", + taskFilterMedium: "متوسطة", + taskFilterLow: "منخفضة", + taskAllSectionTitle: "المهام", + taskMineSectionTitle: "مهامك", + taskCreateSectionTitle: "إنشاء مهمة", + taskUpdateSectionTitle: "تحديث", + taskOpenTitle: "المهام المفتوحة", + taskInProgressTitle: "المهام قيد التنفيذ", + taskClosedTitle: "المهام المغلقة", + taskAssignedTitle: "المهام المُسنَدة", + taskArchivedTitle: "المهام المؤرشفة", + taskPublicTitle: "المهام العامة", + taskPrivateTitle: "المهام الخاصة", + notasks: "لا توجد مهام متاحة.", + noLocation: "لم يتم تحديد الموقع", + taskSetStatus: "تعيين الحالة", + eventTitle: "الأحداث", + eventDateLabel: "التاريخ", + eventsTitle: "الأحداث", + eventsDescription: "اكتشف وأدِر الأحداث في شبكتك.", + eventDescription: "الوصف", + eventPrice: "السعر", + eventStatus: "الحالة", + eventOrganizer: "المنظم", + eventAllSectionTitle: "الأحداث", + eventMineSectionTitle: "أحداثك", + eventArchivedTitle: "الأحداث المؤرشفة", + eventCreateSectionTitle: "إنشاء حدث", + eventUpdateSectionTitle: "تحديث الحدث", + eventDeleteButton: "حذف", + eventCreateButton: "إنشاء حدث", + eventTitleLabel: "العنوان", + eventDescriptionLabel: "الوصف", + eventDescriptionPlaceholder: "أدخل وصف الحدث...", + eventUpdateButton: "تحديث", + eventAttendeesLabel: "الحاضرون", + eventAttendeesPlaceholder: "أدخل الحاضرين، مفصولين بفواصل...", + eventTagsLabel: "الوسوم", + eventTagsPlaceholder: "أدخل وسوم الحدث، مفصولة بفواصل...", + eventTags: "الوسوم", + eventPriceLabel: "السعر", + eventUrlLabel: "الرابط", + eventAttendees: "الحاضرون", + noAttendees: "لا يوجد حاضرون بعد", + eventCreatedAt: "أُنشئ في", + eventLocation: "الموقع", + eventLocationLabel: "الموقع", + eventNoLocation: "لم يتم تحديد الموقع", + eventNoURL: "لم يتم تحديد رابط", + eventBy: "بواسطة", + noevents: "لا توجد أحداث متاحة.", + eventDate: "التاريخ", + eventDateFormat: "DD:MM:YYYY HH:mm", + eventAttendButton: "حضور الحدث", + eventUnattendButton: "إلغاء الحضور", + eventCreatedBy: "أُنشئ بواسطة", + eventAttendeesCount: "عدد الحاضرين", + eventCreatedByYou: "أنت أنشأت هذا الحدث", + eventAttendConfirmation: "أنت الآن تحضر هذا الحدث", + eventUnattendConfirmation: "لم تعد تحضر هذا الحدث", + eventFilterAll: "الكل", + eventFilterMine: "خاصتي", + eventFilterToday: "اليوم", + eventFilterWeek: "هذا الأسبوع", + eventFilterMonth: "هذا الشهر", + eventFilterYear: "هذه السنة", + eventFilterArchived: "مؤرشف", + eventTodayTitle: "أحداث اليوم", + eventThisWeekTitle: "أحداث هذا الأسبوع", + eventThisMonthTitle: "أحداث هذا الشهر", + eventThisYearTitle: "أحداث هذه السنة", + eventPrivacyLabel: "الظهور", + eventPublic: "عام", + eventPrivate: "خاص", + eventPublicTitle: "الأحداث العامة", + eventNoPrice: "حدث مجاني", + eventNoImage: "لم يتم رفع صورة", + eventAttendConfirmation: "أنت الآن تحضر هذا الحدث", + eventUnattendConfirmation: "لم تعد تحضر هذا الحدث", + eventAttended: "حضر", + eventUnattended: "لم يحضر", + eventStatusOpen: "مفتوح", + eventStatusClosed: "مغلق", + tagsTitle: "الوسوم", + tagsDescription: "اكتشف واستكشف أنماط التصنيف في شبكتك.", + tagsAllSectionTitle: "الوسوم", + tagsTopSectionTitle: "أفضل الوسوم", + tagsCloudSectionTitle: "سحابة الوسوم", + tagsFilterAll: "الكل", + tagsFilterTop: "الأفضل", + tagsFilterCloud: "السحابة", + tagsNoItems: "لا توجد وسوم متاحة.", + tagsTableHeaderTag: "الوسم/الرابط:", + tagsTableHeaderCount: "العداد:", + transfersTitle: "التحويلات", + transfersDescription: "اكتشف وأدِر التحويلات في شبكتك.", + transfersFrom: "من", + transfersTo: "إلى", + transfersFilterAll: "الكل", + transfersFilterMine: "خاصتي", + transfersFilterUBI: "UBI", + transfersFilterMarket: "السوق", + transfersFilterTop: "الأفضل", + transfersFilterPending: "معلّق", + transfersFilterUnconfirmed: "غير مؤكد", + transfersFilterClosed: "مغلق", + transfersFilterDiscarded: "ملغى", + transfersCreateButton: "إنشاء تحويل", + transfersUpdateButton: "تحديث", + transfersDeleteButton: "حذف", + transfersToUser: "معرف Oasis", + transfersToUserValidation: "معرّف Oasis صالح، مثال: @…=.ed25519", + transfersConcept: "المفهوم", + transfersAmount: "المبلغ", + transfersDeadline: "الموعد النهائي", + transfersTags: "الوسوم", + transfersStatus: "الحالة", + transfersStatusUnconfirmed: "غير مؤكد", + transfersStatusClosed: "مغلق", + transfersStatusDiscarded: "ملغى", + transfersCreatedAt: "أُنشئ في", + transfersConfirmations: "التأكيدات", + transfersConfirmButton: "تأكيد التحويل", + transfersNoItems: "لم يتم العثور على تحويلات.", + transfersMineSectionTitle: "تحويلاتك", + transfersUBISectionTitle: "تحويلات UBI", + transfersMarketSectionTitle: "تحويلات السوق", + transfersTopSectionTitle: "أفضل التحويلات", + transfersPendingSectionTitle: "التحويلات المعلّقة", + transfersUnconfirmedSectionTitle: "التحويلات غير المؤكدة", + transfersClosedSectionTitle: "التحويلات المغلقة", + transfersDiscardedSectionTitle: "التحويلات الملغاة", + transfersCreateSectionTitle: "إنشاء عملية نقل", + transfersAllSectionTitle: "التحويلات", + transfersFilterFavs: "المفضلة", + transfersFavsSectionTitle: "التحويلات المفضلة", + transfersSearchLabel: "بحث", + transfersSearchPlaceholder: "ابحث عن مفهوم، وسوم، مستخدمين...", + transfersMinAmountLabel: "الحد الأدنى للمبلغ", + transfersMaxAmountLabel: "الحد الأقصى للمبلغ", + transfersSortLabel: "ترتيب حسب", + transfersSortRecent: "الأحدث", + transfersSortAmount: "الأعلى مبلغًا", + transfersSortDeadline: "الأقرب موعدًا", + transfersSearchButton: "بحث", + transfersFavoriteButton: "إضافة للمفضلة", + transfersUnfavoriteButton: "إزالة من المفضلة", + transfersMessageUserButton: "رسالة", + transfersExpiringSoonBadge: "على وشك الانتهاء", + transfersExpiredBadge: "منتهي الصلاحية", + transfersUpdatedAt: "تم التحديث", + transfersNoMatch: "لا توجد تحويلات تطابق بحثك.", + votationsTitle: "التصويتات", + votationsDescription: "اكتشف وأدِر التصويتات في شبكتك.", + voteMineSectionTitle: "تصويتاتك", + voteCreateSectionTitle: "إنشاء تصويت", + voteUpdateSectionTitle: "تحديث", + voteOpenTitle: "التصويتات المفتوحة", + voteClosedTitle: "التصويتات المغلقة", + voteAllSectionTitle: "التصويتات", + voteCreateButton: "إنشاء تصويت", + voteUpdateButton: "تحديث", + voteDeleteButton: "حذف", + voteOptionYes: "نعم", + voteOptionNo: "لا", + voteOptionAbstention: "امتناع", + voteConfused: "مرتبك", + voteFollowMajority: "اتباع الأغلبية", + voteNotInterested: "غير مهتم", + voteFilterAll: "الكل", + voteFilterMine: "خاصتي", + voteFilterOpen: "مفتوح", + voteFilterClosed: "مغلق", + voteQuestionLabel: "السؤال", + voteDeadlineLabel: "الموعد النهائي", + voteOptionsLabel: "تصويتك", + voteBreakdown: "التفصيل", + voteFinalResult: "النتيجة", + voteTagsLabel: "الوسوم", + voteDeadline: "الموعد النهائي", + voteStatus: "الحالة", + voteTotalVotes: "إجمالي الأصوات", + voteTags: "الوسوم", + voteOpinions: "الآراء", + novotes: "لا توجد مقترحات تصويت متاحة.", + voteBy: "بواسطة", + voteCreatedAt: "أُنشئ في", + voteNoQuestion: "لم يتم تقديم سؤال", + voteUnknownCreator: "مُنشئ غير معروف", + voteUnknownDate: "تاريخ غير معروف", + errorVoteNotFound: "لم يتم العثور على التصويت", + errorAlreadyVoted: "لقد أبديت رأيك بالفعل.", + errorVoteClosedCannotEdit: "لا يمكنك تعديل تصويت مغلق", + errorVoteDeadlinePassed: "انتهى الموعد النهائي لهذا التصويت", + errorRetrievingVote: "خطأ في استرجاع التصويت", + errorCreatingVote: "خطأ في إنشاء التصويت", + errorVoteAlreadyVoted: "لا يمكن التعديل بعد الإدلاء بالرأي", + errorDeletingOldVote: "خطأ في حذف الرأي القديم", + errorCreatingUpdatedVote: "خطأ في إنشاء الرأي المحدّث", + errorCreatingTombstone: "خطأ في إنشاء شاهد القبر", + voteDetailSectionTitle: 'تفاصيل التصويت', + voteCommentsLabel: 'التعليقات', + voteCommentsForumButton: 'فتح النقاش', + voteCommentsSectionTitle: 'فتح النقاش', + voteNoCommentsYet: 'لا توجد تعليقات بعد. كن أول من يرد.', + voteNewCommentPlaceholder: 'اكتب تعليقك هنا…', + voteNewCommentButton: 'نشر التعليق', + voteNewCommentLabel: 'إضافة تعليق', + cvTitle: "السيرة الذاتية", + cvLabel: "السيرة الذاتية (CV)", + cvEditSectionTitle: "تعديل السيرة الذاتية", + cvCreateSectionTitle: "إنشاء سيرة ذاتية", + cvDescription: "إدارة ومشاركة مهاراتك ومعلوماتك المهنية.", + cvNameLabel: "الاسم الكامل", + cvDescriptionLabel: "الملخص", + cvPhotoLabel: "الصورة", + cvPersonalExperiencesLabel: "الخبرات الشخصية", + cvPersonalSkillsLabel: "المهارات الشخصية (مفصولة بفواصل)", + cvOasisExperiencesLabel: "خبرات المساهمة في Oasis", + cvOasisSkillsLabel: "مهارات المساهمة في Oasis (مفصولة بفواصل)", + cvEducationExperiencesLabel: "الخبرات التعليمية", + cvEducationalSkillsLabel: "المهارات التعليمية (مفصولة بفواصل)", + cvProfessionalExperiencesLabel: "الخبرات المهنية", + cvProfessionalSkillsLabel: "المهارات المهنية (مفصولة بفواصل)", + cvLanguagesLabel: "اللغات", + cvLocationLabel: "الموقع", + cvStatusLabel: "الحالة", + cvPreferencesLabel: "التفضيلات", + cvOasisContributorLabel: "مساهم في Oasis", + cvPersonal: "شخصي", + cvOasis: "مساهم في Oasis (اختياري)", + cvOasisContributorView: "مساهمة في Oasis", + cvEducational: "تعليمي (اختياري)", + cvEducationalView: "تعليمي", + cvProfessional: "مهني (اختياري)", + cvProfessionalView: "مهني", + cvAvailability: "التوفر (اختياري)", + cvAvailabilityView: "التوفر", + cvUpdateButton: "تحديث", + cvCreateButton: "إنشاء سيرة ذاتية", + cvContactLabel: "التواصل", + cvCreatedAt: "أُنشئ في", + cvUpdatedAt: "تم التحديث في", + cvEditButton: "تحديث", + cvDeleteButton: "حذف", + cvNoCV: "لم يتم العثور على سيرة ذاتية.", + blogSubject: "الموضوع", + blogMessage: "الرسالة", + blogImage: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + blogPublish: "معاينة", + noPopularMessages: "لم تُنشر رسائل شائعة بعد", + forumTitle: "المنتديات", + forumCategoryLabel: "الفئة", + forumTitleLabel: "العنوان", + forumTitlePlaceholder: "عنوان المنتدى...", + forumCreateButton: "إنشاء منتدى", + forumCreateSectionTitle: "إنشاء منتدى", + forumDescription: "تحدث بصراحة مع السكان الآخرين في شبكتك.", + forumFilterAll: "الكل", + forumFilterMine: "خاصتي", + forumFilterRecent: "الأخيرة", + forumFilterTop: "الأفضل", + forumMineSectionTitle: "منتدياتك", + forumRecentSectionTitle: "المنتديات الأخيرة", + forumAllSectionTitle: "المنتديات", + forumDeleteButton: "حذف", + forumParticipants: "المشاركون", + forumMessages: "الرسائل", + forumLastMessage: "آخر رسالة", + forumMessageLabel: "الرسالة", + forumMessagePlaceholder: "اكتب رسالتك...", + forumSendButton: "إرسال", + forumVisitForum: "زيارة المنتدى", + noForums: "لم يتم العثور على منتديات.", + forumVisitButton: "زيارة المنتدى", + forumCatGENERAL: "عام", + forumCatOASIS: "Oasis", + forumCatLARP: "L.A.R.P.", + forumCatPOLITICS: "سياسة", + forumCatTECH: "تقنية", + forumCatSCIENCE: "علوم", + forumCatMUSIC: "موسيقى", + forumCatART: "فن", + forumCatGAMING: "ألعاب", + forumCatBOOKS: "كتب", + forumCatFILMS: "أفلام", + forumCatPHILOSOPHY: "فلسفة", + forumCatSOCIETY: "مجتمع", + forumCatPRIVACY: "خصوصية", + forumCatCYBERWARFARE: "حرب سيبرانية", + forumCatSURVIVALISM: "البقائية", + imageTitle: "الصور", + imageDescription: "استكشف وأدِر محتوى الصور في شبكتك.", + imagePluginTitle: "العنوان", + imagePluginDescription: "الوصف", + imageMineSectionTitle: "صورك", + imageCreateSectionTitle: "رفع صورة", + imageUpdateSectionTitle: "تحديث الصورة", + imageAllSectionTitle: "الصور", + imageRecentSectionTitle: "الصور الأخيرة", + imageTopSectionTitle: "أفضل الصور", + imageFavoritesSectionTitle: "المفضلة", + imageGallerySectionTitle: "المعرض", + imageMemeSectionTitle: "ميمز", + imageFilterAll: "الكل", + imageFilterMine: "خاصتي", + imageFilterRecent: "الأخيرة", + imageFilterTop: "الأفضل", + imageFilterFavorites: "المفضلة", + imageFilterGallery: "المعرض", + imageFilterMeme: "ميمز", + imageCreateButton: "رفع صورة", + imageUpdateButton: "تحديث", + imageDeleteButton: "حذف", + imageAddFavoriteButton: "إضافة للمفضلة", + imageRemoveFavoriteButton: "إزالة من المفضلة", + imageFileLabel: "اختر ملف صورة (.jpeg, .jpg, .png, .gif)", + imageTagsLabel: "الوسوم", + imageTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + imageTitleLabel: "العنوان", + imageTitlePlaceholder: "اختياري", + imageDescriptionLabel: "الوصف", + imageDescriptionPlaceholder: "اختياري", + imageMemeLabel: "تعيين كميم", + imageNoFile: "لم يتم تقديم ملف صورة", + noImages: "لا توجد صور متاحة.", + imageSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف، مؤلف...", + imageSortRecent: "الأحدث", + imageSortOldest: "الأقدم", + imageSortTop: "الأكثر تصويتًا", + imageSearchButton: "بحث", + imageMessageAuthorButton: "رسالة", + imageUpdatedAt: "تم التحديث", + imageNoMatch: "لا توجد صور تطابق بحثك.", + feedTitle: "التغذية", + createFeedTitle: "إنشاء تغذية", + createFeedButton: "أرسل التغذية!", + feedPlaceholder: "ماذا يحدث؟ (280 حرفًا كحد أقصى)", + ALLButton: "التغذيات", + MINEButton: "تغذياتك", + TODAYButton: "اليوم", + TOPButton: "أفضل التغذيات", + CREATEButton: "إنشاء تغذية", + totalOpinions: "إجمالي الآراء", + moreVoted: "الأكثر تصويتًا", + alreadyVoted: "لقد أبديت رأيك بالفعل.", + noFeedsFound: "لم يتم العثور على تغذيات.", + author: "بواسطة", + createdAtLabel: "أُنشئ في", + FeedshareYourOpinions: "اكتشف وشارك نصوصًا قصيرة في شبكتك.", + refeedButton: "إعادة نشر", + alreadyRefeeded: "لقد أعدت نشر هذا بالفعل.", + activityTitle: "النشاط", + yourActivity: "نشاطك", + globalActivity: "النشاط العام", + activityList: "النشاط", + activityDesc: "شاهد آخر نشاط في شبكتك.", + allButton: "الكل", + mineButton: "خاصتي", + noActions: "لا يتوفر نشاط.", + performed: "→", + from: "من", + to: "إلى", + amount: "المبلغ", + concept: "المفهوم", + description: "الوصف", + meme: "ميم", + activityContact: "جهة اتصال", + activityBy: "الاسم", + activityPixelia: "تمت إضافة بكسل جديد", + viewImage: "عرض الصورة", + playAudio: "تشغيل الصوت", + playVideo: "تشغيل الفيديو", + typeRecent: "الأخيرة", + errorActivity: "خطأ في استرجاع النشاط", + typePost: "منشور", + typeTribe: "القبائل", + typeAbout: "السكان", + typeCurriculum: "السيرة الذاتية", + typeImage: "الصور", + typeBookmark: "العلامات المرجعية", + typeDocument: "المستندات", + typeVotes: "التصويتات", + typeAudio: "الملفات الصوتية", + typeMarket: "السوق", + typeJob: "الوظائف", + typeProject: "المشاريع", + typeVideo: "الفيديوهات", + typeVote: "انتشار", + typeEvent: "الأحداث", + typeTransfer: "تحويل", + typeTask: "المهام", + typePixelia: "بيكسيليا", + typeForum: "المنتدى", + typeReport: "التقارير", + typeFeed: "التغذية", + typeContact: "جهة اتصال", + typePub: "PUB", + typeTombstone: "شاهد قبر", + typeBanking: "المصرفية", + typeBankWallet: "المصرفية/المحفظة", + typeBankClaim: "المصرفية/الدخل الأساسي", + typeKarmaScore: "كارما", + typeParliament: "البرلمان", + typeSpread: "الانتشارات", + typeParliamentCandidature: "البرلمان · ترشيح", + typeParliamentTerm: "البرلمان · فترة", + typeParliamentProposal:"البرلمان · اقتراح", + typeParliamentRevocation:"البرلمان · إلغاء", + typeParliamentLaw: "البرلمان · قانون جديد", + typeCourts: "المحاكم", + typeCourtsCase: "المحاكم · قضية", + typeCourtsEvidence: "المحاكم · دليل", + typeCourtsAnswer: "المحاكم · رد", + typeCourtsVerdict: "المحاكم · حكم", + typeCourtsSettlement: "المحاكم · تسوية", + typeCourtsSettlementProposal: "المحاكم · اقتراح تسوية", + typeCourtsSettlementAccepted: "المحاكم · تسوية مقبولة", + typeCourtsNomination: "المحاكم · ترشيح", + typeCourtsNominationVote: "المحاكم · تصويت ترشيح", + activitySupport: "تحالف جديد أُقيم", + activityJoin: "تم الانضمام إلى PUB جديد", + question: "السؤال", + deadline: "الموعد النهائي", + status: "الحالة", + votes: "الأصوات", + totalVotes: "إجمالي الأصوات", + voteTotalVotes: "إجمالي الأصوات", + name: "الاسم", + skills: "المهارات", + tags: "الوسوم", + title: "العنوان", + date: "التاريخ", + category: "الفئة", + attendees: "الحاضرون", + activitySpread: "->", + visitLink: "زيارة الرابط", + viewDocument: "عرض المستند", + location: "الموقع", + contentWarning: "الموضوع", + personName: "اسم الساكن", + bankWalletConnected: "محفظة ECOin", + bankUbiReceived: "تم استلام الدخل الأساسي", + bankTx: "معاملة", + bankEpochShort: "الحقبة", + bankAllocId: "معرّف التخصيص", + bankingUserEngagementScore: "تسجيل الكارما", + viewDetails: "عرض التفاصيل", + link: "رابط", + aiSnippetsLearned: "مقتطفات مُتعلَّمة", + tribeFeedRefeeds: "إعادات النشر", + activityProjectFollow: "%OASIS% الآن %ACTION% هذا المشروع %PROJECT%", + activityProjectUnfollow: "%OASIS% الآن %ACTION% هذا المشروع %PROJECT%", + activityProjectPledged: "%OASIS% قد %ACTION% %AMOUNT% للمشروع %PROJECT%", + following: "يتابع", + unfollowing: "ألغى المتابعة", + pledged: "تبرع", + parliamentCandidatureId: "الترشيح", + parliamentGovMethod: "الطريقة", + parliamentVotesReceived: "الأصوات المُستلَمة", + parliamentMethodANARCHY: "فوضوية", + parliamentMethodVOTE: "تصويت مجتمعي", + parliamentMethodRANKED: "اختيار تفضيلي", + parliamentMethodPLURALITY: "تعددية", + parliamentMethodCOUNCIL: "مجلس", + parliamentMethodJURY: "هيئة محلفين", + parliamentAnarchy: "فوضوية", + parliamentElectionsStart: "بداية الانتخابات", + parliamentElectionsEnd: "نهاية الانتخابات", + parliamentCurrentLeader: "الترشيح الفائز", + parliamentProposalTitle: "العنوان", + parliamentOpenVote: "تصويت مفتوح", + parliamentStatus: "الحالة", + parliamentLawQuestion: "السؤال", + parliamentLawMethod: "الطريقة", + parliamentLawProposer: "المقترح", + parliamentLawEnacted: "تم سنّه في", + parliamentLawVotes: "الأصوات", + createdAt: "أُنشئ في", + courtsCaseTitle: "القضية", + courtsMethod: "الطريقة", + courtsMethodJUDGE: "قاضٍ", + courtsMethodJUDGES: "هيئة قضاة", + courtsMethodSINGLE_JUDGE: "قاضٍ منفرد", + courtsMethodJURY: "هيئة محلفين", + courtsMethodCOUNCIL: "مجلس", + courtsMethodCOMMUNITY: "مجتمع", + courtsMethodMEDIATION: "وساطة", + courtsMethodARBITRATION: "تحكيم", + courtsMethodVOTE: "تصويت مجتمعي", + courtsAccuser: "المدعي", + courtsRespondent: "المدعى عليه", + courtsThStatus: "الحالة", + courtsThAnswerBy: "الرد بواسطة", + courtsThEvidenceBy: "الدليل بواسطة", + courtsThDecisionBy: "القرار بواسطة", + courtsVotesNeeded: "الأصوات المطلوبة", + courtsVotesSlashTotal: "نعم/الإجمالي", + courtsOpenVote: "تصويت مفتوح", + courtsAnswerTitle: "الرد", + courtsStanceADMIT: "اعتراف", + courtsStanceDENY: "إنكار", + courtsStancePARTIAL: "جزئي", + courtsStanceCOUNTERCLAIM: "دعوى مضادة", + courtsStanceNEUTRAL: "محايد", + courtsVerdictResult: "النتيجة", + courtsVerdictOrders: "الأوامر", + courtsSettlementText: "التسوية", + courtsSettlementAccepted: "مقبولة", + courtsSettlementPending: "معلّقة", + courtsJudge: "القاضي", + courtsThSupports: "الداعمون", + courtsFilterOpenCase: 'فتح قضية', + courtsEvidenceFileLabel: 'ملف الدليل (صورة، صوت، فيديو أو PDF)', + courtsCaseMediators: 'الوسطاء', + courtsCaseMediatorsPh: 'معرّفات Oasis للوسطاء، مفصولة بفاصلة', + courtsMediatorsLabel: 'الوسطاء', + courtsThCase: 'القضية', + courtsThCreatedAt: 'تاريخ البدء', + courtsThActions: 'الإجراءات', + courtsPublicPrefLabel: 'الظهور بعد الحل', + courtsPublicPrefYes: 'أوافق على أن تكون هذه القضية علنية بالكامل', + courtsPublicPrefNo: 'أفضل إبقاء التفاصيل خاصة', + courtsPublicPrefSubmit: 'حفظ تفضيل الظهور', + courtsMethodMEDIATION: 'وساطة', + courtsNoCases: 'لا توجد قضايا.', + reportsTitle: "التقارير", + reportsDescription: "إدارة وتتبع التقارير المتعلقة بالمشاكل والأخطاء والإساءات وتحذيرات المحتوى في شبكتك.", + reportsFilterAll: "الكل", + reportsFilterMine: "خاصتي", + reportsFilterFeatures: "الميزات", + reportsFilterBugs: "الأخطاء", + reportsFilterAbuse: "الإساءة", + reportsFilterContent: "المحتوى", + reportsFilterConfirmed: "مؤكد", + reportsFilterResolved: "محلول", + reportsFilterOpen: "مفتوح", + reportsFilterUnderReview: "قيد المراجعة", + reportsFilterInvalid: "غير صالح", + reportsCreateButton: "إنشاء تقرير", + reportsTitleLabel: "العنوان", + reportsDescriptionLabel: "الوصف", + reportsDescriptionPlaceholder: "يرجى تقديم وصف مفصّل.", + reportsCategory: "الفئة", + reportsCategoryLabel: "الفئة", + reportsCategoryFeatures: "الميزات", + reportsCategoryBugs: "الأخطاء", + reportsCategoryAbuse: "الإساءة", + reportsCategoryContent: "مشاكل المحتوى", + reportsUpdateButton: "تحديث", + reportsDeleteButton: "حذف", + reportsDateLabel: "التاريخ", + reportsUploadFile: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + reportsCreatedBy: "بواسطة", + reportsMineSectionTitle: "تقاريرك", + reportsFeaturesSectionTitle: "طلبات الميزات", + reportsBugsSectionTitle: "الأخطاء", + reportsAbuseSectionTitle: "تقارير الإساءة", + reportsContentSectionTitle: "مشاكل المحتوى", + reportsAllSectionTitle: "التقارير", + reportsNoItems: "لا توجد تقارير متاحة.", + reportsValidationTitle: "يرجى إدخال عنوان صالح.", + reportsValidationDescription: "لا يمكن أن يكون الوصف فارغًا.", + reportsValidationCategory: "يرجى اختيار فئة.", + reportsCreatedAt: "أُنشئ في", + reportsCreatedBy: "بواسطة", + reportsSeverity: "الخطورة", + reportsSeverityLow: "منخفضة", + reportsSeverityMedium: "متوسطة", + reportsSeverityHigh: "عالية", + reportsSeverityCritical: "حرجة", + reportsStatus: "الحالة", + reportsStatusOpen: "مفتوح", + reportsStatusUnderReview: "قيد المراجعة", + reportsStatusResolved: "محلول", + reportsStatusInvalid: "غير صالح", + reportsUpdateStatusButton: "تحديث الحالة", + reportsAnonymityOption: "إرسال بشكل مجهول", + reportsAnonymousAuthor: "مجهول", + reportsConfirmButton: "تأكيد التقرير!", + reportsConfirmations: "التأكيدات", + reportsConfirmedSectionTitle: "التقارير المؤكدة", + reportsCreateTaskButton: "إنشاء مهمة", + reportsOpenSectionTitle: "التقارير المفتوحة", + reportsUnderReviewSectionTitle: "التقارير قيد المراجعة", + reportsResolvedSectionTitle: "التقارير المحلولة", + reportsInvalidSectionTitle: "التقارير غير الصالحة", + reportsTemplateSectionTitle: 'قالب التقرير', + reportsBugTemplateTitle: 'تفاصيل إعادة الإنتاج (الأخطاء)', + reportsFeatureTemplateTitle: 'التفاصيل (الميزات)', + reportsAbuseTemplateTitle: 'التفاصيل (الإساءة)', + reportsContentTemplateTitle: 'التفاصيل (مشاكل المحتوى)', + reportsStepsToReproduceLabel: 'خطوات إعادة الإنتاج', + reportsStepsToReproducePlaceholder: '1) ...\n2) ...\n3) ...', + reportsExpectedBehaviorLabel: 'النتيجة المتوقعة', + reportsExpectedBehaviorPlaceholder: 'ماذا يجب أن يحدث؟', + reportsActualBehaviorLabel: 'النتيجة الفعلية', + reportsActualBehaviorPlaceholder: 'ماذا يحدث فعلاً؟', + reportsEnvironmentLabel: 'البيئة', + reportsEnvironmentPlaceholder: 'الإصدار، الجهاز، نظام التشغيل، المتصفح، الإعدادات، السجلات، إلخ.', + reportsReproduceRateLabel: 'معدل إعادة الإنتاج', + reportsReproduceRateAlways: 'دائمًا', + reportsReproduceRateOften: 'غالبًا', + reportsReproduceRateSometimes: 'أحيانًا', + reportsReproduceRateRarely: 'نادرًا', + reportsReproduceRateUnable: 'غير قابل لإعادة الإنتاج', + reportsReproduceRateUnknown: 'غير محدد', + reportsProblemStatementLabel: 'المشكلة / الحاجة', + reportsProblemStatementPlaceholder: 'ما المشكلة التي تحلها هذه الميزة؟', + reportsUserStoryLabel: 'قصة الساكن', + reportsUserStoryPlaceholder: 'بصفتي <ساكن>، أريد <إجراء>، لكي <فائدة>.', + reportsAcceptanceCriteriaLabel: 'معايير القبول', + reportsAcceptanceCriteriaPlaceholder: '- بفرض...\n- عندما...\n- عندها...', + reportsWhatHappenedLabel: 'ماذا حدث؟', + reportsWhatHappenedPlaceholder: 'صف الحادثة مع السياق والتواريخ التقريبية.', + reportsReportedUserLabel: 'الساكن / الكيان المُبلَّغ عنه', + reportsReportedUserPlaceholder: '@ساكن، تغذية، معرّف، رابط، إلخ.', + reportsEvidenceLinksLabel: 'الأدلة / الروابط', + reportsEvidenceLinksPlaceholder: 'الصق الروابط، معرّفات الرسائل، لقطات الشاشة (إن وُجدت)، إلخ.', + reportsContentLocationLabel: 'مكان المحتوى', + reportsContentLocationPlaceholder: 'رابط، معرّف، قناة، محادثة، مؤلف، إلخ.', + reportsWhyInappropriateLabel: "لماذا هو غير مناسب", + reportsWhyInappropriatePlaceholder: 'اشرح السبب والتأثير.', + reportsRequestedActionLabel: 'الإجراء المطلوب', + reportsRequestedActionPlaceholder: 'إزالة، إخفاء، وسم، تحذير، إلخ.', + tribesTitle: "القبائل", + tribeAllSectionTitle: "القبائل", + tribeMineSectionTitle: "قبائلك", + tribeCreateSectionTitle: "إنشاء قبيلة", + tribeUpdateSectionTitle: "تحديث القبيلة", + tribeGallerySectionTitle: "معرض القبائل", + tribeLarpSectionTitle: "L.A.R.P", + tribeRecentSectionTitle: "القبائل الأخيرة", + tribeTopSectionTitle: "القبائل الشائعة", + tribeviewTribeButton: "زيارة القبيلة", + tribeviewSubTribeButton: "زيارة القبيلة الفرعية", + tribeRootLabel: "الجذر", + tribeDescription: "استكشف أو أنشئ قبائل في شبكتك.", + tribeFilterAll: "الكل", + tribeFilterMine: "خاصتي", + tribeFilterMembership: "العضوية", + tribeFilterRecent: "الأخيرة", + tribeFilterLarp: "L.A.R.P.", + tribeFilterTop: "الأفضل", + tribeFilterSubtribes: "القبائل الفرعية", + tribeFilterGallery: "المعرض", + tribeMainTribeLabel: "القبيلة الرئيسية", + tribeCreateButton: "إنشاء قبيلة", + tribeUpdateButton: "تحديث", + tribeDeleteButton: "حذف", + tribeImageLabel: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + tribeTitleLabel: "العنوان", + searchTribesPlaceholder: "تصفية القبائل حسب الاسم …", + tribeTitlePlaceholder: "اسم القبيلة", + tribeDescriptionLabel: "الوصف", + tribeDescriptionPlaceholder: "صف هذه القبيلة", + tribeLocationLabel: "الموقع", + tribeLocationPlaceholder: "أين تقع هذه القبيلة؟", + tribeTagsLabel: "الوسوم", + tribeTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + tribeIsLARPLabel: "قبيلة L.A.R.P.؟", + tribeInviteMode: "وضع الدعوة", + tribeLARPLabel: "L.A.R.P.", + tribeModeLabel: "الوضع", + tribeIsAnonymousLabel: "الحالة", + tribeMembersCount: "الأعضاء", + tribeInviteCodePlaceholder: "أدخل رمز الدعوة", + tribeJoinByCodeButton: "الانضمام بالرمز", + tribeJoinButton: "انضمام", + tribeLeaveButton: "مغادرة", + tribeYes: "نعم", + tribeNo: "لا", + tribePublic: "عامة", + tribePrivate: "خاصة", + tribeGenerateInvite: "توليد رمز", + tribeCreatedAt: "أُنشئت في", + tribeAuthor: "بواسطة", + tribeAuthorLabel: "المؤلف", + tribeStrict: "صارم", + tribeOpen: "مفتوح", + tribeFeedFilterRECENT: "الأخيرة", + tribeFeedFilterMINE: "خاصتي", + tribeFeedFilterALL: "الكل", + tribeFeedFilterTOP: "الأفضل", + tribeFeedRefeeds: "إعادات النشر", + tribeFeedRefeed: "إعادة نشر", + tribeFeedMessagePlaceholder: "اكتب تغذية…", + tribeFeedSend: "إرسال", + tribeFeedEmpty: "لا توجد رسائل تغذية متاحة بعد.", + noTribes: "لم يتم العثور على قبائل بعد.", + tribeNotFound: "لم يتم العثور على القبيلة!", + createTribeTitle: "إنشاء قبيلة", + updateTribeTitle: "تحديث القبيلة", + tribeSectionOverview: "نظرة عامة", + tribeSectionInhabitants: "السكان", + tribeSectionVotations: "التصويتات", + tribeSectionEvents: "الأحداث", + tribeSectionReports: "التقارير", + tribeSectionTasks: "المهام", + tribeSectionFeed: "التغذية", + tribeSectionForum: "المنتدى", + tribeSectionMarket: "السوق", + tribeSectionJobs: "الوظائف", + tribeSectionProjects: "المشاريع", + tribeSectionMedia: "الوسائط", + tribeSectionImages: "الصور", + tribeSectionAudios: "الملفات الصوتية", + 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.", + tribeInhabitantsEmpty: "لا يوجد سكان في هذه القبيلة بعد.", + tribeEventCreate: "إنشاء حدث", + tribeEventsEmpty: "لا توجد أحداث بعد.", + tribeEventTitle: "العنوان", + tribeEventDescription: "الوصف", + tribeEventDate: "التاريخ", + tribeEventLocation: "الموقع", + tribeEventAttend: "حضور", + tribeEventUnattend: "مغادرة", + tribeEventAttendees: "الحاضرون", + tribeTaskCreate: "إنشاء مهمة", + tribeTasksEmpty: "لا توجد مهام بعد.", + tribeTaskTitle: "العنوان", + tribeTaskDescription: "الوصف", + tribeTaskPriority: "الأولوية", + tribeTaskDeadline: "الموعد النهائي", + tribeTaskAssignees: "المُكلَّفون", + tribeTaskStatusInProgress: "قيد التنفيذ", + tribeTaskStatusClosed: "إغلاق", + tribeTaskAssign: "إسناد", + tribeTaskUnassign: "إلغاء الإسناد", + tribeReportCreate: "إنشاء تقرير", + tribeReportsEmpty: "لا توجد تقارير بعد.", + tribeReportTitle: "العنوان", + tribeReportDescription: "الوصف", + tribeReportCategory: "الفئة", + tribeVotationCreate: "إنشاء تصويت", + tribeVotationsEmpty: "لا توجد تصويتات بعد.", + tribeVotationTitle: "العنوان", + tribeVotationDescription: "الوصف", + tribeVotationOptions: "الخيارات", + tribeVotationDeadline: "الموعد النهائي", + tribeVotationVote: "تصويت", + tribeVotationResults: "الأصوات", + tribeVotationClose: "إغلاق التصويت", + tribeVotationOptionPlaceholder: "خيار", + tribeForumCreate: "إنشاء منتدى", + tribeForumEmpty: "لا توجد محادثات بعد.", + tribeForumTitle: "العنوان", + tribeForumText: "الرسالة", + tribeForumCategory: "الفئة", + tribeForumReply: "رد", + tribeForumReplies: "الردود", + tribeMarketCreate: "إنشاء عرض", + tribeMarketEmpty: "لا توجد عروض بعد.", + tribeMarketTitle: "العنوان", + tribeMarketDescription: "الوصف", + tribeMarketPrice: "السعر", + tribeMarketImage: "الصورة", + tribeMarketCategory: "الفئة", + tribeJobCreate: "إنشاء وظيفة", + tribeJobsEmpty: "لا توجد وظائف بعد.", + tribeJobTitle: "العنوان", + tribeJobDescription: "الوصف", + tribeJobLocation: "الموقع", + tribeJobSalary: "الراتب", + tribeJobDeadline: "الموعد النهائي", + tribeProjectCreate: "إنشاء مشروع", + tribeProjectsEmpty: "لا توجد مشاريع بعد.", + tribeProjectTitle: "العنوان", + tribeProjectDescription: "الوصف", + tribeProjectGoal: "الهدف", + tribeProjectFunded: "مُموَّل", + tribeProjectDeadline: "الموعد النهائي", + tribeMediaUpload: "رفع وسائط", + readDocument: "قراءة المستند", + tribeCreateImage: "إنشاء صورة", + tribeCreateAudio: "إنشاء ملف صوتي", + tribeCreateVideo: "إنشاء فيديو", + tribeCreateDocument: "إنشاء مستند", + tribeCreateBookmark: "إنشاء علامة مرجعية", + tribeMediaEmpty: "لا توجد وسائط بعد.", + tribeMediaTitle: "العنوان", + tribeMediaDescription: "الوصف", + tribeMediaType: "النوع", + tribeMediaTypeImage: "صورة", + tribeMediaTypeVideo: "فيديو", + tribeMediaTypeAudio: "صوت", + tribeMediaTypeDocument: "مستند", + tribeMediaTypeBookmark: "علامة مرجعية", + tribeContentDelete: "حذف", + tribeInviteCodeText: "رمز الدعوة: ", + tribeGroupTribe: "القبيلة", + tribeGroupOffice: "المكتب", + tribeGroupNetwork: "الشبكة", + tribeGroupEconomy: "الاقتصاد", + tribeGroupMedia: "الوسائط", + tribeStatusOpen: "مفتوح", + tribeStatusClosed: "مغلق", + tribeStatusInProgress: "قيد التنفيذ", + tribePriorityLow: "منخفضة", + tribePriorityMedium: "متوسطة", + tribePriorityHigh: "عالية", + tribePriorityCritical: "حرجة", + tribeTaskFilterAll: "الكل", + tribeMediaFilterAll: "الكل", + tribeReportCatBug: "خطأ", + tribeReportCatAbuse: "إساءة", + tribeReportCatContent: "محتوى", + tribeReportCatOther: "أخرى", + tribeForumCatGeneral: "عام", + tribeForumCatProposal: "اقتراح", + tribeForumCatQuestion: "سؤال", + tribeForumCatAnnouncement: "إعلان", + tribeMarketCatGoods: "سلع", + tribeMarketCatServices: "خدمات", + tribeMarketCatFood: "طعام", + tribeMarketCatOther: "أخرى", + tribeStatusLabel: "الحالة", + tribeSubTribes: "القبائل الفرعية", + tribeSubTribesCreate: "إنشاء قبيلة فرعية", + tribeSubTribesStrictDenied: "الوضع الصارم للقبيلة لا يسمح لك بإنشاء قبائل فرعية جديدة. يرجى الاتصال بالمسؤول.", + tribeSubTribesEmpty: "لم يتم إنشاء قبائل فرعية بعد.", + tribeLarpCreateForbidden: "لا يمكن إنشاء قبائل L.A.R.P.", + tribeLarpUpdateForbidden: "لا يمكن تحديث قبائل L.A.R.P.", + tribeActivityJoined: "انضم", + tribeActivityLeft: "غادر", + tribeActivityFeed: "تغذية", + tribeActivityRefeed: "إعادة نشر", + tribeGroupAnalytics: "التحليلات", + tribeGroupCreative: "إبداعي", + tribeSectionActivity: "النشاط", + tribeSectionTrending: "الرائج", + tribeSectionOpinions: "الآراء", + tribeSectionPixelia: "بكسيليا", + tribeSectionTags: "الوسوم", + tribeSectionSearch: "بحث", + tribeActivityEmpty: "لا يوجد نشاط بعد.", + tribeActivityCreated: "أنشأ", + tribeActivityPosted: "نشر", + tribeActivityReplied: "ردّ", + tribeTrendingEmpty: "لا يوجد محتوى رائج بعد.", + tribeTrendingPeriodDay: "اليوم", + tribeTrendingPeriodWeek: "هذا الأسبوع", + tribeTrendingPeriodAll: "كل الأوقات", + tribeTrendingEngagement: "التفاعل", + tribeOpinionsEmpty: "لا توجد آراء بعد.", + tribeOpinionsCast: "تصويت", + tribeOpinionsRankings: "الترتيب", + tribeOpinionsAlreadyVoted: "تم التصويت بالفعل", + tribeTopCategory: "الأكثر تصويتًا", + tribePixeliaTitle: "بكسيليا", + tribePixeliaDescription: "لوحة فن بكسل تعاونية.", + tribePixeliaPaint: "رسم", + tribePixeliaContributors: "المساهمون", + tribePixeliaTotalPixels: "البكسلات المرسومة", + tribeTagsEmpty: "لم يتم العثور على وسوم.", + tribeTagsCloud: "سحابة الوسوم", + tribeTagsContentWith: "محتوى بالوسم", + tribeSearchPlaceholder: "ابحث في محتوى القبيلة...", + tribeSearchEmpty: "لم يتم العثور على نتائج.", + tribeSearchResults: "النتائج", + tribeSearchMinChars: "أدخل حرفين على الأقل للبحث.", + agendaTitle: "الأجندة", + agendaDescription: "هنا يمكنك العثور على جميع العناصر المسندة إليك.", + agendaFilterAll: "الكل", + agendaFilterOpen: "مفتوح", + agendaFilterClosed: "مغلق", + agendaFilterTasks: "المهام", + agendaFilterMarket: "السوق", + agendaFilterTribes: "القبائل", + agendaFilterEvents: "الأحداث", + agendaFilterReports: "التقارير", + agendaFilterTransfers: "التحويلات", + agendaFilterJobs: "الوظائف", + agendaFilterProjects: "المشاريع", + agendaFilterCalendars: "التقويمات", + agendaNoItems: "لم يتم العثور على إسنادات.", + agendaAuthor: "بواسطة", + agendaDiscardButton: "تجاهل", + agendaRestoreButton: "استعادة", + agendaCreatedAt: "أُنشئ في", + agendaTitleLabel: "العنوان", + agendaMembersCount: "الأعضاء", + agendaDescriptionLabel: "الوصف", + agendaStatus: "الحالة", + agendaVisibility: "الظهور", + agendaEventDate: "تاريخ الحدث", + agendaEventLocation: "الموقع", + agendaEventPrice: "السعر", + agendaEventUrl: "الرابط", + agendaTaskStart: "وقت البدء", + agendaLocationLabel: "الموقع", + agendaLARPLabel: "L.A.R.P.", + agendaYes: "نعم", + agendaNo: "لا", + agendaInviteModeLabel: "الحالة", + agendaAnonymousLabel: "مجهول", + agendaMembersLabel: "الأعضاء", + agendareportCategory: "الفئة", + agendareportSeverity: "الخطورة", + agendareportStatus: "الحالة", + agendareportDescription: "الوصف", + agendaTaskEnd: "وقت الانتهاء", + agendaTaskPriority: "الأولوية", + agendaTransferFrom: "من", + agendaTransferTo: "إلى", + agendaTransferConcept: "المفهوم", + agendaTransferAmount: "المبلغ", + agendaTransferDeadline: "الموعد النهائي", + agendaTransferFrom: "من", + agendaTransferTo: "إلى", + agendaTransferConcept: "المفهوم", + agendaTransferAmount: "المبلغ", + agendaTransferDeadline: "الموعد النهائي", + opinionsTitle: "الآراء", + shareYourOpinions: "اكتشف وصوّت للآراء في شبكتك.", + author: "بواسطة", + voteNow: "صوّت الآن", + alreadyVoted: "لقد أبديت رأيك بالفعل.", + noOpinionsFound: "لم يتم العثور على آراء.", + ALLButton: "الكل", + MINEButton: "خاصتي", + RECENTButton: "الأخيرة", + TOPButton: "الأفضل", + interestingButton: "مثير للاهتمام", + necessaryButton: "ضروري", + funnyButton: "مضحك", + disgustingButton: "مقزز", + sensibleButton: "حساس", + propagandaButton: "دعاية", + adultOnlyButton: "للبالغين فقط", + boringButton: "ممل", + confusingButton: "مربك", + inspiringButton: "ملهم", + spamButton: "رسائل مزعجة", + usefulButton: "مفيد", + informativeButton: "إعلامي", + wellResearchedButton: "بحث جيد", + accurateButton: "دقيق", + needsSourcesButton: "يحتاج مصادر", + wrongButton: "خاطئ", + lowQualityButton: "جودة منخفضة", + creativeButton: "إبداعي", + insightfulButton: "ثاقب", + actionableButton: "قابل للتنفيذ", + inspiringButton: "ملهم", + loveButton: "حب", + clearButton: "واضح", + upliftingButton: "مُحفّز", + unnecessaryButton: "غير ضروري", + rejectedButton: "مرفوض", + misleadingButton: "مضلل", + offTopicButton: "خارج الموضوع", + duplicateButton: "مكرر", + clickbaitButton: "طُعم نقرات", + spamButton: "رسائل مزعجة", + trollButton: "تصيّد", + nsfwButton: "NSFW", + violentButton: "عنيف", + toxicButton: "سام", + harassmentButton: "تحرش", + hateButton: "كراهية", + scamButton: "احتيال", + triggeringButton: "مُحفّز سلبيًا", + opinionsCreatedAt: "أُنشئ في", + opinionsTotalCount: "إجمالي الآراء", + voteInteresting: "مثير للاهتمام", + voteNecessary: "ضروري", + voteUseful: "مفيد", + voteInformative: "إعلامي", + voteWellResearched: "بحث جيد", + voteNeedsSources: "يحتاج مصادر", + voteWrong: "خاطئ", + voteLowQuality: "جودة منخفضة", + voteLove: "حب", + voteClear: "واضح", + voteMisleading: "مضلل", + voteOffTopic: "خارج الموضوع", + voteDuplicate: "مكرر", + voteClickbait: "طُعم نقرات", + votePropaganda: "دعاية", + voteFunny: "مضحك", + voteInspiring: "ملهم", + voteUplifting: "مُحفّز", + voteUnnecessary: "غير ضروري", + voteRejected: "مرفوض", + voteConfusing: "مربك", + voteTroll: "تصيّد", + voteNsfw: "NSFW", + voteViolent: "عنيف", + voteToxic: "سام", + voteHarassment: "تحرش", + voteHate: "كراهية", + voteScam: "احتيال", + voteTriggering: "مُحفّز سلبيًا", + voteInsightful: "ثاقب", + voteAccurate: "دقيق", + voteActionable: "قابل للتنفيذ", + voteCreative: "إبداعي", + voteSpam: "رسائل مزعجة", + voteAdultOnly: "للبالغين فقط", + publishBlog: "نشر مدونة", + privateMessage: "رسالة خاصة", + pmSendTitle: "الرسائل الخاصة", + pmSend: "إرسال!", + pmDescription: "استخدم هذا النموذج لإرسال رسالة مشفرة إلى سكان آخرين.", + pmRecipients: "المستلمون", + pmRecipientsHint: "أدخل معرّفات Oasis مفصولة بفواصل", + pmSubject: "الموضوع", + pmSubjectHint: "أدخل موضوع الرسالة", + pmText: "الرسالة", + pmFile: "المرفق", + private: "خاص", + privateDescription: "رسائلك المشفرة.", + privateInbox: "الوارد", + privateSent: "المُرسَل", + privateDelete: "حذف", + pmCreateButton: "كتابة رسالة خاصة", + noPrivateMessages: "لا توجد رسائل خاصة.", + pmFromLabel: "من:", + pmToLabel: "إلى:", + pmInvalidMessage: "رسالة غير صالحة", + pmNoSubject: "(بدون موضوع)", + pmSubjectLabel: "الموضوع:", + pmBodyLabel: "النص", + pmBotJobs: "42-JobsBOT", + pmBotProjects: "42-ProjectsBOT", + pmBotMarket: "42-MarketBOT", + inboxJobSubscribedTitle: "اشتراك جديد في عرض عملك", + pmInhabitantWithId: "ساكن بمعرّف OASIS:", + pmHasSubscribedToYourJobOffer: "اشترك في عرض عملك", + inboxProjectCreatedTitle: "تم إنشاء مشروع جديد", + pmHasCreatedAProject: "أنشأ مشروعًا", + inboxMarketItemSoldTitle: "تم بيع عنصر", + pmYourItem: "عنصرك", + pmHasBeenSoldTo: "تم بيعه إلى", + pmFor: "مقابل", + inboxProjectPledgedTitle: "تبرع جديد لمشروعك", + pmHasPledged: "تبرع بـ", + pmToYourProject: "لمشروعك", + blockchain: 'مستكشف الكتل', + blockchainTitle: 'مستكشف الكتل', + blockchainDescription: 'استكشف وتصوّر الكتل في البلوكتشين.', + blockchainNoBlocks: 'لم يتم العثور على كتل في البلوكتشين.', + blockchainBlockID: 'معرّف الكتلة', + blockchainBlockAuthor: 'المؤلف', + blockchainBlockType: 'النوع', + blockchainBlockTimestamp: 'الطابع الزمني', + blockchainBlockContent: 'الكتلة', + blockchainBlockURL: 'الرابط:', + blockchainContent: 'الكتلة', + blockchainContentPreview: 'معاينة محتوى الكتلة', + blockchainLatestDatagram: 'آخر بيانات', + blockchainDatagram: 'البيانات', + blockchainDetails: 'عرض تفاصيل الكتلة', + blockchainBlockInfo: 'معلومات الكتلة', + blockchainBlockDetails: 'تفاصيل الكتلة المحددة', + blockchainBack: 'العودة إلى مستكشف الكتل', + blockchainContentDeleted: "تم حذف هذا المحتوى", + visitContent: "زيارة المحتوى", + banking: 'المصرفية', + bankingTitle: 'المصرفية', + bankingDescription: 'استكشف القيمة الحالية لـ ECOin وتخصيص الدخل الأساسي الشامل المقابل، الموزّع لكل حقبة بناءً على المشاركة والثقة.', + bankOverview: 'نظرة عامة', + bankEpochs: 'الحقب', + bankRules: 'القواعد', + pending: 'معلّق', + closed: 'مغلق', + bankBack: 'العودة إلى المصرفية', + bankViewTx: 'عرض المعاملة', + bankClaimNow: 'طالب الآن', + bankClaimUBI: 'طالب بـ UBI!', + bankClaimAndPay: 'Claim & Pay', + bankClaimedPending: 'Claim pending...', + bankStatusUnclaimed: 'Unclaimed', + bankStatusClaimed: 'Claimed', + bankStatusExpired: 'Expired', + bankPubOnly: 'PUB-only operation', + bankNoPendingUBI: 'لا توجد تخصيصات UBI معلقة لهذه الحقبة.', + bankEpoch: 'الحقبة', + bankPool: 'المجمع (هذه الحقبة)', + bankWeightsSum: 'مجموع الأوزان', + bankAllocations: 'التخصيصات', + bankNoAllocations: 'لم يتم العثور على تخصيصات.', + bankNoEpochs: 'لم يتم العثور على حقب.', + bankEpochAllocations: 'تخصيصات الحقبة', + bankAllocId: 'معرّف التخصيص', + bankAllocDate: 'التاريخ', + bankAllocConcept: 'المفهوم', + bankAllocFrom: 'من', + bankAllocTo: 'إلى', + bankAllocAmount: 'المبلغ', + bankAllocStatus: 'الحالة', + bankEpochId: 'معرّف الحقبة', + bankRuleHash: 'بصمة لقطة القواعد', + bankViewEpoch: 'عرض الحقبة', + bankUserBalance: 'رصيدك', + ecoWalletNotConfigured: 'محفظة ECOin غير مُعدّة', + editWallet: 'تعديل المحفظة', + addWallet: 'إضافة محفظة', + bankAddresses: 'العناوين', + bankNoAddresses: 'لم يتم العثور على عناوين.', + bankUser: 'معرّف Oasis', + bankAddress: 'العنوان', + bankAddAddressTitle: 'إضافة عنوان ECOIN', + bankAddAddressUser: 'معرّف Oasis', + bankAddAddressAddress: 'عنوان ECOIN', + bankAddAddressSave: 'حفظ', + bankAddressAdded: 'تمت إضافة العنوان', + bankAddressUpdated: 'تم تحديث العنوان', + bankAddressExists: 'العنوان موجود بالفعل', + bankAddressInvalid: 'عنوان غير صالح', + bankAddressDeleted: 'تم حذف العنوان', + bankAddressNotFound: 'لم يتم العثور على العنوان', + bankAddressTotal: 'إجمالي العناوين', + bankAddressSearch: 'ابحث عن @ساكن أو عنوان', + bankAddressActions: 'الإجراءات', + bankAddressDelete: 'حذف', + bankAddressSource: 'المصدر', + bankAddressDeleteConfirm: 'حذف هذا العنوان؟', + search: 'ابحث!', + bankLocal: 'محلي', + bankFromOasis: 'Oasis', + bankMyAddress: 'عنوانك', + bankRemoveMyAddress: 'إزالة عنواني', + bankNotRemovableOasis: 'لا يمكن إزالة العناوين محليًا', + bankingFutureUBI: "UBI", + pubIdTitle: "PUB Wallet", + pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", + pubIdLabel: "PUB ID", + pubIdSave: "Save configuration", + pubIdPlaceholder: "@PUB_ID.ed25519", + bankUbiAvailableNo: "لا توجد أموال!", + bankUbiAvailableOk: "متوفر!", + bankUbiAvailability: "توفر UBI", + bankAlreadyClaimedThisMonth: "تم المطالبة بالفعل هذا الشهر", + bankUbiThisMonth: "الدخل الأساسي (هذا الشهر)", + bankUbiLastClaimed: "الدخل الأساسي (آخر مطالبة)", + bankUbiNeverClaimed: "لم يتم المطالبة قط", + bankUbiTotalClaimed: "الدخل الأساسي (إجمالي المطالبات)", + bankUbiPub: "PUB", + bankUbiInhabitant: "ساكن", + bankUbiClaimedAmount: "المطالب به (ECO)", + typeBankUbiResult: "البنك - الدخل الأساسي", + bankNoPubConfigured: "لم يتم تكوين PUB. قم بتعيين معرف PUB في الإعدادات.", + shopsTitle: "متاجر", + shopDescription: "اكتشف وأدر المتاجر في الشبكة.", + shopTitle: "متجر", + shopFilterAll: "الكل", + shopFilterMine: "متاجري", + shopFilterRecent: "الأحدث", + shopFilterTop: "الأفضل", + shopFilterProducts: "المنتجات", + shopFilterPrices: "الأسعار", + shopFilterFavorites: "المفضلة", + shopUpload: "إنشاء متجر", + shopAllSectionTitle: "جميع المتاجر", + shopMineSectionTitle: "متاجري", + shopRecentSectionTitle: "متاجر حديثة", + shopTopSectionTitle: "أفضل المتاجر", + shopProductsSectionTitle: "أفضل المنتجات", + shopPricesSectionTitle: "المنتجات حسب السعر", + shopFavoritesSectionTitle: "المفضلة", + shopCreateSectionTitle: "إنشاء متجر", + shopUpdateSectionTitle: "تحديث متجر", + shopCreate: "إنشاء", + shopUpdate: "تحديث", + shopDelete: "حذف", + shopAddFavorite: "إضافة مفضلة", + shopRemoveFavorite: "إزالة مفضلة", + shopOpen: "مفتوح", + shopClosed: "مغلق", + shopOpenShop: "فتح المتجر", + shopCloseShop: "إغلاق المتجر", + shopProducts: "المنتجات", + shopProductAdd: "إضافة منتج", + shopProductTitle: "منتج", + shopProductUpdate: "تحديث منتج", + shopProductPrice: "السعر (ECO)", + shopProductStock: "المخزون", + shopProductUntitled: "منتج بلا عنوان", + shopUntitled: "متجر بلا عنوان", + shopNoItems: "لم يتم العثور على متاجر.", + shopNoProducts: "لا توجد منتجات بعد.", + shopOutOfStock: "نفد المخزون", + shopBuy: "شراء", + shopBackToShop: "العودة إلى المتجر", + shopShareUrl: "رابط المشاركة", + shopVisitShop: "زيارة المتجر", + shopStatus: "الحالة", + shopCreatedAt: "تاريخ الإنشاء", + shopSearchPlaceholder: "البحث عن متاجر...", + shopUrl: "الرابط", + shopLocation: "الموقع", + shopTags: "الوسوم", + shopVisibility: "الرؤية", + shopImage: "صورة", + shopShortDescription: "وصف قصير", + shopShortDescriptionPlaceholder: "وصف مختصر لبطاقات المتجر (160 حرف كحد أقصى)", + shopTitlePlaceholder: "اسم متجرك", + shopDescriptionPlaceholder: "وصف تفصيلي لمتجرك", + shopUrlPlaceholder: "https://رابط-متجرك.com", + shopLocationPlaceholder: "المدينة، البلد", + shopTagsPlaceholder: "وسم1، وسم2، وسم3", + mapTitlePlaceholder: "عنوان الخريطة", + shopProductFeatured: "منتج مميز", + shopSendToMarket: "Send to Market", + typeShop: "متجر", + typeShopProduct: "منتج متجر", + bankExchange: 'الصرف', + bankExchangeCurrentValue: 'قيمة ECOin (1 ساعة)', + bankTotalSupply: 'إجمالي معروض ECOin', + bankEcoinHours: "معادلة ECOin بالوقت", + bankHoursOfWork: 'ساعات', + bankUnitMs: "مللي ثانية", + bankUnitSeconds: "ثواني", + bankUnitMinutes: "دقائق", + bankUnitDays: "أيام", + bankExchangeNoData: 'لا توجد بيانات متاحة', + bankExchangeIndex: 'قيمة ECOin (1 ساعة)', + bankInflation: 'تضخم ECOin (anual)', + bankInflationMonthly: 'تضخم ECOin (mensual)', + bankCurrentSupply: 'المعروض الحالي من ECOin', + bankingSyncStatus: 'حالة ECOin', + bankingSyncStatusSynced: 'متزامن', + bankingSyncStatusOutdated: 'قديم', + statsTitle: 'الإحصائيات', + statistics: "الإحصائيات", + statsInhabitant: "إحصائيات الساكن", + statsDescription: "اكتشف إحصائيات عن شبكتك.", + ALLButton: "الكل", + MINEButton: "خاصتي", + TOMBSTONEButton: "شواهد القبور", + statsYou: "أنت", + statsUserId: "معرّف Oasis", + statsCreatedAt: "أُنشئ في", + statsYourContent: "المحتوى", + statsYourOpinions: "الآراء", + statsYourTombstone: "شواهد القبور", + statsNetwork: "الشبكة", + statsTotalInhabitants: "السكان", + statsDiscoveredTribes: "القبائل (العامة)", + statsPrivateDiscoveredTribes: "القبائل (الخاصة)", + statsNetworkContent: "المحتوى", + statsYourMarket: "السوق", + statsYourJob: "الوظائف", + statsYourProject: "المشاريع", + statsYourTransfer: "التحويلات", + statsYourForum: "المنتديات", + statsNetworkOpinions: "الآراء", + statsDiscoveredMarket: "السوق", + statsDiscoveredJob: "الوظائف", + statsDiscoveredProject: "المشاريع", + statsBankingTitle: "المصرفية", + statsEcoWalletLabel: "محفظة ECOIN", + statsEcoWalletNotConfigured: "غير مُعدّة!", + statsTotalEcoAddresses: "إجمالي العناوين", + statsDiscoveredTransfer: "التحويلات", + statsDiscoveredForum: "المنتديات", + statsNetworkTombstone: "شواهد القبور", + statsBookmark: "العلامات المرجعية", + statsEvent: "الأحداث", + statsTask: "المهام", + statsVotes: "الأصوات", + statsMarket: "السوق", + statsForum: "المنتديات", + statsJob: "الوظائف", + statsProject: "المشاريع", + statsReport: "التقارير", + statsFeed: "التغذيات", + statsTribe: "القبائل", + statsImage: "الصور", + statsAudio: "الملفات الصوتية", + statsVideo: "الفيديوهات", + statsDocument: "المستندات", + statsMap: "الخرائط", + statsShop: "المتاجر", + statsShopProduct: "منتجات المتجر", + statsTransfer: "التحويلات", + statsAiExchange: "الذكاء الاصطناعي", + statsPUBs: 'PUBs', + statsPost: "المنشورات", + statsOasisID: "معرّف Oasis", + statsSize: "الإجمالي (الحجم)", + statsBlockchainSize: "البلوكتشين (الحجم)", + statsBlobsSize: "الملفات (الحجم)", + statsActivity7d: "النشاط (آخر 7 أيام)", + statsActivity7dTotal: "إجمالي 7 أيام", + statsActivity30dTotal: "إجمالي 30 يومًا", + statsKarmaScore: "نقاط الكارما", + statsPublic: "عام", + statsPrivate: "خاص", + day: "يوم", + messages: "الرسائل", + statsProject: "المشاريع", + statsProjectsTitle: "المشاريع", + statsProjectsTotal: "إجمالي المشاريع", + statsProjectsActive: "نشط", + statsProjectsCompleted: "مكتمل", + statsProjectsPaused: "متوقف", + statsProjectsCancelled: "ملغى", + statsProjectsGoalTotal: "الهدف الإجمالي", + statsProjectsPledgedTotal: "إجمالي التبرعات", + statsProjectsSuccessRate: "نسبة النجاح", + statsProjectsAvgProgress: "متوسط التقدم", + statsProjectsMedianProgress: "متوسط التقدم (الوسيط)", + statsProjectsActiveFundingAvg: "متوسط التمويل النشط", + statsJobsTitle: "الوظائف", + statsJobsTotal: "إجمالي الوظائف", + statsJobsOpen: "مفتوح", + statsJobsClosed: "مغلق", + statsJobsOpenVacants: "الشواغر المفتوحة", + statsJobsSubscribersTotal: "إجمالي المشتركين", + statsJobsAvgSalary: "متوسط الراتب", + statsJobsMedianSalary: "متوسط الراتب (الوسيط)", + statsMarketTitle: "السوق", + statsMarketTotal: "إجمالي العناصر", + statsMarketForSale: "للبيع", + statsMarketReserved: "محجوز", + statsMarketClosed: "مغلق", + statsMarketSold: "مُباع", + statsMarketRevenue: "الإيرادات", + statsMarketAvgSoldPrice: "متوسط سعر البيع", + statsUsersTitle: "السكان", + user: "ساكن", + statsTombstoneTitle: "شواهد القبور", + statsNetworkTombstones: "شواهد قبور الشبكة", + statsTombstoneRatio: "نسبة شواهد القبور (%)", + statsAITraining: "تدريب الذكاء الاصطناعي", + statsAIExchanges: "التبادلات", + statsParliamentCandidature: "ترشيحات البرلمان", + statsParliamentTerm: "فترات البرلمان", + statsParliamentProposal: "مقترحات البرلمان", + statsParliamentRevocation: "إلغاءات البرلمان", + statsParliamentLaw: "قوانين البرلمان", + statsCourtsCase: "قضايا المحاكم", + statsCourtsEvidence: "أدلة المحاكم", + statsCourtsAnswer: "ردود المحاكم", + statsCourtsVerdict: "أحكام المحاكم", + statsCourtsSettlement: "تسويات المحاكم", + statsCourtsSettlementProposal: "مقترحات التسوية", + statsCourtsSettlementAccepted: "التسويات المقبولة", + statsCourtsNomination: "ترشيحات القضاة", + statsCourtsNominationVote: "أصوات الترشيح", + ai: "الذكاء الاصطناعي", + aiTitle: "الذكاء الاصطناعي", + aiDescription: "ذكاء اصطناعي جماعي (CAI) يُدعى '42' يتعلم من شبكتك.", + aiInputPlaceholder: "ما الجديد؟", + aiUserQuestion: "السؤال", + aiResponseTitle: "الرد", + aiSubmitButton: "إرسال!", + aiSettingsDescription: "عيّن التوجيه (128 حرفًا كحد أقصى) لنموذج الذكاء الاصطناعي.", + aiPrompt: "قدّم ردًا إعلاميًا ودقيقًا.", + aiConfiguration: "تعيين التوجيه", + aiPromptUsed: "التوجيه", + aiClearHistory: "مسح سجل المحادثة", + aiSharePrompt: "إضافة هذه الإجابة للتدريب الجماعي؟", + aiShareYes: "نعم", + aiShareNo: "لا", + aiSharedLabel: "تمت الإضافة للتدريب", + aiRejectedLabel: "لم تتم الإضافة للتدريب", + aiServerError: "لم يتمكن الذكاء الاصطناعي من الرد. يرجى المحاولة مرة أخرى.", + aiInputPlaceholder: "ما هو Oasis؟", + typeAiExchange: "الذكاء الاصطناعي", + aiApproveTrain: "إضافة للتدريب الجماعي", + aiRejectTrain: "عدم التدريب", + aiTrainPending: "بانتظار الموافقة", + aiTrainApproved: "تمت الموافقة للتدريب", + aiTrainRejected: "تم الرفض للتدريب", + aiSnippetsUsed: "المقتطفات المُستخدَمة", + aiSnippetsLearned: "المقتطفات المُتعلَّمة", + statsAITraining: "تدريب الذكاء الاصطناعي", + aiApproveCustomTrain: "التدريب باستخدام هذه الإجابة المخصصة", + aiCustomAnswerPlaceholder: "اكتب إجابتك المخصصة…", + statsAIExchanges: "تبادلات النموذج", + marketMineSectionTitle: "عناصرك", + marketCreateSectionTitle: "إنشاء عنصر", + marketUpdateSectionTitle: "تحديث", + marketAllSectionTitle: "السوق", + marketRecentSectionTitle: "السوق الأخير", + marketTitle: "السوق", + marketDescription: "سوق لتبادل السلع أو الخدمات في شبكتك.", + marketFilterAll: "الكل", + marketFilterMine: "خاصتي", + marketFilterAuctions: "المزادات", + marketFilterItems: "التبادل", + marketFilterNew: "جديد", + marketFilterUsed: "مستعمل", + marketFilterBroken: "معطّل", + marketFilterForSale: "للبيع", + marketFilterSold: "مُباع", + marketFilterDiscarded: "ملغى", + marketFilterRecent: "الأخيرة", + marketFilterMyBids: "العروض", + marketCreateButton: "إنشاء عنصر", + marketItemType: "النوع", + marketItemTitle: "العنوان", + marketItemAvailable: "الموعد النهائي", + marketItemDescription: "الوصف", + marketItemDescriptionPlaceholder: "صف العنصر الذي تبيعه", + marketItemStatus: "الحالة", + marketShopLabel: "متجر", + marketItemCondition: "الحالة", + marketItemPrice: "السعر", + marketItemTags: "الوسوم", + marketItemTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + marketItemDeadline: "الموعد النهائي", + marketItemIncludesShipping: "يشمل الشحن؟", + marketItemHighestBid: "أعلى عرض", + marketItemHighestBidder: "صاحب أعلى عرض", + marketItemStock: "المخزون", + marketOutOfStock: "نفد المخزون", + marketItemBidTime: "وقت العرض", + marketActionsUpdate: "تحديث", + marketUpdateButton: "تحديث العنصر!", + marketActionsDelete: "حذف", + marketActionsSold: "تعيين كمُباع", + marketActionsChangeStatus: "تغيير الحالة", + marketActionsBuy: "شراء!", + marketAuctionBids: "العروض الحالية", + marketPlaceBidButton: "تقديم عرض", + marketItemSeller: "البائع", + marketNoItems: "لا توجد عناصر متاحة بعد.", + marketYourBid: "عرضك", + marketCreateFormImageLabel: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + marketSearchLabel: "بحث", + marketSearchPlaceholder: "ابحث عن عنوان أو وسوم", + marketMinPriceLabel: "الحد الأدنى للسعر", + marketMaxPriceLabel: "الحد الأقصى للسعر", + marketSortLabel: "ترتيب حسب", + marketSortRecent: "الأحدث", + marketSortPrice: "السعر", + marketSortDeadline: "الموعد النهائي", + marketSearchButton: "بحث", + marketAuctionEndsIn: "ينتهي", + marketAuctionEnded: "انتهى", + marketMyBidBadge: "عرضتَ", + marketNoItemsMatch: "لا توجد عناصر تطابق بحثك.", + jobsTitle: "الوظائف", + jobsDescription: "اكتشف وأدِر الوظائف في شبكتك.", + jobsFilterRecent: "الأخيرة", + jobsFilterMine: "خاصتي", + jobsFilterAll: "الكل", + jobsFilterRemote: "عن بُعد", + jobsFilterOpen: "مفتوح", + jobsFilterClosed: "مغلق", + jobsCV: "السير الذاتية", + jobsCreateJob: "إنشاء وظيفة", + jobsRecentTitle: "الوظائف الأخيرة", + jobsMineTitle: "وظائفك", + jobsAllTitle: "الوظائف", + jobsRemoteTitle: "الوظائف عن بُعد", + jobsOpenTitle: "الوظائف المفتوحة", + jobsClosedTitle: "الوظائف المغلقة", + jobsCVTitle: "السير الذاتية", + jobsFilterPresencial: "حضوري", + jobsFilterFreelancer: "مستقل", + jobsFilterEmployee: "موظف", + jobsPresencialTitle: "الوظائف الحضورية", + jobsFreelancerTitle: "الوظائف المستقلة", + jobsEmployeeTitle: "وظائف الموظفين", + jobTitle: "العنوان", + jobLocation: "الموقع", + jobSalary: "الراتب (ECO/1 ساعة)", + jobVacants: "الشواغر", + jobDescription: "الوصف", + jobRequirements: "المتطلبات", + jobLanguages: "اللغات", + jobStatus: "الحالة", + jobStatusOPEN: "مفتوح", + jobStatusCLOSED: "مغلق", + jobSetOpen: "تعيين كمفتوح", + jobSetClosed: "تعيين كمغلق", + jobSubscribeButton: "انضم لهذا العرض!", + jobUnsubscribeButton: "غادر هذا العرض!", + jobTitlePlaceholder: "أدخل عنوان الوظيفة", + jobDescriptionPlaceholder: "صف الوظيفة", + jobRequirementsPlaceholder: "أدخل المتطلبات", + jobLanguagesPlaceholder: "العربية، الإنجليزية، الفرنسية...", + jobTasksPlaceholder: "قائمة المهام", + jobLocationPresencial: "حضوري", + jobLocationRemote: "عن بُعد", + jobVacantsPlaceholder: "عدد المناصب", + jobSalaryPlaceholder: "الراتب بـ ECO لساعة عمل واحدة", + jobImage: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + jobTasks: "المهام", + jobType: "نوع الوظيفة", + jobTime: "وقت الوظيفة", + jobSubscribers: "المشتركون", + noSubscribers: "لا يوجد مشتركون", + jobsFilterTop: "الأفضل", + jobsTopTitle: "الوظائف الأعلى راتبًا", + createJobButton: "نشر الوظيفة", + viewDetailsButton: "عرض التفاصيل", + noJobsFound: "لم يتم العثور على عروض وظيفية.", + jobAuthor: "بواسطة", + jobTypeFreelance: "مستقل", + jobTypeSalary: "موظف", + jobTimePartial: "دوام جزئي", + jobTimeComplete: "دوام كامل", + jobsDeleteButton: "حذف", + jobsUpdateButton: "تحديث", + jobsFilterApplied: "مُتقدَّم", + jobsAppliedTitle: "طلباتي", + jobsAppliedBadge: "مُتقدَّم", + jobsFilterFavs: "المفضلة", + jobsFavsTitle: "المفضلة", + jobsFilterNeeds: "يحتاج مساعدة", + jobsNeedsTitle: "يحتاج مساعدة", + jobsSearchLabel: "بحث", + jobsSearchPlaceholder: "ابحث عن عنوان، وسوم، وصف...", + jobsMinSalaryLabel: "الحد الأدنى للراتب", + jobsMaxSalaryLabel: "الحد الأقصى للراتب", + jobsSortLabel: "ترتيب حسب", + jobsSortRecent: "الأحدث", + jobsSortSalary: "الأعلى راتبًا", + jobsSortSubscribers: "الأكثر متقدمين", + jobsSearchButton: "بحث", + jobsFavoriteButton: "إضافة للمفضلة", + jobsUnfavoriteButton: "إزالة من المفضلة", + jobsMessageAuthorButton: "رسالة خاصة", + jobsApplicants: "المتقدمون", + jobsUpdatedAt: "تم التحديث", + jobSetOpen: "تعيين كمفتوح", + jobNewBadge: "جديد", + jobsTagsLabel: "الوسوم", + jobsTagsPlaceholder: "وسم1، وسم2، وسم3", + noJobsMatch: "لا توجد وظائف تطابق بحثك.", + projectsTitle: "المشاريع", + projectsDescription: "أنشئ ومُوّل وتابع مشاريع يقودها المجتمع في شبكتك.", + projectCreateProject: "إنشاء مشروع", + projectCreateButton: "إنشاء مشروع", + projectUpdateButton: "تحديث", + projectDeleteButton: "حذف", + projectNoProjectsFound: "لم يتم العثور على مشاريع.", + projectFilterAll: "الكل", + projectFilterMine: "خاصتي", + projectFilterActive: "نشط", + projectFilterPaused: "متوقف", + projectFilterCompleted: "مكتمل", + projectFilterFollowing: "يتابع", + projectFilterRecent: "الأخيرة", + projectFilterTop: "الأفضل", + projectAllTitle: "المشاريع", + projectMineTitle: "مشاريعك", + projectActiveTitle: "المشاريع النشطة", + projectPausedTitle: "المشاريع المتوقفة", + projectCompletedTitle: "المشاريع المكتملة", + projectFollowingTitle: "المشاريع المُتابَعة", + projectRecentTitle: "المشاريع الأخيرة", + projectTopTitle: "الأكثر تمويلاً", + projectTitlePlaceholder: "اسم المشروع", + projectImage: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + projectDescription: "الوصف", + projectDescriptionPlaceholder: "اسرد القصة والأهداف…", + projectGoal: "الهدف (ECO)", + projectGoalPlaceholder: "50000", + projectDeadline: "الموعد النهائي", + projectProgress: "نسبة التقدم الأولية (%)", + projectStatus: "الحالة", + projectFunding: "التمويل", + projectPledged: "المتبرَّع به", + projectSetStatus: "تعيين الحالة", + projectSetProgress: "تحديث التقدم", + projectFollowButton: "متابعة", + projectUnfollowButton: "إلغاء المتابعة", + projectStatusACTIVE: "نشط", + projectStatusPAUSED: "متوقف", + projectStatusCOMPLETED: "مكتمل", + projectStatusCANCELLED: "ملغى", + projectPledgeTitle: "ادعم هذا المشروع", + projectPledgePlaceholder: "المبلغ بـ ECO", + projectBounties: "المكافآت", + projectBountiesInputLabel: "المكافآت (واحدة في كل سطر: العنوان|المبلغ [ECO]|الوصف)", + projectBountiesPlaceholder: "إصلاح خطأ واجهة|100|رابط المشكلة\nكتابة التوثيق|250|أمثلة الاستخدام", + projectNoBounties: "لم يتم العثور على مكافآت.", + projectTitle: "العنوان", + projectAddBountyTitle: "مكافأة جديدة", + projectBountyTitle: "عنوان المكافأة", + projectBountyAmount: "المبلغ (ECO)", + projectBountyDescription: "الوصف", + projectMilestoneSelect: "اختيار مرحلة", + projectBountyCreateButton: "إنشاء مكافأة", + projectBountyStatus: "حالة المكافأة", + projectBountyOpen: "مفتوحة", + projectBountyClaimed: "مُطالَب بها", + projectBountyDone: "مكتملة", + projectBountyClaimedBy: "طالب بها", + projectBountyClaimButton: "المطالبة", + projectBountyCompleteButton: "تعيين كمكتملة", + projectMilestones: "المراحل", + projectAddMilestoneTitle: "مرحلة جديدة", + projectMilestoneTitle: "عنوان المرحلة", + projectMilestoneTargetPercent: "النسبة المئوية (%)", + projectMilestoneDueDate: "التاريخ", + projectMilestoneCreateButton: "إنشاء مرحلة", + projectMilestoneStatus: "حالة المرحلة", + projectMilestoneOpen: "مفتوحة", + projectMilestoneDone: "مكتملة", + projectMilestoneMarkDone: "تعيين كمكتملة", + projectMilestoneDue: "مستحقة", + projectNoMilestones: "لم يتم العثور على مراحل.", + projectMilestoneMarkDone: "تعيين كمنجزة", + projectMilestoneTitlePlaceholder: "أدخل عنوان المرحلة", + projectMilestoneDescriptionPlaceholder: "أدخل وصف هذه المرحلة", + projectMilestoneDescription: "وصف المرحلة", + projectBudgetGoal: "الميزانية (الهدف)", + projectBudgetAssigned: "المخصص للمكافآت", + projectBudgetRemaining: "المتبقي", + projectBudgetOver: "تجاوز الميزانية: المخصص يتجاوز الهدف", + projectFollowers: "المتابعون", + projectFollowersTitle: "المتابعون", + projectFollowersNone: "لا يوجد متابعون بعد.", + projectMore: "المزيد", + projectYouFollowHint: "أنت تتابع هذا المشروع", + projectBackers: "الداعمون", + projectBackersTitle: "الداعمون", + projectBackersTotal: "إجمالي الداعمين", + projectBackersTotalPledged: "إجمالي التبرعات", + projectBackersYourPledge: "تبرعك", + projectBackersNone: "لا توجد تبرعات بعد.", + projectNoRemainingBudget: "لا توجد ميزانية متبقية.", + projectFilterBackers: "الداعمون", + projectFilterApplied: "مُتقدَّم", + projectAppliedTitle: "مُتقدَّم", + projectBackersLeaderboardTitle: "أفضل الداعمين", + projectNoBackersFound: "لم يتم العثور على داعمين.", + projectBackerAmount: "إجمالي المساهمة", + projectBackerPledges: "التبرعات", + projectBackerProjects: "المشاريع", + projectPledgeAmount: "المبلغ", + projectSelectMilestoneOrBounty: "اختر مرحلة أو مكافأة", + projectPledgeButton: "تبرّع", + footerLicense: "GPLv3", + footerPackage: "الحزمة", + footerVersion: "الإصدار", + modulesModuleName: "الاسم", + modulesModuleDescription: "الوصف", + modulesModuleStatus: "الحالة", + modulesTotalModulesLabel: "الوحدات المُحمَّلة", + modulesEnabledModulesLabel: "مُفعَّلة", + modulesDisabledModulesLabel: "مُعطَّلة", + modulesPopularLabel: "أبرز المنشورات", + modulesPopularDescription: "وحدة لاستقبال المنشورات الرائجة أو الأكثر مشاهدة أو الأكثر تعليقًا.", + modulesTopicsLabel: "المواضيع", + modulesTopicsDescription: "وحدة لاستقبال فئات النقاش القائمة على الاهتمامات المشتركة.", + modulesSummariesLabel: "الملخصات", + modulesSummariesDescription: "وحدة لاستقبال ملخصات النقاشات أو المنشورات الطويلة.", + modulesLatestLabel: "الأحدث", + modulesLatestDescription: "وحدة لاستقبال أحدث المنشورات والنقاشات.", + modulesThreadsLabel: "المحادثات", + modulesThreadsDescription: "وحدة لاستقبال المحادثات المجمعة حسب الموضوع أو السؤال.", + modulesMultiverseLabel: "الكون المتعدد", + modulesMultiverseDescription: "وحدة لاستقبال المحتوى من الأقران المتحدين الآخرين.", + modulesInvitesLabel: "الدعوات", + modulesInvitesDescription: "وحدة لإدارة وتطبيق رموز الدعوة.", + modulesWalletLabel: "المحفظة", + modulesWalletDescription: "وحدة لإدارة أصولك الرقمية (ECOin).", + modulesLegacyLabel: "القديم", + modulesLegacyDescription: "وحدة لإدارة مفتاحك السري (المفتاح الخاص) بسرعة وأمان.", + modulesCipherLabel: "التشفير", + modulesCipherDescription: "وحدة لتشفير وفك تشفير نصك بشكل متماثل (باستخدام كلمة مرور مشتركة).", + modulesBookmarksLabel: "العلامات المرجعية", + modulesBookmarksDescription: "وحدة لاكتشاف وإدارة العلامات المرجعية.", + modulesVideosLabel: "الفيديوهات", + modulesVideosDescription: "وحدة لاكتشاف وإدارة الفيديوهات.", + modulesDocsLabel: "المستندات", + modulesDocsDescription: "وحدة لاكتشاف وإدارة المستندات.", + modulesAudiosLabel: "الملفات الصوتية", + modulesAudiosDescription: "وحدة لاكتشاف وإدارة الملفات الصوتية.", + modulesTagsLabel: "الوسوم", + modulesTagsDescription: "وحدة لاكتشاف واستكشاف أنماط التصنيف (الوسوم).", + modulesImagesLabel: "الصور", + modulesImagesDescription: "وحدة لاكتشاف وإدارة الصور.", + modulesTrendingLabel: "الرائج", + modulesTrendingDescription: "وحدة لاستكشاف المحتوى الأكثر شعبية.", + modulesEventsLabel: "الأحداث", + modulesEventsDescription: "وحدة لاكتشاف وإدارة الأحداث.", + modulesTasksLabel: "المهام", + modulesTasksDescription: "وحدة لاكتشاف وإدارة المهام.", + modulesMarketLabel: "السوق", + modulesMarketDescription: "وحدة لتبادل السلع أو الخدمات.", + modulesShopsLabel: "متاجر", + modulesShopsDescription: "وحدة لإدارة واكتشاف المتاجر.", + modulesTribesLabel: "القبائل", + modulesTribesDescription: "وحدة لاستكشاف أو إنشاء قبائل (مجموعات).", + modulesVotationsLabel: "التصويتات", + modulesVotationsDescription: "وحدة لاكتشاف وإدارة التصويتات.", + modulesReportsLabel: "التقارير", + modulesReportsDescription: "وحدة لإدارة وتتبع التقارير المتعلقة بالمشاكل والأخطاء والإساءات وتحذيرات المحتوى.", + modulesOpinionsLabel: "الآراء", + modulesOpinionsDescription: "وحدة لاكتشاف والتصويت على الآراء.", + modulesTransfersLabel: "التحويلات", + modulesTransfersDescription: "وحدة لاكتشاف وإدارة العقود الذكية (التحويلات).", + modulesFeedLabel: "التغذية", + modulesFeedDescription: "وحدة لاكتشاف ومشاركة النصوص القصيرة (التغذيات).", + modulesParliamentLabel: "البرلمان", + modulesParliamentDescription: "وحدة لانتخاب الحكومات والتصويت على القوانين.", + modulesCourtsLabel: "المحاكم", + modulesCourtsDescription: "وحدة لحل النزاعات وإصدار الأحكام.", + modulesPixeliaLabel: "بكسيليا", + modulesPixeliaDescription: "وحدة للرسم على شبكة تعاونية.", + modulesAgendaLabel: "الأجندة", + modulesAgendaDescription: "وحدة لإدارة جميع العناصر المسندة إليك.", + modulesAILabel: "الذكاء الاصطناعي", + modulesAIDescription: "وحدة للتحدث مع نموذج لغوي يُدعى '42'.", + modulesForumLabel: "المنتديات", + modulesForumDescription: "وحدة لاكتشاف وإدارة المنتديات.", + modulesJobsLabel: "الوظائف", + modulesJobsDescription: "وحدة لاكتشاف وإدارة الوظائف.", + modulesProjectsLabel: "المشاريع", + modulesProjectsDescription: "وحدة لاستكشاف وتمويل جماعي وإدارة المشاريع.", + modulesBankingLabel: "المصرفية", + modulesBankingDescription: "وحدة لتحديد القيمة الحقيقية لـ ECOIN وتوزيع الدخل الأساسي الشامل باستخدام الخزينة المشتركة.", + modulesFavoritesLabel: "المفضلة", + modulesFavoritesDescription: "وحدة لإدارة المحتوى المفضل لديك.", + fileTooLargeTitle: "الملف كبير جدًا", + fileTooLargeMessage: "يتجاوز الملف الحجم الأقصى المسموح به (50 ميغابايت). يرجى اختيار ملف أصغر.", + goBack: "رجوع", + directConnect: "اتصال مباشر", + directConnectDescription: "اتصل مباشرة بقرين عن طريق إدخال عنوان IP والمنفذ والمفتاح العام. سيتم إضافة القرين كاتصال مُتابَع.", + peerHost: "IP / اسم المضيف", + peerPort: "المنفذ (افتراضي: 8008)", + peerPublicKey: "المفتاح العام (@...ed25519)", + connectAndFollow: "اتصال", + deviceSourceLabel: "مصدر الجهاز", + modulesPresetTitle: "الإعدادات الشائعة", + modulesPreset_minimal: "الحد الأدنى", + modulesPreset_basic: "أساسي", + modulesPreset_social: "اجتماعي", + modulesPreset_economy: "اقتصادي", + modulesPreset_full: "كامل", + statsCarbonFootprintTitle: "البصمة الكربونية", + statsCarbonFootprintNetwork: "البصمة الكربونية للشبكة", + statsCarbonFootprintYours: "بصمتك الكربونية", + statsCarbonTombstone: "بصمة الحذف", + feedSuccessMsg: "تم نشر التغذية بنجاح!", + dominantOpinionLabel: "الرأي السائد", + uploadMedia: "رفع وسائط (الحد الأقصى: 50 ميغابايت)", + feedOpenDiscussion: "فتح النقاش", + feedDetailTitle: "التغذية", + feedPostComment: "نشر تعليق", + courtsRespondentInvalid: "يجب أن يكون معرّف SSB صالحًا (@...ed25519)", + noComments: "لا توجد تعليقات بعد", + mapsLabel: "خرائط", + mapTitle: "خرائط", + mapDescription: "استكشف وأدر الخرائط غير المتصلة في شبكتك.", + mapMineSectionTitle: "خرائطك", + mapCreateSectionTitle: "إنشاء خريطة", + mapUpdateSectionTitle: "تحديث الخريطة", + mapAllSectionTitle: "خرائط", + mapRecentSectionTitle: "خرائط حديثة", + mapFavoritesSectionTitle: "المفضلة", + mapFilterAll: "الكل", + mapFilterMine: "خرائطي", + mapFilterRecent: "حديثة", + mapFilterFavorites: "المفضلة", + mapUploadButton: "إنشاء خريطة", + mapCreateButton: "إنشاء خريطة", + mapUpdateButton: "تحديث", + mapDeleteButton: "حذف", + mapAddFavoriteButton: "إضافة للمفضلة", + mapRemoveFavoriteButton: "إزالة من المفضلة", + mapLatLabel: "خط العرض", + mapLatPlaceholder: "مثال 24.7136", + mapLngLabel: "خط الطول", + mapLngPlaceholder: "مثال 46.6753", + mapDescriptionLabel: "الوصف", + mapDescriptionPlaceholder: "صف الخريطة أو الموقع...", + mapTypeLabel: "نوع الخريطة", + mapTypeSingle: "فردي (الموقع الأولي فقط)", + mapTypeOpen: "مفتوح (يمكن لأي شخص إضافة علامات)", + mapTypeClosed: "مغلق (المنشئ فقط يضيف علامات)", + mapTagsLabel: "الوسوم", + mapTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + mapUrlLabel: "رابط الخريطة", + mapPickCoordLabel: "أو اختر موقعاً على الشبكة:", + mapMarkersLabel: "علامات", + mapMarkersTitle: "العلامات", + mapMarkerDefault: "علامة", + mapMarkerLatLabel: "خط عرض العلامة", + mapMarkerLngLabel: "خط طول العلامة", + mapMarkerLabelField: "تسمية العلامة", + mapMarkerLabelPlaceholder: "صف هذه العلامة...", + markerImageLabel: "صورة العلامة", + mapAddMarkerTitle: "إضافة علامة", + mapAddMarkerButton: "إضافة علامة", + mapCleanMarkerButton: "Clean Marker", + mapApplyZoom: "تطبيق التكبير", + mapSearchPlaceholder: "البحث في الوصف، الوسوم، المؤلف...", + mapSearchButton: "بحث", + mapUpdatedAt: "محدّث", + mapNoMatch: "لا توجد خرائط مطابقة لبحثك.", + noMaps: "لا توجد خرائط متاحة.", + mapLocationTitle: "الموقع", + mapVisitLabel: "زيارة الخريطة", + typeMap: "خرائط", + typeMapMarker: "علامة خريطة", + modulesMapLabel: "خرائط", + modulesMapDescription: "وحدة لإدارة ومشاركة الخرائط غير المتصلة.", + padsTitle: "الوسادات", + padTitle: "وسادة", + modulesPadsLabel: "الوسادات", + modulesPadsDescription: "وحدة لإدارة محررات النصوص التعاونية.", + padFilterAll: "الكل", + padFilterMine: "خاصتي", + padFilterRecent: "الأخيرة", + padFilterOpen: "مفتوح", + padFilterClosed: "مغلق", + padCreate: "إنشاء وسادة", + padUpdate: "تحديث الوسادة", + padDelete: "حذف الوسادة", + padTitleLabel: "العنوان", + padTitlePlaceholder: "أدخل عنوان الوسادة...", + padStatusLabel: "الحالة", + padStatusOpen: "مفتوح", + padStatusInviteOnly: "بدعوة فقط", + padStatusClosed: "مغلق", + padDeadlineLabel: "الموعد النهائي", + padTagsLabel: "الوسوم", + padTagsPlaceholder: "وسم1، وسم2، ...", + padMembersLabel: "الأعضاء", + padVisitPad: "زيارة الوسادة", + padShareUrl: "مشاركة الرابط", + padCreated: "تاريخ الإنشاء", + padAuthor: "المؤلف", + padGenerateCode: "إنشاء رمز", + padInviteCodeLabel: "رمز الدعوة", + padInviteCodePlaceholder: "أدخل رمز الدعوة...", + padValidateInvite: "تحقق", + padStartEditing: "ابدأ التحرير!", + padEditorPlaceholder: "ابدأ الكتابة...", + padSubmitEntry: "إرسال", + padNoEntries: "لا توجد مدخلات بعد.", + padAllSectionTitle: "جميع الوسادات", + padMineSectionTitle: "وساداتي", + padsDescription: "إدارة محرّرات النصوص التعاونية المشفّرة في شبكتك.", + padRecentSectionTitle: "الوسادات الأخيرة", + padOpenSectionTitle: "الوسادات المفتوحة", + padClosedSectionTitle: "الوسادات المغلقة", + padCreateSectionTitle: "إنشاء وسادة جديدة", + padUpdateSectionTitle: "تحديث الوسادة", + padInviteGenerated: "تم إنشاء رمز الدعوة", + typePad: "وسادة", + padNew: "جديد", + padAddFavorite: "إضافة إلى المفضلة", + padRemoveFavorite: "إزالة من المفضلة", + padClose: "إغلاق اللوحة", + padBackToEditor: "العودة إلى المحرر", + padSearchPlaceholder: "البحث عن الوسادات...", + + modulesChatsLabel: "المحادثات", + modulesChatsDescription: "وحدة لاكتشاف وإدارة المحادثات المشفرة.", + typeChat: "محادثة", + typeChatMessage: "رسالة محادثة", + chatLabel: "المحادثات", + chatMessageLabel: "رسائل المحادثة", + chatsTitle: "المحادثات", + chatMineSectionTitle: "Your Chats", + chatRecentTitle: "Recent Chats", + chatFavoritesTitle: "المفضلة", + chatOpenTitle: "Open Chats", + chatClosedTitle: "Closed Chats", + chatDescription: "الوصف", + chatCategory: "الفئة", + chatStatus: "الحالة", + chatFilterAll: "الكل", + chatFilterMine: "لي", + chatFilterRecent: "الأخيرة", + chatFilterFavorites: "المفضلة", + chatFilterOpen: "مفتوح", + chatFilterClosed: "مغلق", + chatCreate: "إنشاء محادثة", + chatUpdate: "تحديث المحادثة", + chatDelete: "حذف المحادثة", + chatClose: "إغلاق المحادثة", + chatVisitChat: "زيارة المحادثة", + chatUntitled: "محادثة بدون عنوان", + chatNoItems: "لا توجد محادثات.", + chatParticipants: "المشاركون", + chatStartChatting: "ابدأ المحادثة!", + chatGenerateCode: "إنشاء رمز", + chatShareUrl: "مشاركة الرابط", + chatCreatedAt: "تم الإنشاء", + chatSearchPlaceholder: "بحث في المحادثات...", + chatStatusOpen: "مفتوح", + chatStatusInviteOnly: "بالدعوة فقط", + chatStatusClosed: "مغلق", + chatSendMessage: "إرسال", + chatMessagePlaceholder: "اكتب رسالتك...", + chatNoMessages: "لا توجد رسائل بعد.", + chatLeave: "مغادرة المحادثة", + chatInviteCodeLabel: "أدخل رمز الدعوة", + chatJoinByInvite: "انضم", + chatTitlePlaceholder: "عنوان المحادثة", + chatDescriptionPlaceholder: "وصف المحادثة", + chatTagsPlaceholder: "وسم1، وسم2", + chatImageLabel: "اختر ملف صورة (.jpeg, .jpg, .png, .gif)", + chatInviteCode: "رمز الدعوة", + chatAuthor: "المؤلف", + chatCreated: "تم الإنشاء", + chatAddFavorite: "إضافة للمفضلة", + chatRemoveFavorite: "إزالة من المفضلة", + chatPM: "رسالة", + chatStatusLabel: "الحالة", + chatCategoryLabel: "الفئة", + chatParticipantsLabel: "المشاركون", + gamesTitle: "الألعاب", + gamesDescription: "اكتشف وألعب بعض الألعاب.", + gamesFilterAll: "الكل", + gamesPlayButton: "العب!", + gamesBackToGames: "العودة إلى الألعاب", + modulesGamesLabel: "الألعاب", + modulesGamesDescription: "وحدة لاكتشاف وتشغيل بعض الألعاب.", + gamesCocolandTitle: "Cocoland", + gamesCocolandDesc: "جوزة هند بعيون تقفز فوق أشجار النخيل وتجمع ECOins.", + gamesTheFlowTitle: "ECOinflow", + gamesTheFlowDesc: "اربط PUBs بالسكان عبر المدققين والمتاجر والمجمّعات. انجُ من تهديد CBDC!", + gamesNeonInfiltratorTitle: "Neon Infiltrator", + gamesNeonInfiltratorDesc: "تسلل عبر الشبكة، اجمع بيانات سرية، تجنب طائرات الأمن واهرب. كم مستوى تستطيع اجتيازه؟", + gamesSpaceInvadersTitle: "Space Invaders", + gamesSpaceInvadersDesc: "أوقف الغزو الفضائي! أسقط موجات الغزاة قبل أن يصلوا إلى الأرض.", + gamesArkanoidTitle: "Arkanoid", + gamesArkanoidDesc: "اكسر جميع الطوب بمضربك وكرتك. تحدي أركيد كلاسيكي.", + gamesPingPongTitle: "PingPong", + gamesPingPongDesc: "بينج بونج كلاسيكي ضد ذكاء اصطناعي. أول من يصل إلى 5 نقاط يفوز.", + gamesOutrunTitle: "Outrun", + gamesOutrunDesc: "سباق ضد الوقت! تجنب السيارات وصل إلى خط النهاية قبل انتهاء الوقت.", + gamesAsteroidsTitle: "Asteroids", + gamesAsteroidsDesc: "قد مركبتك عبر حقل الكويكبات. دمرها قبل أن تصطدم بك.", + gamesRockPaperScissorsTitle: "حجر ورقة مقص", + gamesRockPaperScissorsDesc: "حجر، ورقة أو مقص ضد ذكاء اصطناعي. الأفضل في ثلاث جولات يفوز.", + gamesTikTakToeTitle: "TikTakToe", + gamesTikTakToeDesc: "تيك-تاك-تو الكلاسيكي ضد الذكاء الاصطناعي. ثلاثة في صف واحد للفوز.", + 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.", + gamesCocomanTitle: "Cocoman", + gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.", + 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?", + gamesQuakeTitle: "Quake Arena", + gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", + gamesFilterScoring: "SCORING", + gamesHallOfFame: "Hall of Fame", + gamesHallPlayer: "Player", + gamesHallScore: "Score", + gamesNoScores: "No scores yet.", + calendarsTitle: "التقاويم", + calendarTitle: "التقويم", + modulesCalendarsLabel: "التقاويم", + modulesCalendarsDescription: "وحدة لاكتشاف وإدارة التقاويم.", + typeCalendar: "تقويم", + calendarFilterAll: "الكل", + calendarFilterMine: "تقاويمي", + calendarFilterOpen: "مفتوح", + calendarFilterClosed: "مغلق", + calendarFilterRecent: "الأحدث", + calendarFilterFavorites: "المفضلة", + calendarCreate: "إنشاء تقويم", + calendarUpdate: "تحديث", + calendarDelete: "حذف", + calendarTitleLabel: "العنوان", + calendarTitlePlaceholder: "عنوان التقويم...", + calendarStatusLabel: "الحالة", + calendarStatusOpen: "مفتوح", + calendarStatusClosed: "مغلق", + calendarDeadlineLabel: "Deadline", + calendarTagsLabel: "الوسوم", + calendarTagsPlaceholder: "وسم1، وسم2...", + calendarParticipantsLabel: "المشاركون", + calendarParticipantsCount: "المشاركون", + calendarVisitCalendar: "زيارة التقويم", + calendarCreated: "تم الإنشاء", + calendarAuthor: "المؤلف", + calendarJoin: "انضمام", + calendarJoined: "منضم", + calendarAddDate: "إضافة تاريخ", + calendarAddNote: "إضافة ملاحظة", + calendarDateLabel: "التاريخ", + calendarDatePlaceholder: "وصف هذا التاريخ...", + calendarNoteLabel: "ملاحظة", + calendarNotePlaceholder: "إضافة ملاحظة...", + calendarFirstDateLabel: "التاريخ", + calendarFirstNoteLabel: "ملاحظات", + calendarIntervalLabel: "Interval", + calendarIntervalWeekly: "Weekly", + calendarIntervalMonthly: "Monthly", + calendarIntervalYearly: "Yearly", + calendarFormDescription: "الوصف", + calendarNoDates: "لا توجد تواريخ.", + calendarNoNotes: "لا توجد ملاحظات.", + calendarsNoItems: "لا توجد تقاويم.", + calendarsDescription: "اكتشف وأدر التقويمات في شبكتك.", + calendarMonthPrev: "← السابق", + calendarMonthNext: "التالي →", + calendarMonthLabel: "التواريخ", + calendarsShareUrl: "رابط المشاركة", + calendarAllSectionTitle: "التقاويم", + calendarRecentSectionTitle: "التقويمات الأحدث", + calendarFavoritesSectionTitle: "المفضلة", + calendarMineSectionTitle: "تقويماتك", + calendarOpenSectionTitle: "التقاويم المفتوحة", + calendarClosedSectionTitle: "التقاويم المغلقة", + calendarCreateSectionTitle: "إنشاء تقويم جديد", + calendarUpdateSectionTitle: "تحديث التقويم", + calendarAddFavorite: "إضافة إلى المفضلة", + calendarDeleteNote: "Delete", + calendarRemoveFavorite: "إزالة من المفضلة", + calendarSearchPlaceholder: "البحث عن تقاويم...", + calendarAddEntry: "إضافة إدخال", + calendarLeave: "مغادرة التقويم", + statsCalendar: "التقاويم", + statsCalendarDate: "تواريخ التقويم", + statsCalendarNote: "ملاحظات التقويم", + chatAccessDenied: "ليس لديك حق الوصول إلى هذه المحادثة. اطلب دعوة للوصول إلى المحتوى.", + padAccessDenied: "ليس لديك حق الوصول إلى هذا الوسادة. اطلب دعوة للوصول إلى المحتوى.", + contentAccessDenied: "ليس لديك حق الوصول إلى هذا المحتوى.", + blockAccessRestricted: "الوصول مقيد", + tribeContentAccessDenied: "تم رفض الوصول", + tribeContentAccessDeniedMsg: "هذا المحتوى ينتمي إلى قبيلة. يجب أن تكون عضواً للوصول إليه.", + tribeViewTribes: "عرض القبائل", + torrentsTitle: "التورنت", + torrentsDescription: "استكشف وأدِر التورنت في شبكتك.", + torrentAllSectionTitle: "التورنت", + torrentMineSectionTitle: "تورنتاتك", + torrentRecentSectionTitle: "تورنتات حديثة", + torrentTopSectionTitle: "أفضل التورنتات", + torrentFavoritesSectionTitle: "المفضلة", + torrentFilterAll: "الكل", + torrentFilterMine: "خاصتي", + torrentFilterRecent: "الحديثة", + torrentFilterTop: "الأفضل", + torrentFilterFavorites: "المفضلة", + torrentCreateSectionTitle: "رفع تورنت", + torrentUpdateSectionTitle: "تحديث التورنت", + torrentCreateButton: "رفع تورنت", + torrentUpdateButton: "تحديث", + torrentDeleteButton: "حذف", + torrentAddFavoriteButton: "إضافة إلى المفضلة", + torrentRemoveFavoriteButton: "إزالة من المفضلة", + torrentFileLabel: "اختر ملف تورنت (.torrent)", + torrentTitleLabel: "العنوان", + torrentTitlePlaceholder: "العنوان", + torrentDescriptionLabel: "الوصف", + torrentDescriptionPlaceholder: "الوصف", + torrentTagsLabel: "الوسوم", + torrentTagsPlaceholder: "أدخل الوسوم مفصولة بفواصل", + torrentSizeLabel: "الحجم", + torrentDownloadButton: "DOWNLOAD IT!", + torrentNoFile: "لا يوجد ملف تورنت", + noTorrents: "لم يتم العثور على تورنتات.", + torrentSearchPlaceholder: "بحث بالعنوان، الوسوم، المؤلف...", + torrentSearchButton: "بحث", + torrentSortRecent: "الأحدث", + torrentSortOldest: "الأقدم", + torrentSortTop: "الأكثر تصويتاً", + torrentNoMatch: "لا توجد تورنتات مطابقة.", + torrentMessageAuthorButton: "مراسلة المؤلف", + torrentUpdatedAt: "تم التحديث", + statsTorrent: "التورنت", + typeTorrent: "التورنت", + modulesTorrentsLabel: "التورنت", + modulesTorrentsDescription: "وحدة لاكتشاف وإدارة التورنت.", + favoritesFilterTorrents: "التورنت", + tribeSectionTorrents: "التورنت", + tribeCreateTorrent: "رفع تورنت", + tribeMediaTypeTorrent: "تورنت", + settingsWishTitle: "الرغبة", + settingsWishDesc: "قم بتكوين رغبة الأفاتار الخاص بك.", + settingsWishWhole: "Multiverse", + settingsWishMutuals: "Only mutual-support", + settingsPmVisibilityTitle: "الرسائل الخاصة", + settingsPmVisibilityDesc: "قم بتكوين مستوى التعرض للرسائل الخاصة في الشبكة.", + settingsPmVisibilityWhole: "Multiverse", + settingsPmVisibilityMutuals: "Only mutual-support", + pmMutualNotice: "الإرسال حاجز UX. الاستقبال فلتر انتباه.", + pmBlockedNonMutual: "يمكنك إرسال الرسائل الخاصة فقط للسكان ذوي الدعم المتبادل.", + inhabitantsPendingFollowsTitle: "طلبات الدعم المعلقة", + inhabitantsPendingAccept: "قبول", + inhabitantsPendingReject: "رفض", + bxEncrypted: "مشفر", + bxEncryptedHexLabel: "النص المشفر (معاينة)", + tribeSectionGovernance: "الحوكمة", + tribeSubStatusPublic: "عامة", + tribeSubStatusPrivate: "خاصة", + tribeSubInheritedPrivate: "خاصة (موروثة من القبيلة الرئيسية)", + tribePadInviteRequired: "لا يمكنك الوصول. اطلب دعوة.", + tribeChatInviteRequired: "لا يمكنك الوصول للدردشة. اطلب دعوة.", + tribeGovernanceDesc: "الحوكمة الداخلية لهذه القبيلة.", + tribeGovernanceNoGov: "لا توجد حكومة نشطة", + tribeGovernanceNoGovDesc: "لم تنتخب هذه القبيلة حكومة بعد.", + tribeGovCardTitle: "الحكومة الحالية", + tribeGovCycleSince: "بداية الدورة", + tribeGovCycleEnd: "نهاية الدورة", + tribeGovTimeRemaining: "الوقت المتبقي", + tribeGovPopulation: "السكان", + tribeGovMethod: "الطريقة", + tribeGovVotesReceived: "الأصوات المستلمة", + tribeGovLeader: "القائد", + tribeGovFilterGovernment: "الحكومة", + tribeGovFilterCandidatures: "الترشيحات", + tribeGovFilterLaws: "القوانين", + tribeGovCandidatureId: "الترشيح", + tribeGovCandidatureMethod: "الطريقة", + tribeGovCandidatureProposeBtn: "نشر الترشيح", + tribeGovRuleTitle: "عنوان القاعدة", + tribeGovRuleBody: "محتوى القاعدة", + tribeGovProposals: "الاقتراحات", + tribeGovRevocations: "الإلغاءات", + tribeGovHistorical: "السجل", + tribeGovRules: "القواعد", + tribeGovernanceAlreadyPublished: "لدى هذه القبيلة ترشح مفتوح.", + tribeGovernanceProposeInternal: "اقتراح ترشح داخلي", + tribeGovernanceInternalCandidatures: "الترشيحات الداخلية", + tribeGovernanceNoCandidatures: "لا توجد ترشيحات مفتوحة.", + tribeGovernanceAddRule: "إضافة قاعدة", + tribeGovernanceNoRules: "لا توجد قواعد بعد.", + tribeGovernanceNoLeaders: "لم يُنتخب أي قائد بعد.", + tribeGovernanceComingSoon: "قريبًا في وحدة الحوكمة.", + logsTitle: "السجل", + logsDescription: "سجل تجربتك في الشبكة.", + logsReadMore: "اقرأ المزيد", + logsViewTitle: "السجل", + logsColumnType: "النوع", + logsView: "عرض", + logsManualPrompt: "اكتب سجلك", + logsUpdateButton: "تحديث", + logsEditTitle: "تعديل الإدخال", + logsCreateDescription: "سجل تجربتك...", + logsCreateTitle: "إنشاء إدخال", + logsWriteButton: "اكتب", + logsTextPlaceholder: "صف تجاربك...", + logsTextField: "النص", + logsLabelPlaceholder: "تسمية...", + logsLabelField: "اكتب سجلك (تسمية)", + logsAiDisabledWarn: "فعّل وحدة الذكاء الاصطناعي في /modules لاستخدام السجلات المكتوبة بواسطة الذكاء.", + logsAiContextValue: "يوم blockchain", + logsAiContext: "السياق", + logsAiModStatus: "AImod", + logsModeApply: "تطبيق!", + logsModeAIWritten: "AI-Assistant", + logsModeManual: "يدوي", + logsModeAI: "ذكاء", + logsColumnDelete: "حذف", + logsColumnEdit: "تعديل", + logsColumnLog: "السجل", + logsColumnDate: "التاريخ", + logsDelete: "حذف", + logsEdit: "تعديل", + logsFilterAlways: "دائمًا", + logsFilterYear: "السنة الماضية", + logsFilterMonth: "الشهر الماضي", + logsFilterWeek: "الأسبوع الماضي", + logsFilterToday: "اليوم", + logsFilterRecent: "الأحدث", + logsFilterAll: "الكل", + logsCreate: "إنشاء إدخال", + logsExport: "تصدير السجل", + logsExportOne: "تصدير", + logsViewDetails: "عرض التفاصيل", + logsGenerateButton: "توليد نص", + logsSearchText: "ابحث في السجلات...", + logsSearchAnyType: "أي نوع", + logsSearchButton: "بحث", + logsEmpty: "لا توجد إدخالات بعد.", + modulesLogsLabel: "السجل", + modulesLogsDescription: "وحدة لتسجيل تجاربك (عبر مساعد ذكاء اصطناعي).", + statsLogsTitle: "السجل", + statsLogsEntries: "إدخالات", + typeLog: "سجل", + blockchainCycle: "دورة", + + } +}; diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_de.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_de.js index bc0b171e..76ef4f26 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_de.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_de.js @@ -1657,6 +1657,8 @@ module.exports = { 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.", tribeFilterAll: "ALLE", tribeFilterMine: "MEINE", @@ -1851,6 +1853,7 @@ module.exports = { tribeStatusLabel: "Status", tribeSubTribes: "UNTER-STÄMME", tribeSubTribesCreate: "Unter-Stamm Erstellen", + tribeSubTribesStrictDenied: "Der strikte Modus des Stammes erlaubt Ihnen nicht, neue Unter-Stämme zu erstellen. Bitte wenden Sie sich an den Administrator.", tribeSubTribesEmpty: "Noch keine Unter-Stämme erstellt.", tribeLarpCreateForbidden: "L.A.R.P.-Stämme können nicht erstellt werden.", tribeLarpUpdateForbidden: "L.A.R.P.-Stämme können nicht aktualisiert werden.", @@ -2867,6 +2870,7 @@ module.exports = { padNoEntries: "Noch keine Einträge.", padAllSectionTitle: "Alle Pads", padMineSectionTitle: "Meine Pads", + padsDescription: "Verwalte kollaborative verschlüsselte Texteditoren in deinem Netzwerk.", padRecentSectionTitle: "Aktuelle Pads", padOpenSectionTitle: "Offene Pads", padClosedSectionTitle: "Geschlossene Pads", @@ -3125,6 +3129,26 @@ module.exports = { tribeGovernanceDesc: "Interne Governance dieses Stammes.", tribeGovernanceNoGov: "Keine aktive Regierung", tribeGovernanceNoGovDesc: "Dieser Stamm hat noch keine Regierung gewählt.", + tribeGovCardTitle: "Aktuelle Regierung", + tribeGovCycleSince: "ZYKLUS SEIT", + tribeGovCycleEnd: "ZYKLUS ENDE", + tribeGovTimeRemaining: "VERBLEIBENDE ZEIT", + tribeGovPopulation: "BEVÖLKERUNG", + tribeGovMethod: "METHODE", + tribeGovVotesReceived: "ERHALTENE STIMMEN", + tribeGovLeader: "ANFÜHRER", + tribeGovFilterGovernment: "REGIERUNG", + tribeGovFilterCandidatures: "KANDIDATUREN", + tribeGovFilterLaws: "GESETZE", + tribeGovCandidatureId: "Kandidatur", + tribeGovCandidatureMethod: "Methode", + tribeGovCandidatureProposeBtn: "Kandidatur veröffentlichen", + tribeGovRuleTitle: "Regeltitel", + tribeGovRuleBody: "Regelinhalt", + tribeGovProposals: "VORSCHLÄGE", + tribeGovRevocations: "WIDERRUFE", + tribeGovHistorical: "VERLAUF", + tribeGovRules: "REGELN", tribeGovernanceAlreadyPublished: "Dieser Stamm hat bereits eine offene Kandidatur.", tribeGovernanceProposeInternal: "Interne Kandidatur vorschlagen", tribeGovernanceInternalCandidatures: "Interne Kandidaturen", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_en.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_en.js index 0c3a84e5..b527f300 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_en.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_en.js @@ -1663,6 +1663,8 @@ module.exports = { tribeRecentSectionTitle: "Recent Tribes", tribeTopSectionTitle: "Popular Tribes", tribeviewTribeButton: "Visit Tribe", + tribeviewSubTribeButton: "Visit Sub-Tribe", + tribeRootLabel: "ROOT", tribeDescription: "Explore or create tribes on your network.", tribeFilterAll: "ALL", tribeFilterMine: "MINE", @@ -1857,6 +1859,7 @@ module.exports = { tribeStatusLabel: "Status", tribeSubTribes: "SUB-TRIBES", tribeSubTribesCreate: "Create Sub-Tribe", + tribeSubTribesStrictDenied: "Tribe strict mode does not allow you to create new sub-tribes. Please contact the administrator.", tribeSubTribesEmpty: "No sub-tribes created, yet.", tribeLarpCreateForbidden: "L.A.R.P. tribes cannot be created.", tribeLarpUpdateForbidden: "L.A.R.P. tribes cannot be updated.", @@ -3148,6 +3151,26 @@ module.exports = { tribeGovernanceDesc: "Internal governance for this tribe. Propose candidatures, debate rules, elect leaders.", tribeGovernanceNoGov: "No active government", tribeGovernanceNoGovDesc: "This tribe has not yet elected a government. Propose candidatures to start the process.", + tribeGovCardTitle: "Current Government", + tribeGovCycleSince: "CYCLE SINCE", + tribeGovCycleEnd: "CYCLE END", + tribeGovTimeRemaining: "TIME REMAINING", + tribeGovPopulation: "POPULATION", + tribeGovMethod: "METHOD", + tribeGovVotesReceived: "VOTES RECEIVED", + tribeGovLeader: "LEADER", + tribeGovFilterGovernment: "GOVERNMENT", + tribeGovFilterCandidatures: "CANDIDATURES", + tribeGovFilterLaws: "LAWS", + tribeGovCandidatureId: "Candidature", + tribeGovCandidatureMethod: "Method", + tribeGovCandidatureProposeBtn: "Publish Candidature", + tribeGovRuleTitle: "Rule Title", + tribeGovRuleBody: "Rule Body", + tribeGovProposals: "PROPOSALS", + tribeGovRevocations: "REVOCATIONS", + tribeGovHistorical: "HISTORICAL", + tribeGovRules: "RULES", tribeGovernanceAlreadyPublished: "This tribe already has an open candidature in the current global parliament cycle.", tribeGovernanceProposeInternal: "Propose internal candidature", tribeGovernanceInternalCandidatures: "Internal candidatures", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_es.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_es.js index f580c084..41d38ecf 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_es.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_es.js @@ -1653,6 +1653,8 @@ module.exports = { tribeRecentSectionTitle: "Tribus Recientes", tribeTopSectionTitle: "Tribus Populares", tribeviewTribeButton: "Visitar Tribu", + tribeviewSubTribeButton: "Visitar Sub-Tribu", + tribeRootLabel: "RAÍZ", tribeDescription: "Explora o crea tribus en tu red.", tribeFilterAll: "TODOS", tribeFilterMine: "MÍAS", @@ -1847,6 +1849,7 @@ 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.", tribeSubTribesEmpty: "No se han creado sub-tribus, aún.", tribeLarpCreateForbidden: "No se pueden crear tribus L.A.R.P.", tribeLarpUpdateForbidden: "No se pueden actualizar tribus L.A.R.P.", @@ -2876,6 +2879,7 @@ module.exports = { padNoEntries: "Sin entradas aún.", padAllSectionTitle: "Todos los Pads", padMineSectionTitle: "Mis Pads", + padsDescription: "Gestiona editores de texto cifrados colaborativos en tu red.", padRecentSectionTitle: "Pads Recientes", padOpenSectionTitle: "Pads Abiertos", padClosedSectionTitle: "Pads Cerrados", @@ -3139,6 +3143,26 @@ module.exports = { tribeGovernanceDesc: "Gobierno interno de esta tribu.", tribeGovernanceNoGov: "Sin gobierno activo", tribeGovernanceNoGovDesc: "Esta tribu aún no tiene gobierno. Propón candidaturas para iniciar el proceso.", + tribeGovCardTitle: "Gobierno Actual", + tribeGovCycleSince: "CICLO INICIO", + tribeGovCycleEnd: "CICLO FIN", + tribeGovTimeRemaining: "TIEMPO RESTANTE", + tribeGovPopulation: "POBLACIÓN", + tribeGovMethod: "MÉTODO", + tribeGovVotesReceived: "VOTOS RECIBIDOS", + tribeGovLeader: "LÍDER", + tribeGovFilterGovernment: "GOBIERNO", + tribeGovFilterCandidatures: "CANDIDATURAS", + tribeGovFilterLaws: "LEYES", + tribeGovCandidatureId: "Candidatura", + tribeGovCandidatureMethod: "Método", + tribeGovCandidatureProposeBtn: "Publicar Candidatura", + tribeGovRuleTitle: "Título de Regla", + tribeGovRuleBody: "Cuerpo de Regla", + tribeGovProposals: "PROPUESTAS", + tribeGovRevocations: "REVOCACIONES", + tribeGovHistorical: "HISTÓRICO", + tribeGovRules: "REGLAS", tribeGovernanceAlreadyPublished: "Esta tribu ya tiene una candidatura abierta en el ciclo actual del parlamento global.", tribeGovernanceProposeInternal: "Proponer candidatura interna", tribeGovernanceInternalCandidatures: "Candidaturas internas", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_eu.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_eu.js index 70db4857..382f239d 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_eu.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_eu.js @@ -1620,6 +1620,8 @@ module.exports = { tribeRecentSectionTitle: "Tribu Berriak", tribeTopSectionTitle: "Tribu Gorenak", tribeviewTribeButton: "Tribua Bisitatu", + tribeviewSubTribeButton: "Azpi-Tribua Bisitatu", + tribeRootLabel: "ERROA", tribeDescription: "Aurkitu edo sortu tribuak zure sarean.", tribeFilterAll: "GUZTIAK", tribeFilterMine: "NEUREAK", @@ -1814,6 +1816,7 @@ module.exports = { tribeStatusLabel: "Egoera", tribeSubTribes: "AZPI-TRIBUAK", tribeSubTribesCreate: "Azpi-Tribua Sortu", + tribeSubTribesStrictDenied: "Tribuaren modu zorrotzak ez dizu azpi-tribu berriak sortzen uzten. Jarri harremanetan administratzailearekin.", tribeSubTribesEmpty: "Ez da azpi-triburik sortu, oraindik.", tribeLarpCreateForbidden: "L.A.R.P. tribuak ezin dira sortu.", tribeLarpUpdateForbidden: "L.A.R.P. tribuak ezin dira eguneratu.", @@ -2837,6 +2840,7 @@ module.exports = { padNoEntries: "Oraindik sarrerarik ez.", padAllSectionTitle: "Pad Guztiak", padMineSectionTitle: "Nire Padak", + padsDescription: "Kudeatu zure sareko enkriptatutako testu-editore kolaboratiboak.", padRecentSectionTitle: "Azken Padak", padOpenSectionTitle: "Pad Irekiak", padClosedSectionTitle: "Pad Itxiak", @@ -3099,6 +3103,26 @@ module.exports = { tribeGovernanceDesc: "Tribu honen barne gobernantza.", tribeGovernanceNoGov: "Ez dago gobernu aktiborik", tribeGovernanceNoGovDesc: "Tribu honek ez du oraindik gobernurik aukeratu.", + tribeGovCardTitle: "Egungo Gobernua", + tribeGovCycleSince: "ZIKLOAREN HASIERA", + tribeGovCycleEnd: "ZIKLOAREN AMAIERA", + tribeGovTimeRemaining: "GERATZEN DEN DENBORA", + tribeGovPopulation: "BIZTANLERIA", + tribeGovMethod: "METODOA", + tribeGovVotesReceived: "JASOTAKO BOTOAK", + tribeGovLeader: "BURUZAGIA", + tribeGovFilterGovernment: "GOBERNUA", + tribeGovFilterCandidatures: "HAUTAGAITZAK", + tribeGovFilterLaws: "LEGEAK", + tribeGovCandidatureId: "Hautagaitza", + tribeGovCandidatureMethod: "Metodoa", + tribeGovCandidatureProposeBtn: "Hautagaitza argitaratu", + tribeGovRuleTitle: "Arauaren izenburua", + tribeGovRuleBody: "Arauaren edukia", + tribeGovProposals: "PROPOSAMENAK", + tribeGovRevocations: "EZEZTAPENAK", + tribeGovHistorical: "HISTORIKOA", + tribeGovRules: "ARAUAK", tribeGovernanceAlreadyPublished: "Tribu honek jada hautagai ireki bat du.", tribeGovernanceProposeInternal: "Proposatu barne hautagaia", tribeGovernanceInternalCandidatures: "Barne hautagaiak", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_fr.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_fr.js index a9551304..cd32ffdf 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_fr.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_fr.js @@ -1645,6 +1645,8 @@ module.exports = { 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.", tribeFilterAll: "TOUS", tribeFilterMine: "MIENS", @@ -1839,6 +1841,7 @@ module.exports = { tribeStatusLabel: "Statut", tribeSubTribes: "SOUS-TRIBUS", tribeSubTribesCreate: "Créer Sous-Tribu", + tribeSubTribesStrictDenied: "Le mode strict de la tribu ne vous permet pas de créer de nouvelles sous-tribus. Veuillez contacter l'administrateur.", tribeSubTribesEmpty: "Aucune sous-tribu créée, pour l'instant.", tribeLarpCreateForbidden: "Les tribus L.A.R.P. ne peuvent pas être créées.", tribeLarpUpdateForbidden: "Les tribus L.A.R.P. ne peuvent pas être mises à jour.", @@ -2865,6 +2868,7 @@ module.exports = { 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.", padRecentSectionTitle: "Pads Récents", padOpenSectionTitle: "Pads Ouverts", padClosedSectionTitle: "Pads Fermés", @@ -3127,6 +3131,26 @@ module.exports = { tribeGovernanceDesc: "Gouvernance interne de cette tribu.", tribeGovernanceNoGov: "Pas de gouvernement actif", tribeGovernanceNoGovDesc: "Cette tribu n'a pas encore de gouvernement.", + tribeGovCardTitle: "Gouvernement Actuel", + tribeGovCycleSince: "DÉBUT DU CYCLE", + tribeGovCycleEnd: "FIN DU CYCLE", + tribeGovTimeRemaining: "TEMPS RESTANT", + tribeGovPopulation: "POPULATION", + tribeGovMethod: "MÉTHODE", + tribeGovVotesReceived: "VOTES REÇUS", + tribeGovLeader: "DIRIGEANT", + tribeGovFilterGovernment: "GOUVERNEMENT", + tribeGovFilterCandidatures: "CANDIDATURES", + tribeGovFilterLaws: "LOIS", + tribeGovCandidatureId: "Candidature", + tribeGovCandidatureMethod: "Méthode", + tribeGovCandidatureProposeBtn: "Publier la candidature", + tribeGovRuleTitle: "Titre de la règle", + tribeGovRuleBody: "Corps de la règle", + tribeGovProposals: "PROPOSITIONS", + tribeGovRevocations: "RÉVOCATIONS", + tribeGovHistorical: "HISTORIQUE", + tribeGovRules: "RÈGLES", tribeGovernanceAlreadyPublished: "Cette tribu a déjà une candidature ouverte dans le cycle actuel.", tribeGovernanceProposeInternal: "Proposer une candidature interne", tribeGovernanceInternalCandidatures: "Candidatures internes", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_hi.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_hi.js new file mode 100644 index 00000000..2e0fe44b --- /dev/null +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_hi.js @@ -0,0 +1,3218 @@ +const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); +module.exports = { + hi: { + languageName: "हिन्दी", + extended: "मल्टीवर्स", + extendedDescription: [ + "जब आप किसी का समर्थन करते हैं तो आप उनके द्वारा समर्थित निवासियों की पोस्ट डाउनलोड कर सकते हैं, और वे पोस्ट यहाँ नवीनता के अनुसार क्रमबद्ध दिखाई देती हैं।", + ], + popular: "हाइलाइट्स", + popularDescription: [ + "आपके नेटवर्क के निवासियों की पोस्ट, ", + strong("प्रसार के अनुसार क्रमबद्ध"), + "। सूची प्राप्त करने के लिए समय अवधि चुनें।", + ], + day: "दिन", + week: "सप्ताह", + month: "महीना", + year: "वर्ष", + latest: "नवीनतम", + latestDescription: [ + strong("पोस्ट"), + " आपकी और आपके द्वारा समर्थित निवासियों की, नवीनता के अनुसार क्रमबद्ध।", + ], + topics: "विषय", + topicsDescription: [ + strong("विषय"), + " आपके और आपके द्वारा समर्थित निवासियों के, नवीनता के अनुसार क्रमबद्ध।", + ], + summaries: "सारांश", + summariesDescription: [ + strong("टिप्पणियों वाले विषय"), + " आपके और आपके द्वारा समर्थित निवासियों के, नवीनता के अनुसार क्रमबद्ध।", + ], + threads: "थ्रेड्स", + threadsDescription: [ + strong("टिप्पणियों वाली पोस्ट"), + " आपके द्वारा समर्थित निवासियों की (मल्टीवर्स से शामिल), नवीनता के अनुसार क्रमबद्ध।", + ], + profile: "अवतार", + inhabitants: "निवासी", + manualMode: "मैनुअल मोड", + mentions: "उल्लेख", + mentionsDescription: [ + strong("वे पोस्ट जो आपको @उल्लेख करती हैं"), + ", नवीनता के अनुसार क्रमबद्ध।", + ], + nextPage: "अगला", + previousPage: "पिछला", + noMentions: "आपको अभी तक कोई @उल्लेख नहीं मिला है।", + private: "इनबॉक्स", + privateDescription: "अपने निजी संदेश देखें और प्रबंधित करें।", + privateInbox: "इनबॉक्स", + privateSent: "भेजे गए", + privateFrom: "से", + privateTo: "को", + privateDate: "दिनांक", + privateDelete: "हटाएँ", + pmCreateButton: "PM लिखें", + pmReply: "उत्तर दें", + pmReplies: "उत्तर", + pmNew: "नया", + pmMarkRead: "पढ़ा हुआ चिह्नित करें", + inReplyTo: "के उत्तर में", + pmPreview: "पूर्वावलोकन", + pmPreviewTitle: "संदेश पूर्वावलोकन", + noPrivateMessages: "आपको अभी तक कोई निजी संदेश नहीं मिला है।", + peers: "पीयर", + privateDescription: ["निजी संदेश ",strong("आपकी सार्वजनिक कुंजी के लिए एन्क्रिप्टेड हैं")," और अधिकतम 7 प्राप्तकर्ता हो सकते हैं।"], + search: "खोज", + searchDescription: "विवरण", + imageSearch: "छवि खोज", + searchPlaceholder: "@निवासी, #टैग और कीवर्ड खोजें...", + settings: "सेटिंग्स", + continueReading: "पढ़ना जारी रखें", + moreComments: "और टिप्पणी", + readThread: "बाकी थ्रेड पढ़ें", + pixeliaTitle: 'Pixelia', + pixeliaDescription: 'ग्रिड पर पिक्सेल बनाएँ और अपने नेटवर्क में दूसरों के साथ सहयोग करें।', + coordLabel: 'निर्देशांक (जैसे, A3)', + coordPlaceholder: 'निर्देशांक दर्ज करें', + contributorsTitle: "योगदानकर्ता", + pixeliaBy: "द्वारा", + colorLabel: 'रंग चुनें', + paintButton: 'रंग भरें!', + invalidCoordinate: 'गलत निर्देशांक', + goToMuralButton: "भित्तिचित्र देखें", + totalPixels: 'कुल पिक्सेल', + modules: "मॉड्यूल", + modulesViewTitle: "मॉड्यूल", + modulesViewDescription: "मॉड्यूल सक्षम या अक्षम करके अपना वातावरण सेट करें।", + inbox: "इनबॉक्स", + multiverse: "मल्टीवर्स", + popularLabel: "हाइलाइट्स", + topicsLabel: "विषय", + latestLabel: "नवीनतम", + summariesLabel: "सारांश", + threadsLabel: "थ्रेड्स", + multiverseLabel: "मल्टीवर्स", + inboxLabel: "इनबॉक्स", + invitesLabel: "आमंत्रण", + walletLabel: "वॉलेट", + legacyLabel: "कुंजियाँ", + cipherLabel: "क्रिप्टर", + bookmarksLabel: "बुकमार्क", + videosLabel: "वीडियो", + torrentsLabel: "टोरेंट", + docsLabel: "दस्तावेज़", + audiosLabel: "ऑडियो", + tagsLabel: "टैग", + imagesLabel: "छवियाँ", + inhabitantsLabel: "निवासी", + trendingLabel: "ट्रेंडिंग", + eventsLabel: "कार्यक्रम", + tasksLabel: "कार्य", + transfersTitle: "स्थानांतरण", + marketTitle: "बाज़ार", + opinionsTitle: "राय", + saveSettings: "कॉन्फ़िगरेशन सहेजें", + apply: "लागू करें", + menuPersonal: "व्यक्तिगत", + menuContent: "सामग्री", + menuGovernance: "शासन", + menuOffice: "कार्यालय", + menuMultiverse: "मल्टीवर्स", + menuNetwork: "नेटवर्क", + menuCreative: "रचनात्मक", + menuEconomy: "अर्थव्यवस्था", + menuMedia: "मीडिया", + menuTools: "उपकरण", + comment: "टिप्पणी", + subtopic: "उपविषय", + json: "JSON", + createdAt: "बनाया गया", + createdBy: "द्वारा", + unfollow: "समर्थन वापस लें", + follow: "समर्थन करें", + block: "ब्लॉक करें", + unblock: "अनब्लॉक करें", + newerPosts: "नई पोस्ट", + olderPosts: "पुरानी पोस्ट", + feedRangeEmpty: "इस फ़ीड के लिए दी गई सीमा खाली है। देखने का प्रयास करें ", + seeFullFeed: "पूरी फ़ीड", + feedEmpty: "Oasis नेटवर्क ने इस खाते से कभी कोई पोस्ट नहीं देखी है।", + beginningOfFeed: "यह फ़ीड की शुरुआत है", + noNewerPosts: "अभी तक कोई नई पोस्ट प्राप्त नहीं हुई है।", + relationshipNotFollowing: "आपका समर्थन नहीं किया गया है", + relationshipTheyFollow: "आपका समर्थन करते हैं", + relationshipMutuals: "पारस्परिक समर्थन", + relationshipFollowing: "आप समर्थन कर रहे हैं", + relationshipYou: "आप", + relationshipBlocking: "आप ब्लॉक कर रहे हैं", + relationshipBlockedBy: "आप ब्लॉक हैं", + relationshipMutualBlock: "पारस्परिक ब्लॉक", + relationshipNone: "आप समर्थन नहीं कर रहे हैं", + relationshipConflict: "विवाद", + relationshipBlockingPost: "ब्लॉक की गई पोस्ट", + viewLikes: "प्रसार देखें", + spreadedDescription: "निवासी द्वारा प्रसारित पोस्ट की सूची।", + totalspreads: "कुल प्रसार", + attachFiles: "फ़ाइलें संलग्न करें", + preview: "पूर्वावलोकन", + publish: "लिखें", + contentWarningPlaceholder: "पोस्ट में विषय जोड़ें (वैकल्पिक)", + privateWarningPlaceholder: "निजी पोस्ट भेजने के लिए निवासी जोड़ें (वैकल्पिक)", + publishWarningPlaceholder: "...", + publishCustomDescription: [ + "याद रखें: ब्लॉकचेन तकनीक के कारण, एक बार पोस्ट प्रकाशित होने के बाद इसे संपादित या हटाया नहीं जा सकता।", + ], + commentWarning: [ + "याद रखें: ब्लॉकचेन तकनीक के कारण, एक बार पोस्ट प्रकाशित होने के बाद इसे संपादित या हटाया नहीं जा सकता।", + ], + commentPublic: "सार्वजनिक", + commentPrivate: "निजी", + commentLabel: ({ publicOrPrivate, markdownUrl }) => [ + ], + publishLabel: ({ markdownUrl, linkTarget }) => [ + "याद रखें: ब्लॉकचेन तकनीक के कारण, एक बार पोस्ट प्रकाशित होने के बाद इसे संपादित या हटाया नहीं जा सकता।", + ], + replyLabel: ({ markdownUrl }) => [ + "याद रखें: ब्लॉकचेन तकनीक के कारण, एक बार पोस्ट प्रकाशित होने के बाद इसे संपादित या हटाया नहीं जा सकता।", + ], + publishCustomInfo: ({ href }) => [ + "यदि आपके पास अनुभव है, तो आप ", + a({ href }, "एक उन्नत पोस्ट लिख सकते हैं"), + "।", + ], + publishBasicInfo: ({ href }) => [ + "यदि आपके पास अनुभव नहीं है, तो आपको ", + a({ href }, "एक पोस्ट लिखनी चाहिए"), + "।", + ], + publishCustom: "उन्नत पोस्ट लिखें", + subtopicLabel: "इस पोस्ट का उपविषय बनाएँ", + messagePreview: "पोस्ट पूर्वावलोकन", + mentionsMatching: "मिलते-जुलते उल्लेख", + mentionsName: "नाम", + mentionsRelationship: "संबंध", + updateit: "अपडेट प्राप्त करें!", + updateBannerText: "Oasis का एक नया संस्करण उपलब्ध है।", + updateBannerAction: "अभी अपडेट करें →", + info: "जानकारी", + settingsIntro: ({ version }) => [ + `[SNH] ꖒ OASIS [ v.${version} ]`, + ], + timeAgo: "पहले", + sendTime: "लगभग ", + theme: "थीम", + legacy: "कुंजियाँ", + legacyTitle: "कुंजियाँ", + legacyDescription: "अपनी गुप्त कुंजी (निजी कुंजी) को जल्दी और सुरक्षित रूप से प्रबंधित करें।", + legacyExportButton: "निर्यात", + legacyImportButton: "आयात", + ssbLogStream: "ब्लॉकचेन", + ssbLogStreamDescription: "ब्लॉकचेन स्ट्रीम के लिए संदेश सीमा कॉन्फ़िगर करें।", + saveSettings: "सेटिंग्स सहेजें", + exportTitle: "डेटा निर्यात करें", + exportDescription: "अपनी कुंजी एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", + exportDataTitle: "बैकअप", + exportDataDescription: "अपना डेटा डाउनलोड करें (गुप्त कुंजी शामिल नहीं!)", + exportDataButton: "डेटाबेस डाउनलोड करें", + pubWallet: "PUB वॉलेट", + pubWalletDescription: "PUB वॉलेट URL सेट करें। इसका उपयोग PUB लेनदेन (UBI सहित) के लिए किया जाएगा।", + pubWalletConfiguration: "कॉन्फ़िगरेशन सहेजें", + importTitle: "डेटा आयात करें", + importDescription: "अपना अवतार सक्रिय करने के लिए अपनी एन्क्रिप्टेड गुप्त कुंजी (निजी कुंजी) आयात करें", + importAttach: "एन्क्रिप्टेड फ़ाइल संलग्न करें (.enc)", + passwordLengthInfo: "पासवर्ड कम से कम 32 अक्षर लंबा होना चाहिए।", + passwordImport: "डेटा को डिक्रिप्ट करने के लिए अपना पासवर्ड लिखें जो आपके सिस्टम होम पर सहेजा जाएगा (नाम: secret)", + randomPassword: "यादृच्छिक पासवर्ड", + exportPasswordPlaceholder: "लोअरकेस, अपरकेस, संख्याएँ और प्रतीक उपयोग करें", + fileInfo: "आपकी एन्क्रिप्टेड गुप्त कुंजी आपके सिस्टम होम पर सहेजी जाएगी (नाम: oasis.enc)", + themeIntro: + "एक थीम चुनें।", + setTheme: "थीम सेट करें", + language: "भाषा", + languageDescription: + "यदि आप दूसरी भाषा उपयोग करना चाहते हैं, तो यहाँ चुनें।", + setLanguage: "भाषा सेट करें", + status: "स्थिति", + peerConnections: "पीयर", + peerConnectionsIntro: "अन्य पीयर के साथ अपने सभी कनेक्शन प्रबंधित करें।", + online: "ऑनलाइन", + offline: "ऑफ़लाइन", + discovered: 'खोजे गए', + unknown: 'अज्ञात', + pub: 'PUB', + supported: "समर्थित", + recommended: "अनुशंसित", + blocked: "ब्लॉक किए गए", + noConnections: "कोई पीयर कनेक्ट नहीं है।", + noDiscovered: "कोई पीयर नहीं मिला।", + noSupportedConnections: "कोई समर्थित पीयर नहीं।", + noBlockedConnections: "कोई ब्लॉक किया गया पीयर नहीं।", + noRecommendedConnections: "कोई अनुशंसित पीयर नहीं।", + connectionActionIntro: + "", + startNetworking: "नेटवर्किंग शुरू करें", + stopNetworking: "नेटवर्किंग बंद करें", + restartNetworking: "नेटवर्किंग पुनः आरंभ करें", + sync: "नेटवर्क सिंक करें", + indexes: "इंडेक्स", + indexesDescription: + "अपने इंडेक्स पुनर्निर्माण करना सुरक्षित है, और कुछ प्रकार की त्रुटियों को ठीक कर सकता है।", + homePageTitle: "होम", + homePageDescription: "चुनें कि कौन सा मॉड्यूल आपका होम पेज हो।", + saveHomePage: "होम सेट करें", + invites: "आमंत्रण", + invitesTitle: "आमंत्रण", + invitesInvites: "आमंत्रण", + invitesDescription: "अपने नेटवर्क में आमंत्रण कोड प्रबंधित करें और लागू करें।", + invitesTribesTitle: "जनजातियाँ", + invitesTribeInviteCodePlaceholder: "जनजाति आमंत्रण कोड दर्ज करें", + invitesTribeJoinButton: "जनजाति में शामिल हों", + invitesPubsTitle: "PUBs", + invitesPubInviteCodePlaceholder: "PUB आमंत्रण कोड दर्ज करें", + invitesAcceptInvite: "PUB में शामिल हों", + invitesAcceptedInvites: "संघीय नेटवर्क", + invitesNoInvites: "अभी तक कोई आमंत्रण स्वीकार नहीं किया गया।", + invitesUnfollow: "अनफ़ॉलो करें", + invitesFollow: "फ़ॉलो करें", + invitesUnfollowedInvites: "असंघीय नेटवर्क", + invitesNoFederatedPubs: "कोई संघीय नेटवर्क नहीं।", + invitesNoUnfollowed: "कोई असंघीय नेटवर्क नहीं।", + invitesUnreachablePubs: "अगम्य नेटवर्क", + invitesNoUnreachablePubs: "कोई अगम्य नेटवर्क नहीं।", + currentlyUnreachable: "त्रुटि!", + errorDetails: "त्रुटि विवरण", + genericError: "एक त्रुटि हुई।", + panicMode: "आपातकालीन मोड!", + encryptData: "अपनी ब्लॉकचेन एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", + decryptData: "अपनी ब्लॉकचेन डिक्रिप्ट करने के लिए पासवर्ड दर्ज करें", + panicModeDescription: "अपनी ब्लॉकचेन एन्क्रिप्ट/डिक्रिप्ट या हटाएँ", + removeDataDescription: "चेतावनी: यह प्रक्रिया पूर्ववत नहीं की जा सकती।", + encryptPanicButton: "ब्लॉकचेन एन्क्रिप्ट करें", + decryptPanicButton: "ब्लॉकचेन डिक्रिप्ट करें", + removePanicButton: "अपना सारा डेटा हटाएँ!", + searchTitle: "खोज", + searchDescriptionLabel: "अपने नेटवर्क में सामग्री खोजें।", + searchLanguagesLabel: "भाषाएँ", + searchSkillsLabel: "कौशल", + searchPlaceholder:"सामग्री खोजें...", + searchSubmit:"खोजें!", + tribeLocationLabel:"स्थान", + tribeModeLabel:"आमंत्रण मोड", + tribeMembersCount:"सदस्य संख्या", + searchDateLabel:"दिनांक", + searchLocationLabel:"स्थान", + searchPriceLabel:"मूल्य", + searchUrlLabel:"URL", + searchCategoryLabel:"श्रेणी", + searchStartLabel:"प्रारंभ समय", + searchEndLabel:"समाप्ति समय", + searchPriorityLabel:"प्राथमिकता", + searchStatusLabel:"स्थिति", + statusLabel:"स्थिति", + totalVotesLabel:"कुल मत", + votesLabel:"मत", + noResultsFound:"कोई परिणाम नहीं मिला।", + author:"लेखक", + createdAtLabel:"बनाया गया", + hashtagDescription:"इस हैशटैग से जुड़ी सामग्री खोजें", + tribeDescriptionLabel:"विवरण", + votesOption:"मत विकल्प", + voteYesLabel:"हाँ", + voteNoLabel:"नहीं", + allTypesLabel: "असीमित", + ABSTENTIONLabel:"तटस्थता", + YESLabel:"हाँ", + NOLabel:"नहीं", + FOLLOW_MAJORITYLabel: "बहुमत का पालन करें", + CONFUSEDLabel: "भ्रमित", + NOT_INTERESTEDLabel: "रुचि नहीं", + voteOptionYes:"हाँ", + voteOptionNo:"नहीं", + voteOptionAbstention:"तटस्थता", + StatusLabel:"स्थिति", + votesOptionYesLabel:"हाँ", + votesOptionNoLabel:"नहीं", + votesOptionAbstentionLabel:"तटस्थता", + votesQuestionLabel:"प्रश्न", + votesCreatedByLabel:"द्वारा बनाया गया", + voteStatusOpen:"खुला", + voteStatusClosed:"बंद", + imageSearchLabel: "छवियों को खोजने के लिए शब्द दर्ज करें।", + commentDescription: ({ parentUrl }) => [ + " ने टिप्पणी की ", + a({ href: parentUrl }, " थ्रेड पर"), + ], + commentTitle: ({ authorName }) => [`@${authorName} की पोस्ट पर टिप्पणी`], + subtopicDescription: ({ parentUrl }) => [ + " ने एक उपविषय बनाया ", + a({ href: parentUrl }, " एक पोस्ट से"), + ], + subtopicTitle: ({ authorName }) => [`@${authorName} की पोस्ट पर उपविषय`], + mysteryDescription: "एक रहस्यमय पोस्ट प्रकाशित की", + oasisDescription: "OASIS परियोजना नेटवर्क", + searchSubmit: "खोजें...", + hashtagDescription: "इस हैशटैग से टैग की गई पोस्ट।", + postLabel: "पोस्ट", + aboutLabel: "निवासी", + feedLabel: "फ़ीड", + votesLabel: "मतदान", + reportLabel: "रिपोर्ट", + imageLabel: "छवियाँ", + videoLabel: "वीडियो", + audioLabel: "ऑडियो", + documentLabel: "दस्तावेज़", + torrentLabel: "टॉरेंट", + pdfFallbackLabel: "PDF दस्तावेज़", + eventLabel: "कार्यक्रम", + taskLabel: "कार्य", + transferLabel: "स्थानांतरण", + curriculumLabel: "पाठ्यक्रम", + bookmarkLabel: "बुकमार्क", + tribeLabel: "जनजातियाँ", + marketLabel: "बाज़ार", + shopLabel: "SHOPS", + shopProductLabel: "SHOP PRODUCTS", + mapLabel: "MAPS", + jobLabel: "JOBS", + forumLabel: "FORUMS", + projectLabel: "PROJECTS", + bankWalletLabel: "वॉलेट", + bankClaimLabel: "UBI CLAIMS", + voteLabel: "VOTES", + contactLabel: "CONTACTS", + pubLabel: "PUBS", + cvLabel: "बायोडाटा", + submit: "जमा करें", + subjectLabel: "विषय", + editProfile: "अवतार संपादित करें", + editProfileDescription: + "", + profileName: "नाम", + profileImage: "अवतार छवि", + profileDescription: "विवरण", + hashtagDescription: + "आपके नेटवर्क के निवासियों की पोस्ट जो इस #हैशटैग का संदर्भ देती हैं, नवीनता के अनुसार क्रमबद्ध।", + rebuildName: "डेटाबेस पुनर्निर्माण करें", + wallet: "वॉलेट", + walletAddress: "पता", + walletAmount: "राशि", + walletAddressLine: ({ address }) => `पता: ${address}`, + walletAmountLine: ({ amount }) => `राशि: ${amount} ECO`, + walletBack: "वापस", + walletBalanceTitle: "शेष", + walletWalletSendTitle: "भेजें", + walletReceiveTitle: "प्राप्त करें", + walletHistoryTitle: "इतिहास", + walletBalanceLine: ({ balance }) => `${balance} ECO`, + walletCnfrs: "पुष्टि", + walletConfirm: "पुष्टि करें", + walletDescription: "अपनी डिजिटल संपत्तियाँ प्रबंधित करें, जिसमें ECOin भेजना और प्राप्त करना, अपना शेष देखना और अपना लेनदेन इतिहास शामिल है।", + walletDate: "दिनांक", + walletFee: "शुल्क (शुल्क जितना अधिक होगा, आपका लेनदेन उतनी तेज़ी से संसाधित होगा)", + walletFeeLine: ({ fee }) => `शुल्क: ECO ${fee}`, + walletHistory: "इतिहास", + walletReceive: "प्राप्त करें", + walletReset: "रीसेट", + walletSend: "भेजें", + walletStatus: "स्थिति", + walletDisconnected: [ + "ECOin ", + strong("वॉलेट डिस्कनेक्ट है"), + "। जाँचें ", + a({ href: '/settings' }, "आपकी सेटिंग्स"), + " या कनेक्शन स्थिति।", + ], + walletSentToLine: ({ destination, amount }) => `ECO ${amount} भेजा गया ${destination} को`, + walletSettingsTitle: "वॉलेट", + walletSettingsDescription: "Oasis को अपने ECOin वॉलेट के साथ एकीकृत करें।", + walletSettingsDocLink: "ECOin स्थापना मार्गदर्शिका", + walletStatusMessages: { + invalid_amount: "अमान्य राशि", + invalid_dest: "अमान्य गंतव्य पता", + invalid_fee: "अमान्य शुल्क", + validation_errors: "सत्यापन त्रुटियाँ", + send_tx_success: "लेनदेन सफल", + }, + walletTitle: "वॉलेट", + walletTotalCostLine: ({ totalCost }) => `कुल लागत: ECO ${totalCost}`, + walletTransactionId: "लेनदेन ID", + walletTxId: "Tx ID", + walletType: "प्रकार", + walletUser: "उपयोगकर्ता नाम", + walletPass: "पासवर्ड", + walletConfiguration: "वॉलेट सेट करें", + cipher: "क्रिप्टर", + cipherTitle: "क्रिप्टर", + cipherDescription: "अपने टेक्स्ट को सममित रूप से एन्क्रिप्ट और डिक्रिप्ट करें (साझा पासवर्ड का उपयोग करके)।", + randomPassword: "यादृच्छिक पासवर्ड", + cipherEncryptTitle: "टेक्स्ट एन्क्रिप्ट करें", + cipherEncryptDescription: "एन्क्रिप्ट करने के लिए टेक्स्ट दर्ज करें", + cipherTextLabel: "एन्क्रिप्ट करने के लिए टेक्स्ट", + cipherTextPlaceholder: "एन्क्रिप्ट करने के लिए टेक्स्ट दर्ज करें...", + cipherPasswordLabel: "अपना टेक्स्ट एन्क्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", + cipherPasswordDecryptLabel: "अपना टेक्स्ट डिक्रिप्ट करने के लिए पासवर्ड सेट करें (न्यूनतम 32 अक्षर)", + cipherPasswordPlaceholder: "पासवर्ड दर्ज करें...", + cipherEncryptButton: "एन्क्रिप्ट करें", + cipherDecryptTitle: "टेक्स्ट डिक्रिप्ट करें", + cipherDecryptDescription: "डिक्रिप्ट करने के लिए टेक्स्ट दर्ज करें", + cipherEncryptedMessageLabel: "एन्क्रिप्टेड टेक्स्ट", + cipherDecryptedMessageLabel: "डिक्रिप्टेड टेक्स्ट", + cipherPasswordUsedLabel: "एन्क्रिप्ट करने के लिए उपयोग किया गया पासवर्ड (इसे रखें!)", + cipherEncryptedTextPlaceholder: "एन्क्रिप्टेड टेक्स्ट दर्ज करें...", + cipherIvLabel: "IV", + cipherIvPlaceholder: "इनिशियलाइज़ेशन वेक्टर दर्ज करें...", + cipherDecryptButton: "डिक्रिप्ट करें", + password: "पासवर्ड", + text: "टेक्स्ट", + encryptedText: "एन्क्रिप्टेड टेक्स्ट", + iv: "इनिशियलाइज़ेशन वेक्टर (IV)", + encryptTitle: "अपना टेक्स्ट एन्क्रिप्ट करें", + encryptDescription: "वह टेक्स्ट दर्ज करें जिसे आप एन्क्रिप्ट करना चाहते हैं और पासवर्ड प्रदान करें।", + encryptButton: "एन्क्रिप्ट करें", + decryptTitle: "अपना टेक्स्ट डिक्रिप्ट करें", + decryptDescription: "एन्क्रिप्टेड टेक्स्ट दर्ज करें और एन्क्रिप्शन के लिए उपयोग किया गया वही पासवर्ड प्रदान करें।", + decryptButton: "डिक्रिप्ट करें", + passwordLengthError: "पासवर्ड कम से कम 32 अक्षर लंबा होना चाहिए।", + missingFieldsError: "टेक्स्ट, पासवर्ड या IV प्रदान नहीं किया गया।", + encryptionError: "टेक्स्ट एन्क्रिप्ट करने में त्रुटि।", + decryptionError: "टेक्स्ट डिक्रिप्ट करने में त्रुटि।", + bookmarkTitle: "बुकमार्क", + bookmarkDescription: "अपने नेटवर्क में बुकमार्क खोजें और प्रबंधित करें।", + bookmarkAllSectionTitle: "बुकमार्क", + bookmarkMineSectionTitle: "आपके बुकमार्क", + bookmarkRecentSectionTitle: "हाल के बुकमार्क", + bookmarkTopSectionTitle: "शीर्ष बुकमार्क", + bookmarkFavoritesSectionTitle: "पसंदीदा", + bookmarkCreateSectionTitle: "बुकमार्क बनाएँ", + bookmarkUpdateSectionTitle: "बुकमार्क अपडेट करें", + bookmarkFilterAll: "सभी", + bookmarkFilterMine: "मेरे", + bookmarkFilterTop: "शीर्ष", + bookmarkFilterFavorites: "पसंदीदा", + bookmarkFilterRecent: "हाल के", + bookmarkCreateButton: "बुकमार्क बनाएँ", + bookmarkUpdateButton: "अपडेट", + bookmarkDeleteButton: "हटाएँ", + bookmarkAddFavoriteButton: "पसंदीदा जोड़ें", + bookmarkRemoveFavoriteButton: "पसंदीदा हटाएँ", + bookmarkUrlLabel: "लिंक", + bookmarkUrlPlaceholder: "https://example.com", + bookmarkDescriptionLabel: "विवरण", + bookmarkDescriptionPlaceholder: "वैकल्पिक", + bookmarkTagsLabel: "टैग", + bookmarkTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + bookmarkCategoryLabel: "श्रेणी", + bookmarkCategoryPlaceholder: "वैकल्पिक", + bookmarkLastVisitLabel: "अंतिम विज़िट", + bookmarkSearchPlaceholder: "URL, टैग, श्रेणी, लेखक खोजें...", + bookmarkSortRecent: "सबसे हाल का", + bookmarkSortOldest: "सबसे पुराना", + bookmarkSortTop: "सर्वाधिक मतदान", + bookmarkSearchButton: "खोजें", + bookmarkUpdatedAt: "अपडेट किया गया", + bookmarkNoMatch: "आपकी खोज से कोई बुकमार्क मेल नहीं खाता।", + noBookmarks: "कोई बुकमार्क उपलब्ध नहीं।", + noUrl: "कोई लिंक नहीं", + noCategory: "कोई श्रेणी नहीं", + noLastVisit: "कोई अंतिम विज़िट नहीं", + videoTitle: "वीडियो", + videoDescription: "अपने नेटवर्क में वीडियो सामग्री खोजें और प्रबंधित करें।", + videoPluginTitle: "शीर्षक", + videoPluginDescription: "विवरण", + videoMineSectionTitle: "आपके वीडियो", + videoCreateSectionTitle: "वीडियो अपलोड करें", + videoUpdateSectionTitle: "वीडियो अपडेट करें", + videoAllSectionTitle: "वीडियो", + videoRecentSectionTitle: "हाल के वीडियो", + videoTopSectionTitle: "शीर्ष वीडियो", + videoFavoritesSectionTitle: "पसंदीदा", + videoFilterAll: "सभी", + videoFilterMine: "मेरे", + videoFilterRecent: "हाल के", + videoFilterTop: "शीर्ष", + videoFilterFavorites: "पसंदीदा", + videoCreateButton: "वीडियो अपलोड करें", + videoUpdateButton: "अपडेट", + videoDeleteButton: "हटाएँ", + videoAddFavoriteButton: "पसंदीदा जोड़ें", + videoRemoveFavoriteButton: "पसंदीदा हटाएँ", + videoFileLabel: "वीडियो फ़ाइल चुनें (.mp4, .webm, .ogv, .mov)", + videoTagsLabel: "टैग", + videoTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + videoTitleLabel: "शीर्षक", + videoTitlePlaceholder: "वैकल्पिक", + videoDescriptionLabel: "विवरण", + videoDescriptionPlaceholder: "वैकल्पिक", + videoNoFile: "कोई वीडियो फ़ाइल प्रदान नहीं की गई", + noVideos: "कोई वीडियो उपलब्ध नहीं।", + videoSearchPlaceholder: "शीर्षक, टैग, लेखक खोजें...", + videoSortRecent: "सबसे हाल का", + videoSortOldest: "सबसे पुराना", + videoSortTop: "सर्वाधिक मतदान", + videoSearchButton: "खोजें", + videoMessageAuthorButton: "PM", + videoUpdatedAt: "अपडेट किया गया", + videoNoMatch: "आपकी खोज से कोई वीडियो मेल नहीं खाता।", + documentTitle: "दस्तावेज़", + documentDescription: "अपने नेटवर्क में दस्तावेज़ खोजें और प्रबंधित करें।", + documentAllSectionTitle: "दस्तावेज़", + documentMineSectionTitle: "आपके दस्तावेज़", + documentRecentSectionTitle: "हाल के दस्तावेज़", + documentTopSectionTitle: "शीर्ष दस्तावेज़", + documentFavoritesSectionTitle: "पसंदीदा", + documentCreateSectionTitle: "दस्तावेज़ अपलोड करें", + documentUpdateSectionTitle: "दस्तावेज़ संपादित करें", + documentFilterAll: "सभी", + documentFilterMine: "मेरे", + documentFilterRecent: "हाल के", + documentFilterTop: "शीर्ष", + documentFilterFavorites: "पसंदीदा", + documentCreateButton: "दस्तावेज़ अपलोड करें", + documentUpdateButton: "अपडेट", + documentDeleteButton: "हटाएँ", + documentAddFavoriteButton: "पसंदीदा जोड़ें", + documentRemoveFavoriteButton: "पसंदीदा से हटाएँ", + documentMessageAuthorButton: "PM", + documentFileLabel: "दस्तावेज़ अपलोड करें (.pdf)", + documentTagsLabel: "टैग", + documentTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + documentTitleLabel: "शीर्षक", + documentTitlePlaceholder: "वैकल्पिक", + documentDescriptionLabel: "विवरण", + documentDescriptionPlaceholder: "वैकल्पिक", + documentNoFile: "कोई फ़ाइल नहीं।", + noDocuments: "कोई दस्तावेज़ उपलब्ध नहीं।", + documentSearchPlaceholder: "शीर्षक, टैग, विवरण, लेखक खोजें...", + documentSortRecent: "सबसे हाल का", + documentSortOldest: "सबसे पुराना", + documentSortTop: "सर्वाधिक मतदान", + documentSearchButton: "खोजें", + documentNoMatch: "आपकी खोज से कोई दस्तावेज़ मेल नहीं खाता।", + documentUpdatedAt: "अपडेट किया गया", + audioTitle: "ऑडियो", + audioDescription: "अपने नेटवर्क में ऑडियो सामग्री खोजें और प्रबंधित करें।", + audioPluginTitle: "शीर्षक", + audioPluginDescription: "विवरण", + audioMineSectionTitle: "आपके ऑडियो", + audioCreateSectionTitle: "ऑडियो अपलोड करें", + audioUpdateSectionTitle: "ऑडियो अपडेट करें", + audioAllSectionTitle: "ऑडियो", + audioRecentSectionTitle: "हाल के ऑडियो", + audioTopSectionTitle: "शीर्ष ऑडियो", + audioFilterAll: "सभी", + audioFilterMine: "मेरे", + audioFilterRecent: "हाल के", + audioFilterTop: "शीर्ष", + audioCreateButton: "ऑडियो अपलोड करें", + audioUpdateButton: "अपडेट", + audioDeleteButton: "हटाएँ", + audioAddFavoriteButton: "पसंदीदा जोड़ें", + audioRemoveFavoriteButton: "पसंदीदा हटाएँ", + audioFileLabel: "ऑडियो फ़ाइल चुनें (.mp3, .wav, .ogg)", + audioTagsLabel: "टैग", + audioTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + audioTitleLabel: "शीर्षक", + audioTitlePlaceholder: "वैकल्पिक", + audioDescriptionLabel: "विवरण", + audioDescriptionPlaceholder: "वैकल्पिक", + audioNoFile: "कोई ऑडियो फ़ाइल प्रदान नहीं की गई", + noAudios: "कोई ऑडियो उपलब्ध नहीं।", + audioSearchPlaceholder: "शीर्षक, टैग, लेखक खोजें...", + audioSortRecent: "सबसे हाल का", + audioSortOldest: "सबसे पुराना", + audioSortTop: "सर्वाधिक मतदान", + audioSearchButton: "खोजें", + audioMessageAuthorButton: "PM", + audioUpdatedAt: "अपडेट किया गया", + audioNoMatch: "आपकी खोज से कोई ऑडियो मेल नहीं खाता।", + audioFavoritesSectionTitle: "पसंदीदा", + audioFilterFavorites: "पसंदीदा", + favoritesTitle: "पसंदीदा", + favoritesDescription: "आपकी सभी पसंदीदा मीडिया एक ही स्थान पर।", + favoritesFilterAll: "सभी", + favoritesFilterRecent: "हाल के", + favoritesFilterAudios: "ऑडियो", + favoritesFilterBookmarks: "बुकमार्क", + favoritesFilterDocuments: "दस्तावेज़", + favoritesFilterImages: "छवियाँ", + favoritesFilterMaps: "मानचित्र", + favoritesFilterPads: "पैड", + favoritesFilterChats: "चैट्स", + favoritesFilterCalendars: "कैलेंडर", + favoritesFilterVideos: "वीडियो", + favoritesRemoveButton: "पसंदीदा से हटाएँ", + favoritesNoItems: "अभी तक कोई पसंदीदा नहीं।", + yourContacts: "आपके संपर्क", + allInhabitants: "निवासी", + allCVs: "सभी CVs", + discoverPeople: "अपने नेटवर्क में निवासियों को खोजें।", + allInhabitantsButton: "सभी", + contactsButton: "समर्थन", + CVsButton: "बायोडाटा", + matchSkills: "कौशल मिलान", + matchSkillsButton: "कौशल मिलान", + suggestedButton: "सुझाए गए", + searchInhabitantsPlaceholder: "नाम से निवासी फ़िल्टर करें …", + filterLocation: "स्थान से निवासी फ़िल्टर करें …", + filterLanguage: "भाषा से निवासी फ़िल्टर करें …", + filterSkills: "कौशल से निवासी फ़िल्टर करें …", + applyFilters: "फ़िल्टर लागू करें", + locationLabel: "स्थान", + languagesLabel: "भाषाएँ", + skillsLabel: "कौशल", + commonSkills: "सामान्य कौशल", + mutualFollowers: "पारस्परिक अनुयायी", + latestInteractions: "नवीनतम बातचीत", + viewAvatar: "अवतार देखें", + viewCV: "CV देखें", + suggestedSectionTitle: "सुझाए गए", + topkarmaSectionTitle: "शीर्ष कर्मा", + topactivitySectionTitle: "शीर्ष गतिविधि", + blockedSectionTitle: "ब्लॉक किए गए", + gallerySectionTitle: "गैलरी", + blockedButton: "ब्लॉक किए गए", + blockedLabel: "ब्लॉक किया गया उपयोगकर्ता", + inhabitantviewDetails: "विवरण देखें", + viewDetails: "विवरण देखें", + keepReading: "पढ़ते रहें...", + oasisId: "ID", + noInhabitantsFound: "अभी तक कोई निवासी नहीं मिला।", + inhabitantActivityLevel: "गतिविधि स्तर", + deviceLabel: "उपकरण", + parliamentTitle: "संसद", + parliamentDescription: "शासन के रूपों और सामूहिक प्रबंधन कानूनों का अन्वेषण करें।", + parliamentFilterGovernment: "सरकार", + parliamentFilterCandidatures: "उम्मीदवारी", + parliamentFilterProposals: "प्रस्ताव", + parliamentFilterLaws: "कानून", + parliamentFilterHistorical: "ऐतिहासिक", + parliamentFilterLeaders: "नेता", + parliamentFilterRules: "नियम", + parliamentGovernmentCard: "वर्तमान सरकार", + parliamentGovMethod: "शासन पद्धति", + parliamentActorInPowerInhabitant: 'सत्तारूढ़ निवासी', + parliamentActorInPowerTribe: 'सत्तारूढ़ जनजाति', + parliamentHistoricalGovernmentsTitle: 'सरकारें', + parliamentHistoricalElectionsTitle: 'चुनाव चक्र', + parliamentHistoricalLawsTitle: 'ऐतिहासिक', + parliamentHistoricalLeadersTitle: 'नेता', + parliamentThCycles: 'चक्र', + parliamentThTimesInPower: 'सत्ता में', + parliamentThTotalCandidatures: 'उम्मीदवारी', + parliamentThProposed: 'प्रस्तावित कानून', + parliamentThApproved: 'स्वीकृत कानून', + parliamentThDeclined: 'अस्वीकृत कानून', + parliamentThDiscarded: 'निरस्त कानून', + parliamentVotesReceived: "प्राप्त मत", + parliamentMembers: "सदस्य", + parliamentLegSince: "चक्र प्रारंभ", + parliamentLegEnd: "चक्र समाप्ति", + parliamentPoliciesProposal: "कानून प्रस्ताव", + parliamentPoliciesApproved: "स्वीकृत कानून", + parliamentPoliciesDeclined: "अस्वीकृत कानून", + parliamentPoliciesDiscarded: "निरस्त कानून", + parliamentEfficiency: "% दक्षता", + parliamentFilterRevocations: 'निरसन', + parliamentRevocationFormTitle: 'कानून निरसन', + parliamentRevocationLaw: 'कानून', + parliamentRevocationTitle: 'शीर्षक', + parliamentRevocationReasons: 'कारण', + parliamentRevocationPublish: 'निरसन प्रकाशित करें', + parliamentCurrentRevocationsTitle: 'वर्तमान निरसन', + parliamentFutureRevocationsTitle: 'भविष्य के निरसन', + parliamentPoliciesRevocated: 'निरसित कानून', + parliamentPoliciesTitle: 'ऐतिहासिक', + parliamentLawsTitle: 'स्वीकृत कानून', + parliamentRulesRevocations: 'किसी भी स्वीकृत कानून को वर्तमान शासन पद्धति का उपयोग करके निरसित किया जा सकता है।', + parliamentNoStableGov: "अभी तक कोई सरकार नहीं चुनी गई।", + parliamentNoGovernments: "अभी तक कोई सरकार नहीं है।", + parliamentCandidatureFormTitle: "उम्मीदवारी प्रस्तावित करें", + parliamentCandidatureId: "उम्मीदवारी", + parliamentCandidatureIdPh: "Oasis ID (@...) या जनजाति का नाम", + parliamentCandidatureSlogan: "नारा (अधिकतम 140 अक्षर)", + parliamentCandidatureSloganPh: "एक छोटा आदर्श वाक्य", + parliamentCandidatureMethod: "पद्धति", + parliamentCandidatureProposeBtn: "उम्मीदवारी प्रकाशित करें", + parliamentThType: "प्रकार", + parliamentThId: "ID", + parliamentThDate: "प्रस्ताव तिथि", + parliamentThSlogan: "नारा", + parliamentThMethod: "पद्धति", + parliamentThKarma: "कर्मा", + parliamentThSince: "प्रोफ़ाइल से", + parliamentThVotes: "प्राप्त मत", + parliamentThVoteAction: "मत दें", + parliamentTypeUser: "निवासी", + parliamentTypeTribe: "जनजाति", + parliamentVoteBtn: "मत दें", + parliamentProposalFormTitle: "कानून प्रस्तावित करें", + parliamentProposalTitle: "शीर्षक", + parliamentProposalDescription: "विवरण (≤1000)", + parliamentProposalPublish: "प्रस्ताव प्रकाशित करें", + parliamentOpenVote: "मतदान खोलें", + parliamentFinalize: "अंतिम रूप दें", + parliamentDeadline: "समय सीमा", + parliamentStatus: "स्थिति", + parliamentNoProposals: "अभी तक कोई कानून प्रस्ताव नहीं है।", + parliamentNoLaws: "अभी तक कोई स्वीकृत कानून नहीं है।", + parliamentLawMethod: "पद्धति", + parliamentLawProposer: "प्रस्तावक", + parliamentLawVotes: "हाँ/कुल", + parliamentLawEnacted: "लागू किया गया", + parliamentMethodDEMOCRACY: "लोकतंत्र", + parliamentMethodMAJORITY: "बहुमत (80%)", + parliamentMethodMINORITY: "अल्पमत (20%)", + parliamentMethodDICTATORSHIP: "तानाशाही", + parliamentMethodKARMATOCRACY: "कर्मतंत्र", + parliamentMethodANARCHY: "अराजकता", + parliamentThId: "ID", + parliamentThProposalDate: "प्रस्ताव तिथि", + parliamentThMethod: "पद्धति", + parliamentThKarma: "कर्म", + parliamentThSupports: "समर्थन", + parliamentThVote: "मत", + parliamentCurrentProposalsTitle: "वर्तमान प्रस्ताव", + parliamentVotesSlashTotal: "मत/कुल", + parliamentVotesNeeded: "आवश्यक मत", + parliamentFutureLawsTitle: "भविष्य के कानून", + parliamentNoFutureLaws: "अभी तक कोई भविष्य के कानून नहीं।", + parliamentVoteAction: "मत दें", + parliamentLeadersTitle: "नेता", + parliamentThLeader: "अवतार", + parliamentPopulation: "जनसंख्या", + parliamentThType: "प्रकार", + parliamentThInPower: "सत्ता में", + parliamentThPresented: "उम्मीदवारी", + parliamentNoLeaders: "अभी तक कोई नेता नहीं।", + typeParliament: "संसद", + typeParliamentCandidature: "संसद · उम्मीदवारी", + typeParliamentTerm: "संसद · कार्यकाल", + typeParliamentProposal: "संसद · प्रस्ताव", + typeParliamentLaw: "संसद · नया कानून", + typeCourts: "न्यायालय", + parliamentLawQuestion: "प्रश्न", + parliamentStatus: "स्थिति", + parliamentCandidaturesListTitle: "उम्मीदवारी सूची", + parliamentElectionsEnd: "चुनाव समाप्ति", + parliamentTimeRemaining: "शेष समय", + parliamentCurrentLeader: "विजयी उम्मीदवारी", + parliamentNoLeader: "अभी तक कोई विजयी उम्मीदवारी नहीं।", + parliamentElectionsStatusTitle: "अगली सरकार", + parliamentElectionsStart: "चुनाव प्रारंभ", + parliamentProposalDeadlineLabel: "समय सीमा", + parliamentProposalTimeLeft: "शेष समय", + parliamentProposalOnTrack: "पारित होने की राह पर", + parliamentProposalOffTrack: "अभी तक पर्याप्त समर्थन नहीं", + parliamentRulesTitle: "संसद कैसे काम करती है", + parliamentRulesIntro: "चुनाव हर 2 महीने में हल होते हैं; उम्मीदवारी निरंतर होती है और सरकार चुने जाने पर रीसेट हो जाती है।", + parliamentRulesCandidates: "कोई भी निवासी अपने आप को, किसी अन्य निवासी को, या किसी जनजाति को प्रस्तावित कर सकता है। प्रत्येक निवासी प्रति चक्र अधिकतम 3 उम्मीदवारी प्रस्तावित कर सकता है; एक ही चक्र में दोहराव अस्वीकार किए जाते हैं।", + parliamentRulesElection: "विजेता वह उम्मीदवारी है जिसे समाधान के समय सबसे अधिक मत प्राप्त हों।", + parliamentRulesTies: "टाई-ब्रेक क्रम: सर्वोच्च निवासी कर्म; यदि बराबर, सबसे पुरानी प्रोफ़ाइल; यदि अभी भी बराबर, सबसे पहला प्रस्ताव; फिर शब्दकोषीय ID द्वारा।", + parliamentRulesFallback: "यदि कोई मत नहीं देता, तो नवीनतम प्रस्तावित उम्मीदवारी जीतती है। यदि कोई उम्मीदवारी नहीं है, तो एक यादृच्छिक जनजाति चुनी जाती है।", + parliamentRulesTerm: "सरकार टैब वर्तमान सरकार और आँकड़े दिखाता है।", + parliamentRulesMethods: "रूप: अराजकता (साधारण बहुमत), लोकतंत्र (50%+1), बहुमत (80%), अल्पमत (20%), कर्मतंत्र (सर्वोच्च-कर्म प्रस्ताव), तानाशाही (तत्काल अनुमोदन)।", + parliamentRulesAnarchy: "अराजकता डिफ़ॉल्ट मोड है: यदि समाधान पर कोई उम्मीदवारी नहीं चुनी जाती, तो अराजकता घोषित होती है। अराजकता के तहत, कोई भी निवासी कानून प्रस्तावित कर सकता है।", + parliamentRulesProposals: "यदि आप सत्तारूढ़ निवासी हैं या सत्तारूढ़ जनजाति के सदस्य हैं, तो आप कानून प्रस्ताव प्रकाशित कर सकते हैं। गैर-तानाशाही पद्धतियाँ सार्वजनिक मतदान बनाती हैं।", + parliamentRulesLimit: "प्रत्येक निवासी प्रति चक्र अधिकतम 3 कानून प्रस्ताव प्रकाशित कर सकता है।", + parliamentRulesLaws: "जब कोई प्रस्ताव अपनी सीमा पूरी करता है, तो वह कानून बन जाता है और कानून टैब में लागू होने की तिथि के साथ दिखाई देता है।", + parliamentRulesHistorical: "ऐतिहासिक टैब में आप हर सरकारी चक्र और उसके प्रबंधन का डेटा देख सकते हैं।", + parliamentRulesLeaders: "नेता टैब में आप उन निवासियों/जनजातियों की रैंकिंग देख सकते हैं जिन्होंने शासन किया है (या उम्मीदवार रहे हैं), दक्षता के अनुसार क्रमबद्ध।", + parliamentProposalVoteStatusLabel: "मत स्थिति", + parliamentProposalOnTrackYes: "सीमा पूरी हुई", + parliamentProposalOnTrackNo: "सीमा से नीचे", + courtsTitle: "न्यायालय", + courtsDescription: "विवाद समाधान और सामूहिक न्याय प्रबंधन के रूपों का अन्वेषण करें।", + courtsFilterCases: "मामले", + courtsFilterMyCases: "मेरे", + courtsFilterJudges: "न्यायाधीश", + courtsFilterHistory: "इतिहास", + courtsFilterRules: "नियम", + courtsFilterOpenCase: "मामला खोलें", + courtsCaseFormTitle: "मामला खोलें", + courtsCaseTitle: "शीर्षक", + courtsCaseRespondent: "आरोपी / प्रतिवादी", + courtsCaseRespondentPh: "Oasis ID (@...) या जनजाति का नाम", + courtsCaseMediatorsAccuser: "मध्यस्थ (वादी)", + courtsCaseMediatorsPh: "Oasis IDs, अल्पविराम से अलग", + courtsCaseMethod: "समाधान पद्धति", + courtsCaseDescription: "विवरण (अधिकतम 1000 अक्षर)", + courtsCaseEvidenceTitle: "मामले के साक्ष्य", + courtsCaseEvidenceHelp: "अपने मामले का समर्थन करने वाली छवियाँ, ऑडियो, दस्तावेज़ (PDF) या वीडियो संलग्न करें।", + courtsCaseSubmit: "मामला दायर करें", + courtsNominateJudge: "न्यायाधीश नामांकित करें", + courtsJudgeId: "न्यायाधीश", + courtsJudgeIdPh: "Oasis ID (@...) या निवासी का नाम", + courtsNominateBtn: "नामांकित करें", + courtsAddEvidence: "साक्ष्य जोड़ें", + courtsEvidenceText: "टेक्स्ट", + courtsEvidenceLink: "लिंक", + courtsEvidenceLinkPh: "https://…", + courtsEvidenceSubmit: "संलग्न करें", + courtsAnswerTitle: "दावे का उत्तर दें", + courtsAnswerText: "प्रतिक्रिया संक्षिप्त", + courtsAnswerSubmit: "प्रतिक्रिया भेजें", + courtsStanceDENY: "अस्वीकार", + courtsStanceADMIT: "स्वीकार", + courtsStancePARTIAL: "आंशिक", + courtsVerdictTitle: "फैसला जारी करें", + courtsVerdictResult: "परिणाम", + courtsVerdictOrders: "आदेश", + courtsVerdictOrdersPh: "कार्रवाई, समय सीमा, पुनर्स्थापनात्मक कदम ...", + courtsIssueVerdict: "फैसला जारी करें", + courtsMediationPropose: "समझौता प्रस्तावित करें", + courtsSettlementText: "शर्तें", + courtsSettlementProposeBtn: "प्रस्तावित करें", + courtsNominationsTitle: "न्यायिक नामांकन", + courtsThJudge: "न्यायाधीश", + courtsThSupports: "समर्थन", + courtsThDate: "दिनांक", + courtsThVote: "मत", + courtsNoNominations: "अभी तक कोई नामांकन नहीं।", + courtsAccuser: "वादी", + courtsRespondent: "प्रतिवादी", + courtsThStatus: "स्थिति", + courtsThAnswerBy: "उत्तर द्वारा", + courtsThEvidenceBy: "साक्ष्य द्वारा", + courtsThDecisionBy: "निर्णय द्वारा", + courtsThCase: "मामला", + courtsThCreatedAt: "प्रारंभ तिथि", + courtsThActions: "कार्रवाई", + courtsCaseMediatorsRespondentTitle: "बचाव मध्यस्थ जोड़ें", + courtsCaseMediatorsRespondent: "मध्यस्थ (बचाव)", + courtsMediatorsAccuserLabel: "मध्यस्थ (वादी)", + courtsMediatorsRespondentLabel: "मध्यस्थ (बचाव)", + courtsMediatorsSubmit: "मध्यस्थ सहेजें", + courtsVotesNeeded: "आवश्यक मत", + courtsVotesSlashTotal: "हाँ / कुल", + courtsOpenVote: "मतदान खोलें", + courtsPublicPrefLabel: "समाधान के बाद दृश्यता", + courtsPublicPrefYes: "मैं सहमत हूँ कि यह मामला पूर्ण रूप से सार्वजनिक हो सकता है", + courtsPublicPrefNo: "मैं विवरण निजी रखना पसंद करता हूँ", + courtsPublicPrefSubmit: "दृश्यता प्राथमिकता सहेजें", + courtsNoCases: "कोई मामला नहीं।", + courtsNoMyCases: "आपका अभी तक कोई विवाद नहीं है।", + courtsNoHistory: "अभी तक कोई दर्ज मुकदमा नहीं।", + courtsMethodJUDGE: "न्यायाधीश", + courtsMethodDICTATOR: "तानाशाह", + courtsMethodPOPULAR: "लोकप्रिय", + courtsMethodMEDIATION: "मध्यस्थता", + courtsMethodKARMATOCRACY: "कर्मतंत्र", + courtsMethod: "पद्धति", + courtsRulesTitle: "न्यायालय कैसे काम करते हैं", + courtsRulesIntro: "न्यायालय विवादों को हल करने और पुनर्स्थापनात्मक न्याय को बढ़ावा देने की एक सामुदायिक प्रक्रिया है। संवाद, स्पष्ट साक्ष्य और आनुपातिक उपायों को प्राथमिकता दी जाती है।", + courtsRulesLifecycle: "प्रक्रिया: 1) मामला खोलें 2) पद्धति चुनें 3) साक्ष्य प्रस्तुत करें 4) सुनवाई और विचार-विमर्श 5) फैसला और उपाय 6) अनुपालन और समापन 7) अपील (यदि लागू हो)।", + courtsRulesRoles: "वादी: मामला खोलता है। बचाव: आरोपित व्यक्ति या जनजाति। पद्धति: समुदाय द्वारा चुनी गई व्यवस्था जो सुविधा प्रदान करती है, साक्ष्य का मूल्यांकन करती है, और फैसला जारी करती है। गवाह: गवाही या साक्ष्य प्रदान करता है। मध्यस्थ: वादी और/या बचाव द्वारा आमंत्रित तटस्थ लोग, जिनकी सभी विवरणों तक पहुँच है, जो विवाद को शांत करने और समझौते सह-निर्माण करने में मदद करते हैं।", + courtsRulesEvidence: "विवरण अधिकतम 1000 अक्षर। प्रासंगिक और वैध छवियाँ, ऑडियो, वीडियो और PDF दस्तावेज़ संलग्न करें। सहमति के बिना संवेदनशील निजी डेटा साझा न करें।", + courtsRulesDeliberation: "सुनवाई सार्वजनिक या निजी हो सकती है। न्यायाधीश सम्मान सुनिश्चित करते हैं, स्पष्टीकरण का अनुरोध करते हैं, और अप्रासंगिक या गैरकानूनी सामग्री को हटा सकते हैं।", + courtsRulesVerdict: "पुनर्स्थापना को प्राथमिकता दी जाती है: क्षमा याचना, मध्यस्थता समझौते, सामग्री मॉडरेशन, अस्थायी प्रतिबंध, या अन्य आनुपातिक उपाय। तर्क दर्ज किया जाना चाहिए।", + courtsRulesAppeals: "अपील: नए साक्ष्य या स्पष्ट प्रक्रियात्मक त्रुटि होने पर अनुमति है। अन्यथा कहा न जाए तो 7 दिनों के भीतर दायर की जानी चाहिए।", + courtsRulesPrivacy: "गोपनीयता और सुरक्षा का सम्मान करें। डॉक्सिंग, घृणा, या धमकियाँ हटा दी जाती हैं। न्यायाधीश जोखिम वाले लोगों की सुरक्षा के लिए रिकॉर्ड के भागों को संपादित या सील कर सकते हैं।", + courtsRulesMisconduct: "उत्पीड़न, हेरफेर, या मनगढ़ंत साक्ष्य तत्काल नकारात्मक समाधान का कारण बन सकते हैं।", + courtsRulesGlossary: "मामला: विवाद का रिकॉर्ड। साक्ष्य: दावों का समर्थन करने वाली सामग्री। फैसला: उपाय के साथ निर्णय। अपील: फैसले की समीक्षा का अनुरोध।", + courtsFilterActions: "कार्रवाई", + courtsNoActions: "आपकी भूमिका के लिए कोई लंबित कार्रवाई नहीं।", + courtsCaseTitlePlaceholder: "विवाद का संक्षिप्त विवरण", + courtsCaseSeverity: "गंभीरता", + courtsCaseSeverityNone: "कोई गंभीरता टैग नहीं", + courtsCaseSeverityLOW: "कम", + courtsCaseSeverityMEDIUM: "मध्यम", + courtsCaseSeverityHIGH: "उच्च", + courtsCaseSeverityCRITICAL: "गंभीर", + courtsCaseSubject: "विषय", + courtsCaseSubjectNone: "कोई विषय टैग नहीं", + courtsCaseSubjectBEHAVIOUR: "व्यवहार", + courtsCaseSubjectCONTENT: "सामग्री", + courtsCaseSubjectGOVERNANCE: "शासन / नियम", + courtsCaseSubjectFINANCIAL: "वित्तीय / संसाधन", + courtsCaseSubjectOTHER: "अन्य", + courtsHiddenRespondent: "छुपा हुआ (केवल संबंधित भूमिकाओं को दिखाई देता है)।", + courtsThRole: "भूमिका", + courtsRoleAccuser: "वादी", + courtsRoleDefence: "बचाव", + courtsRoleMediator: "मध्यस्थ", + courtsRoleJudge: "न्यायाधीश", + courtsRoleDictator: "तानाशाह", + courtsAssignJudgeTitle: "न्यायाधीश चुनें", + courtsAssignJudgeBtn: "न्यायाधीश चुनें", + trendingTitle: "ट्रेंडिंग", + exploreTrending: "अपने नेटवर्क में सबसे लोकप्रिय सामग्री खोजें।", + ALLButton: "सभी", + MINEButton: "मेरे", + RECENTButton: "हाल के", + TOPButton: "शीर्ष", + bookmarkButton: "बुकमार्क", + transferButton: "स्थानांतरण", + eventButton: "कार्यक्रम", + taskButton: "कार्य", + votesButton: "मतदान", + reportButton: "रिपोर्ट", + feedButton: "फ़ीड", + marketButton: "बाज़ार", + imageButton: "छवियाँ", + audioButton: "ऑडियो", + videoButton: "वीडियो", + documentButton: "दस्तावेज़", + torrentButton: "टॉरेंट", + author: "द्वारा", + createdAtLabel: "बनाया गया", + totalVotes: "कुल मत", + noTrendingFound: "कोई ट्रेंडिंग सामग्री नहीं मिली।", + noContentMessage: "अभी तक कोई ट्रेंडिंग सामग्री उपलब्ध नहीं।", + trendingDescription: "विवरण", + trendingDate: "दिनांक", + trendingLocation: "स्थान", + trendingPrice: "मूल्य", + trendingUrl: "URL", + trendingCategory: "श्रेणी", + trendingStart: "प्रारंभ", + trendingEnd: "समाप्ति", + trendingPriority: "प्राथमिकता", + trendingStatus: "स्थिति", + trendingFrom: "से", + trendingTo: "को", + trendingConcept: "अवधारणा", + trendingAmount: "राशि", + trendingDeadline: "समय सीमा", + trendingItemStatus: "आइटम स्थिति", + trendingTotalVotes: "कुल मत", + trendingTotalOpinions: "कुल राय", + trendingNoContentMessage: "अभी तक कोई ट्रेंडिंग सामग्री उपलब्ध नहीं।", + trendingAuthor: "द्वारा", + trendingCreatedAtLabel: "बनाया गया", + trendingTotalCount: "कुल संख्या", + tasksTitle: "कार्य", + tasksDescription: "अपने नेटवर्क में कार्य खोजें और प्रबंधित करें।", + taskTitleLabel: "शीर्षक", + taskDescriptionLabel: "विवरण", + taskStartTimeLabel: "प्रारंभ समय", + taskEndTimeLabel: "समाप्ति समय", + taskPriorityLabel: "प्राथमिकता", + taskPrioritySelect: "प्राथमिकता चुनें", + taskPriorityUrgent: "अत्यावश्यक", + taskPriorityHigh: "उच्च", + taskPriorityMedium: "मध्यम", + taskPriorityLow: "कम", + taskLocationLabel: "स्थान", + taskTagsLabel: "टैग", + taskVisibilityLabel: "दृश्यता", + taskPublic: "सार्वजनिक", + taskPrivate: "निजी", + taskCreatedAt: "बनाया गया", + taskBy: "द्वारा", + taskStatus: "स्थिति", + taskStatusOpen: "खुला", + taskStatusInProgress: "प्रगति में", + taskStatusClosed: "बंद", + taskAssignedTo: "को सौंपा गया", + taskAssignees: "सौंपे गए", + taskAssignButton: "मुझे सौंपें", + taskUnassignButton: "सौंपना रद्द करें", + taskCreateButton: "कार्य बनाएँ", + taskUpdateButton: "अपडेट", + taskDeleteButton: "हटाएँ", + taskFilterAll: "सभी", + taskFilterMine: "मेरे", + taskFilterOpen: "खुले", + taskFilterInProgress: "प्रगति में", + taskFilterClosed: "बंद", + taskFilterAssigned: "सौंपे गए", + taskFilterArchived: "संग्रहीत", + taskFilterUrgent: "अत्यावश्यक", + taskFilterHigh: "उच्च", + taskFilterMedium: "मध्यम", + taskFilterLow: "कम", + taskAllSectionTitle: "कार्य", + taskMineSectionTitle: "आपके कार्य", + taskCreateSectionTitle: "कार्य बनाएँ", + taskUpdateSectionTitle: "अपडेट", + taskOpenTitle: "खुले कार्य", + taskInProgressTitle: "प्रगति में कार्य", + taskClosedTitle: "बंद कार्य", + taskAssignedTitle: "सौंपे गए कार्य", + taskArchivedTitle: "संग्रहीत कार्य", + taskPublicTitle: "सार्वजनिक कार्य", + taskPrivateTitle: "निजी कार्य", + notasks: "कोई कार्य उपलब्ध नहीं।", + noLocation: "कोई स्थान निर्दिष्ट नहीं", + taskSetStatus: "स्थिति सेट करें", + eventTitle: "कार्यक्रम", + eventDateLabel: "दिनांक", + eventsTitle: "कार्यक्रम", + eventsDescription: "अपने नेटवर्क में कार्यक्रम खोजें और प्रबंधित करें।", + eventDescription: "विवरण", + eventPrice: "मूल्य", + eventStatus: "स्थिति", + eventOrganizer: "आयोजक", + eventAllSectionTitle: "कार्यक्रम", + eventMineSectionTitle: "आपके कार्यक्रम", + eventArchivedTitle: "संग्रहीत कार्यक्रम", + eventCreateSectionTitle: "कार्यक्रम बनाएँ", + eventUpdateSectionTitle: "कार्यक्रम अपडेट करें", + eventDeleteButton: "हटाएँ", + eventCreateButton: "कार्यक्रम बनाएँ", + eventTitleLabel: "शीर्षक", + eventDescriptionLabel: "विवरण", + eventDescriptionPlaceholder: "कार्यक्रम विवरण दर्ज करें...", + eventUpdateButton: "अपडेट", + eventAttendeesLabel: "उपस्थित", + eventAttendeesPlaceholder: "अल्पविराम से अलग करके उपस्थित दर्ज करें...", + eventTagsLabel: "टैग", + eventTagsPlaceholder: "अल्पविराम से अलग करके कार्यक्रम टैग दर्ज करें...", + eventTags: "टैग", + eventPriceLabel: "मूल्य", + eventUrlLabel: "URL", + eventAttendees: "उपस्थित", + noAttendees: "अभी तक कोई उपस्थित नहीं", + eventCreatedAt: "बनाया गया", + eventLocation: "स्थान", + eventLocationLabel: "स्थान", + eventNoLocation: "कोई स्थान निर्दिष्ट नहीं", + eventNoURL: "कोई URL निर्दिष्ट नहीं", + eventBy: "द्वारा", + noevents: "कोई कार्यक्रम उपलब्ध नहीं।", + eventDate: "दिनांक", + eventDateFormat: "DD:MM:YYYY HH:mm", + eventAttendButton: "कार्यक्रम में शामिल हों", + eventUnattendButton: "कार्यक्रम छोड़ें", + eventCreatedBy: "द्वारा बनाया गया", + eventAttendeesCount: "उपस्थित संख्या", + eventCreatedByYou: "आपने यह कार्यक्रम बनाया", + eventAttendConfirmation: "अब आप इस कार्यक्रम में शामिल हैं", + eventUnattendConfirmation: "अब आप इस कार्यक्रम में शामिल नहीं हैं", + eventFilterAll: "सभी", + eventFilterMine: "मेरे", + eventFilterToday: "आज", + eventFilterWeek: "इस सप्ताह", + eventFilterMonth: "इस महीने", + eventFilterYear: "इस वर्ष", + eventFilterArchived: "संग्रहीत", + eventTodayTitle: "आज के कार्यक्रम", + eventThisWeekTitle: "इस सप्ताह के कार्यक्रम", + eventThisMonthTitle: "इस महीने के कार्यक्रम", + eventThisYearTitle: "इस वर्ष के कार्यक्रम", + eventPrivacyLabel: "दृश्यता", + eventPublic: "सार्वजनिक", + eventPrivate: "निजी", + eventPublicTitle: "सार्वजनिक कार्यक्रम", + eventNoPrice: "निःशुल्क कार्यक्रम", + eventNoImage: "कोई छवि अपलोड नहीं की गई", + eventAttendConfirmation: "अब आप इस कार्यक्रम में शामिल हैं", + eventUnattendConfirmation: "अब आप इस कार्यक्रम में शामिल नहीं हैं", + eventAttended: "शामिल हुए", + eventUnattended: "शामिल नहीं", + eventStatusOpen: "खुला", + eventStatusClosed: "बंद", + tagsTitle: "टैग", + tagsDescription: "अपने नेटवर्क में वर्गीकरण पैटर्न खोजें और अन्वेषण करें।", + tagsAllSectionTitle: "टैग", + tagsTopSectionTitle: "शीर्ष टैग", + tagsCloudSectionTitle: "टैग क्लाउड", + tagsFilterAll: "सभी", + tagsFilterTop: "शीर्ष", + tagsFilterCloud: "क्लाउड", + tagsNoItems: "कोई टैग उपलब्ध नहीं।", + tagsTableHeaderTag: "टैग/लिंक:", + tagsTableHeaderCount: "गणना:", + transfersTitle: "स्थानांतरण", + transfersDescription: "अपने नेटवर्क में स्थानांतरण खोजें और प्रबंधित करें।", + transfersFrom: "से", + transfersTo: "को", + transfersFilterAll: "सभी", + transfersFilterMine: "मेरे", + transfersFilterUBI: "UBI", + transfersFilterMarket: "बाज़ार", + transfersFilterTop: "शीर्ष", + transfersFilterPending: "लंबित", + transfersFilterUnconfirmed: "अपुष्ट", + transfersFilterClosed: "बंद", + transfersFilterDiscarded: "निरस्त", + transfersCreateButton: "स्थानांतरण बनाएँ", + transfersUpdateButton: "अपडेट", + transfersDeleteButton: "हटाएँ", + transfersToUser: "ओएसिस ID", + transfersToUserValidation: "वैध Oasis ID, जैसे @…=.ed25519", + transfersConcept: "अवधारणा", + transfersAmount: "राशि", + transfersDeadline: "समय सीमा", + transfersTags: "टैग", + transfersStatus: "स्थिति", + transfersStatusUnconfirmed: "अपुष्ट", + transfersStatusClosed: "बंद", + transfersStatusDiscarded: "निरस्त", + transfersCreatedAt: "बनाया गया", + transfersConfirmations: "पुष्टि", + transfersConfirmButton: "स्थानांतरण पुष्टि करें", + transfersNoItems: "कोई स्थानांतरण नहीं मिला।", + transfersMineSectionTitle: "आपके स्थानांतरण", + transfersUBISectionTitle: "UBI स्थानांतरण", + transfersMarketSectionTitle: "बाज़ार स्थानांतरण", + transfersTopSectionTitle: "शीर्ष स्थानांतरण", + transfersPendingSectionTitle: "लंबित स्थानांतरण", + transfersUnconfirmedSectionTitle: "अपुष्ट स्थानांतरण", + transfersClosedSectionTitle: "बंद स्थानांतरण", + transfersDiscardedSectionTitle: "निरस्त स्थानांतरण", + transfersCreateSectionTitle: "स्थानांतरण बनाएँ", + transfersAllSectionTitle: "स्थानांतरण", + transfersFilterFavs: "पसंदीदा", + transfersFavsSectionTitle: "पसंदीदा स्थानांतरण", + transfersSearchLabel: "खोज", + transfersSearchPlaceholder: "अवधारणा, टैग, उपयोगकर्ता खोजें...", + transfersMinAmountLabel: "न्यूनतम राशि", + transfersMaxAmountLabel: "अधिकतम राशि", + transfersSortLabel: "क्रमबद्ध करें", + transfersSortRecent: "सबसे हाल का", + transfersSortAmount: "सबसे अधिक राशि", + transfersSortDeadline: "निकटतम समय सीमा", + transfersSearchButton: "खोजें", + transfersFavoriteButton: "पसंदीदा", + transfersUnfavoriteButton: "पसंदीदा हटाएँ", + transfersMessageUserButton: "संदेश", + transfersExpiringSoonBadge: "समाप्त हो रहा है", + transfersExpiredBadge: "समाप्त", + transfersUpdatedAt: "अपडेट किया गया", + transfersNoMatch: "आपकी खोज से कोई स्थानांतरण मेल नहीं खाता।", + votationsTitle: "मतदान", + votationsDescription: "अपने नेटवर्क में मतदान खोजें और प्रबंधित करें।", + voteMineSectionTitle: "आपके मतदान", + voteCreateSectionTitle: "मतदान बनाएँ", + voteUpdateSectionTitle: "अपडेट", + voteOpenTitle: "खुले मतदान", + voteClosedTitle: "बंद मतदान", + voteAllSectionTitle: "मतदान", + voteCreateButton: "मतदान बनाएँ", + voteUpdateButton: "अपडेट", + voteDeleteButton: "हटाएँ", + voteOptionYes: "हाँ", + voteOptionNo: "नहीं", + voteOptionAbstention: "तटस्थता", + voteConfused: "भ्रमित", + voteFollowMajority: "बहुमत का पालन करें", + voteNotInterested: "रुचि नहीं", + voteFilterAll: "सभी", + voteFilterMine: "मेरे", + voteFilterOpen: "खुले", + voteFilterClosed: "बंद", + voteQuestionLabel: "प्रश्न", + voteDeadlineLabel: "समय सीमा", + voteOptionsLabel: "आपका मत", + voteBreakdown: "विश्लेषण", + voteFinalResult: "परिणाम", + voteTagsLabel: "टैग", + voteDeadline: "समय सीमा", + voteStatus: "स्थिति", + voteTotalVotes: "कुल मत", + voteTags: "टैग", + voteOpinions: "राय", + novotes: "कोई मतदान प्रस्ताव उपलब्ध नहीं।", + voteBy: "द्वारा", + voteCreatedAt: "बनाया गया", + voteNoQuestion: "कोई प्रश्न प्रदान नहीं किया गया", + voteUnknownCreator: "अज्ञात निर्माता", + voteUnknownDate: "अज्ञात दिनांक", + errorVoteNotFound: "मत नहीं मिला", + errorAlreadyVoted: "आपने पहले ही राय दे दी है।", + errorVoteClosedCannotEdit: "आप बंद मतदान को संपादित नहीं कर सकते", + errorVoteDeadlinePassed: "इस मतदान की समय सीमा बीत चुकी है", + errorRetrievingVote: "मत प्राप्त करने में त्रुटि", + errorCreatingVote: "मत बनाने में त्रुटि", + errorVoteAlreadyVoted: "राय दिए जाने के बाद संपादित नहीं किया जा सकता", + errorDeletingOldVote: "पुरानी राय हटाने में त्रुटि", + errorCreatingUpdatedVote: "अपडेटेड राय बनाने में त्रुटि", + errorCreatingTombstone: "टॉम्बस्टोन बनाने में त्रुटि", + voteDetailSectionTitle: 'मत विवरण', + voteCommentsLabel: 'टिप्पणियाँ', + voteCommentsForumButton: 'चर्चा खोलें', + voteCommentsSectionTitle: 'चर्चा खोलें', + voteNoCommentsYet: 'अभी तक कोई टिप्पणी नहीं है। पहले उत्तर देने वाले बनें।', + voteNewCommentPlaceholder: 'अपनी टिप्पणी यहाँ लिखें…', + voteNewCommentButton: 'टिप्पणी पोस्ट करें', + voteNewCommentLabel: 'टिप्पणी जोड़ें', + cvTitle: "CV", + cvLabel: "बायोडाटा (CV)", + cvEditSectionTitle: "CV संपादित करें", + cvCreateSectionTitle: "CV बनाएँ", + cvDescription: "अपने पेशेवर कौशल और जानकारी प्रबंधित करें और साझा करें।", + cvNameLabel: "पूरा नाम", + cvDescriptionLabel: "सारांश", + cvPhotoLabel: "फ़ोटो", + cvPersonalExperiencesLabel: "व्यक्तिगत अनुभव", + cvPersonalSkillsLabel: "व्यक्तिगत कौशल (अल्पविराम से अलग)", + cvOasisExperiencesLabel: "Oasis योगदान अनुभव", + cvOasisSkillsLabel: "Oasis योगदान कौशल (अल्पविराम से अलग)", + cvEducationExperiencesLabel: "शैक्षिक अनुभव", + cvEducationalSkillsLabel: "शैक्षिक कौशल (अल्पविराम से अलग)", + cvProfessionalExperiencesLabel: "पेशेवर अनुभव", + cvProfessionalSkillsLabel: "पेशेवर कौशल (अल्पविराम से अलग)", + cvLanguagesLabel: "भाषाएँ", + cvLocationLabel: "स्थान", + cvStatusLabel: "स्थिति", + cvPreferencesLabel: "प्राथमिकताएँ", + cvOasisContributorLabel: "Oasis योगदानकर्ता", + cvPersonal: "व्यक्तिगत", + cvOasis: "Oasis योगदानकर्ता (वैकल्पिक)", + cvOasisContributorView: "Oasis योगदान", + cvEducational: "शैक्षिक (वैकल्पिक)", + cvEducationalView: "शैक्षिक", + cvProfessional: "पेशेवर (वैकल्पिक)", + cvProfessionalView: "पेशेवर", + cvAvailability: "उपलब्धता (वैकल्पिक)", + cvAvailabilityView: "उपलब्धता", + cvUpdateButton: "अपडेट", + cvCreateButton: "CV बनाएँ", + cvContactLabel: "संपर्क", + cvCreatedAt: "बनाया गया", + cvUpdatedAt: "अपडेट किया गया", + cvEditButton: "अपडेट", + cvDeleteButton: "हटाएँ", + cvNoCV: "कोई CV नहीं मिला।", + blogSubject: "विषय", + blogMessage: "संदेश", + blogImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + blogPublish: "पूर्वावलोकन", + noPopularMessages: "अभी तक कोई लोकप्रिय संदेश प्रकाशित नहीं हुआ", + forumTitle: "मंच", + forumCategoryLabel: "श्रेणी", + forumTitleLabel: "शीर्षक", + forumTitlePlaceholder: "मंच शीर्षक...", + forumCreateButton: "मंच बनाएँ", + forumCreateSectionTitle: "मंच बनाएँ", + forumDescription: "अपने नेटवर्क के अन्य निवासियों से खुलकर बात करें।", + forumFilterAll: "सभी", + forumFilterMine: "मेरे", + forumFilterRecent: "हाल के", + forumFilterTop: "शीर्ष", + forumMineSectionTitle: "आपके मंच", + forumRecentSectionTitle: "हाल के मंच", + forumAllSectionTitle: "मंच", + forumDeleteButton: "हटाएँ", + forumParticipants: "प्रतिभागी", + forumMessages: "संदेश", + forumLastMessage: "अंतिम संदेश", + forumMessageLabel: "संदेश", + forumMessagePlaceholder: "अपना संदेश लिखें...", + forumSendButton: "भेजें", + forumVisitForum: "मंच देखें", + noForums: "कोई मंच नहीं मिला।", + forumVisitButton: "मंच देखें", + forumCatGENERAL: "सामान्य", + forumCatOASIS: "Oasis", + forumCatLARP: "L.A.R.P.", + forumCatPOLITICS: "राजनीति", + forumCatTECH: "प्रौद्योगिकी", + forumCatSCIENCE: "विज्ञान", + forumCatMUSIC: "संगीत", + forumCatART: "कला", + forumCatGAMING: "गेमिंग", + forumCatBOOKS: "पुस्तकें", + forumCatFILMS: "फ़िल्में", + forumCatPHILOSOPHY: "दर्शन", + forumCatSOCIETY: "समाज", + forumCatPRIVACY: "गोपनीयता", + forumCatCYBERWARFARE: "साइबरयुद्ध", + forumCatSURVIVALISM: "जीवनवाद", + imageTitle: "छवियाँ", + imageDescription: "अपने नेटवर्क में छवि सामग्री खोजें और प्रबंधित करें।", + imagePluginTitle: "शीर्षक", + imagePluginDescription: "विवरण", + imageMineSectionTitle: "आपकी छवियाँ", + imageCreateSectionTitle: "छवि अपलोड करें", + imageUpdateSectionTitle: "छवि अपडेट करें", + imageAllSectionTitle: "छवियाँ", + imageRecentSectionTitle: "हाल की छवियाँ", + imageTopSectionTitle: "शीर्ष छवियाँ", + imageFavoritesSectionTitle: "पसंदीदा", + imageGallerySectionTitle: "गैलरी", + imageMemeSectionTitle: "मीम्स", + imageFilterAll: "सभी", + imageFilterMine: "मेरे", + imageFilterRecent: "हाल के", + imageFilterTop: "शीर्ष", + imageFilterFavorites: "पसंदीदा", + imageFilterGallery: "गैलरी", + imageFilterMeme: "मीम्स", + imageCreateButton: "छवि अपलोड करें", + imageUpdateButton: "अपडेट", + imageDeleteButton: "हटाएँ", + imageAddFavoriteButton: "पसंदीदा जोड़ें", + imageRemoveFavoriteButton: "पसंदीदा हटाएँ", + imageFileLabel: "छवि फ़ाइल चुनें (.jpeg, .jpg, .png, .gif)", + imageTagsLabel: "टैग", + imageTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + imageTitleLabel: "शीर्षक", + imageTitlePlaceholder: "वैकल्पिक", + imageDescriptionLabel: "विवरण", + imageDescriptionPlaceholder: "वैकल्पिक", + imageMemeLabel: "मीम के रूप में चिह्नित करें", + imageNoFile: "कोई छवि फ़ाइल प्रदान नहीं की गई", + noImages: "कोई छवि उपलब्ध नहीं।", + imageSearchPlaceholder: "शीर्षक, टैग, विवरण, लेखक खोजें...", + imageSortRecent: "सबसे हाल का", + imageSortOldest: "सबसे पुराना", + imageSortTop: "सर्वाधिक मतदान", + imageSearchButton: "खोजें", + imageMessageAuthorButton: "संदेश", + imageUpdatedAt: "अपडेट किया गया", + imageNoMatch: "आपकी खोज से कोई छवि मेल नहीं खाती।", + feedTitle: "फ़ीड", + createFeedTitle: "फ़ीड बनाएँ", + createFeedButton: "फ़ीड भेजें!", + feedPlaceholder: "क्या हो रहा है? (अधिकतम 280 अक्षर)", + ALLButton: "फ़ीड", + MINEButton: "आपकी फ़ीड", + TODAYButton: "आज", + TOPButton: "शीर्ष फ़ीड", + CREATEButton: "फ़ीड बनाएँ", + totalOpinions: "कुल राय", + moreVoted: "अधिक मतदान", + alreadyVoted: "आपने पहले ही राय दे दी है।", + noFeedsFound: "कोई फ़ीड नहीं मिली।", + author: "द्वारा", + createdAtLabel: "बनाया गया", + FeedshareYourOpinions: "अपने नेटवर्क में लघु-पाठ खोजें और साझा करें।", + refeedButton: "रीफ़ीड", + alreadyRefeeded: "आपने इसे पहले ही रीफ़ीड कर दिया है।", + activityTitle: "गतिविधि", + yourActivity: "आपकी गतिविधि", + globalActivity: "वैश्विक गतिविधि", + activityList: "गतिविधि", + activityDesc: "अपने नेटवर्क में नवीनतम गतिविधि देखें।", + allButton: "सभी", + mineButton: "मेरे", + noActions: "कोई गतिविधि उपलब्ध नहीं।", + performed: "→", + from: "से", + to: "को", + amount: "राशि", + concept: "अवधारणा", + description: "विवरण", + meme: "मीम", + activityContact: "संपर्क", + activityBy: "नाम", + activityPixelia: "नया पिक्सेल जोड़ा गया", + viewImage: "छवि देखें", + playAudio: "ऑडियो चलाएँ", + playVideo: "वीडियो चलाएँ", + typeRecent: "हाल के", + errorActivity: "गतिविधि प्राप्त करने में त्रुटि", + typePost: "पोस्ट", + typeTribe: "जनजातियाँ", + typeAbout: "निवासी", + typeCurriculum: "CV", + typeImage: "छवियाँ", + typeBookmark: "बुकमार्क", + typeDocument: "दस्तावेज़", + typeVotes: "मतदान", + typeAudio: "ऑडियो", + typeMarket: "बाज़ार", + typeJob: "नौकरियाँ", + typeProject: "परियोजनाएँ", + typeVideo: "वीडियो", + typeVote: "प्रसार", + typeEvent: "कार्यक्रम", + typeTransfer: "स्थानांतरण", + typeTask: "कार्य", + typePixelia: "पिक्सेलिया", + typeForum: "मंच", + typeReport: "रिपोर्ट", + typeFeed: "फ़ीड", + typeContact: "संपर्क", + typePub: "PUB", + typeTombstone: "टॉम्बस्टोन", + typeBanking: "बैंकिंग", + typeBankWallet: "बैंकिंग/वॉलेट", + typeBankClaim: "बैंकिंग/UBI", + typeKarmaScore: "कर्मा", + typeParliament: "संसद", + typeSpread: "प्रसार", + typeParliamentCandidature: "संसद · उम्मीदवारी", + typeParliamentTerm: "संसद · कार्यकाल", + typeParliamentProposal:"संसद · प्रस्ताव", + typeParliamentRevocation:"संसद · निरसन", + typeParliamentLaw: "संसद · नया कानून", + typeCourts: "न्यायालय", + typeCourtsCase: "न्यायालय · मामला", + typeCourtsEvidence: "न्यायालय · साक्ष्य", + typeCourtsAnswer: "न्यायालय · उत्तर", + typeCourtsVerdict: "न्यायालय · फैसला", + typeCourtsSettlement: "न्यायालय · समझौता", + typeCourtsSettlementProposal: "न्यायालय · समझौता प्रस्ताव", + typeCourtsSettlementAccepted: "न्यायालय · समझौता स्वीकृत", + typeCourtsNomination: "न्यायालय · नामांकन", + typeCourtsNominationVote: "न्यायालय · नामांकन मत", + activitySupport: "नया गठबंधन बना", + activityJoin: "नए PUB में शामिल हुए", + question: "प्रश्न", + deadline: "समय सीमा", + status: "स्थिति", + votes: "मत", + totalVotes: "कुल मत", + voteTotalVotes: "कुल मत", + name: "नाम", + skills: "कौशल", + tags: "टैग", + title: "शीर्षक", + date: "दिनांक", + category: "श्रेणी", + attendees: "उपस्थित", + activitySpread: "->", + visitLink: "लिंक देखें", + viewDocument: "दस्तावेज़ देखें", + location: "स्थान", + contentWarning: "विषय", + personName: "निवासी का नाम", + bankWalletConnected: "ECOin वॉलेट", + bankUbiReceived: "UBI प्राप्त", + bankTx: "Tx", + bankEpochShort: "युग", + bankAllocId: "आवंटन ID", + bankingUserEngagementScore: "कर्म स्कोरिंग", + viewDetails: "विवरण देखें", + link: "लिंक", + aiSnippetsLearned: "सीखे गए अंश", + tribeFeedRefeeds: "रीफ़ीड", + activityProjectFollow: "%OASIS% अब इस परियोजना %PROJECT% को %ACTION% कर रहा है", + activityProjectUnfollow: "%OASIS% अब इस परियोजना %PROJECT% को %ACTION% कर रहा है", + activityProjectPledged: "%OASIS% ने परियोजना %PROJECT% को %AMOUNT% %ACTION% किया है", + following: "फ़ॉलो कर रहे हैं", + unfollowing: "अनफ़ॉलो कर रहे हैं", + pledged: "प्रतिज्ञा", + parliamentCandidatureId: "उम्मीदवारी", + parliamentGovMethod: "पद्धति", + parliamentVotesReceived: "प्राप्त मत", + parliamentMethodANARCHY: "अराजकता", + parliamentMethodVOTE: "सामुदायिक मत", + parliamentMethodRANKED: "रैंक्ड चॉइस", + parliamentMethodPLURALITY: "बहुलता", + parliamentMethodCOUNCIL: "परिषद", + parliamentMethodJURY: "जूरी", + parliamentAnarchy: "अराजकता", + parliamentElectionsStart: "चुनाव प्रारंभ", + parliamentElectionsEnd: "चुनाव समाप्ति", + parliamentCurrentLeader: "विजयी उम्मीदवारी", + parliamentProposalTitle: "शीर्षक", + parliamentOpenVote: "मतदान खोलें", + parliamentStatus: "स्थिति", + parliamentLawQuestion: "प्रश्न", + parliamentLawMethod: "पद्धति", + parliamentLawProposer: "प्रस्तावक", + parliamentLawEnacted: "लागू किया गया", + parliamentLawVotes: "मत", + createdAt: "बनाया गया", + courtsCaseTitle: "मामला", + courtsMethod: "पद्धति", + courtsMethodJUDGE: "न्यायाधीश", + courtsMethodJUDGES: "न्यायाधीश पैनल", + courtsMethodSINGLE_JUDGE: "एकल न्यायाधीश", + courtsMethodJURY: "जूरी", + courtsMethodCOUNCIL: "परिषद", + courtsMethodCOMMUNITY: "समुदाय", + courtsMethodMEDIATION: "मध्यस्थता", + courtsMethodARBITRATION: "मध्यस्थता", + courtsMethodVOTE: "सामुदायिक मत", + courtsAccuser: "वादी", + courtsRespondent: "प्रतिवादी", + courtsThStatus: "स्थिति", + courtsThAnswerBy: "उत्तर द्वारा", + courtsThEvidenceBy: "साक्ष्य द्वारा", + courtsThDecisionBy: "निर्णय द्वारा", + courtsVotesNeeded: "आवश्यक मत", + courtsVotesSlashTotal: "हाँ/कुल", + courtsOpenVote: "मतदान खोलें", + courtsAnswerTitle: "उत्तर", + courtsStanceADMIT: "स्वीकार", + courtsStanceDENY: "अस्वीकार", + courtsStancePARTIAL: "आंशिक", + courtsStanceCOUNTERCLAIM: "प्रतिदावा", + courtsStanceNEUTRAL: "तटस्थ", + courtsVerdictResult: "परिणाम", + courtsVerdictOrders: "आदेश", + courtsSettlementText: "समझौता", + courtsSettlementAccepted: "स्वीकृत", + courtsSettlementPending: "लंबित", + courtsJudge: "न्यायाधीश", + courtsThSupports: "समर्थन", + courtsFilterOpenCase: 'मामला खोलें', + courtsEvidenceFileLabel: 'साक्ष्य फ़ाइल (छवि, ऑडियो, वीडियो या PDF)', + courtsCaseMediators: 'मध्यस्थ', + courtsCaseMediatorsPh: 'मध्यस्थ Oasis IDs, अल्पविराम से अलग', + courtsMediatorsLabel: 'मध्यस्थ', + courtsThCase: 'मामला', + courtsThCreatedAt: 'प्रारंभ तिथि', + courtsThActions: 'कार्रवाई', + courtsPublicPrefLabel: 'समाधान के बाद दृश्यता', + courtsPublicPrefYes: 'मैं सहमत हूँ कि यह मामला पूर्ण रूप से सार्वजनिक हो सकता है', + courtsPublicPrefNo: 'मैं विवरण निजी रखना पसंद करता हूँ', + courtsPublicPrefSubmit: 'दृश्यता प्राथमिकता सहेजें', + courtsMethodMEDIATION: 'मध्यस्थता', + courtsNoCases: 'कोई मामला नहीं।', + reportsTitle: "रिपोर्ट", + reportsDescription: "अपने नेटवर्क में मुद्दों, बग, दुरुपयोग और सामग्री चेतावनियों से संबंधित रिपोर्ट प्रबंधित करें और ट्रैक करें।", + reportsFilterAll: "सभी", + reportsFilterMine: "मेरे", + reportsFilterFeatures: "सुविधाएँ", + reportsFilterBugs: "बग", + reportsFilterAbuse: "दुरुपयोग", + reportsFilterContent: "सामग्री", + reportsFilterConfirmed: "पुष्ट", + reportsFilterResolved: "हल किया गया", + reportsFilterOpen: "खुले", + reportsFilterUnderReview: "समीक्षाधीन", + reportsFilterInvalid: "अमान्य", + reportsCreateButton: "रिपोर्ट बनाएँ", + reportsTitleLabel: "शीर्षक", + reportsDescriptionLabel: "विवरण", + reportsDescriptionPlaceholder: "कृपया विस्तृत विवरण प्रदान करें।", + reportsCategory: "श्रेणी", + reportsCategoryLabel: "श्रेणी", + reportsCategoryFeatures: "सुविधाएँ", + reportsCategoryBugs: "बग", + reportsCategoryAbuse: "दुरुपयोग", + reportsCategoryContent: "सामग्री समस्याएँ", + reportsUpdateButton: "अपडेट", + reportsDeleteButton: "हटाएँ", + reportsDateLabel: "दिनांक", + reportsUploadFile: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + reportsCreatedBy: "द्वारा", + reportsMineSectionTitle: "आपकी रिपोर्ट", + reportsFeaturesSectionTitle: "सुविधा अनुरोध", + reportsBugsSectionTitle: "बग", + reportsAbuseSectionTitle: "दुरुपयोग रिपोर्ट", + reportsContentSectionTitle: "सामग्री समस्याएँ", + reportsAllSectionTitle: "रिपोर्ट", + reportsNoItems: "कोई रिपोर्ट उपलब्ध नहीं।", + reportsValidationTitle: "कृपया एक वैध शीर्षक दर्ज करें।", + reportsValidationDescription: "विवरण खाली नहीं हो सकता।", + reportsValidationCategory: "कृपया एक श्रेणी चुनें।", + reportsCreatedAt: "बनाया गया", + reportsCreatedBy: "द्वारा", + reportsSeverity: "गंभीरता", + reportsSeverityLow: "कम", + reportsSeverityMedium: "मध्यम", + reportsSeverityHigh: "उच्च", + reportsSeverityCritical: "गंभीर", + reportsStatus: "स्थिति", + reportsStatusOpen: "खुला", + reportsStatusUnderReview: "समीक्षाधीन", + reportsStatusResolved: "हल किया गया", + reportsStatusInvalid: "अमान्य", + reportsUpdateStatusButton: "स्थिति अपडेट करें", + reportsAnonymityOption: "गुमनाम रूप से जमा करें", + reportsAnonymousAuthor: "गुमनाम", + reportsConfirmButton: "रिपोर्ट पुष्टि करें!", + reportsConfirmations: "पुष्टि", + reportsConfirmedSectionTitle: "पुष्ट रिपोर्ट", + reportsCreateTaskButton: "कार्य बनाएँ", + reportsOpenSectionTitle: "खुली रिपोर्ट", + reportsUnderReviewSectionTitle: "समीक्षाधीन रिपोर्ट", + reportsResolvedSectionTitle: "हल की गई रिपोर्ट", + reportsInvalidSectionTitle: "अमान्य रिपोर्ट", + reportsTemplateSectionTitle: 'रिपोर्ट टेम्पलेट', + reportsBugTemplateTitle: 'पुनरुत्पादन विवरण (बग)', + reportsFeatureTemplateTitle: 'विवरण (सुविधाएँ)', + reportsAbuseTemplateTitle: 'विवरण (दुरुपयोग)', + reportsContentTemplateTitle: 'विवरण (सामग्री समस्याएँ)', + reportsStepsToReproduceLabel: 'पुनरुत्पादन के चरण', + reportsStepsToReproducePlaceholder: '1) ...\n2) ...\n3) ...', + reportsExpectedBehaviorLabel: 'अपेक्षित परिणाम', + reportsExpectedBehaviorPlaceholder: 'क्या होना चाहिए?', + reportsActualBehaviorLabel: 'वास्तविक परिणाम', + reportsActualBehaviorPlaceholder: 'वास्तव में क्या होता है?', + reportsEnvironmentLabel: 'वातावरण', + reportsEnvironmentPlaceholder: 'संस्करण, उपकरण, OS, ब्राउज़र, सेटिंग्स, लॉग, आदि।', + reportsReproduceRateLabel: 'पुनरुत्पादन दर', + reportsReproduceRateAlways: 'हमेशा', + reportsReproduceRateOften: 'अक्सर', + reportsReproduceRateSometimes: 'कभी-कभी', + reportsReproduceRateRarely: 'शायद ही कभी', + reportsReproduceRateUnable: 'पुनरुत्पादन करने में असमर्थ', + reportsReproduceRateUnknown: 'निर्दिष्ट नहीं', + reportsProblemStatementLabel: 'समस्या / आवश्यकता', + reportsProblemStatementPlaceholder: 'यह सुविधा कौन सी समस्या हल करती है?', + reportsUserStoryLabel: 'निवासी कहानी', + reportsUserStoryPlaceholder: 'एक <निवासी> के रूप में, मैं <कार्रवाई> चाहता हूँ, ताकि <लाभ>।', + reportsAcceptanceCriteriaLabel: 'स्वीकृति मानदंड', + reportsAcceptanceCriteriaPlaceholder: '- दिया गया...\n- जब...\n- तब...', + reportsWhatHappenedLabel: 'क्या हुआ?', + reportsWhatHappenedPlaceholder: 'संदर्भ और अनुमानित तिथियों के साथ घटना का वर्णन करें।', + reportsReportedUserLabel: 'रिपोर्ट किया गया निवासी / संस्था', + reportsReportedUserPlaceholder: '@निवासी, फ़ीड, ID, लिंक, आदि।', + reportsEvidenceLinksLabel: 'साक्ष्य / लिंक', + reportsEvidenceLinksPlaceholder: 'लिंक, संदेश IDs, स्क्रीनशॉट (यदि लागू हो), आदि पेस्ट करें।', + reportsContentLocationLabel: 'सामग्री कहाँ है', + reportsContentLocationPlaceholder: 'लिंक, ID, चैनल, थ्रेड, लेखक, आदि।', + reportsWhyInappropriateLabel: "यह अनुचित क्यों है", + reportsWhyInappropriatePlaceholder: 'कारण और प्रभाव बताएँ।', + reportsRequestedActionLabel: 'अनुरोधित कार्रवाई', + reportsRequestedActionPlaceholder: 'हटाएँ, छुपाएँ, टैग करें, चेतावनी दें, आदि।', + tribesTitle: "जनजातियाँ", + tribeAllSectionTitle: "जनजातियाँ", + tribeMineSectionTitle: "आपकी जनजातियाँ", + tribeCreateSectionTitle: "जनजाति बनाएँ", + tribeUpdateSectionTitle: "जनजाति अपडेट करें", + tribeGallerySectionTitle: "जनजाति गैलरी", + tribeLarpSectionTitle: "L.A.R.P", + tribeRecentSectionTitle: "हाल की जनजातियाँ", + tribeTopSectionTitle: "लोकप्रिय जनजातियाँ", + tribeviewTribeButton: "जनजाति देखें", + tribeviewSubTribeButton: "उप-जनजाति देखें", + tribeRootLabel: "मूल", + tribeDescription: "अपने नेटवर्क में जनजातियाँ खोजें या बनाएँ।", + tribeFilterAll: "सभी", + tribeFilterMine: "मेरे", + tribeFilterMembership: "सदस्यता", + tribeFilterRecent: "हाल के", + tribeFilterLarp: "L.A.R.P.", + tribeFilterTop: "शीर्ष", + tribeFilterSubtribes: "उप-जनजातियाँ", + tribeFilterGallery: "गैलरी", + tribeMainTribeLabel: "मुख्य जनजाति", + tribeCreateButton: "जनजाति बनाएँ", + tribeUpdateButton: "अपडेट", + tribeDeleteButton: "हटाएँ", + tribeImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + tribeTitleLabel: "शीर्षक", + searchTribesPlaceholder: "नाम से जनजातियाँ फ़िल्टर करें …", + tribeTitlePlaceholder: "जनजाति का नाम", + tribeDescriptionLabel: "विवरण", + tribeDescriptionPlaceholder: "इस जनजाति का वर्णन करें", + tribeLocationLabel: "स्थान", + tribeLocationPlaceholder: "यह जनजाति कहाँ स्थित है?", + tribeTagsLabel: "टैग", + tribeTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + tribeIsLARPLabel: "L.A.R.P. जनजाति?", + tribeInviteMode: "आमंत्रण मोड", + tribeLARPLabel: "L.A.R.P.", + tribeModeLabel: "मोड", + tribeIsAnonymousLabel: "स्थिति", + tribeMembersCount: "सदस्य", + tribeInviteCodePlaceholder: "आमंत्रण कोड दर्ज करें", + tribeJoinByCodeButton: "कोड से जुड़ें", + tribeJoinButton: "शामिल हों", + tribeLeaveButton: "छोड़ें", + tribeYes: "हाँ", + tribeNo: "नहीं", + tribePublic: "सार्वजनिक", + tribePrivate: "निजी", + tribeGenerateInvite: "कोड बनाएँ", + tribeCreatedAt: "बनाया गया", + tribeAuthor: "द्वारा", + tribeAuthorLabel: "लेखक", + tribeStrict: "सख़्त", + tribeOpen: "खुला", + tribeFeedFilterRECENT: "हाल के", + tribeFeedFilterMINE: "मेरे", + tribeFeedFilterALL: "सभी", + tribeFeedFilterTOP: "शीर्ष", + tribeFeedRefeeds: "रीफ़ीड", + tribeFeedRefeed: "रीफ़ीड", + tribeFeedMessagePlaceholder: "एक फ़ीड लिखें…", + tribeFeedSend: "भेजें", + tribeFeedEmpty: "अभी तक कोई फ़ीड संदेश उपलब्ध नहीं।", + noTribes: "अभी तक कोई जनजाति नहीं मिली।", + tribeNotFound: "जनजाति नहीं मिली!", + createTribeTitle: "जनजाति बनाएँ", + updateTribeTitle: "जनजाति अपडेट करें", + tribeSectionOverview: "अवलोकन", + tribeSectionInhabitants: "निवासी", + tribeSectionVotations: "मतदान", + tribeSectionEvents: "कार्यक्रम", + tribeSectionReports: "रिपोर्ट", + tribeSectionTasks: "कार्य", + tribeSectionFeed: "फ़ीड", + tribeSectionForum: "मंच", + tribeSectionMarket: "बाज़ार", + tribeSectionJobs: "नौकरियाँ", + tribeSectionProjects: "परियोजनाएँ", + tribeSectionMedia: "मीडिया", + tribeSectionImages: "छवियाँ", + tribeSectionAudios: "ऑडियो", + 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.", + tribeInhabitantsEmpty: "इस जनजाति में अभी तक कोई निवासी नहीं।", + tribeEventCreate: "कार्यक्रम बनाएँ", + tribeEventsEmpty: "अभी तक कोई कार्यक्रम नहीं।", + tribeEventTitle: "शीर्षक", + tribeEventDescription: "विवरण", + tribeEventDate: "दिनांक", + tribeEventLocation: "स्थान", + tribeEventAttend: "शामिल हों", + tribeEventUnattend: "छोड़ें", + tribeEventAttendees: "उपस्थित", + tribeTaskCreate: "कार्य बनाएँ", + tribeTasksEmpty: "अभी तक कोई कार्य नहीं।", + tribeTaskTitle: "शीर्षक", + tribeTaskDescription: "विवरण", + tribeTaskPriority: "प्राथमिकता", + tribeTaskDeadline: "समय सीमा", + tribeTaskAssignees: "सौंपे गए", + tribeTaskStatusInProgress: "प्रगति में", + tribeTaskStatusClosed: "बंद करें", + tribeTaskAssign: "सौंपें", + tribeTaskUnassign: "सौंपना रद्द करें", + tribeReportCreate: "रिपोर्ट बनाएँ", + tribeReportsEmpty: "अभी तक कोई रिपोर्ट नहीं।", + tribeReportTitle: "शीर्षक", + tribeReportDescription: "विवरण", + tribeReportCategory: "श्रेणी", + tribeVotationCreate: "मतदान बनाएँ", + tribeVotationsEmpty: "अभी तक कोई मतदान नहीं।", + tribeVotationTitle: "शीर्षक", + tribeVotationDescription: "विवरण", + tribeVotationOptions: "विकल्प", + tribeVotationDeadline: "समय सीमा", + tribeVotationVote: "मत दें", + tribeVotationResults: "मत", + tribeVotationClose: "मतदान बंद करें", + tribeVotationOptionPlaceholder: "विकल्प", + tribeForumCreate: "मंच बनाएँ", + tribeForumEmpty: "अभी तक कोई थ्रेड नहीं।", + tribeForumTitle: "शीर्षक", + tribeForumText: "संदेश", + tribeForumCategory: "श्रेणी", + tribeForumReply: "उत्तर दें", + tribeForumReplies: "उत्तर", + tribeMarketCreate: "लिस्टिंग बनाएँ", + tribeMarketEmpty: "अभी तक कोई लिस्टिंग नहीं।", + tribeMarketTitle: "शीर्षक", + tribeMarketDescription: "विवरण", + tribeMarketPrice: "मूल्य", + tribeMarketImage: "छवि", + tribeMarketCategory: "श्रेणी", + tribeJobCreate: "नौकरी बनाएँ", + tribeJobsEmpty: "अभी तक कोई नौकरी नहीं।", + tribeJobTitle: "शीर्षक", + tribeJobDescription: "विवरण", + tribeJobLocation: "स्थान", + tribeJobSalary: "वेतन", + tribeJobDeadline: "समय सीमा", + tribeProjectCreate: "परियोजना बनाएँ", + tribeProjectsEmpty: "अभी तक कोई परियोजना नहीं।", + tribeProjectTitle: "शीर्षक", + tribeProjectDescription: "विवरण", + tribeProjectGoal: "लक्ष्य", + tribeProjectFunded: "वित्तपोषित", + tribeProjectDeadline: "समय सीमा", + tribeMediaUpload: "मीडिया अपलोड करें", + readDocument: "दस्तावेज़ पढ़ें", + tribeCreateImage: "छवि बनाएँ", + tribeCreateAudio: "ऑडियो बनाएँ", + tribeCreateVideo: "वीडियो बनाएँ", + tribeCreateDocument: "दस्तावेज़ बनाएँ", + tribeCreateBookmark: "बुकमार्क बनाएँ", + tribeMediaEmpty: "अभी तक कोई मीडिया नहीं।", + tribeMediaTitle: "शीर्षक", + tribeMediaDescription: "विवरण", + tribeMediaType: "प्रकार", + tribeMediaTypeImage: "छवि", + tribeMediaTypeVideo: "वीडियो", + tribeMediaTypeAudio: "ऑडियो", + tribeMediaTypeDocument: "दस्तावेज़", + tribeMediaTypeBookmark: "बुकमार्क", + tribeContentDelete: "हटाएँ", + tribeInviteCodeText: "आमंत्रण कोड: ", + tribeGroupTribe: "जनजाति", + tribeGroupOffice: "कार्यालय", + tribeGroupNetwork: "नेटवर्क", + tribeGroupEconomy: "अर्थव्यवस्था", + tribeGroupMedia: "मीडिया", + tribeStatusOpen: "खुला", + tribeStatusClosed: "बंद", + tribeStatusInProgress: "प्रगति में", + tribePriorityLow: "कम", + tribePriorityMedium: "मध्यम", + tribePriorityHigh: "उच्च", + tribePriorityCritical: "गंभीर", + tribeTaskFilterAll: "सभी", + tribeMediaFilterAll: "सभी", + tribeReportCatBug: "बग", + tribeReportCatAbuse: "दुरुपयोग", + tribeReportCatContent: "सामग्री", + tribeReportCatOther: "अन्य", + tribeForumCatGeneral: "सामान्य", + tribeForumCatProposal: "प्रस्ताव", + tribeForumCatQuestion: "प्रश्न", + tribeForumCatAnnouncement: "घोषणा", + tribeMarketCatGoods: "सामान", + tribeMarketCatServices: "सेवाएँ", + tribeMarketCatFood: "भोजन", + tribeMarketCatOther: "अन्य", + tribeStatusLabel: "स्थिति", + tribeSubTribes: "उप-जनजातियाँ", + tribeSubTribesCreate: "उप-जनजाति बनाएँ", + tribeSubTribesStrictDenied: "जनजाति का सख्त मोड आपको नई उप-जनजातियाँ बनाने की अनुमति नहीं देता। कृपया प्रशासक से संपर्क करें।", + tribeSubTribesEmpty: "अभी तक कोई उप-जनजाति नहीं बनाई गई।", + tribeLarpCreateForbidden: "L.A.R.P. जनजातियाँ नहीं बनाई जा सकतीं।", + tribeLarpUpdateForbidden: "L.A.R.P. जनजातियाँ अपडेट नहीं की जा सकतीं।", + tribeActivityJoined: "शामिल हुए", + tribeActivityLeft: "छोड़ दिया", + tribeActivityFeed: "फ़ीड", + tribeActivityRefeed: "रीफ़ीड", + tribeGroupAnalytics: "विश्लेषिकी", + tribeGroupCreative: "रचनात्मक", + tribeSectionActivity: "गतिविधि", + tribeSectionTrending: "ट्रेंडिंग", + tribeSectionOpinions: "राय", + tribeSectionPixelia: "PIXELIA", + tribeSectionTags: "टैग", + tribeSectionSearch: "खोज", + tribeActivityEmpty: "अभी तक कोई गतिविधि नहीं।", + tribeActivityCreated: "बनाया", + tribeActivityPosted: "पोस्ट किया", + tribeActivityReplied: "उत्तर दिया", + tribeTrendingEmpty: "अभी तक कोई ट्रेंडिंग सामग्री नहीं।", + tribeTrendingPeriodDay: "आज", + tribeTrendingPeriodWeek: "इस सप्ताह", + tribeTrendingPeriodAll: "सभी समय", + tribeTrendingEngagement: "सहभागिता", + tribeOpinionsEmpty: "अभी तक कोई राय नहीं।", + tribeOpinionsCast: "मत दें", + tribeOpinionsRankings: "रैंकिंग", + tribeOpinionsAlreadyVoted: "पहले ही मतदान किया", + tribeTopCategory: "अधिक मतदान", + tribePixeliaTitle: "Pixelia", + tribePixeliaDescription: "सहयोगी पिक्सेल कला कैनवास।", + tribePixeliaPaint: "रंग भरें", + tribePixeliaContributors: "योगदानकर्ता", + tribePixeliaTotalPixels: "रंगे गए पिक्सेल", + tribeTagsEmpty: "कोई टैग नहीं मिला।", + tribeTagsCloud: "टैग क्लाउड", + tribeTagsContentWith: "टैग वाली सामग्री", + tribeSearchPlaceholder: "जनजाति सामग्री खोजें...", + tribeSearchEmpty: "कोई परिणाम नहीं मिला।", + tribeSearchResults: "परिणाम", + tribeSearchMinChars: "खोजने के लिए कम से कम 2 अक्षर दर्ज करें।", + agendaTitle: "एजेंडा", + agendaDescription: "यहाँ आप अपने सभी सौंपे गए आइटम पा सकते हैं।", + agendaFilterAll: "सभी", + agendaFilterOpen: "खुले", + agendaFilterClosed: "बंद", + agendaFilterTasks: "कार्य", + agendaFilterMarket: "बाज़ार", + agendaFilterTribes: "जनजातियाँ", + agendaFilterEvents: "कार्यक्रम", + agendaFilterReports: "रिपोर्ट", + agendaFilterTransfers: "स्थानांतरण", + agendaFilterJobs: "नौकरियाँ", + agendaFilterProjects: "परियोजनाएँ", + agendaFilterCalendars: "कैलेंडर", + agendaNoItems: "कोई सौंपे गए आइटम नहीं मिले।", + agendaAuthor: "द्वारा", + agendaDiscardButton: "निरस्त करें", + agendaRestoreButton: "पुनर्स्थापित करें", + agendaCreatedAt: "बनाया गया", + agendaTitleLabel: "शीर्षक", + agendaMembersCount: "सदस्य", + agendaDescriptionLabel: "विवरण", + agendaStatus: "स्थिति", + agendaVisibility: "दृश्यता", + agendaEventDate: "कार्यक्रम तिथि", + agendaEventLocation: "स्थान", + agendaEventPrice: "मूल्य", + agendaEventUrl: "URL", + agendaTaskStart: "प्रारंभ समय", + agendaLocationLabel: "स्थान", + agendaLARPLabel: "L.A.R.P.", + agendaYes: "हाँ", + agendaNo: "नहीं", + agendaInviteModeLabel: "स्थिति", + agendaAnonymousLabel: "गुमनाम", + agendaMembersLabel: "सदस्य", + agendareportCategory: "श्रेणी", + agendareportSeverity: "गंभीरता", + agendareportStatus: "स्थिति", + agendareportDescription: "विवरण", + agendaTaskEnd: "समाप्ति समय", + agendaTaskPriority: "प्राथमिकता", + agendaTransferFrom: "से", + agendaTransferTo: "को", + agendaTransferConcept: "अवधारणा", + agendaTransferAmount: "राशि", + agendaTransferDeadline: "समय सीमा", + agendaTransferFrom: "से", + agendaTransferTo: "को", + agendaTransferConcept: "अवधारणा", + agendaTransferAmount: "राशि", + agendaTransferDeadline: "समय सीमा", + opinionsTitle: "राय", + shareYourOpinions: "अपने नेटवर्क में राय खोजें और मतदान करें।", + author: "द्वारा", + voteNow: "अभी मतदान करें", + alreadyVoted: "आपने पहले ही राय दे दी है।", + noOpinionsFound: "कोई राय नहीं मिली।", + ALLButton: "सभी", + MINEButton: "मेरे", + RECENTButton: "हाल के", + TOPButton: "शीर्ष", + interestingButton: "दिलचस्प", + necessaryButton: "आवश्यक", + funnyButton: "मज़ेदार", + disgustingButton: "घृणित", + sensibleButton: "समझदार", + propagandaButton: "प्रचार", + adultOnlyButton: "केवल वयस्क", + boringButton: "उबाऊ", + confusingButton: "भ्रमित करने वाला", + inspiringButton: "प्रेरणादायक", + spamButton: "स्पैम", + usefulButton: "उपयोगी", + informativeButton: "सूचनाप्रद", + wellResearchedButton: "अच्छी तरह शोधित", + accurateButton: "सटीक", + needsSourcesButton: "स्रोत चाहिए", + wrongButton: "गलत", + lowQualityButton: "निम्न गुणवत्ता", + creativeButton: "रचनात्मक", + insightfulButton: "अंतर्दृष्टिपूर्ण", + actionableButton: "कार्रवाई योग्य", + inspiringButton: "प्रेरणादायक", + loveButton: "प्यार", + clearButton: "स्पष्ट", + upliftingButton: "उत्थानकारी", + unnecessaryButton: "अनावश्यक", + rejectedButton: "अस्वीकृत", + misleadingButton: "भ्रामक", + offTopicButton: "विषय से हटकर", + duplicateButton: "डुप्लिकेट", + clickbaitButton: "क्लिकबेट", + spamButton: "स्पैम", + trollButton: "ट्रोल", + nsfwButton: "NSFW", + violentButton: "हिंसक", + toxicButton: "विषाक्त", + harassmentButton: "उत्पीड़न", + hateButton: "घृणा", + scamButton: "धोखाधड़ी", + triggeringButton: "उत्तेजक", + opinionsCreatedAt: "बनाया गया", + opinionsTotalCount: "कुल राय", + voteInteresting: "दिलचस्प", + voteNecessary: "आवश्यक", + voteUseful: "उपयोगी", + voteInformative: "सूचनाप्रद", + voteWellResearched: "अच्छी तरह शोधित", + voteNeedsSources: "स्रोत चाहिए", + voteWrong: "गलत", + voteLowQuality: "निम्न गुणवत्ता", + voteLove: "प्यार", + voteClear: "स्पष्ट", + voteMisleading: "भ्रामक", + voteOffTopic: "विषय से हटकर", + voteDuplicate: "डुप्लिकेट", + voteClickbait: "क्लिकबेट", + votePropaganda: "प्रचार", + voteFunny: "मज़ेदार", + voteInspiring: "प्रेरणादायक", + voteUplifting: "उत्थानकारी", + voteUnnecessary: "अनावश्यक", + voteRejected: "अस्वीकृत", + voteConfusing: "भ्रमित करने वाला", + voteTroll: "ट्रोल", + voteNsfw: "NSFW", + voteViolent: "हिंसक", + voteToxic: "विषाक्त", + voteHarassment: "उत्पीड़न", + voteHate: "घृणा", + voteScam: "धोखाधड़ी", + voteTriggering: "उत्तेजक", + voteInsightful: "अंतर्दृष्टिपूर्ण", + voteAccurate: "सटीक", + voteActionable: "कार्रवाई योग्य", + voteCreative: "रचनात्मक", + voteSpam: "स्पैम", + voteAdultOnly: "केवल वयस्क", + publishBlog: "ब्लॉग प्रकाशित करें", + privateMessage: "PM", + pmSendTitle: "निजी संदेश", + pmSend: "भेजें!", + pmDescription: "अन्य निवासियों को एन्क्रिप्टेड संदेश भेजने के लिए इस फ़ॉर्म का उपयोग करें।", + pmRecipients: "प्राप्तकर्ता", + pmRecipientsHint: "अल्पविराम से अलग Oasis IDs दर्ज करें", + pmSubject: "विषय", + pmSubjectHint: "संदेश विषय दर्ज करें", + pmText: "संदेश", + pmFile: "संलग्नक", + private: "निजी", + privateDescription: "आपके एन्क्रिप्टेड संदेश।", + privateInbox: "इनबॉक्स", + privateSent: "भेजे गए", + privateDelete: "हटाएँ", + pmCreateButton: "PM लिखें", + noPrivateMessages: "कोई निजी संदेश नहीं।", + pmFromLabel: "से:", + pmToLabel: "को:", + pmInvalidMessage: "अमान्य संदेश", + pmNoSubject: "(कोई विषय नहीं)", + pmSubjectLabel: "विषय:", + pmBodyLabel: "मुख्य भाग", + pmBotJobs: "42-JobsBOT", + pmBotProjects: "42-ProjectsBOT", + pmBotMarket: "42-MarketBOT", + inboxJobSubscribedTitle: "आपके नौकरी प्रस्ताव के लिए नई सदस्यता", + pmInhabitantWithId: "OASIS ID वाला निवासी:", + pmHasSubscribedToYourJobOffer: "ने आपके नौकरी प्रस्ताव की सदस्यता ली है", + inboxProjectCreatedTitle: "नई परियोजना बनाई गई", + pmHasCreatedAProject: "ने एक परियोजना बनाई है", + inboxMarketItemSoldTitle: "आइटम बिक गया", + pmYourItem: "आपका आइटम", + pmHasBeenSoldTo: "बेचा गया", + pmFor: "के लिए", + inboxProjectPledgedTitle: "आपकी परियोजना के लिए नई प्रतिज्ञा", + pmHasPledged: "ने प्रतिज्ञा की है", + pmToYourProject: "आपकी परियोजना को", + blockchain: 'BlockExplorer', + blockchainTitle: 'BlockExplorer', + blockchainDescription: 'ब्लॉकचेन में ब्लॉक खोजें और विज़ुअलाइज़ करें।', + blockchainNoBlocks: 'ब्लॉकचेन में कोई ब्लॉक नहीं मिला।', + blockchainBlockID: 'ब्लॉक ID', + blockchainBlockAuthor: 'लेखक', + blockchainBlockType: 'प्रकार', + blockchainBlockTimestamp: 'टाइमस्टैम्प', + blockchainBlockContent: 'ब्लॉक', + blockchainBlockURL: 'URL:', + blockchainContent: 'ब्लॉक', + blockchainContentPreview: 'ब्लॉक सामग्री का पूर्वावलोकन', + blockchainLatestDatagram: 'नवीनतम डेटाग्राम', + blockchainDatagram: 'डेटाग्राम', + blockchainDetails: 'ब्लॉक विवरण देखें', + blockchainBlockInfo: 'ब्लॉक जानकारी', + blockchainBlockDetails: 'चयनित ब्लॉक का विवरण', + blockchainBack: 'BlockExplorer पर वापस जाएँ', + blockchainContentDeleted: "यह सामग्री टॉम्बस्टोन कर दी गई है", + visitContent: "सामग्री देखें", + banking: 'बैंकिंग', + bankingTitle: 'बैंकिंग', + bankingDescription: 'ECOin का वर्तमान मूल्य और संबंधित UBI आवंटन खोजें, जो भागीदारी और विश्वास के आधार पर प्रति युग वितरित होता है।', + bankOverview: 'अवलोकन', + bankEpochs: 'युग', + bankRules: 'नियम', + pending: 'लंबित', + closed: 'बंद', + bankBack: 'बैंकिंग पर वापस जाएँ', + bankViewTx: 'Tx देखें', + bankClaimNow: 'अभी दावा करें', + bankClaimUBI: 'UBI का दावा करें!', + bankClaimAndPay: 'Claim & Pay', + bankClaimedPending: 'Claim pending...', + bankStatusUnclaimed: 'Unclaimed', + bankStatusClaimed: 'Claimed', + bankStatusExpired: 'Expired', + bankPubOnly: 'PUB-only operation', + bankNoPendingUBI: 'इस अवधि के लिए कोई लंबित UBI आवंटन नहीं।', + bankEpoch: 'युग', + bankPool: 'पूल (यह युग)', + bankWeightsSum: 'भारों का योग', + bankAllocations: 'आवंटन', + bankNoAllocations: 'कोई आवंटन नहीं मिला।', + bankNoEpochs: 'कोई युग नहीं मिला।', + bankEpochAllocations: 'युग आवंटन', + bankAllocId: 'आवंटन ID', + bankAllocDate: 'दिनांक', + bankAllocConcept: 'अवधारणा', + bankAllocFrom: 'से', + bankAllocTo: 'को', + bankAllocAmount: 'राशि', + bankAllocStatus: 'स्थिति', + bankEpochId: 'युग ID', + bankRuleHash: 'नियम स्नैपशॉट हैश', + bankViewEpoch: 'युग देखें', + bankUserBalance: 'आपका शेष', + ecoWalletNotConfigured: 'ECOin वॉलेट कॉन्फ़िगर नहीं है', + editWallet: 'वॉलेट संपादित करें', + addWallet: 'वॉलेट जोड़ें', + bankAddresses: 'पते', + bankNoAddresses: 'कोई पता नहीं मिला।', + bankUser: 'Oasis ID', + bankAddress: 'पता', + bankAddAddressTitle: 'ECOIN पता जोड़ें', + bankAddAddressUser: 'Oasis ID', + bankAddAddressAddress: 'ECOIN पता', + bankAddAddressSave: 'सहेजें', + bankAddressAdded: 'पता जोड़ा गया', + bankAddressUpdated: 'पता अपडेट किया गया', + bankAddressExists: 'पता पहले से मौजूद है', + bankAddressInvalid: 'अमान्य पता', + bankAddressDeleted: 'पता हटाया गया', + bankAddressNotFound: 'पता नहीं मिला', + bankAddressTotal: 'कुल पते', + bankAddressSearch: '@निवासी या पता खोजें', + bankAddressActions: 'कार्रवाई', + bankAddressDelete: 'हटाएँ', + bankAddressSource: 'स्रोत', + bankAddressDeleteConfirm: 'यह पता हटाएँ?', + search: 'खोजें!', + bankLocal: 'स्थानीय', + bankFromOasis: 'Oasis', + bankMyAddress: 'आपका पता', + bankRemoveMyAddress: 'मेरा पता हटाएँ', + bankNotRemovableOasis: 'पते स्थानीय रूप से नहीं हटाए जा सकते', + bankingFutureUBI: "UBI", + pubIdTitle: "PUB Wallet", + pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", + pubIdLabel: "PUB ID", + pubIdSave: "Save configuration", + pubIdPlaceholder: "@PUB_ID.ed25519", + bankUbiAvailableNo: "कोई धन नहीं!", + bankUbiAvailableOk: "उपलब्ध!", + bankUbiAvailability: "UBI उपलब्धता", + bankAlreadyClaimedThisMonth: "इस महीने पहले ही दावा किया गया", + bankUbiThisMonth: "UBI (इस महीने)", + bankUbiLastClaimed: "UBI (अंतिम दावा)", + bankUbiNeverClaimed: "कभी दावा नहीं किया", + bankUbiTotalClaimed: "UBI (कुल दावा)", + bankUbiPub: "PUB", + bankUbiInhabitant: "निवासी", + bankUbiClaimedAmount: "दावा (ECO)", + typeBankUbiResult: "बैंकिंग - UBI", + bankNoPubConfigured: "कोई PUB कॉन्फ़िगर नहीं है। सेटिंग में अपना PUB ID सेट करें।", + shopsTitle: "दुकानें", + shopDescription: "नेटवर्क में दुकानें खोजें और प्रबंधित करें।", + shopTitle: "दुकान", + shopFilterAll: "सभी", + shopFilterMine: "मेरी", + shopFilterRecent: "हालिया", + shopFilterTop: "शीर्ष", + shopFilterProducts: "उत्पाद", + shopFilterPrices: "मूल्य", + shopFilterFavorites: "पसंदीदा", + shopUpload: "दुकान बनाएं", + shopAllSectionTitle: "सभी दुकानें", + shopMineSectionTitle: "मेरी दुकानें", + shopRecentSectionTitle: "हालिया दुकानें", + shopTopSectionTitle: "शीर्ष दुकानें", + shopProductsSectionTitle: "शीर्ष उत्पाद", + shopPricesSectionTitle: "मूल्य अनुसार उत्पाद", + shopFavoritesSectionTitle: "पसंदीदा", + shopCreateSectionTitle: "दुकान बनाएं", + shopUpdateSectionTitle: "दुकान अपडेट", + shopCreate: "बनाएं", + shopUpdate: "अपडेट", + shopDelete: "हटाएं", + shopAddFavorite: "पसंदीदा जोड़ें", + shopRemoveFavorite: "पसंदीदा हटाएं", + shopOpen: "खुली", + shopClosed: "बंद", + shopOpenShop: "दुकान खोलें", + shopCloseShop: "दुकान बंद करें", + shopProducts: "उत्पाद", + shopProductAdd: "उत्पाद जोड़ें", + shopProductTitle: "उत्पाद", + shopProductUpdate: "उत्पाद अपडेट", + shopProductPrice: "मूल्य (ECO)", + shopProductStock: "स्टॉक", + shopProductUntitled: "बिना शीर्षक उत्पाद", + shopUntitled: "बिना शीर्षक दुकान", + shopNoItems: "कोई दुकान नहीं मिली।", + shopNoProducts: "अभी तक कोई उत्पाद नहीं।", + shopOutOfStock: "स्टॉक में नहीं", + shopBuy: "खरीदें", + shopBackToShop: "दुकान पर वापस", + shopShareUrl: "शेयर URL", + shopVisitShop: "दुकान देखें", + shopStatus: "स्थिति", + shopCreatedAt: "बनाया गया", + shopSearchPlaceholder: "दुकानें खोजें...", + shopUrl: "URL", + shopLocation: "स्थान", + shopTags: "टैग", + shopVisibility: "दृश्यता", + shopImage: "छवि", + shopShortDescription: "संक्षिप्त विवरण", + shopShortDescriptionPlaceholder: "दुकान कार्ड के लिए संक्षिप्त विवरण (अधिकतम 160 अक्षर)", + shopTitlePlaceholder: "आपकी दुकान का नाम", + shopDescriptionPlaceholder: "आपकी दुकान का विस्तृत विवरण", + shopUrlPlaceholder: "https://aapki-dukan-url.com", + shopLocationPlaceholder: "शहर, देश", + shopTagsPlaceholder: "टैग1, टैग2, टैग3", + mapTitlePlaceholder: "मानचित्र शीर्षक", + shopProductFeatured: "विशेष उत्पाद", + shopSendToMarket: "Send to Market", + typeShop: "दुकान", + typeShopProduct: "दुकान उत्पाद", + bankExchange: 'विनिमय', + bankExchangeCurrentValue: 'ECOin मूल्य (1h)', + bankTotalSupply: 'ECOin कुल आपूर्ति', + bankEcoinHours: "ECOin समय समतुल्यता", + bankHoursOfWork: 'घंटे', + bankUnitMs: "मि.से.", + bankUnitSeconds: "सेकंड", + bankUnitMinutes: "मिनट", + bankUnitDays: "दिन", + bankExchangeNoData: 'कोई डेटा उपलब्ध नहीं', + bankExchangeIndex: 'ECOin मूल्य (1h)', + bankInflation: 'ECOin मुद्रास्फीति (anual)', + bankInflationMonthly: 'ECOin मुद्रास्फीति (mensual)', + bankCurrentSupply: 'ECOin वर्तमान आपूर्ति', + bankingSyncStatus: 'ECOin स्थिति', + bankingSyncStatusSynced: 'सिंक किया गया', + bankingSyncStatusOutdated: 'पुराना', + statsTitle: 'सांख्यिकी', + statistics: "सांख्यिकी", + statsInhabitant: "निवासी सांख्यिकी", + statsDescription: "अपने नेटवर्क के बारे में सांख्यिकी खोजें।", + ALLButton: "सभी", + MINEButton: "मेरे", + TOMBSTONEButton: "टॉम्बस्टोन", + statsYou: "आप", + statsUserId: "Oasis ID", + statsCreatedAt: "बनाया गया", + statsYourContent: "सामग्री", + statsYourOpinions: "राय", + statsYourTombstone: "टॉम्बस्टोन", + statsNetwork: "नेटवर्क", + statsTotalInhabitants: "निवासी", + statsDiscoveredTribes: "जनजातियाँ (सार्वजनिक)", + statsPrivateDiscoveredTribes: "जनजातियाँ (निजी)", + statsNetworkContent: "सामग्री", + statsYourMarket: "बाज़ार", + statsYourJob: "नौकरियाँ", + statsYourProject: "परियोजनाएँ", + statsYourTransfer: "स्थानांतरण", + statsYourForum: "मंच", + statsNetworkOpinions: "राय", + statsDiscoveredMarket: "बाज़ार", + statsDiscoveredJob: "नौकरियाँ", + statsDiscoveredProject: "परियोजनाएँ", + statsBankingTitle: "बैंकिंग", + statsEcoWalletLabel: "ECOIN वॉलेट", + statsEcoWalletNotConfigured: "कॉन्फ़िगर नहीं!", + statsTotalEcoAddresses: "कुल पते", + statsDiscoveredTransfer: "स्थानांतरण", + statsDiscoveredForum: "मंच", + statsNetworkTombstone: "टॉम्बस्टोन", + statsBookmark: "बुकमार्क", + statsEvent: "कार्यक्रम", + statsTask: "कार्य", + statsVotes: "मत", + statsMarket: "बाज़ार", + statsForum: "मंच", + statsJob: "नौकरियाँ", + statsProject: "परियोजनाएँ", + statsReport: "रिपोर्ट", + statsFeed: "फ़ीड", + statsTribe: "जनजातियाँ", + statsImage: "छवियाँ", + statsAudio: "ऑडियो", + statsVideo: "वीडियो", + statsDocument: "दस्तावेज़", + statsMap: "मानचित्र", + statsShop: "दुकानें", + statsShopProduct: "दुकान उत्पाद", + statsTransfer: "स्थानांतरण", + statsAiExchange: "AI", + statsPUBs: 'PUBs', + statsPost: "पोस्ट", + statsOasisID: "Oasis ID", + statsSize: "कुल (आकार)", + statsBlockchainSize: "ब्लॉकचेन (आकार)", + statsBlobsSize: "ब्लॉब (आकार)", + statsActivity7d: "गतिविधि (पिछले 7 दिन)", + statsActivity7dTotal: "7-दिन कुल", + statsActivity30dTotal: "30-दिन कुल", + statsKarmaScore: "कर्म स्कोर", + statsPublic: "सार्वजनिक", + statsPrivate: "निजी", + day: "दिन", + messages: "संदेश", + statsProject: "परियोजनाएँ", + statsProjectsTitle: "परियोजनाएँ", + statsProjectsTotal: "कुल परियोजनाएँ", + statsProjectsActive: "सक्रिय", + statsProjectsCompleted: "पूर्ण", + statsProjectsPaused: "रुकी हुई", + statsProjectsCancelled: "रद्द", + statsProjectsGoalTotal: "कुल लक्ष्य", + statsProjectsPledgedTotal: "कुल प्रतिज्ञा", + statsProjectsSuccessRate: "सफलता दर", + statsProjectsAvgProgress: "औसत प्रगति", + statsProjectsMedianProgress: "मध्यांश प्रगति", + statsProjectsActiveFundingAvg: "औसत सक्रिय वित्तपोषण", + statsJobsTitle: "नौकरियाँ", + statsJobsTotal: "कुल नौकरियाँ", + statsJobsOpen: "खुली", + statsJobsClosed: "बंद", + statsJobsOpenVacants: "खुली रिक्तियाँ", + statsJobsSubscribersTotal: "कुल सदस्य", + statsJobsAvgSalary: "औसत वेतन", + statsJobsMedianSalary: "मध्यांश वेतन", + statsMarketTitle: "बाज़ार", + statsMarketTotal: "कुल आइटम", + statsMarketForSale: "बिक्री के लिए", + statsMarketReserved: "आरक्षित", + statsMarketClosed: "बंद", + statsMarketSold: "बेचा गया", + statsMarketRevenue: "राजस्व", + statsMarketAvgSoldPrice: "औसत बिक्री मूल्य", + statsUsersTitle: "निवासी", + user: "निवासी", + statsTombstoneTitle: "टॉम्बस्टोन", + statsNetworkTombstones: "नेटवर्क टॉम्बस्टोन", + statsTombstoneRatio: "टॉम्बस्टोन अनुपात (%)", + statsAITraining: "AI प्रशिक्षण", + statsAIExchanges: "आदान-प्रदान", + statsParliamentCandidature: "संसद उम्मीदवारी", + statsParliamentTerm: "संसद कार्यकाल", + statsParliamentProposal: "संसद प्रस्ताव", + statsParliamentRevocation: "संसद निरसन", + statsParliamentLaw: "संसद कानून", + statsCourtsCase: "न्यायालय मामले", + statsCourtsEvidence: "न्यायालय साक्ष्य", + statsCourtsAnswer: "न्यायालय उत्तर", + statsCourtsVerdict: "न्यायालय फैसले", + statsCourtsSettlement: "न्यायालय समझौते", + statsCourtsSettlementProposal: "समझौता प्रस्ताव", + statsCourtsSettlementAccepted: "स्वीकृत समझौते", + statsCourtsNomination: "न्यायाधीश नामांकन", + statsCourtsNominationVote: "नामांकन मत", + ai: "AI", + aiTitle: "AI", + aiDescription: "'42' नामक एक सामूहिक कृत्रिम बुद्धिमत्ता (CAI) जो आपके नेटवर्क से सीखती है।", + aiInputPlaceholder: "क्या हाल है?", + aiUserQuestion: "प्रश्न", + aiResponseTitle: "उत्तर", + aiSubmitButton: "भेजें!", + aiSettingsDescription: "AI मॉडल के लिए अपना प्रॉम्प्ट सेट करें (अधिकतम 128 अक्षर)।", + aiPrompt: "एक सूचनाप्रद और सटीक प्रतिक्रिया प्रदान करें।", + aiConfiguration: "प्रॉम्प्ट सेट करें", + aiPromptUsed: "प्रॉम्प्ट", + aiClearHistory: "चैट इतिहास साफ़ करें", + aiSharePrompt: "यह उत्तर सामूहिक प्रशिक्षण में जोड़ें?", + aiShareYes: "हाँ", + aiShareNo: "नहीं", + aiSharedLabel: "प्रशिक्षण में जोड़ा गया", + aiRejectedLabel: "प्रशिक्षण में नहीं जोड़ा गया", + aiServerError: "AI उत्तर नहीं दे सका। कृपया पुनः प्रयास करें।", + aiInputPlaceholder: "Oasis क्या है?", + typeAiExchange: "AI", + aiApproveTrain: "सामूहिक प्रशिक्षण में जोड़ें", + aiRejectTrain: "प्रशिक्षण न करें", + aiTrainPending: "अनुमोदन लंबित", + aiTrainApproved: "प्रशिक्षण के लिए अनुमोदित", + aiTrainRejected: "प्रशिक्षण के लिए अस्वीकृत", + aiSnippetsUsed: "उपयोग किए गए अंश", + aiSnippetsLearned: "सीखे गए अंश", + statsAITraining: "AI प्रशिक्षण", + aiApproveCustomTrain: "इस कस्टम उत्तर का उपयोग करके प्रशिक्षित करें", + aiCustomAnswerPlaceholder: "अपना कस्टम उत्तर लिखें…", + statsAIExchanges: "मॉडल आदान-प्रदान", + marketMineSectionTitle: "आपके आइटम", + marketCreateSectionTitle: "आइटम बनाएँ", + marketUpdateSectionTitle: "अपडेट", + marketAllSectionTitle: "बाज़ार", + marketRecentSectionTitle: "हाल का बाज़ार", + marketTitle: "बाज़ार", + marketDescription: "अपने नेटवर्क में सामान या सेवाओं के आदान-प्रदान के लिए एक बाज़ार।", + marketFilterAll: "सभी", + marketFilterMine: "मेरे", + marketFilterAuctions: "नीलामी", + marketFilterItems: "विनिमय", + marketFilterNew: "नया", + marketFilterUsed: "प्रयुक्त", + marketFilterBroken: "टूटा हुआ", + marketFilterForSale: "बिक्री के लिए", + marketFilterSold: "बिका हुआ", + marketFilterDiscarded: "निरस्त", + marketFilterRecent: "हाल के", + marketFilterMyBids: "बोलियाँ", + marketCreateButton: "आइटम बनाएँ", + marketItemType: "प्रकार", + marketItemTitle: "शीर्षक", + marketItemAvailable: "समय सीमा", + marketItemDescription: "विवरण", + marketItemDescriptionPlaceholder: "जो आइटम आप बेच रहे हैं उसका वर्णन करें", + marketItemStatus: "स्थिति", + marketShopLabel: "दुकान", + marketItemCondition: "स्थिति", + marketItemPrice: "मूल्य", + marketItemTags: "टैग", + marketItemTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + marketItemDeadline: "समय सीमा", + marketItemIncludesShipping: "शिपिंग शामिल है?", + marketItemHighestBid: "सबसे ऊँची बोली", + marketItemHighestBidder: "सबसे ऊँची बोली लगाने वाला", + marketItemStock: "स्टॉक", + marketOutOfStock: "स्टॉक में नहीं", + marketItemBidTime: "बोली समय", + marketActionsUpdate: "अपडेट", + marketUpdateButton: "आइटम अपडेट करें!", + marketActionsDelete: "हटाएँ", + marketActionsSold: "बिका हुआ चिह्नित करें", + marketActionsChangeStatus: "स्थिति बदलें", + marketActionsBuy: "खरीदें!", + marketAuctionBids: "वर्तमान बोलियाँ", + marketPlaceBidButton: "बोली लगाएँ", + marketItemSeller: "विक्रेता", + marketNoItems: "अभी तक कोई आइटम उपलब्ध नहीं।", + marketYourBid: "आपकी बोली", + marketCreateFormImageLabel: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + marketSearchLabel: "खोज", + marketSearchPlaceholder: "शीर्षक या टैग खोजें", + marketMinPriceLabel: "न्यूनतम मूल्य", + marketMaxPriceLabel: "अधिकतम मूल्य", + marketSortLabel: "क्रमबद्ध करें", + marketSortRecent: "सबसे हाल का", + marketSortPrice: "मूल्य", + marketSortDeadline: "समय सीमा", + marketSearchButton: "खोजें", + marketAuctionEndsIn: "समाप्त होता है", + marketAuctionEnded: "समाप्त हो गया", + marketMyBidBadge: "आपकी बोली", + marketNoItemsMatch: "आपकी खोज से कोई आइटम मेल नहीं खाता।", + jobsTitle: "नौकरियाँ", + jobsDescription: "अपने नेटवर्क में नौकरियाँ खोजें और प्रबंधित करें।", + jobsFilterRecent: "हाल के", + jobsFilterMine: "मेरे", + jobsFilterAll: "सभी", + jobsFilterRemote: "दूरस्थ", + jobsFilterOpen: "खुले", + jobsFilterClosed: "बंद", + jobsCV: "बायोडाटा", + jobsCreateJob: "नौकरी बनाएँ", + jobsRecentTitle: "हाल की नौकरियाँ", + jobsMineTitle: "आपकी नौकरियाँ", + jobsAllTitle: "नौकरियाँ", + jobsRemoteTitle: "दूरस्थ नौकरियाँ", + jobsOpenTitle: "खुली नौकरियाँ", + jobsClosedTitle: "बंद नौकरियाँ", + jobsCVTitle: "बायोडाटा", + jobsFilterPresencial: "उपस्थित", + jobsFilterFreelancer: "फ्रीलांसर", + jobsFilterEmployee: "कर्मचारी", + jobsPresencialTitle: "उपस्थित नौकरियाँ", + jobsFreelancerTitle: "फ्रीलांस नौकरियाँ", + jobsEmployeeTitle: "कर्मचारी नौकरियाँ", + jobTitle: "शीर्षक", + jobLocation: "स्थान", + jobSalary: "वेतन (ECO/1h)", + jobVacants: "रिक्तियाँ", + jobDescription: "विवरण", + jobRequirements: "आवश्यकताएँ", + jobLanguages: "भाषाएँ", + jobStatus: "स्थिति", + jobStatusOPEN: "खुली", + jobStatusCLOSED: "बंद", + jobSetOpen: "खुली सेट करें", + jobSetClosed: "बंद सेट करें", + jobSubscribeButton: "इस प्रस्ताव में शामिल हों!", + jobUnsubscribeButton: "इस प्रस्ताव से हटें!", + jobTitlePlaceholder: "नौकरी शीर्षक दर्ज करें", + jobDescriptionPlaceholder: "नौकरी का वर्णन करें", + jobRequirementsPlaceholder: "आवश्यकताएँ दर्ज करें", + jobLanguagesPlaceholder: "अंग्रेज़ी, स्पेनिश, फ्रेंच, बास्क...", + jobTasksPlaceholder: "कार्य सूचीबद्ध करें", + jobLocationPresencial: "स्थानीय", + jobLocationRemote: "दूरस्थ", + jobVacantsPlaceholder: "पदों की संख्या", + jobSalaryPlaceholder: "1 समर्पित घंटे के लिए ECO में वेतन", + jobImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + jobTasks: "कार्य", + jobType: "नौकरी प्रकार", + jobTime: "नौकरी समय", + jobSubscribers: "सदस्य", + noSubscribers: "कोई सदस्य नहीं", + jobsFilterTop: "शीर्ष", + jobsTopTitle: "शीर्ष वेतन नौकरियाँ", + createJobButton: "नौकरी प्रकाशित करें", + viewDetailsButton: "विवरण देखें", + noJobsFound: "कोई नौकरी प्रस्ताव नहीं मिला।", + jobAuthor: "द्वारा", + jobTypeFreelance: "फ्रीलांसर", + jobTypeSalary: "कर्मचारी", + jobTimePartial: "अंशकालिक", + jobTimeComplete: "पूर्णकालिक", + jobsDeleteButton: "हटाएँ", + jobsUpdateButton: "अपडेट", + jobsFilterApplied: "आवेदित", + jobsAppliedTitle: "मेरे आवेदन", + jobsAppliedBadge: "आवेदित", + jobsFilterFavs: "पसंदीदा", + jobsFavsTitle: "पसंदीदा", + jobsFilterNeeds: "मदद चाहिए", + jobsNeedsTitle: "मदद चाहिए", + jobsSearchLabel: "खोज", + jobsSearchPlaceholder: "शीर्षक, टैग, विवरण खोजें...", + jobsMinSalaryLabel: "न्यूनतम वेतन", + jobsMaxSalaryLabel: "अधिकतम वेतन", + jobsSortLabel: "क्रमबद्ध करें", + jobsSortRecent: "सबसे हाल का", + jobsSortSalary: "सबसे अधिक वेतन", + jobsSortSubscribers: "सबसे अधिक आवेदक", + jobsSearchButton: "खोजें", + jobsFavoriteButton: "पसंदीदा", + jobsUnfavoriteButton: "पसंदीदा हटाएँ", + jobsMessageAuthorButton: "PM", + jobsApplicants: "आवेदक", + jobsUpdatedAt: "अपडेट किया गया", + jobSetOpen: "खुली सेट करें", + jobNewBadge: "नया", + jobsTagsLabel: "टैग", + jobsTagsPlaceholder: "tag1, tag2, tag3", + noJobsMatch: "आपकी खोज से कोई नौकरी मेल नहीं खाती।", + projectsTitle: "परियोजनाएँ", + projectsDescription: "अपने नेटवर्क में समुदाय-संचालित परियोजनाएँ बनाएँ, वित्तपोषित करें और अनुसरण करें।", + projectCreateProject: "परियोजना बनाएँ", + projectCreateButton: "परियोजना बनाएँ", + projectUpdateButton: "अपडेट", + projectDeleteButton: "हटाएँ", + projectNoProjectsFound: "कोई परियोजना नहीं मिली।", + projectFilterAll: "सभी", + projectFilterMine: "मेरे", + projectFilterActive: "सक्रिय", + projectFilterPaused: "रुकी हुई", + projectFilterCompleted: "पूर्ण", + projectFilterFollowing: "अनुसरण कर रहे हैं", + projectFilterRecent: "हाल के", + projectFilterTop: "शीर्ष", + projectAllTitle: "परियोजनाएँ", + projectMineTitle: "आपकी परियोजनाएँ", + projectActiveTitle: "सक्रिय परियोजनाएँ", + projectPausedTitle: "रुकी हुई परियोजनाएँ", + projectCompletedTitle: "पूर्ण परियोजनाएँ", + projectFollowingTitle: "अनुसरण कर रही परियोजनाएँ", + projectRecentTitle: "हाल की परियोजनाएँ", + projectTopTitle: "शीर्ष वित्तपोषित", + projectTitlePlaceholder: "परियोजना का नाम", + projectImage: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + projectDescription: "विवरण", + projectDescriptionPlaceholder: "कहानी और लक्ष्य बताएँ…", + projectGoal: "लक्ष्य (ECO)", + projectGoalPlaceholder: "50000", + projectDeadline: "समय सीमा", + projectProgress: "प्रारंभिक प्रगति (%)", + projectStatus: "स्थिति", + projectFunding: "वित्तपोषण", + projectPledged: "प्रतिज्ञा", + projectSetStatus: "स्थिति सेट करें", + projectSetProgress: "प्रगति अपडेट करें", + projectFollowButton: "अनुसरण करें", + projectUnfollowButton: "अनुसरण बंद करें", + projectStatusACTIVE: "सक्रिय", + projectStatusPAUSED: "रुकी हुई", + projectStatusCOMPLETED: "पूर्ण", + projectStatusCANCELLED: "रद्द", + projectPledgeTitle: "इस परियोजना का समर्थन करें", + projectPledgePlaceholder: "ECO में राशि", + projectBounties: "इनाम", + projectBountiesInputLabel: "इनाम (प्रति पंक्ति एक: शीर्षक|राशि [ECO]|विवरण)", + projectBountiesPlaceholder: "UI बग ठीक करें|100|समस्या का लिंक\nडॉक्स लिखें|250|उपयोग उदाहरण रूपरेखा", + projectNoBounties: "कोई इनाम नहीं मिला।", + projectTitle: "शीर्षक", + projectAddBountyTitle: "नया इनाम", + projectBountyTitle: "इनाम शीर्षक", + projectBountyAmount: "राशि (ECO)", + projectBountyDescription: "विवरण", + projectMilestoneSelect: "मील का पत्थर चुनें", + projectBountyCreateButton: "इनाम बनाएँ", + projectBountyStatus: "इनाम स्थिति", + projectBountyOpen: "खुला", + projectBountyClaimed: "दावा किया गया", + projectBountyDone: "पूर्ण", + projectBountyClaimedBy: "द्वारा दावा किया गया", + projectBountyClaimButton: "दावा करें", + projectBountyCompleteButton: "पूर्ण चिह्नित करें", + projectMilestones: "मील के पत्थर", + projectAddMilestoneTitle: "नया मील का पत्थर", + projectMilestoneTitle: "मील का पत्थर शीर्षक", + projectMilestoneTargetPercent: "प्रतिशत (%)", + projectMilestoneDueDate: "दिनांक", + projectMilestoneCreateButton: "मील का पत्थर बनाएँ", + projectMilestoneStatus: "मील का पत्थर स्थिति", + projectMilestoneOpen: "खुला", + projectMilestoneDone: "पूर्ण", + projectMilestoneMarkDone: "पूर्ण चिह्नित करें", + projectMilestoneDue: "देय", + projectNoMilestones: "कोई मील का पत्थर नहीं मिला।", + projectMilestoneMarkDone: "पूर्ण चिह्नित करें", + projectMilestoneTitlePlaceholder: "मील का पत्थर शीर्षक दर्ज करें", + projectMilestoneDescriptionPlaceholder: "इस मील के पत्थर का विवरण दर्ज करें", + projectMilestoneDescription: "मील का पत्थर विवरण", + projectBudgetGoal: "बजट (लक्ष्य)", + projectBudgetAssigned: "इनामों को सौंपा गया", + projectBudgetRemaining: "शेष", + projectBudgetOver: "बजट से अधिक: सौंपा गया लक्ष्य से अधिक है", + projectFollowers: "अनुसरणकर्ता", + projectFollowersTitle: "अनुसरणकर्ता", + projectFollowersNone: "अभी तक कोई अनुसरणकर्ता नहीं।", + projectMore: "अधिक", + projectYouFollowHint: "आप इस परियोजना का अनुसरण करते हैं", + projectBackers: "समर्थक", + projectBackersTitle: "समर्थक", + projectBackersTotal: "कुल समर्थक", + projectBackersTotalPledged: "कुल प्रतिज्ञा", + projectBackersYourPledge: "आपकी प्रतिज्ञा", + projectBackersNone: "अभी तक कोई प्रतिज्ञा नहीं।", + projectNoRemainingBudget: "कोई शेष बजट नहीं।", + projectFilterBackers: "समर्थक", + projectFilterApplied: "आवेदित", + projectAppliedTitle: "आवेदित", + projectBackersLeaderboardTitle: "शीर्ष समर्थक", + projectNoBackersFound: "कोई समर्थक नहीं मिला।", + projectBackerAmount: "कुल योगदान", + projectBackerPledges: "प्रतिज्ञाएँ", + projectBackerProjects: "परियोजनाएँ", + projectPledgeAmount: "राशि", + projectSelectMilestoneOrBounty: "मील का पत्थर या इनाम चुनें", + projectPledgeButton: "प्रतिज्ञा करें", + footerLicense: "GPLv3", + footerPackage: "पैकेज", + footerVersion: "संस्करण", + modulesModuleName: "नाम", + modulesModuleDescription: "विवरण", + modulesModuleStatus: "स्थिति", + modulesTotalModulesLabel: "लोड किए गए मॉड्यूल", + modulesEnabledModulesLabel: "सक्षम", + modulesDisabledModulesLabel: "अक्षम", + modulesPopularLabel: "लोकप्रिय", + modulesPopularDescription: "ट्रेंडिंग, सबसे अधिक देखी गई या सबसे अधिक टिप्पणी की गई पोस्ट प्राप्त करने का मॉड्यूल।", + modulesTopicsLabel: "विषय", + modulesTopicsDescription: "साझा रुचियों पर आधारित चर्चा श्रेणियाँ प्राप्त करने का मॉड्यूल।", + modulesSummariesLabel: "सारांश", + modulesSummariesDescription: "लंबी चर्चाओं या पोस्ट के सारांश प्राप्त करने का मॉड्यूल।", + modulesLatestLabel: "नवीनतम", + modulesLatestDescription: "सबसे हाल की पोस्ट और चर्चाएँ प्राप्त करने का मॉड्यूल।", + modulesThreadsLabel: "थ्रेड्स", + modulesThreadsDescription: "विषय या प्रश्न के अनुसार समूहीकृत बातचीत प्राप्त करने का मॉड्यूल।", + modulesMultiverseLabel: "मल्टीवर्स", + modulesMultiverseDescription: "अन्य संघीय पीयर से सामग्री प्राप्त करने का मॉड्यूल।", + modulesInvitesLabel: "आमंत्रण", + modulesInvitesDescription: "आमंत्रण कोड प्रबंधित और लागू करने का मॉड्यूल।", + modulesWalletLabel: "वॉलेट", + modulesWalletDescription: "अपनी डिजिटल संपत्तियाँ (ECOin) प्रबंधित करने का मॉड्यूल।", + modulesLegacyLabel: "विरासत", + modulesLegacyDescription: "अपनी गुप्त कुंजी (निजी कुंजी) को जल्दी और सुरक्षित रूप से प्रबंधित करने का मॉड्यूल।", + modulesCipherLabel: "सिफर", + modulesCipherDescription: "अपने टेक्स्ट को सममित रूप से एन्क्रिप्ट और डिक्रिप्ट करने का मॉड्यूल (साझा पासवर्ड का उपयोग करके)।", + modulesBookmarksLabel: "बुकमार्क", + modulesBookmarksDescription: "बुकमार्क खोजने और प्रबंधित करने का मॉड्यूल।", + modulesVideosLabel: "वीडियो", + modulesVideosDescription: "वीडियो खोजने और प्रबंधित करने का मॉड्यूल।", + modulesDocsLabel: "दस्तावेज़", + modulesDocsDescription: "दस्तावेज़ खोजने और प्रबंधित करने का मॉड्यूल।", + modulesAudiosLabel: "ऑडियो", + modulesAudiosDescription: "ऑडियो खोजने और प्रबंधित करने का मॉड्यूल।", + modulesTagsLabel: "टैग", + modulesTagsDescription: "वर्गीकरण पैटर्न (टैग) खोजने और अन्वेषण करने का मॉड्यूल।", + modulesImagesLabel: "छवियाँ", + modulesImagesDescription: "छवियाँ खोजने और प्रबंधित करने का मॉड्यूल।", + modulesTrendingLabel: "ट्रेंडिंग", + modulesTrendingDescription: "सबसे लोकप्रिय सामग्री खोजने का मॉड्यूल।", + modulesEventsLabel: "कार्यक्रम", + modulesEventsDescription: "कार्यक्रम खोजने और प्रबंधित करने का मॉड्यूल।", + modulesTasksLabel: "कार्य", + modulesTasksDescription: "कार्य खोजने और प्रबंधित करने का मॉड्यूल।", + modulesMarketLabel: "बाज़ार", + modulesMarketDescription: "सामान या सेवाओं के आदान-प्रदान का मॉड्यूल।", + modulesShopsLabel: "दुकानें", + modulesShopsDescription: "दुकानों को प्रबंधित और खोजने के लिए मॉड्यूल।", + modulesTribesLabel: "जनजातियाँ", + modulesTribesDescription: "जनजातियाँ (समूह) खोजने या बनाने का मॉड्यूल।", + modulesVotationsLabel: "मतदान", + modulesVotationsDescription: "मतदान खोजने और प्रबंधित करने का मॉड्यूल।", + modulesReportsLabel: "रिपोर्ट", + modulesReportsDescription: "मुद्दों, बग, दुरुपयोग और सामग्री चेतावनियों से संबंधित रिपोर्ट प्रबंधित और ट्रैक करने का मॉड्यूल।", + modulesOpinionsLabel: "राय", + modulesOpinionsDescription: "राय खोजने और मतदान करने का मॉड्यूल।", + modulesTransfersLabel: "स्थानांतरण", + modulesTransfersDescription: "स्मार्ट-कॉन्ट्रैक्ट (स्थानांतरण) खोजने और प्रबंधित करने का मॉड्यूल।", + modulesFeedLabel: "फ़ीड", + modulesFeedDescription: "लघु-पाठ (फ़ीड) खोजने और साझा करने का मॉड्यूल।", + modulesParliamentLabel: "संसद", + modulesParliamentDescription: "सरकारों का चुनाव करने और कानूनों पर मतदान करने का मॉड्यूल।", + modulesCourtsLabel: "न्यायालय", + modulesCourtsDescription: "विवादों को हल करने और फैसले जारी करने का मॉड्यूल।", + modulesPixeliaLabel: "Pixelia", + modulesPixeliaDescription: "सहयोगी ग्रिड पर चित्र बनाने का मॉड्यूल।", + modulesAgendaLabel: "एजेंडा", + modulesAgendaDescription: "अपने सभी सौंपे गए आइटम प्रबंधित करने का मॉड्यूल।", + modulesAILabel: "AI", + modulesAIDescription: "'42' नामक LLM से बात करने का मॉड्यूल।", + modulesForumLabel: "मंच", + modulesForumDescription: "मंच खोजने और प्रबंधित करने का मॉड्यूल।", + modulesJobsLabel: "नौकरियाँ", + modulesJobsDescription: "नौकरियाँ खोजने और प्रबंधित करने का मॉड्यूल।", + modulesProjectsLabel: "परियोजनाएँ", + modulesProjectsDescription: "परियोजनाएँ खोजने, क्राउड-फंडिंग करने और प्रबंधित करने का मॉड्यूल।", + modulesBankingLabel: "बैंकिंग", + modulesBankingDescription: "ECOIN का वास्तविक मूल्य निर्धारित करने और सामान्य कोषागार का उपयोग करके UBI वितरित करने का मॉड्यूल।", + modulesFavoritesLabel: "पसंदीदा", + modulesFavoritesDescription: "अपनी पसंदीदा सामग्री प्रबंधित करने का मॉड्यूल।", + fileTooLargeTitle: "फ़ाइल बहुत बड़ी", + fileTooLargeMessage: "फ़ाइल अधिकतम अनुमत आकार (50 MB) से अधिक है। कृपया एक छोटी फ़ाइल चुनें।", + goBack: "वापस जाएँ", + directConnect: "सीधा कनेक्शन", + directConnectDescription: "किसी पीयर से सीधे कनेक्ट करने के लिए उनका IP पता, पोर्ट और सार्वजनिक कुंजी दर्ज करें। पीयर को एक अनुसरित कनेक्शन के रूप में जोड़ा जाएगा।", + peerHost: "IP / होस्टनाम", + peerPort: "पोर्ट (डिफ़ॉल्ट: 8008)", + peerPublicKey: "सार्वजनिक कुंजी (@...ed25519)", + connectAndFollow: "कनेक्ट करें", + deviceSourceLabel: "डिवाइस स्रोत", + modulesPresetTitle: "सामान्य कॉन्फ़िगरेशन", + modulesPreset_minimal: "न्यूनतम", + modulesPreset_basic: "बुनियादी", + modulesPreset_social: "सामाजिक", + modulesPreset_economy: "अर्थव्यवस्था", + modulesPreset_full: "पूर्ण", + statsCarbonFootprintTitle: "कार्बन फुटप्रिंट", + statsCarbonFootprintNetwork: "नेटवर्क कार्बन फुटप्रिंट", + statsCarbonFootprintYours: "आपका कार्बन फुटप्रिंट", + statsCarbonTombstone: "टॉम्बस्टोनिंग फुटप्रिंट", + feedSuccessMsg: "फ़ीड सफलतापूर्वक प्रकाशित!", + dominantOpinionLabel: "प्रमुख राय", + uploadMedia: "मीडिया अपलोड करें (अधिकतम-आकार: 50MB)", + feedOpenDiscussion: "चर्चा खोलें", + feedDetailTitle: "फ़ीड", + feedPostComment: "टिप्पणी पोस्ट करें", + courtsRespondentInvalid: "एक वैध SSB ID होनी चाहिए (@...ed25519)", + noComments: "अभी तक कोई टिप्पणी नहीं", + mapsLabel: "मानचित्र", + mapTitle: "मानचित्र", + mapDescription: "अपने नेटवर्क में ऑफ़लाइन मानचित्र खोजें और प्रबंधित करें।", + mapMineSectionTitle: "आपके मानचित्र", + mapCreateSectionTitle: "मानचित्र बनाएं", + mapUpdateSectionTitle: "मानचित्र अपडेट करें", + mapAllSectionTitle: "मानचित्र", + mapRecentSectionTitle: "हाल के मानचित्र", + mapFavoritesSectionTitle: "पसंदीदा", + mapFilterAll: "सभी", + mapFilterMine: "मेरे", + mapFilterRecent: "हाल के", + mapFilterFavorites: "पसंदीदा", + mapUploadButton: "मानचित्र बनाएं", + mapCreateButton: "मानचित्र बनाएं", + mapUpdateButton: "अपडेट करें", + mapDeleteButton: "हटाएं", + mapAddFavoriteButton: "पसंदीदा में जोड़ें", + mapRemoveFavoriteButton: "पसंदीदा से हटाएं", + mapLatLabel: "अक्षांश", + mapLatPlaceholder: "उदा. 28.6139", + mapLngLabel: "देशांतर", + mapLngPlaceholder: "उदा. 77.2090", + mapDescriptionLabel: "विवरण", + mapDescriptionPlaceholder: "मानचित्र या स्थान का वर्णन करें...", + mapTypeLabel: "मानचित्र प्रकार", + mapTypeSingle: "एकल (केवल प्रारंभिक स्थान)", + mapTypeOpen: "खुला (कोई भी मार्कर जोड़ सकता है)", + mapTypeClosed: "बंद (केवल निर्माता मार्कर जोड़ता है)", + mapTagsLabel: "टैग", + mapTagsPlaceholder: "अल्पविराम से अलग टैग दर्ज करें", + mapUrlLabel: "मानचित्र URL", + mapPickCoordLabel: "या ग्रिड पर स्थान चुनें:", + mapMarkersLabel: "मार्कर", + mapMarkersTitle: "मार्कर", + mapMarkerDefault: "मार्कर", + mapMarkerLatLabel: "मार्कर अक्षांश", + mapMarkerLngLabel: "मार्कर देशांतर", + mapMarkerLabelField: "मार्कर लेबल", + mapMarkerLabelPlaceholder: "इस मार्कर का वर्णन करें...", + markerImageLabel: "मार्कर छवि", + mapAddMarkerTitle: "मार्कर जोड़ें", + mapAddMarkerButton: "मार्कर जोड़ें", + mapCleanMarkerButton: "Clean Marker", + mapApplyZoom: "ज़ूम लागू करें", + mapSearchPlaceholder: "विवरण, टैग, लेखक खोजें...", + mapSearchButton: "खोजें", + mapUpdatedAt: "अपडेट किया गया", + mapNoMatch: "आपकी खोज से मेल खाने वाला कोई मानचित्र नहीं।", + noMaps: "कोई मानचित्र उपलब्ध नहीं।", + mapLocationTitle: "स्थान", + mapVisitLabel: "मानचित्र देखें", + typeMap: "मानचित्र", + typeMapMarker: "मानचित्र मार्कर", + modulesMapLabel: "मानचित्र", + modulesMapDescription: "ऑफ़लाइन मानचित्रों को प्रबंधित और साझा करने का मॉड्यूल।", + padsTitle: "पैड्स", + padTitle: "पैड", + modulesPadsLabel: "पैड्स", + modulesPadsDescription: "सहयोगी पाठ संपादकों को प्रबंधित करने का मॉड्यूल।", + padFilterAll: "सभी", + padFilterMine: "मेरे", + padFilterRecent: "हालिया", + padFilterOpen: "खुला", + padFilterClosed: "बंद", + padCreate: "पैड बनाएं", + padUpdate: "पैड अपडेट करें", + padDelete: "पैड हटाएं", + padTitleLabel: "शीर्षक", + padTitlePlaceholder: "पैड का शीर्षक दर्ज करें...", + padStatusLabel: "स्थिति", + padStatusOpen: "खुला", + padStatusInviteOnly: "केवल आमंत्रण", + padStatusClosed: "बंद", + padDeadlineLabel: "समय सीमा", + padTagsLabel: "टैग", + padTagsPlaceholder: "टैग1, टैग2, ...", + padMembersLabel: "सदस्य", + padVisitPad: "पैड देखें", + padShareUrl: "URL साझा करें", + padCreated: "बनाया गया", + padAuthor: "लेखक", + padGenerateCode: "कोड बनाएं", + padInviteCodeLabel: "आमंत्रण कोड", + padInviteCodePlaceholder: "आमंत्रण कोड दर्ज करें...", + padValidateInvite: "सत्यापित करें", + padStartEditing: "संपादन शुरू करें!", + padEditorPlaceholder: "लिखना शुरू करें...", + padSubmitEntry: "सबमिट करें", + padNoEntries: "अभी कोई प्रविष्टि नहीं।", + padAllSectionTitle: "सभी पैड्स", + padMineSectionTitle: "मेरे पैड्स", + padsDescription: "अपने नेटवर्क में सहयोगी एन्क्रिप्टेड टेक्स्ट संपादक प्रबंधित करें।", + padRecentSectionTitle: "हालिया पैड्स", + padOpenSectionTitle: "खुले पैड्स", + padClosedSectionTitle: "बंद पैड्स", + padCreateSectionTitle: "नया पैड बनाएं", + padUpdateSectionTitle: "पैड अपडेट करें", + padInviteGenerated: "आमंत्रण कोड बनाया गया", + typePad: "पैड", + padNew: "नया", + padAddFavorite: "पसंदीदा में जोड़ें", + padRemoveFavorite: "पसंदीदा से हटाएं", + padClose: "पैड बंद करें", + padBackToEditor: "संपादक पर वापस", + padSearchPlaceholder: "पैड खोजें...", + + modulesChatsLabel: "चैट्स", + modulesChatsDescription: "एन्क्रिप्टेड चैट खोजने और प्रबंधित करने का मॉड्यूल।", + typeChat: "चैट", + typeChatMessage: "चैट संदेश", + chatLabel: "चैट्स", + chatMessageLabel: "चैट संदेश", + chatsTitle: "चैट्स", + chatMineSectionTitle: "Your Chats", + chatRecentTitle: "Recent Chats", + chatFavoritesTitle: "पसंदीदा", + chatOpenTitle: "Open Chats", + chatClosedTitle: "Closed Chats", + chatDescription: "विवरण", + chatCategory: "श्रेणी", + chatStatus: "स्थिति", + chatFilterAll: "सभी", + chatFilterMine: "मेरे", + chatFilterRecent: "हाल के", + chatFilterFavorites: "पसंदीदा", + chatFilterOpen: "खुले", + chatFilterClosed: "बंद", + chatCreate: "चैट बनाएं", + chatUpdate: "चैट अपडेट करें", + chatDelete: "चैट हटाएं", + chatClose: "चैट बंद करें", + chatVisitChat: "चैट देखें", + chatUntitled: "बिना शीर्षक चैट", + chatNoItems: "कोई चैट नहीं मिली।", + chatParticipants: "प्रतिभागी", + chatStartChatting: "चैट शुरू करें!", + chatGenerateCode: "कोड बनाएं", + chatShareUrl: "URL शेयर करें", + chatCreatedAt: "बनाया गया", + chatSearchPlaceholder: "चैट खोजें...", + chatStatusOpen: "खुला", + chatStatusInviteOnly: "केवल आमंत्रण", + chatStatusClosed: "बंद", + chatSendMessage: "भेजें", + chatMessagePlaceholder: "संदेश लिखें...", + chatNoMessages: "अभी तक कोई संदेश नहीं।", + chatLeave: "चैट छोड़ें", + chatInviteCodeLabel: "आमंत्रण कोड दर्ज करें", + chatJoinByInvite: "शामिल हों", + chatTitlePlaceholder: "चैट का शीर्षक", + chatDescriptionPlaceholder: "चैट का विवरण", + chatTagsPlaceholder: "टैग1, टैग2", + chatImageLabel: "छवि फ़ाइल चुनें (.jpeg, .jpg, .png, .gif)", + chatInviteCode: "आमंत्रण कोड", + chatAuthor: "लेखक", + chatCreated: "बनाया", + chatAddFavorite: "पसंदीदा में जोड़ें", + chatRemoveFavorite: "पसंदीदा से हटाएं", + chatPM: "PM", + chatStatusLabel: "स्थिति", + chatCategoryLabel: "श्रेणी", + chatParticipantsLabel: "प्रतिभागी", + gamesTitle: "खेल", + gamesDescription: "कुछ खेल खोजें और खेलें।", + gamesFilterAll: "सभी", + gamesPlayButton: "खेलें!", + gamesBackToGames: "खेलों पर वापस जाएं", + modulesGamesLabel: "खेल", + modulesGamesDescription: "कुछ खेल खोजने और खेलने का मॉड्यूल।", + gamesCocolandTitle: "Cocoland", + gamesCocolandDesc: "आंखों वाला एक नारियल ताड़ के पेड़ों के ऊपर कूदता है और ECOins इकट्ठा करता है।", + gamesTheFlowTitle: "ECOinflow", + gamesTheFlowDesc: "PUBs को validators, shops और accumulators के ज़रिए habitants से जोड़ें। CBDC के खतरे से बचें!", + gamesNeonInfiltratorTitle: "Neon Infiltrator", + gamesNeonInfiltratorDesc: "ग्रिड में घुसें, गोपनीय डेटा इकट्ठा करें, सुरक्षा ड्रोन से बचें और भागें. कितने लेवल साफ कर सकते हैं?", + gamesSpaceInvadersTitle: "Space Invaders", + gamesSpaceInvadersDesc: "एलियन आक्रमण रोकें! आक्रमणकारियों की लहरों को मार गिराएं।", + gamesArkanoidTitle: "Arkanoid", + gamesArkanoidDesc: "अपने पैडल और गेंद से सभी ईंटें तोड़ें। एक क्लासिक आर्केड चुनौती।", + gamesPingPongTitle: "PingPong", + gamesPingPongDesc: "AI के खिलाफ क्लासिक पिंग-पोंग। 5 पॉइंट पहले पाने वाला जीतता है।", + gamesOutrunTitle: "Outrun", + gamesOutrunDesc: "समय के खिलाफ दौड़! यातायात से बचें और समय से पहले मंजिल पर पहुंचें।", + gamesAsteroidsTitle: "Asteroids", + gamesAsteroidsDesc: "क्षुद्रग्रह क्षेत्र में अपना यान उड़ाएं। उन्हें आने से पहले नष्ट करें।", + gamesRockPaperScissorsTitle: "पत्थर कागज कैंची", + gamesRockPaperScissorsDesc: "AI के खिलाफ पत्थर, कागज या कैंची। तीन में से दो जीतने वाला विजेता।", + gamesTikTakToeTitle: "TikTakToe", + gamesTikTakToeDesc: "AI के खिलाफ क्लासिक टिक-टैक-टो। तीन एक पंक्ति में जीत है।", + 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.", + gamesCocomanTitle: "Cocoman", + gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.", + 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?", + gamesQuakeTitle: "Quake Arena", + gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", + gamesFilterScoring: "SCORING", + gamesHallOfFame: "Hall of Fame", + gamesHallPlayer: "Player", + gamesHallScore: "Score", + gamesNoScores: "No scores yet.", + calendarsTitle: "कैलेंडर", + calendarTitle: "कैलेंडर", + modulesCalendarsLabel: "कैलेंडर", + modulesCalendarsDescription: "कैलेंडर खोजने और प्रबंधित करने का मॉड्यूल।", + typeCalendar: "कैलेंडर", + calendarFilterAll: "सभी", + calendarFilterMine: "मेरे", + calendarFilterOpen: "खुला", + calendarFilterClosed: "बंद", + calendarFilterRecent: "हाल के", + calendarFilterFavorites: "पसंदीदा", + calendarCreate: "कैलेंडर बनाएं", + calendarUpdate: "अपडेट करें", + calendarDelete: "हटाएं", + calendarTitleLabel: "शीर्षक", + calendarTitlePlaceholder: "कैलेंडर शीर्षक...", + calendarStatusLabel: "स्थिति", + calendarStatusOpen: "खुला", + calendarStatusClosed: "बंद", + calendarDeadlineLabel: "Deadline", + calendarTagsLabel: "टैग", + calendarTagsPlaceholder: "टैग1, टैग2...", + calendarParticipantsLabel: "प्रतिभागी", + calendarParticipantsCount: "प्रतिभागी", + calendarVisitCalendar: "कैलेंडर देखें", + calendarCreated: "बनाया गया", + calendarAuthor: "लेखक", + calendarJoin: "जुड़ें", + calendarJoined: "जुड़े हुए", + calendarAddDate: "तारीख जोड़ें", + calendarAddNote: "नोट जोड़ें", + calendarDateLabel: "तारीख", + calendarDatePlaceholder: "इस तारीख का वर्णन करें...", + calendarNoteLabel: "नोट", + calendarNotePlaceholder: "नोट जोड़ें...", + calendarFirstDateLabel: "तारीख", + calendarFirstNoteLabel: "नोट्स", + calendarIntervalLabel: "Interval", + calendarIntervalWeekly: "Weekly", + calendarIntervalMonthly: "Monthly", + calendarIntervalYearly: "Yearly", + calendarFormDescription: "विवरण", + calendarNoDates: "कोई तारीख नहीं जोड़ी गई।", + calendarNoNotes: "कोई नोट नहीं।", + calendarsNoItems: "कोई कैलेंडर नहीं मिला।", + calendarsDescription: "अपने नेटवर्क में कैलेंडर खोजें और प्रबंधित करें।", + calendarMonthPrev: "← पिछला", + calendarMonthNext: "अगला →", + calendarMonthLabel: "तारीखें", + calendarsShareUrl: "शेयर URL", + calendarAllSectionTitle: "कैलेंडर", + calendarRecentSectionTitle: "हाल के कैलेंडर", + calendarFavoritesSectionTitle: "पसंदीदा", + calendarMineSectionTitle: "आपके कैलेंडर", + calendarOpenSectionTitle: "खुले कैलेंडर", + calendarClosedSectionTitle: "बंद कैलेंडर", + calendarCreateSectionTitle: "नया कैलेंडर बनाएं", + calendarUpdateSectionTitle: "कैलेंडर अपडेट करें", + calendarAddFavorite: "पसंदीदा में जोड़ें", + calendarDeleteNote: "Delete", + calendarRemoveFavorite: "पसंदीदा से हटाएं", + calendarSearchPlaceholder: "कैलेंडर खोजें...", + calendarAddEntry: "प्रविष्टि जोड़ें", + calendarLeave: "कैलेंडर छोड़ें", + statsCalendar: "कैलेंडर", + statsCalendarDate: "कैलेंडर तारीखें", + statsCalendarNote: "कैलेंडर नोट", + chatAccessDenied: "आपके पास इस चैट तक पहुंच नहीं है। सामग्री तक पहुंचने के लिए आमंत्रण मांगें।", + padAccessDenied: "आपके पास इस पैड तक पहुंच नहीं है। सामग्री तक पहुंचने के लिए आमंत्रण मांगें।", + contentAccessDenied: "आपके पास इस सामग्री तक पहुंच नहीं है।", + blockAccessRestricted: "पहुंच प्रतिबंधित", + tribeContentAccessDenied: "पहुंच अस्वीकृत", + tribeContentAccessDeniedMsg: "यह सामग्री एक जनजाति की है। इसे देखने के लिए आपको सदस्य होना चाहिए।", + tribeViewTribes: "जनजातियाँ देखें", + torrentsTitle: "टॉरेंट", + torrentsDescription: "अपने नेटवर्क में टॉरेंट खोजें और प्रबंधित करें।", + torrentAllSectionTitle: "टॉरेंट", + torrentMineSectionTitle: "आपके टॉरेंट", + torrentRecentSectionTitle: "हालिया टॉरेंट", + torrentTopSectionTitle: "शीर्ष टॉरेंट", + torrentFavoritesSectionTitle: "पसंदीदा", + torrentFilterAll: "सभी", + torrentFilterMine: "मेरे", + torrentFilterRecent: "हालिया", + torrentFilterTop: "शीर्ष", + torrentFilterFavorites: "पसंदीदा", + torrentCreateSectionTitle: "टॉरेंट अपलोड करें", + torrentUpdateSectionTitle: "टॉरेंट अपडेट करें", + torrentCreateButton: "टॉरेंट अपलोड करें", + torrentUpdateButton: "अपडेट करें", + torrentDeleteButton: "हटाएं", + torrentAddFavoriteButton: "पसंदीदा में जोड़ें", + torrentRemoveFavoriteButton: "पसंदीदा से हटाएं", + torrentFileLabel: "टॉरेंट फ़ाइल चुनें (.torrent)", + torrentTitleLabel: "शीर्षक", + torrentTitlePlaceholder: "शीर्षक", + torrentDescriptionLabel: "विवरण", + torrentDescriptionPlaceholder: "विवरण", + torrentTagsLabel: "टैग", + torrentTagsPlaceholder: "अल्पविराम से अलग करके टैग दर्ज करें", + torrentSizeLabel: "आकार", + torrentDownloadButton: "DOWNLOAD IT!", + torrentNoFile: "कोई टॉरेंट फ़ाइल नहीं", + noTorrents: "कोई टॉरेंट नहीं मिला।", + torrentSearchPlaceholder: "शीर्षक, टैग, लेखक खोजें...", + torrentSearchButton: "खोजें", + torrentSortRecent: "सबसे हालिया", + torrentSortOldest: "सबसे पुराने", + torrentSortTop: "सबसे अधिक वोट", + torrentNoMatch: "कोई मिलान टॉरेंट नहीं।", + torrentMessageAuthorButton: "लेखक को संदेश भेजें", + torrentUpdatedAt: "अपडेट किया गया", + statsTorrent: "टॉरेंट", + typeTorrent: "टॉरेंट", + modulesTorrentsLabel: "टॉरेंट", + modulesTorrentsDescription: "टॉरेंट खोजने और प्रबंधित करने का मॉड्यूल।", + favoritesFilterTorrents: "टॉरेंट", + tribeSectionTorrents: "टॉरेंट", + tribeCreateTorrent: "टॉरेंट अपलोड करें", + tribeMediaTypeTorrent: "टॉरेंट", + settingsWishTitle: "इच्छा", + settingsWishDesc: "अपने अवतार की इच्छा कॉन्फ़िगर करें।", + settingsWishWhole: "Multiverse", + settingsWishMutuals: "Only mutual-support", + settingsPmVisibilityTitle: "निजी संदेश", + settingsPmVisibilityDesc: "नेटवर्क में निजी संदेश एक्सपोज़र स्तर कॉन्फ़िगर करें।", + settingsPmVisibilityWhole: "Multiverse", + settingsPmVisibilityMutuals: "Only mutual-support", + pmMutualNotice: "आउटबाउंड UX गार्डरेल है। इनबाउंड ध्यान फ़िल्टर है।", + pmBlockedNonMutual: "केवल पारस्परिक समर्थन वाले निवासियों को PM भेज सकते हैं।", + inhabitantsPendingFollowsTitle: "लंबित समर्थन अनुरोध", + inhabitantsPendingAccept: "स्वीकार", + inhabitantsPendingReject: "अस्वीकार", + bxEncrypted: "एन्क्रिप्टेड", + bxEncryptedHexLabel: "सिफरटेक्स्ट (पूर्वावलोकन)", + tribeSectionGovernance: "शासन", + tribeSubStatusPublic: "सार्वजनिक", + tribeSubStatusPrivate: "निजी", + tribeSubInheritedPrivate: "निजी (मुख्य जनजाति से विरासत)", + tribePadInviteRequired: "पैड तक पहुंच नहीं। निमंत्रण मांगें।", + tribeChatInviteRequired: "चैट तक पहुंच नहीं। निमंत्रण मांगें।", + tribeGovernanceDesc: "इस जनजाति का आंतरिक शासन।", + tribeGovernanceNoGov: "कोई सक्रिय सरकार नहीं", + tribeGovernanceNoGovDesc: "इस जनजाति ने अभी सरकार नहीं चुनी।", + tribeGovCardTitle: "वर्तमान सरकार", + tribeGovCycleSince: "चक्र शुरू", + tribeGovCycleEnd: "चक्र समाप्त", + tribeGovTimeRemaining: "शेष समय", + tribeGovPopulation: "जनसंख्या", + tribeGovMethod: "विधि", + tribeGovVotesReceived: "प्राप्त वोट", + tribeGovLeader: "नेता", + tribeGovFilterGovernment: "सरकार", + tribeGovFilterCandidatures: "उम्मीदवारी", + tribeGovFilterLaws: "कानून", + tribeGovCandidatureId: "उम्मीदवारी", + tribeGovCandidatureMethod: "विधि", + tribeGovCandidatureProposeBtn: "उम्मीदवारी प्रकाशित करें", + tribeGovRuleTitle: "नियम का शीर्षक", + tribeGovRuleBody: "नियम का शरीर", + tribeGovProposals: "प्रस्ताव", + tribeGovRevocations: "निरसन", + tribeGovHistorical: "इतिहास", + tribeGovRules: "नियम", + tribeGovernanceAlreadyPublished: "इस जनजाति की पहले से ही एक खुली उम्मीदवारी है।", + tribeGovernanceProposeInternal: "आंतरिक उम्मीदवारी प्रस्तावित करें", + tribeGovernanceInternalCandidatures: "आंतरिक उम्मीदवारियां", + tribeGovernanceNoCandidatures: "कोई खुली उम्मीदवारी नहीं।", + tribeGovernanceAddRule: "नियम जोड़ें", + tribeGovernanceNoRules: "अभी कोई नियम नहीं।", + tribeGovernanceNoLeaders: "कोई नेता निर्वाचित नहीं।", + tribeGovernanceComingSoon: "शासन मॉड्यूल में जल्द ही।", + logsTitle: "लॉग", + logsDescription: "नेटवर्क पर अपना अनुभव रिकॉर्ड करें।", + logsReadMore: "और पढ़ें", + logsViewTitle: "लॉग", + logsColumnType: "प्रकार", + logsView: "देखें", + logsManualPrompt: "अपनी लॉग लिखें", + logsUpdateButton: "अपडेट करें", + logsEditTitle: "प्रविष्टि संपादित करें", + logsCreateDescription: "अपना अनुभव रिकॉर्ड करें...", + logsCreateTitle: "प्रविष्टि बनाएँ", + logsWriteButton: "लिखें", + logsTextPlaceholder: "अपने अनुभव वर्णित करें...", + logsTextField: "पाठ", + logsLabelPlaceholder: "लेबल...", + logsLabelField: "अपनी लॉग लिखें (लेबल)", + logsAiDisabledWarn: "एआई लिखित लॉग के लिए /modules में एआई मॉड्यूल सक्षम करें।", + logsAiContextValue: "ब्लॉकचेन दिन", + logsAiContext: "संदर्भ", + logsAiModStatus: "AImod", + logsModeApply: "लागू करें!", + logsModeAIWritten: "AI-Assistant", + logsModeManual: "मैन्युअल", + logsModeAI: "एआई", + logsColumnDelete: "हटाएँ", + logsColumnEdit: "संपादित करें", + logsColumnLog: "लॉग", + logsColumnDate: "दिनांक", + logsDelete: "हटाएँ", + logsEdit: "संपादित करें", + logsFilterAlways: "हमेशा", + logsFilterYear: "पिछला वर्ष", + logsFilterMonth: "पिछला महीना", + logsFilterWeek: "पिछला सप्ताह", + logsFilterToday: "आज", + logsFilterRecent: "हाल के", + logsFilterAll: "सभी", + logsCreate: "प्रविष्टि बनाएँ", + logsExport: "लॉग निर्यात करें", + logsExportOne: "निर्यात", + logsViewDetails: "विवरण देखें", + logsGenerateButton: "पाठ जनरेट करें", + logsSearchText: "लॉग में खोजें...", + logsSearchAnyType: "कोई भी प्रकार", + logsSearchButton: "खोजें", + logsEmpty: "कोई प्रविष्टियाँ नहीं।", + modulesLogsLabel: "लॉग", + modulesLogsDescription: "(एआई सहायक के माध्यम से) अपने अनुभव रिकॉर्ड करने के लिए मॉड्यूल।", + statsLogsTitle: "लॉग", + statsLogsEntries: "प्रविष्टियाँ", + typeLog: "लॉग", + blockchainCycle: "चक्र", + + } +}; diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_it.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_it.js index 4634d3cd..6cbe888e 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_it.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_it.js @@ -1658,6 +1658,8 @@ module.exports = { tribeRecentSectionTitle: "Tribù recenti", tribeTopSectionTitle: "Tribù popolari", tribeviewTribeButton: "Visita tribù", + tribeviewSubTribeButton: "Visita Sotto-Tribù", + tribeRootLabel: "RADICE", tribeDescription: "Esplora o crea tribù nella tua rete.", tribeFilterAll: "TUTTE", tribeFilterMine: "MIE", @@ -1852,6 +1854,7 @@ module.exports = { tribeStatusLabel: "Stato", tribeSubTribes: "SOTTO-TRIBÙ", tribeSubTribesCreate: "Crea Sotto-Tribù", + tribeSubTribesStrictDenied: "La modalità rigida della tribù non ti consente di creare nuove sotto-tribù. Si prega di contattare l'amministratore.", tribeSubTribesEmpty: "Nessuna sotto-tribù creata.", tribeLarpCreateForbidden: "Le tribù L.A.R.P. non possono essere create.", tribeLarpUpdateForbidden: "Le tribù L.A.R.P. non possono essere aggiornate.", @@ -2868,6 +2871,7 @@ module.exports = { padNoEntries: "Nessuna voce ancora.", padAllSectionTitle: "Tutti i Pad", padMineSectionTitle: "I Miei Pad", + padsDescription: "Gestisci editor di testo collaborativi cifrati nella tua rete.", padRecentSectionTitle: "Pad Recenti", padOpenSectionTitle: "Pad Aperti", padClosedSectionTitle: "Pad Chiusi", @@ -3130,6 +3134,26 @@ module.exports = { tribeGovernanceDesc: "Governance interna di questa tribù.", tribeGovernanceNoGov: "Nessun governo attivo", tribeGovernanceNoGovDesc: "Questa tribù non ha ancora eletto un governo.", + tribeGovCardTitle: "Governo Attuale", + tribeGovCycleSince: "INIZIO CICLO", + tribeGovCycleEnd: "FINE CICLO", + tribeGovTimeRemaining: "TEMPO RIMANENTE", + tribeGovPopulation: "POPOLAZIONE", + tribeGovMethod: "METODO", + tribeGovVotesReceived: "VOTI RICEVUTI", + tribeGovLeader: "LEADER", + tribeGovFilterGovernment: "GOVERNO", + tribeGovFilterCandidatures: "CANDIDATURE", + tribeGovFilterLaws: "LEGGI", + tribeGovCandidatureId: "Candidatura", + tribeGovCandidatureMethod: "Metodo", + tribeGovCandidatureProposeBtn: "Pubblica candidatura", + tribeGovRuleTitle: "Titolo della regola", + tribeGovRuleBody: "Corpo della regola", + tribeGovProposals: "PROPOSTE", + tribeGovRevocations: "REVOCHE", + tribeGovHistorical: "STORICO", + tribeGovRules: "REGOLE", tribeGovernanceAlreadyPublished: "Questa tribù ha già una candidatura aperta.", tribeGovernanceProposeInternal: "Proponi candidatura interna", tribeGovernanceInternalCandidatures: "Candidature interne", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_pt.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_pt.js index 78c6c149..ae0fe4ec 100644 --- a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_pt.js +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_pt.js @@ -1658,6 +1658,8 @@ module.exports = { tribeRecentSectionTitle: "Tribos recentes", tribeTopSectionTitle: "Tribos populares", tribeviewTribeButton: "Visitar tribo", + tribeviewSubTribeButton: "Visitar sub-tribo", + tribeRootLabel: "RAIZ", tribeDescription: "Explora ou cria tribos na tua rede.", tribeFilterAll: "TODOS", tribeFilterMine: "MEUS", @@ -1852,6 +1854,7 @@ module.exports = { tribeStatusLabel: "Estado", tribeSubTribes: "SUB-TRIBOS", tribeSubTribesCreate: "Criar Sub-Tribo", + tribeSubTribesStrictDenied: "O modo estrito da tribo não permite criar novas sub-tribos. Por favor, entre em contato com o administrador.", tribeSubTribesEmpty: "Ainda sem sub-tribos criadas.", tribeLarpCreateForbidden: "Tribos L.A.R.P. não podem ser criadas.", tribeLarpUpdateForbidden: "Tribos L.A.R.P. não podem ser atualizadas.", @@ -2868,6 +2871,7 @@ module.exports = { padNoEntries: "Sem entradas ainda.", padAllSectionTitle: "Todos os Pads", padMineSectionTitle: "Os Meus Pads", + padsDescription: "Gere editores de texto colaborativos cifrados na tua rede.", padRecentSectionTitle: "Pads Recentes", padOpenSectionTitle: "Pads Abertos", padClosedSectionTitle: "Pads Fechados", @@ -3130,6 +3134,26 @@ module.exports = { tribeGovernanceDesc: "Governança interna desta tribo.", tribeGovernanceNoGov: "Sem governo ativo", tribeGovernanceNoGovDesc: "Esta tribo ainda não elegeu governo.", + tribeGovCardTitle: "Governo Atual", + tribeGovCycleSince: "INÍCIO DO CICLO", + tribeGovCycleEnd: "FIM DO CICLO", + tribeGovTimeRemaining: "TEMPO RESTANTE", + tribeGovPopulation: "POPULAÇÃO", + tribeGovMethod: "MÉTODO", + tribeGovVotesReceived: "VOTOS RECEBIDOS", + tribeGovLeader: "LÍDER", + tribeGovFilterGovernment: "GOVERNO", + tribeGovFilterCandidatures: "CANDIDATURAS", + tribeGovFilterLaws: "LEIS", + tribeGovCandidatureId: "Candidatura", + tribeGovCandidatureMethod: "Método", + tribeGovCandidatureProposeBtn: "Publicar candidatura", + tribeGovRuleTitle: "Título da regra", + tribeGovRuleBody: "Corpo da regra", + tribeGovProposals: "PROPOSTAS", + tribeGovRevocations: "REVOGAÇÕES", + tribeGovHistorical: "HISTÓRICO", + tribeGovRules: "REGRAS", tribeGovernanceAlreadyPublished: "Esta tribo já tem candidatura aberta.", tribeGovernanceProposeInternal: "Propor candidatura interna", tribeGovernanceInternalCandidatures: "Candidaturas internas", diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_ru.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_ru.js new file mode 100644 index 00000000..5fb66fb1 --- /dev/null +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_ru.js @@ -0,0 +1,3181 @@ +const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); +module.exports = { + ru: { + languageName: "Русский", + extended: "Мультивселенная", + extendedDescription: [ + "Когда вы поддерживаете кого-то, вы можете загружать записи жителей, которых они поддерживают, и эти записи отображаются здесь в обратном хронологическом порядке.", + ], + popular: "Избранное", + popularDescription: [ + "Записи жителей вашей сети, ", + strong("отсортированные по распространениям"), + ". Выберите период времени для получения списка.", + ], + day: "ДЕНЬ", + week: "НЕДЕЛЯ", + month: "МЕСЯЦ", + year: "ГОД", + latest: "Последние", + latestDescription: [ + strong("Записи"), + " от вас и жителей, которых вы поддерживаете, в обратном хронологическом порядке.", + ], + topics: "Темы", + topicsDescription: [ + strong("Темы"), + " от вас и жителей, которых вы поддерживаете, в обратном хронологическом порядке.", + ], + summaries: "Сводки", + summariesDescription: [ + strong("Темы с комментариями"), + " от вас и жителей, которых вы поддерживаете, в обратном хронологическом порядке.", + ], + threads: "Обсуждения", + threadsDescription: [ + strong("Записи с комментариями"), + " от жителей, которых вы поддерживаете (включая мультивселенную), в обратном хронологическом порядке.", + ], + profile: "Аватар", + inhabitants: "Жители", + manualMode: "Ручной режим", + mentions: "Упоминания", + mentionsDescription: [ + strong("Записи, в которых @упоминают вас"), + ", в обратном хронологическом порядке.", + ], + nextPage: "Далее", + previousPage: "Назад", + noMentions: "Вы ещё не получали @упоминаний.", + private: "Входящие", + privateDescription: "Просмотр и управление вашими личными сообщениями.", + privateInbox: "ВХОДЯЩИЕ", + privateSent: "ОТПРАВЛЕННЫЕ", + privateFrom: "От", + privateTo: "Кому", + privateDate: "Дата", + privateDelete: "Удалить", + pmCreateButton: "Написать ЛС", + pmReply: "Ответить", + pmReplies: "ответы", + pmNew: "новое", + pmMarkRead: "Отметить как прочитанное", + inReplyTo: "В ОТВЕТ НА", + pmPreview: "Предпросмотр", + pmPreviewTitle: "Предпросмотр сообщения", + noPrivateMessages: "Вы ещё не получали личных сообщений.", + peers: "Узлы", + privateDescription: ["Личные сообщения ",strong("зашифрованы вашим открытым ключом")," и могут иметь максимум 7 получателей."], + search: "Поиск", + searchDescription: "Описание", + imageSearch: "Поиск изображений", + searchPlaceholder: "Искать @жителей, #теги и ключевые слова...", + settings: "Настройки", + continueReading: "Продолжить чтение", + moreComments: "ещё комментарий", + readThread: "прочитать остальное обсуждение", + pixeliaTitle: 'Pixelia', + pixeliaDescription: 'Рисуйте пиксели на сетке и сотрудничайте с другими в вашей сети.', + coordLabel: 'Координата (напр., A3)', + coordPlaceholder: 'Введите координату', + contributorsTitle: "Участники", + pixeliaBy: "автор", + colorLabel: 'Выберите цвет', + paintButton: 'Рисовать!', + invalidCoordinate: 'Неверная координата', + goToMuralButton: "Смотреть фреску", + totalPixels: 'Всего пикселей', + modules: "Модули", + modulesViewTitle: "Модули", + modulesViewDescription: "Настройте свою среду, включая или отключая модули.", + inbox: "Входящие", + multiverse: "Мультивселенная", + popularLabel: "Избранное", + topicsLabel: "Темы", + latestLabel: "Последние", + summariesLabel: "Сводки", + threadsLabel: "Обсуждения", + multiverseLabel: "Мультивселенная", + inboxLabel: "Входящие", + invitesLabel: "Приглашения", + walletLabel: "Кошелёк", + legacyLabel: "Ключи", + cipherLabel: "Шифратор", + bookmarksLabel: "Закладки", + videosLabel: "Видео", + torrentsLabel: "Торренты", + docsLabel: "Документы", + audiosLabel: "Аудио", + tagsLabel: "Теги", + imagesLabel: "Изображения", + inhabitantsLabel: "Жители", + trendingLabel: "В тренде", + eventsLabel: "События", + tasksLabel: "Задачи", + transfersTitle: "Переводы", + marketTitle: "Рынок", + opinionsTitle: "Мнения", + saveSettings: "Сохранить настройки", + apply: "Применить", + menuPersonal: "Личное", + menuContent: "Контент", + menuGovernance: "Управление", + menuOffice: "Офис", + menuMultiverse: "Мультивселенная", + menuNetwork: "Сеть", + menuCreative: "Творчество", + menuEconomy: "Экономика", + menuMedia: "Медиа", + menuTools: "Инструменты", + comment: "Комментарий", + subtopic: "Подтема", + json: "JSON", + createdAt: "Создано", + createdBy: "автор", + unfollow: "Отменить поддержку", + follow: "Поддержать", + block: "Заблокировать", + unblock: "Разблокировать", + newerPosts: "Более новые записи", + olderPosts: "Более старые записи", + feedRangeEmpty: "Данный диапазон пуст для этой ленты. Попробуйте просмотреть ", + seeFullFeed: "полную ленту", + feedEmpty: "Сеть Oasis никогда не видела записей от этого аккаунта.", + beginningOfFeed: "Это начало ленты", + noNewerPosts: "Более новых записей пока не получено.", + relationshipNotFollowing: "Вас не поддерживают", + relationshipTheyFollow: "Поддерживает вас", + relationshipMutuals: "Взаимная поддержка", + relationshipFollowing: "Вы поддерживаете", + relationshipYou: "Вы", + relationshipBlocking: "Вы блокируете", + relationshipBlockedBy: "Вы заблокированы", + relationshipMutualBlock: "Взаимная блокировка", + relationshipNone: "Вы не поддерживаете", + relationshipConflict: "Конфликт", + relationshipBlockingPost: "Заблокированная запись", + viewLikes: "Посмотреть распространения", + spreadedDescription: "Список записей, распространённых жителем.", + totalspreads: "Всего распространений", + attachFiles: "Прикрепить файлы", + preview: "Предпросмотр", + publish: "Написать", + contentWarningPlaceholder: "Добавьте тему к записи (необязательно)", + privateWarningPlaceholder: "Добавьте жителей для отправки приватной записи (необязательно)", + publishWarningPlaceholder: "...", + publishCustomDescription: [ + "ПОМНИТЕ: Благодаря технологии блокчейн, после публикации запись невозможно отредактировать или удалить.", + ], + commentWarning: [ + "ПОМНИТЕ: Благодаря технологии блокчейн, после публикации запись невозможно отредактировать или удалить.", + ], + commentPublic: "публичный", + commentPrivate: "приватный", + commentLabel: ({ publicOrPrivate, markdownUrl }) => [ + ], + publishLabel: ({ markdownUrl, linkTarget }) => [ + "ПОМНИТЕ: Благодаря технологии блокчейн, после публикации запись невозможно отредактировать или удалить.", + ], + replyLabel: ({ markdownUrl }) => [ + "ПОМНИТЕ: Благодаря технологии блокчейн, после публикации запись невозможно отредактировать или удалить.", + ], + publishCustomInfo: ({ href }) => [ + "Если у вас есть опыт, вы также можете ", + a({ href }, "написать расширенную запись"), + ".", + ], + publishBasicInfo: ({ href }) => [ + "Если у вас нет опыта, вам следует ", + a({ href }, "написать запись"), + ".", + ], + publishCustom: "Написать расширенную запись", + subtopicLabel: "Создать подтему для этой записи", + messagePreview: "Предпросмотр записи", + mentionsMatching: "Совпадающие упоминания", + mentionsName: "Имя", + mentionsRelationship: "Отношение", + updateit: "ОБНОВИТЬ!", + updateBannerText: "Доступна новая версия Oasis.", + updateBannerAction: "Обновить сейчас →", + info: "Информация", + settingsIntro: ({ version }) => [ + `[SNH] ꖒ OASIS [ v.${version} ]`, + ], + timeAgo: "назад", + sendTime: "примерно ", + theme: "Тема", + legacy: "Ключи", + legacyTitle: "Ключи", + legacyDescription: "Быстро и безопасно управляйте своим секретом (приватным ключом).", + legacyExportButton: "Экспорт", + legacyImportButton: "Импорт", + ssbLogStream: "Блокчейн", + ssbLogStreamDescription: "Настройте лимит сообщений для потоков блокчейна.", + saveSettings: "Сохранить настройки", + exportTitle: "Экспорт данных", + exportDescription: "Установите пароль (минимум 32 символа) для шифрования вашего ключа", + exportDataTitle: "Резервная копия", + exportDataDescription: "Скачайте ваши данные (без секретного ключа!)", + exportDataButton: "Скачать базу данных", + pubWallet: "PUB Кошелёк", + pubWalletDescription: "Установите URL кошелька PUB. Он будет использоваться для транзакций PUB (включая UBI).", + pubWalletConfiguration: "Сохранить конфигурацию", + importTitle: "Импорт данных", + importDescription: "Импортируйте ваш зашифрованный секрет (приватный ключ) для активации аватара", + importAttach: "Прикрепить зашифрованный файл (.enc)", + passwordLengthInfo: "Пароль должен содержать минимум 32 символа.", + passwordImport: "Введите пароль для расшифровки данных, которые будут сохранены в домашней директории системы (имя файла: secret)", + randomPassword: "Случайный пароль", + exportPasswordPlaceholder: "Используйте строчные, заглавные буквы, цифры и символы", + fileInfo: "Ваш зашифрованный секретный ключ будет сохранён в домашней директории системы (имя файла: oasis.enc)", + themeIntro: + "Выберите тему.", + setTheme: "Установить тему", + language: "Язык", + languageDescription: + "Если вы хотите использовать другой язык, выберите его здесь.", + setLanguage: "Установить язык", + status: "Статус", + peerConnections: "Узлы", + peerConnectionsIntro: "Управляйте всеми подключениями к другим узлам.", + online: "В сети", + offline: "Не в сети", + discovered: 'Обнаружен', + unknown: 'Неизвестно', + pub: 'PUB', + supported: "Поддерживается", + recommended: "Рекомендовано", + blocked: "Заблокирован", + noConnections: "Нет подключённых узлов.", + noDiscovered: "Нет обнаруженных узлов.", + noSupportedConnections: "Нет поддерживаемых узлов.", + noBlockedConnections: "Нет заблокированных узлов.", + noRecommendedConnections: "Нет рекомендованных узлов.", + connectionActionIntro: + "", + startNetworking: "Запустить сеть", + stopNetworking: "Остановить сеть", + restartNetworking: "Перезапустить сеть", + sync: "Синхронизировать сеть", + indexes: "Индексы", + indexesDescription: + "Перестройка индексов безопасна и может исправить некоторые типы ошибок.", + homePageTitle: "Главная", + homePageDescription: "Выберите модуль, который будет вашей главной страницей.", + saveHomePage: "Установить главную", + invites: "Приглашения", + invitesTitle: "Приглашения", + invitesInvites: "Приглашения", + invitesDescription: "Управляйте и применяйте коды приглашений в вашей сети.", + invitesTribesTitle: "Племена", + invitesTribeInviteCodePlaceholder: "Введите код приглашения племени", + invitesTribeJoinButton: "Вступить в племя", + invitesPubsTitle: "PUB", + invitesPubInviteCodePlaceholder: "Введите код приглашения PUB", + invitesAcceptInvite: "Присоединиться к PUB", + invitesAcceptedInvites: "Федеративные сети", + invitesNoInvites: "Приглашения ещё не приняты.", + invitesUnfollow: "Отписаться", + invitesFollow: "Подписаться", + invitesUnfollowedInvites: "Нефедеративные сети", + invitesNoFederatedPubs: "Нет федеративных сетей.", + invitesNoUnfollowed: "Нет нефедеративных сетей.", + invitesUnreachablePubs: "Недоступные сети", + invitesNoUnreachablePubs: "Нет недоступных сетей.", + currentlyUnreachable: "ОШИБКА!", + errorDetails: "Подробности ошибки", + genericError: "Произошла ошибка.", + panicMode: "Режим паники!", + encryptData: "Установите пароль (минимум 32 символа) для шифрования вашего блокчейна", + decryptData: "Введите пароль для расшифровки вашего блокчейна", + panicModeDescription: "Зашифровать/Расшифровать или УДАЛИТЬ ваш блокчейн", + removeDataDescription: "ВНИМАНИЕ: Этот процесс нельзя отменить.", + encryptPanicButton: "Зашифровать блокчейн", + decryptPanicButton: "Расшифровать блокчейн", + removePanicButton: "УДАЛИТЬ ВСЕ ДАННЫЕ!", + searchTitle: "Поиск", + searchDescriptionLabel: "Поиск контента в вашей сети.", + searchLanguagesLabel: "Языки", + searchSkillsLabel: "Навыки", + searchPlaceholder:"Искать контент...", + searchSubmit:"Искать!", + tribeLocationLabel:"Местоположение", + tribeModeLabel:"Режим приглашений", + tribeMembersCount:"Количество участников", + searchDateLabel:"Дата", + searchLocationLabel:"Местоположение", + searchPriceLabel:"Цена", + searchUrlLabel:"URL", + searchCategoryLabel:"Категория", + searchStartLabel:"Время начала", + searchEndLabel:"Время окончания", + searchPriorityLabel:"Приоритет", + searchStatusLabel:"Статус", + statusLabel:"Статус", + totalVotesLabel:"Всего голосов", + votesLabel:"Голоса", + noResultsFound:"Результатов не найдено.", + author:"Автор", + createdAtLabel:"Создано", + hashtagDescription:"Просмотр контента, связанного с этим хештегом", + tribeDescriptionLabel:"Описание", + votesOption:"Варианты голосования", + voteYesLabel:"За", + voteNoLabel:"Против", + allTypesLabel: "БЕЗ ОГРАНИЧЕНИЙ", + ABSTENTIONLabel:"ВОЗДЕРЖАНИЕ", + YESLabel:"ЗА", + NOLabel:"ПРОТИВ", + FOLLOW_MAJORITYLabel: "СЛЕДОВАТЬ БОЛЬШИНСТВУ", + CONFUSEDLabel: "ЗАМЕШАТЕЛЬСТВО", + NOT_INTERESTEDLabel: "НЕ ИНТЕРЕСНО", + voteOptionYes:"За", + voteOptionNo:"Против", + voteOptionAbstention:"Воздержание", + StatusLabel:"Статус", + votesOptionYesLabel:"За", + votesOptionNoLabel:"Против", + votesOptionAbstentionLabel:"Воздержание", + votesQuestionLabel:"Вопрос", + votesCreatedByLabel:"Создано", + voteStatusOpen:"ОТКРЫТО", + voteStatusClosed:"ЗАКРЫТО", + imageSearchLabel: "Введите слова для поиска изображений с соответствующими метками.", + commentDescription: ({ parentUrl }) => [ + " прокомментировал ", + a({ href: parentUrl }, " обсуждение"), + ], + commentTitle: ({ authorName }) => [`Комментарий к записи @${authorName}`], + subtopicDescription: ({ parentUrl }) => [ + " создал подтему из ", + a({ href: parentUrl }, " записи"), + ], + subtopicTitle: ({ authorName }) => [`Подтема записи @${authorName}`], + mysteryDescription: "опубликовал загадочную запись", + oasisDescription: "Сеть проекта OASIS", + searchSubmit: "Искать...", + hashtagDescription: "Записи с этим хештегом.", + postLabel: "ЗАПИСИ", + aboutLabel: "ЖИТЕЛИ", + feedLabel: "ЛЕНТЫ", + votesLabel: "ГОЛОСОВАНИЯ", + reportLabel: "ОТЧЁТЫ", + imageLabel: "ИЗОБРАЖЕНИЯ", + videoLabel: "ВИДЕО", + audioLabel: "АУДИО", + documentLabel: "ДОКУМЕНТЫ", + torrentLabel: "ТОРРЕНТЫ", + pdfFallbackLabel: "PDF документ", + eventLabel: "СОБЫТИЯ", + taskLabel: "ЗАДАЧИ", + transferLabel: "ПЕРЕВОДЫ", + curriculumLabel: "РЕЗЮМЕ", + bookmarkLabel: "ЗАКЛАДКИ", + tribeLabel: "ПЛЕМЕНА", + marketLabel: "РЫНОК", + shopLabel: "SHOPS", + shopProductLabel: "SHOP PRODUCTS", + mapLabel: "MAPS", + jobLabel: "JOBS", + forumLabel: "FORUMS", + projectLabel: "PROJECTS", + bankWalletLabel: "КОШЕЛЬКИ", + bankClaimLabel: "UBI CLAIMS", + voteLabel: "VOTES", + contactLabel: "CONTACTS", + pubLabel: "PUBS", + cvLabel: "Резюме", + submit: "Отправить", + subjectLabel: "Тема", + editProfile: "Редактировать аватар", + editProfileDescription: + "", + profileName: "Имя", + profileImage: "Изображение аватара", + profileDescription: "Описание", + hashtagDescription: + "Записи жителей вашей сети, ссылающиеся на этот #хештег, в обратном хронологическом порядке.", + rebuildName: "Перестроить базу данных", + wallet: "Кошелёк", + walletAddress: "Адрес", + walletAmount: "Сумма", + walletAddressLine: ({ address }) => `Адрес: ${address}`, + walletAmountLine: ({ amount }) => `Сумма: ${amount} ECO`, + walletBack: "Назад", + walletBalanceTitle: "Баланс", + walletWalletSendTitle: "Отправить", + walletReceiveTitle: "Получить", + walletHistoryTitle: "История", + walletBalanceLine: ({ balance }) => `${balance} ECO`, + walletCnfrs: "Подтв.", + walletConfirm: "Подтвердить", + walletDescription: "Управляйте цифровыми активами: отправка и получение ECOin, просмотр баланса и история транзакций.", + walletDate: "Дата", + walletFee: "Комиссия (чем выше комиссия, тем быстрее обработка транзакции)", + walletFeeLine: ({ fee }) => `Комиссия: ECO ${fee}`, + walletHistory: "История", + walletReceive: "Получить", + walletReset: "Сбросить", + walletSend: "Отправить", + walletStatus: "Статус", + walletDisconnected: [ + "ECOin ", + strong("кошелёк отключён"), + ". Проверьте ", + a({ href: '/settings' }, "ваши настройки"), + " или состояние подключения.", + ], + walletSentToLine: ({ destination, amount }) => `Отправлено ECO ${amount} на ${destination}`, + walletSettingsTitle: "Кошелёк", + walletSettingsDescription: "Интегрируйте Oasis с вашим кошельком ECOin.", + walletSettingsDocLink: "Руководство по установке ECOin", + walletStatusMessages: { + invalid_amount: "Неверная сумма", + invalid_dest: "Неверный адрес назначения", + invalid_fee: "Неверная комиссия", + validation_errors: "Ошибки валидации", + send_tx_success: "Транзакция успешна", + }, + walletTitle: "Кошелёк", + walletTotalCostLine: ({ totalCost }) => `Общая стоимость: ECO ${totalCost}`, + walletTransactionId: "ID транзакции", + walletTxId: "ID транзакции", + walletType: "Тип", + walletUser: "Имя пользователя", + walletPass: "Пароль", + walletConfiguration: "Настроить кошелёк", + cipher: "Шифратор", + cipherTitle: "Шифратор", + cipherDescription: "Симметричное шифрование и расшифровка текста (с использованием общего пароля).", + randomPassword: "Случайный пароль", + cipherEncryptTitle: "Зашифровать текст", + cipherEncryptDescription: "Введите текст для шифрования", + cipherTextLabel: "Текст для шифрования", + cipherTextPlaceholder: "Введите текст для шифрования...", + cipherPasswordLabel: "Установите пароль (минимум 32 символа) для шифрования текста", + cipherPasswordDecryptLabel: "Установите пароль (минимум 32 символа) для расшифровки текста", + cipherPasswordPlaceholder: "Введите пароль...", + cipherEncryptButton: "Зашифровать", + cipherDecryptTitle: "Расшифровать текст", + cipherDecryptDescription: "Введите текст для расшифровки", + cipherEncryptedMessageLabel: "Зашифрованный текст", + cipherDecryptedMessageLabel: "Расшифрованный текст", + cipherPasswordUsedLabel: "Пароль, использованный для шифрования (сохраните его!)", + cipherEncryptedTextPlaceholder: "Введите зашифрованный текст...", + cipherIvLabel: "IV", + cipherIvPlaceholder: "Введите вектор инициализации...", + cipherDecryptButton: "Расшифровать", + password: "Пароль", + text: "Текст", + encryptedText: "Зашифрованный текст", + iv: "Вектор инициализации (IV)", + encryptTitle: "Зашифровать текст", + encryptDescription: "Введите текст для шифрования и укажите пароль.", + encryptButton: "Зашифровать", + decryptTitle: "Расшифровать текст", + decryptDescription: "Введите зашифрованный текст и укажите тот же пароль, что использовался при шифровании.", + decryptButton: "Расшифровать", + passwordLengthError: "Пароль должен содержать минимум 32 символа.", + missingFieldsError: "Текст, пароль или IV не указаны.", + encryptionError: "Ошибка шифрования текста.", + decryptionError: "Ошибка расшифровки текста.", + bookmarkTitle: "Закладки", + bookmarkDescription: "Находите и управляйте закладками в вашей сети.", + bookmarkAllSectionTitle: "Закладки", + bookmarkMineSectionTitle: "Ваши закладки", + bookmarkRecentSectionTitle: "Недавние закладки", + bookmarkTopSectionTitle: "Лучшие закладки", + bookmarkFavoritesSectionTitle: "Избранное", + bookmarkCreateSectionTitle: "Создать закладку", + bookmarkUpdateSectionTitle: "Обновить закладку", + bookmarkFilterAll: "ВСЕ", + bookmarkFilterMine: "МОИ", + bookmarkFilterTop: "ЛУЧШИЕ", + bookmarkFilterFavorites: "ИЗБРАННОЕ", + bookmarkFilterRecent: "НЕДАВНИЕ", + bookmarkCreateButton: "Создать закладку", + bookmarkUpdateButton: "Обновить", + bookmarkDeleteButton: "Удалить", + bookmarkAddFavoriteButton: "В избранное", + bookmarkRemoveFavoriteButton: "Из избранного", + bookmarkUrlLabel: "Ссылка", + bookmarkUrlPlaceholder: "https://example.com", + bookmarkDescriptionLabel: "Описание", + bookmarkDescriptionPlaceholder: "Необязательно", + bookmarkTagsLabel: "Теги", + bookmarkTagsPlaceholder: "Введите теги через запятую", + bookmarkCategoryLabel: "Категория", + bookmarkCategoryPlaceholder: "Необязательно", + bookmarkLastVisitLabel: "Последний визит", + bookmarkSearchPlaceholder: "Искать URL, теги, категорию, автора...", + bookmarkSortRecent: "Новейшие", + bookmarkSortOldest: "Старейшие", + bookmarkSortTop: "Больше голосов", + bookmarkSearchButton: "Искать", + bookmarkUpdatedAt: "Обновлено", + bookmarkNoMatch: "Закладки не найдены.", + noBookmarks: "Нет доступных закладок.", + noUrl: "Нет ссылки", + noCategory: "Нет категории", + noLastVisit: "Нет записи о посещении", + videoTitle: "Видео", + videoDescription: "Просматривайте и управляйте видеоконтентом в вашей сети.", + videoPluginTitle: "Название", + videoPluginDescription: "Описание", + videoMineSectionTitle: "Ваши видео", + videoCreateSectionTitle: "Загрузить видео", + videoUpdateSectionTitle: "Обновить видео", + videoAllSectionTitle: "Видео", + videoRecentSectionTitle: "Недавние видео", + videoTopSectionTitle: "Лучшие видео", + videoFavoritesSectionTitle: "Избранное", + videoFilterAll: "ВСЕ", + videoFilterMine: "МОИ", + videoFilterRecent: "НЕДАВНИЕ", + videoFilterTop: "ЛУЧШИЕ", + videoFilterFavorites: "ИЗБРАННОЕ", + videoCreateButton: "Загрузить видео", + videoUpdateButton: "Обновить", + videoDeleteButton: "Удалить", + videoAddFavoriteButton: "В избранное", + videoRemoveFavoriteButton: "Из избранного", + videoFileLabel: "Выберите видеофайл (.mp4, .webm, .ogv, .mov)", + videoTagsLabel: "Теги", + videoTagsPlaceholder: "Введите теги через запятую", + videoTitleLabel: "Название", + videoTitlePlaceholder: "Необязательно", + videoDescriptionLabel: "Описание", + videoDescriptionPlaceholder: "Необязательно", + videoNoFile: "Видеофайл не указан", + noVideos: "Нет доступных видео.", + videoSearchPlaceholder: "Искать название, теги, автора...", + videoSortRecent: "Новейшие", + videoSortOldest: "Старейшие", + videoSortTop: "Больше голосов", + videoSearchButton: "Искать", + videoMessageAuthorButton: "ЛС", + videoUpdatedAt: "Обновлено", + videoNoMatch: "Видео не найдены.", + documentTitle: "Документы", + documentDescription: "Находите и управляйте документами в вашей сети.", + documentAllSectionTitle: "Документы", + documentMineSectionTitle: "Ваши документы", + documentRecentSectionTitle: "Недавние документы", + documentTopSectionTitle: "Лучшие документы", + documentFavoritesSectionTitle: "Избранное", + documentCreateSectionTitle: "Загрузить документ", + documentUpdateSectionTitle: "Редактировать документ", + documentFilterAll: "ВСЕ", + documentFilterMine: "МОИ", + documentFilterRecent: "НЕДАВНИЕ", + documentFilterTop: "ЛУЧШИЕ", + documentFilterFavorites: "ИЗБРАННОЕ", + documentCreateButton: "Загрузить документ", + documentUpdateButton: "Обновить", + documentDeleteButton: "Удалить", + documentAddFavoriteButton: "В избранное", + documentRemoveFavoriteButton: "Из избранного", + documentMessageAuthorButton: "ЛС", + documentFileLabel: "Загрузить документ (.pdf)", + documentTagsLabel: "Теги", + documentTagsPlaceholder: "Введите теги через запятую", + documentTitleLabel: "Название", + documentTitlePlaceholder: "Необязательно", + documentDescriptionLabel: "Описание", + documentDescriptionPlaceholder: "Необязательно", + documentNoFile: "Нет файла.", + noDocuments: "Нет доступных документов.", + documentSearchPlaceholder: "Искать название, теги, описание, автора...", + documentSortRecent: "Новейшие", + documentSortOldest: "Старейшие", + documentSortTop: "Больше голосов", + documentSearchButton: "Искать", + documentNoMatch: "Документы не найдены.", + documentUpdatedAt: "Обновлено", + audioTitle: "Аудио", + audioDescription: "Просматривайте и управляйте аудиоконтентом в вашей сети.", + audioPluginTitle: "Название", + audioPluginDescription: "Описание", + audioMineSectionTitle: "Ваши аудио", + audioCreateSectionTitle: "Загрузить аудио", + audioUpdateSectionTitle: "Обновить аудио", + audioAllSectionTitle: "Аудио", + audioRecentSectionTitle: "Недавние аудио", + audioTopSectionTitle: "Лучшие аудио", + audioFilterAll: "ВСЕ", + audioFilterMine: "МОИ", + audioFilterRecent: "НЕДАВНИЕ", + audioFilterTop: "ЛУЧШИЕ", + audioCreateButton: "Загрузить аудио", + audioUpdateButton: "Обновить", + audioDeleteButton: "Удалить", + audioAddFavoriteButton: "В избранное", + audioRemoveFavoriteButton: "Из избранного", + audioFileLabel: "Выберите аудиофайл (.mp3, .wav, .ogg)", + audioTagsLabel: "Теги", + audioTagsPlaceholder: "Введите теги через запятую", + audioTitleLabel: "Название", + audioTitlePlaceholder: "Необязательно", + audioDescriptionLabel: "Описание", + audioDescriptionPlaceholder: "Необязательно", + audioNoFile: "Аудиофайл не указан", + noAudios: "Нет доступных аудио.", + audioSearchPlaceholder: "Искать название, теги, автора...", + audioSortRecent: "Новейшие", + audioSortOldest: "Старейшие", + audioSortTop: "Больше голосов", + audioSearchButton: "Искать", + audioMessageAuthorButton: "ЛС", + audioUpdatedAt: "Обновлено", + audioNoMatch: "Аудио не найдены.", + audioFavoritesSectionTitle: "Избранное", + audioFilterFavorites: "ИЗБРАННОЕ", + favoritesTitle: "Избранное", + favoritesDescription: "Все ваши избранные медиа в одном месте.", + favoritesFilterAll: "ВСЕ", + favoritesFilterRecent: "НЕДАВНИЕ", + favoritesFilterAudios: "АУДИО", + favoritesFilterBookmarks: "ЗАКЛАДКИ", + favoritesFilterDocuments: "ДОКУМЕНТЫ", + favoritesFilterImages: "ИЗОБРАЖЕНИЯ", + favoritesFilterMaps: "КАРТЫ", + favoritesFilterPads: "БЛОКНОТЫ", + favoritesFilterChats: "ЧАТЫ", + favoritesFilterCalendars: "КАЛЕНДАРИ", + favoritesFilterVideos: "ВИДЕО", + favoritesRemoveButton: "Убрать из избранного", + favoritesNoItems: "Пока нет избранного.", + yourContacts: "Ваши контакты", + allInhabitants: "Жители", + allCVs: "Все резюме", + discoverPeople: "Находите жителей в вашей сети.", + allInhabitantsButton: "ВСЕ", + contactsButton: "ПОДДЕРЖКА", + CVsButton: "Резюме", + matchSkills: "Совпадение навыков", + matchSkillsButton: "СОВПАДЕНИЕ НАВЫКОВ", + suggestedButton: "РЕКОМЕНДОВАННЫЕ", + searchInhabitantsPlaceholder: "ФИЛЬТР жителей ПО ИМЕНИ...", + filterLocation: "ФИЛЬТР жителей ПО МЕСТОПОЛОЖЕНИЮ...", + filterLanguage: "ФИЛЬТР жителей ПО ЯЗЫКУ...", + filterSkills: "ФИЛЬТР жителей ПО НАВЫКАМ...", + applyFilters: "Применить фильтры", + locationLabel: "Местоположение", + languagesLabel: "Языки", + skillsLabel: "Навыки", + commonSkills: "Общие навыки", + mutualFollowers: "Общие подписчики", + latestInteractions: "Последние взаимодействия", + viewAvatar: "Смотреть аватар", + viewCV: "Смотреть резюме", + suggestedSectionTitle: "Рекомендованные", + topkarmaSectionTitle: "Лучшая Карма", + topactivitySectionTitle: "Наибольшая активность", + blockedSectionTitle: "Заблокированные", + gallerySectionTitle: "ГАЛЕРЕЯ", + blockedButton: "ЗАБЛОКИРОВАННЫЕ", + blockedLabel: "Заблокированный пользователь", + inhabitantviewDetails: "Подробнее", + viewDetails: "Подробнее", + keepReading: "Продолжить чтение...", + oasisId: "ID", + noInhabitantsFound: "Жители пока не найдены.", + inhabitantActivityLevel: "Уровень активности", + parliamentTitle: "Парламент", + parliamentDescription: "Изучайте формы правления и коллективные законы управления.", + parliamentFilterGovernment: "ПРАВИТЕЛЬСТВО", + parliamentFilterCandidatures: "КАНДИДАТУРЫ", + parliamentFilterProposals: "ЗАКОНОПРОЕКТЫ", + parliamentFilterLaws: "ЗАКОНЫ", + parliamentFilterHistorical: "ИСТОРИЯ", + parliamentFilterLeaders: "ЛИДЕРЫ", + parliamentFilterRules: "ПРАВИЛА", + parliamentGovernmentCard: "Текущее правительство", + parliamentGovMethod: "МЕТОД ПРАВЛЕНИЯ", + parliamentActorInPowerInhabitant: 'ПРАВЯЩИЙ ЖИТЕЛЬ', + parliamentActorInPowerTribe: 'ПРАВЯЩЕЕ ПЛЕМЯ', + parliamentHistoricalGovernmentsTitle: 'ПРАВИТЕЛЬСТВА', + parliamentHistoricalElectionsTitle: 'ИЗБИРАТЕЛЬНЫЕ ЦИКЛЫ', + parliamentHistoricalLawsTitle: 'ИСТОРИЯ', + parliamentHistoricalLeadersTitle: 'ЛИДЕРЫ', + parliamentThCycles: 'ЦИКЛЫ', + parliamentThTimesInPower: 'ПРАВЛЕНИЕ', + parliamentThTotalCandidatures: 'КАНДИДАТУРЫ', + parliamentThProposed: 'ПРЕДЛОЖЕНО ЗАКОНОВ', + parliamentThApproved: 'ПРИНЯТО ЗАКОНОВ', + parliamentThDeclined: 'ОТКЛОНЕНО ЗАКОНОВ', + parliamentThDiscarded: 'ОТМЕНЕНО ЗАКОНОВ', + parliamentVotesReceived: "ПОЛУЧЕНО ГОЛОСОВ", + parliamentMembers: "УЧАСТНИКИ", + parliamentLegSince: "ЦИКЛ С", + parliamentLegEnd: "ЦИКЛ ДО", + parliamentPoliciesProposal: "ЗАКОНОПРОЕКТЫ", + parliamentPoliciesApproved: "ПРИНЯТЫЕ ЗАКОНЫ", + parliamentPoliciesDeclined: "ОТКЛОНЁННЫЕ ЗАКОНЫ", + parliamentPoliciesDiscarded: "ОТМЕНЁННЫЕ ЗАКОНЫ", + parliamentEfficiency: "% ЭФФЕКТИВНОСТЬ", + parliamentFilterRevocations: 'ОТЗЫВЫ', + parliamentRevocationFormTitle: 'Отозвать закон', + parliamentRevocationLaw: 'Закон', + parliamentRevocationTitle: 'Название', + parliamentRevocationReasons: 'Причины', + parliamentRevocationPublish: 'Опубликовать отзыв', + parliamentCurrentRevocationsTitle: 'Текущие отзывы', + parliamentFutureRevocationsTitle: 'Будущие отзывы', + parliamentPoliciesRevocated: 'ОТОЗВАННЫЕ ЗАКОНЫ', + parliamentPoliciesTitle: 'ИСТОРИЯ', + parliamentLawsTitle: 'ПРИНЯТЫЕ ЗАКОНЫ', + parliamentRulesRevocations: 'Любой принятый закон может быть отозван с использованием текущего метода правления.', + parliamentNoStableGov: "Правительство ещё не выбрано.", + parliamentNoGovernments: "Правительств пока нет.", + parliamentCandidatureFormTitle: "Предложить кандидатуру", + parliamentCandidatureId: "Кандидатура", + parliamentCandidatureIdPh: "Oasis ID (@...) или название племени", + parliamentCandidatureSlogan: "Слоган (макс. 140 символов)", + parliamentCandidatureSloganPh: "Краткий девиз", + parliamentCandidatureMethod: "Метод", + parliamentCandidatureProposeBtn: "Опубликовать кандидатуру", + parliamentThType: "Тип", + parliamentThId: "ID", + parliamentThDate: "Дата предложения", + parliamentThSlogan: "Слоган", + parliamentThMethod: "Метод", + parliamentThKarma: "Карма", + parliamentThSince: "Профиль с", + parliamentThVotes: "Получено голосов", + parliamentThVoteAction: "Голосовать", + parliamentTypeUser: "Житель", + parliamentTypeTribe: "Племя", + parliamentVoteBtn: "Голосовать", + parliamentProposalFormTitle: "Предложить закон", + parliamentProposalTitle: "Название", + parliamentProposalDescription: "Описание (до 1000 символов)", + parliamentProposalPublish: "Опубликовать законопроект", + parliamentOpenVote: "Открыть голосование", + parliamentFinalize: "Завершить", + parliamentDeadline: "Крайний срок", + parliamentStatus: "Статус", + parliamentNoProposals: "Законопроектов пока нет.", + parliamentNoLaws: "Принятых законов пока нет.", + parliamentLawMethod: "Метод", + parliamentLawProposer: "Предложил", + parliamentLawVotes: "ЗА/Всего", + parliamentLawEnacted: "Принят", + parliamentMethodDEMOCRACY: "Демократия", + parliamentMethodMAJORITY: "Большинство (80%)", + parliamentMethodMINORITY: "Меньшинство (20%)", + parliamentMethodDICTATORSHIP: "Диктатура", + parliamentMethodKARMATOCRACY: "Карматократия", + parliamentMethodANARCHY: "Анархия", + parliamentThProposalDate: "Дата предложения", + parliamentThSupports: "Поддержка", + parliamentThVote: "Голос", + parliamentCurrentProposalsTitle: "Текущие законопроекты", + parliamentVotesSlashTotal: "Голоса/Всего", + parliamentVotesNeeded: "Необходимо голосов", + parliamentFutureLawsTitle: "Будущие законы", + parliamentNoFutureLaws: "Будущих законов пока нет.", + parliamentVoteAction: "Голосовать", + parliamentLeadersTitle: "Лидеры", + parliamentThLeader: "АВАТАР", + parliamentPopulation: "Население", + parliamentThInPower: "У власти", + parliamentThPresented: "КАНДИДАТУРЫ", + parliamentNoLeaders: "Лидеров пока нет.", + typeParliament: "ПАРЛАМЕНТ", + typeParliamentCandidature: "Парламент · Кандидатура", + typeParliamentTerm: "Парламент · Срок", + typeParliamentProposal: "Парламент · Законопроект", + typeParliamentLaw: "Парламент · Новый закон", + typeCourts: "Суды", + parliamentLawQuestion: "Вопрос", + parliamentCandidaturesListTitle: "Список кандидатур", + parliamentElectionsEnd: "Конец выборов", + parliamentTimeRemaining: "Оставшееся время", + parliamentCurrentLeader: "Лидирующая кандидатура", + parliamentNoLeader: "Лидирующей кандидатуры пока нет.", + parliamentElectionsStatusTitle: "Следующее правительство", + parliamentElectionsStart: "Начало выборов", + parliamentProposalDeadlineLabel: "Крайний срок", + parliamentProposalTimeLeft: "Осталось времени", + parliamentProposalOnTrack: "На пути к принятию", + parliamentProposalOffTrack: "Недостаточно поддержки", + parliamentRulesTitle: "Как работает Парламент", + parliamentRulesIntro: "Выборы проводятся каждые 2 месяца; кандидатуры подаются непрерывно и сбрасываются при выборе правительства.", + parliamentRulesCandidates: "Любой житель может выдвинуть себя, другого жителя или любое племя. Каждый житель может предложить до 3 кандидатур за цикл; дубликаты в одном цикле отклоняются.", + parliamentRulesElection: "Побеждает кандидатура, набравшая наибольшее количество голосов на момент подведения итогов.", + parliamentRulesTies: "Порядок разрешения ничьих: наивысшая karma жителя; при равенстве — самый старый профиль; при дальнейшем равенстве — самое раннее предложение; затем лексикографически по ID.", + parliamentRulesFallback: "Если никто не голосует, побеждает последняя предложенная кандидатура. Если кандидатур нет, выбирается случайное племя.", + parliamentRulesTerm: "На вкладке «Правительство» отображается текущее правительство и статистика.", + parliamentRulesMethods: "Формы: Анархия (простое большинство), Демократия (50%+1), Большинство (80%), Меньшинство (20%), Карматократия (законопроекты с наивысшей karma), Диктатура (мгновенное утверждение).", + parliamentRulesAnarchy: "Анархия — режим по умолчанию: если ни одна кандидатура не избрана на момент подведения итогов, провозглашается Анархия. При Анархии любой житель может предлагать законы.", + parliamentRulesProposals: "Если вы правящий житель или член правящего племени, вы можете публиковать законопроекты. Недиктаторские методы создают публичное голосование.", + parliamentRulesLimit: "Каждый житель может опубликовать не более 3 законопроектов за цикл.", + parliamentRulesLaws: "Когда законопроект набирает необходимый порог, он становится Законом и появляется на вкладке «Законы» с датой принятия.", + parliamentRulesHistorical: "На вкладке «История» вы можете увидеть каждый цикл правления и данные о его управлении.", + parliamentRulesLeaders: "На вкладке «Лидеры» вы можете увидеть рейтинг жителей/племён, которые правили (или выдвигались), отсортированный по эффективности.", + parliamentProposalVoteStatusLabel: "Статус голосования", + parliamentProposalOnTrackYes: "Порог достигнут", + parliamentProposalOnTrackNo: "Ниже порога", + courtsTitle: "Суды", + courtsDescription: "Изучайте формы разрешения конфликтов и коллективного управления правосудием.", + courtsFilterCases: "ДЕЛА", + courtsFilterMyCases: "МОИ", + courtsFilterJudges: "СУДЬИ", + courtsFilterHistory: "ИСТОРИЯ", + courtsFilterRules: "ПРАВИЛА", + courtsFilterOpenCase: "ОТКРЫТЬ ДЕЛО", + courtsCaseFormTitle: "Открыть дело", + courtsCaseTitle: "Название", + courtsCaseRespondent: "Обвиняемый / Ответчик", + courtsCaseRespondentPh: "Oasis ID (@...) или название племени", + courtsCaseMediatorsAccuser: "Посредники (обвинитель)", + courtsCaseMediatorsPh: "Oasis ID через запятую", + courtsCaseMethod: "Метод разрешения", + courtsCaseDescription: "Описание (макс. 1000 символов)", + courtsCaseEvidenceTitle: "Доказательства по делу", + courtsCaseEvidenceHelp: "Прикрепите изображения, аудио, документы (PDF) или видео, подтверждающие вашу позицию.", + courtsCaseSubmit: "Подать дело", + courtsNominateJudge: "Выдвинуть судью", + courtsJudgeId: "Судья", + courtsJudgeIdPh: "Oasis ID (@...) или имя жителя", + courtsNominateBtn: "Выдвинуть", + courtsAddEvidence: "Добавить доказательство", + courtsEvidenceText: "Текст", + courtsEvidenceLink: "Ссылка", + courtsEvidenceLinkPh: "https://...", + courtsEvidenceSubmit: "Прикрепить", + courtsAnswerTitle: "Ответить на обвинение", + courtsAnswerText: "Краткий ответ", + courtsAnswerSubmit: "Отправить ответ", + courtsStanceDENY: "Отрицать", + courtsStanceADMIT: "Признать", + courtsStancePARTIAL: "Частично", + courtsVerdictTitle: "Вынести вердикт", + courtsVerdictResult: "Результат", + courtsVerdictOrders: "Предписания", + courtsVerdictOrdersPh: "Действия, сроки, восстановительные меры...", + courtsIssueVerdict: "Вынести вердикт", + courtsMediationPropose: "Предложить мировое соглашение", + courtsSettlementText: "Условия", + courtsSettlementProposeBtn: "Предложить", + courtsNominationsTitle: "Судебные номинации", + courtsThJudge: "Судья", + courtsThSupports: "Поддержка", + courtsThDate: "Дата", + courtsThVote: "Голос", + courtsNoNominations: "Номинаций пока нет.", + courtsAccuser: "Обвинитель", + courtsRespondent: "Ответчик", + courtsThStatus: "Статус", + courtsThAnswerBy: "Ответ от", + courtsThEvidenceBy: "Доказательства от", + courtsThDecisionBy: "Решение от", + courtsThCase: "Дело", + courtsThCreatedAt: "Дата начала", + courtsThActions: "Действия", + courtsCaseMediatorsRespondentTitle: "Добавить посредников защиты", + courtsCaseMediatorsRespondent: "Посредники (защита)", + courtsMediatorsAccuserLabel: "Посредники (обвинитель)", + courtsMediatorsRespondentLabel: "Посредники (защита)", + courtsMediatorsSubmit: "Сохранить посредников", + courtsVotesNeeded: "Необходимо голосов", + courtsVotesSlashTotal: "ЗА / ВСЕГО", + courtsOpenVote: "Открыть голосование", + courtsPublicPrefLabel: "Видимость после разрешения", + courtsPublicPrefYes: "Я согласен, что это дело может быть полностью публичным", + courtsPublicPrefNo: "Я предпочитаю сохранить детали конфиденциальными", + courtsPublicPrefSubmit: "Сохранить настройку видимости", + courtsNoCases: "Нет дел.", + courtsNoMyCases: "У вас пока нет конфликтов.", + courtsNoHistory: "Зафиксированных разбирательств пока нет.", + courtsMethodJUDGE: "Судья", + courtsMethodDICTATOR: "Диктатор", + courtsMethodPOPULAR: "Народный", + courtsMethodMEDIATION: "Медиация", + courtsMethodKARMATOCRACY: "Карматократия", + courtsMethod: "Метод", + courtsRulesTitle: "Как работают Суды", + courtsRulesIntro: "Суды — это общественный процесс разрешения конфликтов и содействия восстановительному правосудию. Приоритет отдаётся диалогу, чётким доказательствам и соразмерным мерам.", + courtsRulesLifecycle: "Процесс: 1) Открытие дела 2) Выбор метода 3) Представление доказательств 4) Слушание и обсуждение 5) Вердикт и средства защиты 6) Исполнение и закрытие 7) Апелляция (при необходимости).", + courtsRulesRoles: "Обвинитель: открывает дело. Защита: обвиняемое лицо или племя. Метод: механизм, выбранный сообществом для содействия, оценки доказательств и вынесения вердикта. Свидетель: предоставляет показания или доказательства. Посредники: нейтральные лица, приглашённые обвинителем и/или защитой, имеющие доступ ко всем деталям, которые помогают деэскалировать конфликт и совместно выработать соглашения.", + courtsRulesEvidence: "Описание до 1000 символов. Прикрепляйте релевантные и законные изображения, аудио, видео и PDF-документы. Не передавайте конфиденциальные личные данные без согласия.", + courtsRulesDeliberation: "Слушания могут быть публичными или закрытыми. Судьи обеспечивают уважение, запрашивают уточнения и могут отклонить нерелевантные или незаконные материалы.", + courtsRulesVerdict: "Приоритет отдаётся восстановлению: извинения, соглашения о медиации, модерация контента, временные ограничения или другие соразмерные меры. Обоснование должно быть зафиксировано.", + courtsRulesAppeals: "Апелляция: допускается при наличии новых доказательств или явной процедурной ошибки. Должна быть подана в течение 7 дней, если не указано иное.", + courtsRulesPrivacy: "Уважайте конфиденциальность и безопасность. Доксинг, ненависть или угрозы удаляются. Судьи могут редактировать или засекречивать части записи для защиты людей в зоне риска.", + courtsRulesMisconduct: "Преследование, манипуляции или фабрикация доказательств могут привести к немедленному негативному решению.", + courtsRulesGlossary: "Дело: запись о конфликте. Доказательство: материалы, подтверждающие утверждения. Вердикт: решение с мерой пресечения. Апелляция: запрос на пересмотр вердикта.", + courtsFilterActions: "ДЕЙСТВИЯ", + courtsNoActions: "Нет ожидающих действий для вашей роли.", + courtsCaseTitlePlaceholder: "Краткое описание конфликта", + courtsCaseSeverity: "Серьёзность", + courtsCaseSeverityNone: "Без метки серьёзности", + courtsCaseSeverityLOW: "Низкая", + courtsCaseSeverityMEDIUM: "Средняя", + courtsCaseSeverityHIGH: "Высокая", + courtsCaseSeverityCRITICAL: "Критическая", + courtsCaseSubject: "Тема", + courtsCaseSubjectNone: "Без метки темы", + courtsCaseSubjectBEHAVIOUR: "Поведение", + courtsCaseSubjectCONTENT: "Контент", + courtsCaseSubjectGOVERNANCE: "Управление / правила", + courtsCaseSubjectFINANCIAL: "Финансы / ресурсы", + courtsCaseSubjectOTHER: "Другое", + courtsHiddenRespondent: "Скрыто (видно только участникам дела).", + courtsThRole: "Роль", + courtsRoleAccuser: "Обвинитель", + courtsRoleDefence: "Защита", + courtsRoleMediator: "Посредник", + courtsRoleJudge: "Судья", + courtsRoleDictator: "Диктатор", + courtsAssignJudgeTitle: "Выбрать судью", + courtsAssignJudgeBtn: "Выбрать судью", + trendingTitle: "В тренде", + exploreTrending: "Изучайте самый популярный контент в вашей сети.", + ALLButton: "ВСЕ", + MINEButton: "МОИ", + RECENTButton: "НЕДАВНИЕ", + TOPButton: "ЛУЧШИЕ", + bookmarkButton: "ЗАКЛАДКИ", + transferButton: "ПЕРЕВОДЫ", + eventButton: "СОБЫТИЯ", + taskButton: "ЗАДАЧИ", + votesButton: "ГОЛОСОВАНИЯ", + reportButton: "ОТЧЁТЫ", + feedButton: "ЛЕНТА", + marketButton: "РЫНОК", + imageButton: "ИЗОБРАЖЕНИЯ", + audioButton: "АУДИО", + videoButton: "ВИДЕО", + documentButton: "ДОКУМЕНТЫ", + torrentButton: "ТОРРЕНТЫ", + author: "Автор", + createdAtLabel: "Создано", + totalVotes: "Всего голосов", + noTrendingFound: "Трендовый контент не найден.", + noContentMessage: "Трендового контента пока нет.", + trendingDescription: "Описание", + trendingDate: "Дата", + trendingLocation: "Местоположение", + trendingPrice: "Цена", + trendingUrl: "URL", + trendingCategory: "Категория", + trendingStart: "Начало", + trendingEnd: "Конец", + trendingPriority: "Приоритет", + trendingStatus: "Статус", + trendingFrom: "От", + trendingTo: "Кому", + trendingConcept: "Концепция", + trendingAmount: "Сумма", + trendingDeadline: "Крайний срок", + trendingItemStatus: "Статус элемента", + trendingTotalVotes: "Всего голосов", + trendingTotalOpinions: "Всего мнений", + trendingNoContentMessage: "Трендового контента пока нет.", + trendingAuthor: "Автор", + trendingCreatedAtLabel: "Создано", + trendingTotalCount: "Всего", + tasksTitle: "Задачи", + tasksDescription: "Находите и управляйте задачами в вашей сети.", + taskTitleLabel: "Название", + taskDescriptionLabel: "Описание", + taskStartTimeLabel: "Время начала", + taskEndTimeLabel: "Время окончания", + taskPriorityLabel: "Приоритет", + taskPrioritySelect: "Выберите приоритет", + taskPriorityUrgent: "Срочный", + taskPriorityHigh: "Высокий", + taskPriorityMedium: "Средний", + taskPriorityLow: "Низкий", + taskLocationLabel: "Местоположение", + taskTagsLabel: "Теги", + taskVisibilityLabel: "Видимость", + taskPublic: "публичная", + taskPrivate: "приватная", + taskCreatedAt: "Создано", + taskBy: "Автор", + taskStatus: "Статус", + taskStatusOpen: "Открыта", + taskStatusInProgress: "В работе", + taskStatusClosed: "Закрыта", + taskAssignedTo: "Назначено", + taskAssignees: "Исполнители", + taskAssignButton: "Назначить себе", + taskUnassignButton: "Снять назначение", + taskCreateButton: "Создать задачу", + taskUpdateButton: "Обновить", + taskDeleteButton: "Удалить", + taskFilterAll: "ВСЕ", + taskFilterMine: "МОИ", + taskFilterOpen: "ОТКРЫТЫЕ", + taskFilterInProgress: "В РАБОТЕ", + taskFilterClosed: "ЗАКРЫТЫЕ", + taskFilterAssigned: "НАЗНАЧЕННЫЕ", + taskFilterArchived: "АРХИВ", + taskFilterUrgent: "СРОЧНЫЕ", + taskFilterHigh: "ВЫСОКИЙ", + taskFilterMedium: "СРЕДНИЙ", + taskFilterLow: "НИЗКИЙ", + taskAllSectionTitle: "Задачи", + taskMineSectionTitle: "Ваши задачи", + taskCreateSectionTitle: "Создать задачу", + taskUpdateSectionTitle: "Обновить", + taskOpenTitle: "Открытые задачи", + taskInProgressTitle: "Задачи в работе", + taskClosedTitle: "Закрытые задачи", + taskAssignedTitle: "Назначенные задачи", + taskArchivedTitle: "Архивные задачи", + taskPublicTitle: "Публичные задачи", + taskPrivateTitle: "Приватные задачи", + notasks: "Нет доступных задач.", + noLocation: "Местоположение не указано", + taskSetStatus: "Установить статус", + eventTitle: "Событие", + eventDateLabel: "Дата", + eventsTitle: "События", + eventsDescription: "Находите и управляйте событиями в вашей сети.", + eventDescription: "Описание", + eventPrice: "Цена", + eventStatus: "Статус", + eventOrganizer: "Организатор", + eventAllSectionTitle: "События", + eventMineSectionTitle: "Ваши события", + eventArchivedTitle: "Архивные события", + eventCreateSectionTitle: "Создать событие", + eventUpdateSectionTitle: "Обновить событие", + eventDeleteButton: "Удалить", + eventCreateButton: "Создать событие", + eventTitleLabel: "Название", + eventDescriptionLabel: "Описание", + eventDescriptionPlaceholder: "Введите описание события...", + eventUpdateButton: "Обновить", + eventAttendeesLabel: "Участники", + eventAttendeesPlaceholder: "Введите участников через запятую...", + eventTagsLabel: "Теги", + eventTagsPlaceholder: "Введите теги через запятую...", + eventTags: "Теги", + eventPriceLabel: "Цена", + eventUrlLabel: "URL", + eventAttendees: "Участники", + noAttendees: "Участников пока нет", + eventCreatedAt: "Создано", + eventLocation: "Местоположение", + eventLocationLabel: "Местоположение", + eventNoLocation: "Местоположение не указано", + eventNoURL: "URL не указан", + eventBy: "Автор", + noevents: "Нет доступных событий.", + eventDate: "Дата", + eventDateFormat: "ДД:ММ:ГГГГ ЧЧ:мм", + eventAttendButton: "Принять участие", + eventUnattendButton: "Отменить участие", + eventCreatedBy: "Создано", + eventAttendeesCount: "Количество участников", + eventCreatedByYou: "Вы создали это событие", + eventAttendConfirmation: "Вы теперь участвуете в этом событии", + eventUnattendConfirmation: "Вы больше не участвуете в этом событии", + eventFilterAll: "ВСЕ", + eventFilterMine: "МОИ", + eventFilterToday: "СЕГОДНЯ", + eventFilterWeek: "ЭТА НЕДЕЛЯ", + eventFilterMonth: "ЭТОТ МЕСЯЦ", + eventFilterYear: "ЭТОТ ГОД", + eventFilterArchived: "АРХИВ", + eventTodayTitle: "Сегодняшние события", + eventThisWeekTitle: "События этой недели", + eventThisMonthTitle: "События этого месяца", + eventThisYearTitle: "События этого года", + eventPrivacyLabel: "Видимость", + eventPublic: "Публичное", + eventPrivate: "Приватное", + eventPublicTitle: "Публичные события", + eventNoPrice: "Бесплатное событие", + eventNoImage: "Изображение не загружено", + eventAttended: "Участвует", + eventUnattended: "Не участвует", + eventStatusOpen: "Открыто", + eventStatusClosed: "Закрыто", + tagsTitle: "Теги", + tagsDescription: "Изучайте и исследуйте таксономические шаблоны в вашей сети.", + tagsAllSectionTitle: "Теги", + tagsTopSectionTitle: "Популярные теги", + tagsCloudSectionTitle: "Облако тегов", + tagsFilterAll: "ВСЕ", + tagsFilterTop: "ЛУЧШИЕ", + tagsFilterCloud: "ОБЛАКО", + tagsNoItems: "Нет доступных тегов.", + tagsTableHeaderTag: "ТЕГ/ССЫЛКА:", + tagsTableHeaderCount: "СЧЁТЧИК:", + transfersTitle: "Переводы", + transfersDescription: "Находите и управляйте переводами в вашей сети.", + transfersFrom: "От", + transfersTo: "Кому", + transfersFilterAll: "ВСЕ", + transfersFilterMine: "МОИ", + transfersFilterUBI: "UBI", + transfersFilterMarket: "РЫНОК", + transfersFilterTop: "ЛУЧШИЕ", + transfersFilterPending: "ОЖИДАЮЩИЕ", + transfersFilterUnconfirmed: "НЕПОДТВЕРЖДЁННЫЕ", + transfersFilterClosed: "ЗАКРЫТЫЕ", + transfersFilterDiscarded: "ОТМЕНЁННЫЕ", + transfersCreateButton: "Создать перевод", + transfersUpdateButton: "Обновить", + transfersDeleteButton: "Удалить", + transfersToUser: "Oasis ID", + transfersToUserValidation: "Действительный Oasis ID, напр. @...=.ed25519", + transfersConcept: "Концепция", + transfersAmount: "Сумма", + transfersDeadline: "Крайний срок", + transfersTags: "Теги", + transfersStatus: "Статус", + transfersStatusUnconfirmed: "НЕПОДТВЕРЖДЁН", + transfersStatusClosed: "ЗАКРЫТ", + transfersStatusDiscarded: "ОТМЕНЁН", + transfersCreatedAt: "Создано", + transfersConfirmations: "ПОДТВЕРЖДЕНИЯ", + transfersConfirmButton: "Подтвердить перевод", + transfersNoItems: "Переводы не найдены.", + transfersMineSectionTitle: "Ваши переводы", + transfersUBISectionTitle: "UBI переводы", + transfersMarketSectionTitle: "Рыночные переводы", + transfersTopSectionTitle: "Лучшие переводы", + transfersPendingSectionTitle: "Ожидающие переводы", + transfersUnconfirmedSectionTitle: "Неподтверждённые переводы", + transfersClosedSectionTitle: "Закрытые переводы", + transfersDiscardedSectionTitle: "Отменённые переводы", + transfersCreateSectionTitle: "Создать перевод", + transfersAllSectionTitle: "Переводы", + transfersFilterFavs: "Избранное", + transfersFavsSectionTitle: "Избранные переводы", + transfersSearchLabel: "Поиск", + transfersSearchPlaceholder: "Искать концепцию, теги, пользователей...", + transfersMinAmountLabel: "Мин. сумма", + transfersMaxAmountLabel: "Макс. сумма", + transfersSortLabel: "Сортировать по", + transfersSortRecent: "Новейшие", + transfersSortAmount: "Наибольшая сумма", + transfersSortDeadline: "Ближайший срок", + transfersSearchButton: "Искать", + transfersFavoriteButton: "В избранное", + transfersUnfavoriteButton: "Из избранного", + transfersMessageUserButton: "Написать", + transfersExpiringSoonBadge: "ИСТЕКАЕТ", + transfersExpiredBadge: "ИСТЁК", + transfersUpdatedAt: "Обновлено", + transfersNoMatch: "Переводы не найдены по вашему запросу.", + votationsTitle: "Голосования", + votationsDescription: "Находите и управляйте голосованиями в вашей сети.", + voteMineSectionTitle: "Ваши голосования", + voteCreateSectionTitle: "Создать голосование", + voteUpdateSectionTitle: "Обновить", + voteOpenTitle: "Открытые голосования", + voteClosedTitle: "Закрытые голосования", + voteAllSectionTitle: "Голосования", + voteCreateButton: "Создать голосование", + voteUpdateButton: "Обновить", + voteDeleteButton: "Удалить", + voteOptionYes: "ЗА", + voteOptionNo: "ПРОТИВ", + voteOptionAbstention: "ВОЗДЕРЖАНИЕ", + voteConfused: "ЗАМЕШАТЕЛЬСТВО", + voteFollowMajority: "СЛЕДОВАТЬ БОЛЬШИНСТВУ", + voteNotInterested: "НЕ ИНТЕРЕСНО", + voteFilterAll: "ВСЕ", + voteFilterMine: "МОИ", + voteFilterOpen: "ОТКРЫТЫЕ", + voteFilterClosed: "ЗАКРЫТЫЕ", + voteQuestionLabel: "Вопрос", + voteDeadlineLabel: "Крайний срок", + voteOptionsLabel: "Ваш голос", + voteBreakdown: "Разбивка", + voteFinalResult: "РЕЗУЛЬТАТ", + voteTagsLabel: "Теги", + voteDeadline: "Крайний срок", + voteStatus: "Статус", + voteTotalVotes: "Всего голосов", + voteTags: "Теги", + voteOpinions: "Мнения", + novotes: "Нет доступных голосований.", + voteBy: "Автор", + voteCreatedAt: "Создано", + voteNoQuestion: "Вопрос не указан", + voteUnknownCreator: "Неизвестный автор", + voteUnknownDate: "Неизвестная дата", + errorVoteNotFound: "Голосование не найдено", + errorAlreadyVoted: "Вы уже высказали мнение.", + errorVoteClosedCannotEdit: "Нельзя редактировать закрытое голосование", + errorVoteDeadlinePassed: "Срок этого голосования истёк", + errorRetrievingVote: "Ошибка получения голосования", + errorCreatingVote: "Ошибка создания голосования", + errorVoteAlreadyVoted: "Нельзя редактировать после голосования", + errorDeletingOldVote: "Ошибка удаления старого мнения", + errorCreatingUpdatedVote: "Ошибка создания обновлённого мнения", + errorCreatingTombstone: "Ошибка создания записи об удалении", + voteDetailSectionTitle: 'Детали голосования', + voteCommentsLabel: 'Комментарии', + voteCommentsForumButton: 'Открыть обсуждение', + voteCommentsSectionTitle: 'Открыть обсуждение', + voteNoCommentsYet: 'Комментариев пока нет. Будьте первым.', + voteNewCommentPlaceholder: 'Напишите ваш комментарий...', + voteNewCommentButton: 'Отправить комментарий', + voteNewCommentLabel: 'Добавить комментарий', + cvTitle: "Резюме", + cvLabel: "Curriculum Vitae (CV)", + cvEditSectionTitle: "Редактировать резюме", + cvCreateSectionTitle: "Создать резюме", + cvDescription: "Управляйте и делитесь профессиональными навыками и информацией.", + cvNameLabel: "Полное имя", + cvDescriptionLabel: "Описание", + cvPhotoLabel: "Фото", + cvPersonalExperiencesLabel: "Личный опыт", + cvPersonalSkillsLabel: "Личные навыки (через запятую)", + cvOasisExperiencesLabel: "Опыт вклада в Oasis", + cvOasisSkillsLabel: "Навыки вклада в Oasis (через запятую)", + cvEducationExperiencesLabel: "Образовательный опыт", + cvEducationalSkillsLabel: "Образовательные навыки (через запятую)", + cvProfessionalExperiencesLabel: "Профессиональный опыт", + cvProfessionalSkillsLabel: "Профессиональные навыки (через запятую)", + cvLanguagesLabel: "Языки", + cvLocationLabel: "Местоположение", + cvStatusLabel: "Статус", + cvPreferencesLabel: "Предпочтения", + cvOasisContributorLabel: "Участник Oasis", + cvPersonal: "Личное", + cvOasis: "Участник Oasis (необязательно)", + cvOasisContributorView: "Вклад в Oasis", + cvEducational: "Образование (необязательно)", + cvEducationalView: "Образование", + cvProfessional: "Профессиональное (необязательно)", + cvProfessionalView: "Профессиональное", + cvAvailability: "Доступность (необязательно)", + cvAvailabilityView: "Доступность", + cvUpdateButton: "Обновить", + cvCreateButton: "Создать резюме", + cvContactLabel: "Контакт", + cvCreatedAt: "Создано", + cvUpdatedAt: "Обновлено", + cvEditButton: "Обновить", + cvDeleteButton: "Удалить", + cvNoCV: "Резюме не найдено.", + blogSubject: "Тема", + blogMessage: "Сообщение", + blogImage: "Загрузить медиа (макс: 50MB)", + blogPublish: "Предварительный просмотр", + noPopularMessages: "Популярных сообщений пока нет", + forumTitle: "Форумы", + forumCategoryLabel: "Категория", + forumTitleLabel: "Название", + forumTitlePlaceholder: "Название форума...", + forumCreateButton: "Создать форум", + forumCreateSectionTitle: "Создать форум", + forumDescription: "Общайтесь открыто с другими жителями вашей сети.", + forumFilterAll: "ВСЕ", + forumFilterMine: "МОИ", + forumFilterRecent: "НЕДАВНИЕ", + forumFilterTop: "ТОП", + forumMineSectionTitle: "Ваши форумы", + forumRecentSectionTitle: "Последние форумы", + forumAllSectionTitle: "Форумы", + forumDeleteButton: "Удалить", + forumParticipants: "участники", + forumMessages: "сообщения", + forumLastMessage: "Последнее сообщение", + forumMessageLabel: "Сообщение", + forumMessagePlaceholder: "Напишите сообщение...", + forumSendButton: "Отправить", + forumVisitForum: "Посетить форум", + noForums: "Форумы не найдены.", + forumVisitButton: "Посетить форум", + forumCatGENERAL: "Общее", + forumCatOASIS: "Oasis", + forumCatLARP: "L.A.R.P.", + forumCatPOLITICS: "Политика", + forumCatTECH: "Технологии", + forumCatSCIENCE: "Наука", + forumCatMUSIC: "Музыка", + forumCatART: "Искусство", + forumCatGAMING: "Игры", + forumCatBOOKS: "Книги", + forumCatFILMS: "Фильмы", + forumCatPHILOSOPHY: "Философия", + forumCatSOCIETY: "Общество", + forumCatPRIVACY: "Конфиденциальность", + forumCatCYBERWARFARE: "Кибервойна", + forumCatSURVIVALISM: "Выживание", + imageTitle: "Изображения", + imageDescription: "Исследуйте и управляйте изображениями в вашей сети.", + imagePluginTitle: "Название", + imagePluginDescription: "Описание", + imageMineSectionTitle: "Ваши изображения", + imageCreateSectionTitle: "Загрузить изображение", + imageUpdateSectionTitle: "Обновить изображение", + imageAllSectionTitle: "Изображения", + imageRecentSectionTitle: "Последние изображения", + imageTopSectionTitle: "Топ изображений", + imageFavoritesSectionTitle: "Избранное", + imageGallerySectionTitle: "Галерея", + imageMemeSectionTitle: "Мемы", + imageFilterAll: "ВСЕ", + imageFilterMine: "МОИ", + imageFilterRecent: "НЕДАВНИЕ", + imageFilterTop: "ТОП", + imageFilterFavorites: "ИЗБРАННОЕ", + imageFilterGallery: "ГАЛЕРЕЯ", + imageFilterMeme: "МЕМЫ", + imageCreateButton: "Загрузить изображение", + imageUpdateButton: "Обновить", + imageDeleteButton: "Удалить", + imageAddFavoriteButton: "Добавить в избранное", + imageRemoveFavoriteButton: "Удалить из избранного", + imageFileLabel: "Выбрать файл изображения (.jpeg, .jpg, .png, .gif)", + imageTagsLabel: "Теги", + imageTagsPlaceholder: "Введите теги через запятую", + imageTitleLabel: "Название", + imageTitlePlaceholder: "Необязательно", + imageDescriptionLabel: "Описание", + imageDescriptionPlaceholder: "Необязательно", + imageMemeLabel: "Отметить как МЕМ", + imageNoFile: "Файл изображения не предоставлен", + noImages: "Изображений нет.", + imageSearchPlaceholder: "Поиск по названию, тегам, описанию, автору...", + imageSortRecent: "Самые новые", + imageSortOldest: "Самые старые", + imageSortTop: "С наибольшим рейтингом", + imageSearchButton: "Поиск", + imageMessageAuthorButton: "Сообщение", + imageUpdatedAt: "Обновлено", + imageNoMatch: "Изображения не найдены.", + feedTitle: "Лента", + createFeedTitle: "Создать пост", + createFeedButton: "Отправить пост!", + feedPlaceholder: "Что происходит? (макс 280 символов)", + ALLButton: "Посты", + MINEButton: "Ваши посты", + TODAYButton: "СЕГОДНЯ", + TOPButton: "Топ постов", + CREATEButton: "Создать пост", + totalOpinions: "Всего мнений", + moreVoted: "Больше голосов", + alreadyVoted: "Вы уже высказали мнение.", + noFeedsFound: "Посты не найдены.", + author: "Автор", + createdAtLabel: "Создано", + FeedshareYourOpinions: "Открывайте и делитесь короткими текстами в вашей сети.", + refeedButton: "Переопубликовать", + alreadyRefeeded: "Вы уже переопубликовали это.", + activityTitle: "Активность", + yourActivity: "Ваша активность", + globalActivity: "Глобальная активность", + activityList: "Активность", + activityDesc: "Смотрите последнюю активность в вашей сети.", + allButton: "ВСЕ", + mineButton: "МОИ", + noActions: "Активности нет.", + performed: "→", + from: "От", + to: "Кому", + amount: "Сумма", + concept: "Концепция", + description: "Описание", + meme: "Мем", + activityContact: "Контакт", + activityBy: "Имя", + activityPixelia: "Добавлен новый пиксель", + viewImage: "Просмотр изображения", + playAudio: "Воспроизвести аудио", + playVideo: "Воспроизвести видео", + typeRecent: "НЕДАВНИЕ", + errorActivity: "Ошибка получения активности", + typePost: "ПОСТ", + typeTribe: "ПЛЕМЕНА", + typeAbout: "ЖИТЕЛИ", + typeCurriculum: "РЕЗЮМЕ", + typeImage: "ИЗОБРАЖЕНИЯ", + typeBookmark: "ЗАКЛАДКИ", + typeDocument: "ДОКУМЕНТЫ", + typeVotes: "ГОЛОСОВАНИЯ", + typeAudio: "АУДИО", + typeMarket: "РЫНОК", + typeJob: "ВАКАНСИИ", + typeProject: "ПРОЕКТЫ", + typeVideo: "ВИДЕО", + typeVote: "РАСПРОСТРАНИТЬ", + typeEvent: "СОБЫТИЯ", + typeTransfer: "ПЕРЕВОД", + typeTask: "ЗАДАЧИ", + typePixelia: "ПИКСЕЛИ", + typeForum: "ФОРУМ", + typeReport: "ОТЧЁТЫ", + typeFeed: "ЛЕНТА", + typeContact: "КОНТАКТ", + typePub: "PUB", + typeTombstone: "НАДГРОБИЕ", + typeBanking: "БАНКИНГ", + typeBankWallet: "БАНКИНГ/КОШЕЛЁК", + typeBankClaim: "БАНКИНГ/UBI", + typeKarmaScore: "КАРМА", + typeParliament: "ПАРЛАМЕНТ", + typeSpread: "РАСПРОСТРАНЕНИЯ", + typeParliamentCandidature: "Парламент · Кандидатура", + typeParliamentTerm: "Парламент · Срок", + typeParliamentProposal: "Парламент · Предложение", + typeParliamentRevocation: "Парламент · Отзыв", + typeParliamentLaw: "Парламент · Новый закон", + typeCourts: "СУДЫ", + typeCourtsCase: "Суды · Дело", + typeCourtsEvidence: "Суды · Доказательство", + typeCourtsAnswer: "Суды · Ответ", + typeCourtsVerdict: "Суды · Приговор", + typeCourtsSettlement: "Суды · Мировое соглашение", + typeCourtsSettlementProposal: "Суды · Предложение мирового соглашения", + typeCourtsSettlementAccepted: "Суды · Мировое соглашение принято", + typeCourtsNomination: "Суды · Назначение", + typeCourtsNominationVote: "Суды · Голосование за назначение", + activitySupport: "Заключён новый альянс", + activityJoin: "Присоединился к новому PUB", + question: "Вопрос", + deadline: "Срок", + status: "Статус", + votes: "Голоса", + totalVotes: "Всего голосов", + voteTotalVotes: "Всего голосов", + name: "Имя", + skills: "Навыки", + tags: "Теги", + title: "Название", + date: "Дата", + category: "Категория", + attendees: "Участники", + activitySpread: "->", + visitLink: "Перейти по ссылке", + viewDocument: "Просмотр документа", + location: "Местоположение", + contentWarning: "Тема", + personName: "Имя жителя", + bankWalletConnected: "Кошелёк ECOin", + bankUbiReceived: "Получен UBI", + bankTx: "Транзакция", + bankEpochShort: "Эпоха", + bankingUserEngagementScore: "Оценка КАРМА", + viewDetails: "Просмотр деталей", + link: "Ссылка", + tribeFeedRefeeds: "Переопубликации", + activityProjectFollow: "%OASIS% теперь %ACTION% этот проект %PROJECT%", + activityProjectUnfollow: "%OASIS% теперь %ACTION% этот проект %PROJECT%", + activityProjectPledged: "%OASIS% внёс %ACTION% %AMOUNT% в проект %PROJECT%", + following: "СЛЕЖУ", + unfollowing: "ОТПИСАН", + pledged: "ПОДДЕРЖАЛ", + parliamentCandidatureId: "Кандидатура", + parliamentGovMethod: "Метод", + parliamentVotesReceived: "Получено голосов", + parliamentMethodANARCHY: "Анархия", + parliamentMethodVOTE: "Голосование сообщества", + parliamentMethodRANKED: "Ранговое голосование", + parliamentMethodPLURALITY: "Плюрализм", + parliamentMethodCOUNCIL: "Совет", + parliamentMethodJURY: "Жюри", + parliamentAnarchy: "АНАРХИЯ", + parliamentElectionsStart: "Начало выборов", + parliamentElectionsEnd: "Конец выборов", + parliamentCurrentLeader: "Победившая кандидатура", + parliamentProposalTitle: "Название", + parliamentOpenVote: "Открытое голосование", + parliamentStatus: "Статус", + parliamentLawQuestion: "Вопрос", + parliamentLawMethod: "Метод", + parliamentLawProposer: "Предложивший", + parliamentLawEnacted: "Принято", + parliamentLawVotes: "Голоса", + createdAt: "Создано", + courtsCaseTitle: "Дело", + courtsMethod: "Метод", + courtsMethodJUDGE: "Судья", + courtsMethodJUDGES: "Коллегия судей", + courtsMethodSINGLE_JUDGE: "Единый судья", + courtsMethodJURY: "Жюри", + courtsMethodCOUNCIL: "Совет", + courtsMethodCOMMUNITY: "Сообщество", + courtsMethodMEDIATION: "Медиация", + courtsMethodARBITRATION: "Арбитраж", + courtsMethodVOTE: "Голосование сообщества", + courtsAccuser: "Обвинитель", + courtsRespondent: "Ответчик", + courtsThStatus: "Статус", + courtsThAnswerBy: "Ответ до", + courtsThEvidenceBy: "Доказательства до", + courtsThDecisionBy: "Решение до", + courtsVotesNeeded: "Необходимо голосов", + courtsVotesSlashTotal: "ЗА/ВСЕГО", + courtsOpenVote: "Открытое голосование", + courtsAnswerTitle: "Ответ", + courtsStanceADMIT: "Признаю", + courtsStanceDENY: "Отрицаю", + courtsStancePARTIAL: "Частично", + courtsStanceCOUNTERCLAIM: "Встречный иск", + courtsStanceNEUTRAL: "Нейтрально", + courtsVerdictResult: "Результат", + courtsVerdictOrders: "Предписания", + courtsSettlementText: "Соглашение", + courtsSettlementAccepted: "Принято", + courtsSettlementPending: "В ожидании", + courtsJudge: "Судья", + courtsThSupports: "Поддержки", + courtsFilterOpenCase: "Открытое дело", + courtsEvidenceFileLabel: "Файл доказательства (изображение, аудио, видео или PDF)", + courtsCaseMediators: "Медиаторы", + courtsCaseMediatorsPh: "Oasis ID медиаторов через запятую", + courtsMediatorsLabel: "Медиаторы", + courtsThCase: "Дело", + courtsThCreatedAt: "Дата начала", + courtsThActions: "Действия", + courtsPublicPrefLabel: "Видимость после решения", + courtsPublicPrefYes: "Согласен, что это дело может быть полностью публичным", + courtsPublicPrefNo: "Предпочитаю сохранить детали в тайне", + courtsPublicPrefSubmit: "Сохранить настройку видимости", + courtsNoCases: "Дел нет.", + reportsTitle: "Отчёты", + reportsDescription: "Управляйте и отслеживайте отчёты, связанные с проблемами, ошибками, злоупотреблениями и предупреждениями в вашей сети.", + reportsFilterAll: "ВСЕ", + reportsFilterMine: "МОИ", + reportsFilterFeatures: "ФУНКЦИИ", + reportsFilterBugs: "ОШИБКИ", + reportsFilterAbuse: "ЗЛОУПОТРЕБЛЕНИЯ", + reportsFilterContent: "КОНТЕНТ", + reportsFilterConfirmed: "ПОДТВЕРЖДЁННЫЕ", + reportsFilterResolved: "РЕШЁННЫЕ", + reportsFilterOpen: "ОТКРЫТЫЕ", + reportsFilterUnderReview: "НА РАССМОТРЕНИИ", + reportsFilterInvalid: "НЕДЕЙСТВИТЕЛЬНЫЕ", + reportsCreateButton: "Создать отчёт", + reportsTitleLabel: "Название", + reportsDescriptionLabel: "Описание", + reportsDescriptionPlaceholder: "Пожалуйста, предоставьте подробное описание.", + reportsCategory: "Категория", + reportsCategoryLabel: "Категория", + reportsCategoryFeatures: "Функции", + reportsCategoryBugs: "Ошибки", + reportsCategoryAbuse: "Злоупотребления", + reportsCategoryContent: "Проблемы с контентом", + reportsUpdateButton: "Обновить", + reportsDeleteButton: "Удалить", + reportsDateLabel: "Дата", + reportsUploadFile: "Загрузить медиа (макс: 50MB)", + reportsCreatedBy: "Автор", + reportsMineSectionTitle: "Ваши отчёты", + reportsFeaturesSectionTitle: "Запросы функций", + reportsBugsSectionTitle: "Ошибки", + reportsAbuseSectionTitle: "Отчёты о злоупотреблениях", + reportsContentSectionTitle: "Проблемы с контентом", + reportsAllSectionTitle: "Отчёты", + reportsNoItems: "Отчётов нет.", + reportsValidationTitle: "Введите допустимое название.", + reportsValidationDescription: "Описание не может быть пустым.", + reportsValidationCategory: "Выберите категорию.", + reportsCreatedAt: "Создано", + reportsSeverity: "Серьёзность", + reportsSeverityLow: "Низкая", + reportsSeverityMedium: "Средняя", + reportsSeverityHigh: "Высокая", + reportsSeverityCritical: "Критическая", + reportsStatus: "Статус", + reportsStatusOpen: "Открытый", + reportsStatusUnderReview: "На рассмотрении", + reportsStatusResolved: "Решён", + reportsStatusInvalid: "Недействительный", + reportsUpdateStatusButton: "Обновить статус", + reportsAnonymityOption: "Отправить анонимно", + reportsAnonymousAuthor: "Анонимный", + reportsConfirmButton: "ПОДТВЕРДИТЬ ОТЧЁТ!", + reportsConfirmations: "Подтверждения", + reportsConfirmedSectionTitle: "Подтверждённые отчёты", + reportsCreateTaskButton: "СОЗДАТЬ ЗАДАЧУ", + reportsOpenSectionTitle: "Открытые отчёты", + reportsUnderReviewSectionTitle: "Отчёты на рассмотрении", + reportsResolvedSectionTitle: "Решённые отчёты", + reportsInvalidSectionTitle: "Недействительные отчёты", + reportsTemplateSectionTitle: "Шаблон отчёта", + reportsBugTemplateTitle: "Детали воспроизведения (Ошибки)", + reportsFeatureTemplateTitle: "Детали (Функции)", + reportsAbuseTemplateTitle: "Детали (Злоупотребления)", + reportsContentTemplateTitle: "Детали (Проблемы с контентом)", + reportsStepsToReproduceLabel: "Шаги воспроизведения", + reportsStepsToReproducePlaceholder: "1) ...\n2) ...\n3) ...", + reportsExpectedBehaviorLabel: "Ожидаемый результат", + reportsExpectedBehaviorPlaceholder: "Что должно произойти?", + reportsActualBehaviorLabel: "Фактический результат", + reportsActualBehaviorPlaceholder: "Что произошло на самом деле?", + reportsEnvironmentLabel: "Среда", + reportsEnvironmentPlaceholder: "Версия, устройство, ОС, браузер, настройки, журналы и т.д.", + reportsReproduceRateLabel: "Частота воспроизведения", + reportsReproduceRateAlways: "Всегда", + reportsReproduceRateOften: "Часто", + reportsReproduceRateSometimes: "Иногда", + reportsReproduceRateRarely: "Редко", + reportsReproduceRateUnable: "Невозможно воспроизвести", + reportsReproduceRateUnknown: "Не указано", + reportsProblemStatementLabel: "Проблема / потребность", + reportsProblemStatementPlaceholder: "Какую проблему решает эта функция?", + reportsUserStoryLabel: "История жителя", + reportsUserStoryPlaceholder: "Как <житель>, я хочу <действие>, чтобы <польза>.", + reportsAcceptanceCriteriaLabel: "Критерии приёмки", + reportsAcceptanceCriteriaPlaceholder: "- Дано...\n- Когда...\n- Тогда...", + reportsWhatHappenedLabel: "Что произошло?", + reportsWhatHappenedPlaceholder: "Опишите инцидент с контекстом и примерными датами.", + reportsReportedUserLabel: "Сообщаемый житель / сущность", + reportsReportedUserPlaceholder: "@житель, лента, ID, ссылка и т.д.", + reportsEvidenceLinksLabel: "Доказательства / ссылки", + reportsEvidenceLinksPlaceholder: "Вставьте ссылки, ID сообщений, скриншоты (если применимо) и т.д.", + reportsContentLocationLabel: "Где находится контент", + reportsContentLocationPlaceholder: "Ссылка, ID, канал, тред, автор и т.д.", + reportsWhyInappropriateLabel: "Почему это неуместно", + reportsWhyInappropriatePlaceholder: "Объясните причину и последствия.", + reportsRequestedActionLabel: "Запрашиваемое действие", + reportsRequestedActionPlaceholder: "Удалить, скрыть, пометить, предупредить и т.д.", + tribesTitle: "Племена", + tribeAllSectionTitle: "Племена", + tribeMineSectionTitle: "Ваши племена", + tribeCreateSectionTitle: "Создать племя", + tribeUpdateSectionTitle: "Обновить племя", + tribeGallerySectionTitle: "Галерея племён", + tribeLarpSectionTitle: "L.A.R.P", + tribeRecentSectionTitle: "Недавние племена", + tribeTopSectionTitle: "Популярные племена", + tribeviewTribeButton: "Посетить племя", + tribeviewSubTribeButton: "Посетить под-племя", + tribeRootLabel: "КОРЕНЬ", + tribeDescription: "Исследуйте или создавайте племена в вашей сети.", + tribeFilterAll: "ВСЕ", + tribeFilterMine: "МОИ", + tribeFilterMembership: "ЧЛЕНСТВО", + tribeFilterRecent: "НЕДАВНИЕ", + tribeFilterLarp: "L.A.R.P.", + tribeFilterTop: "ТОП", + tribeFilterSubtribes: "ПОДПЛЕМЕНА", + tribeFilterGallery: "ГАЛЕРЕЯ", + tribeMainTribeLabel: "ГЛАВНОЕ ПЛЕМЯ", + tribeCreateButton: "Создать племя", + tribeUpdateButton: "Обновить", + tribeDeleteButton: "Удалить", + tribeImageLabel: "Загрузить медиа (макс: 50MB)", + tribeTitleLabel: "Название", + searchTribesPlaceholder: "ФИЛЬТР племён ПО ИМЕНИ …", + tribeTitlePlaceholder: "Название племени", + tribeDescriptionLabel: "Описание", + tribeDescriptionPlaceholder: "Опишите это племя", + tribeLocationLabel: "Местоположение", + tribeLocationPlaceholder: "Где находится это племя?", + tribeTagsLabel: "Теги", + tribeTagsPlaceholder: "Введите теги через запятую", + tribeIsLARPLabel: "Племя L.A.R.P.?", + tribeInviteMode: "Режим приглашений", + tribeLARPLabel: "L.A.R.P.", + tribeModeLabel: "РЕЖИМ", + tribeIsAnonymousLabel: "СТАТУС", + tribeMembersCount: "Участники", + tribeInviteCodePlaceholder: "Введите код приглашения", + tribeJoinByCodeButton: "Войти с кодом", + tribeJoinButton: "ВСТУПИТЬ", + tribeLeaveButton: "ПОКИНУТЬ", + tribeYes: "ДА", + tribeNo: "НЕТ", + tribePublic: "ПУБЛИЧНОЕ", + tribePrivate: "ЧАСТНОЕ", + tribeGenerateInvite: "СОЗДАТЬ КОД", + tribeCreatedAt: "Создано", + tribeAuthor: "Автор", + tribeAuthorLabel: "АВТОР", + tribeStrict: "Строгое", + tribeOpen: "Открытое", + tribeFeedFilterRECENT: "НЕДАВНИЕ", + tribeFeedFilterMINE: "МОИ", + tribeFeedFilterALL: "ВСЕ", + tribeFeedFilterTOP: "ТОП", + tribeFeedRefeeds: "Переопубликации", + tribeFeedRefeed: "Переопубликовать", + tribeFeedMessagePlaceholder: "Написать пост…", + tribeFeedSend: "Отправить", + tribeFeedEmpty: "Пока нет постов ленты.", + noTribes: "Племена пока не найдены.", + tribeNotFound: "Племя не найдено!", + createTribeTitle: "Создать племя", + updateTribeTitle: "Обновить племя", + tribeSectionOverview: "Обзор", + tribeSectionInhabitants: "Жители", + tribeSectionVotations: "ГОЛОСОВАНИЯ", + tribeSectionEvents: "СОБЫТИЯ", + tribeSectionReports: "Отчёты", + tribeSectionTasks: "ЗАДАЧИ", + tribeSectionFeed: "ЛЕНТА", + tribeSectionForum: "ФОРУМ", + tribeSectionMarket: "Рынок", + tribeSectionJobs: "Вакансии", + tribeSectionProjects: "Проекты", + tribeSectionMedia: "Медиа", + tribeSectionImages: "ИЗОБРАЖЕНИЯ", + tribeSectionAudios: "АУДИО", + 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.", + tribeInhabitantsEmpty: "В этом племени пока нет жителей.", + tribeEventCreate: "Создать событие", + tribeEventsEmpty: "Событий пока нет.", + tribeEventTitle: "Название", + tribeEventDescription: "Описание", + tribeEventDate: "Дата", + tribeEventLocation: "Местоположение", + tribeEventAttend: "УЧАСТВУЮ", + tribeEventUnattend: "ОТКАЗАТЬСЯ", + tribeEventAttendees: "Участники", + tribeTaskCreate: "Создать задачу", + tribeTasksEmpty: "Задач пока нет.", + tribeTaskTitle: "Название", + tribeTaskDescription: "Описание", + tribeTaskPriority: "Приоритет", + tribeTaskDeadline: "Срок", + tribeTaskAssignees: "Исполнители", + tribeTaskStatusInProgress: "В ПРОЦЕССЕ", + tribeTaskStatusClosed: "ЗАКРЫТЬ", + tribeTaskAssign: "НАЗНАЧИТЬ", + tribeTaskUnassign: "СНЯТЬ НАЗНАЧЕНИЕ", + tribeReportCreate: "Создать отчёт", + tribeReportsEmpty: "Отчётов пока нет.", + tribeReportTitle: "Название", + tribeReportDescription: "Описание", + tribeReportCategory: "Категория", + tribeVotationCreate: "Создать голосование", + tribeVotationsEmpty: "Голосований пока нет.", + tribeVotationTitle: "Название", + tribeVotationDescription: "Описание", + tribeVotationOptions: "Варианты", + tribeVotationDeadline: "Срок", + tribeVotationVote: "ГОЛОСОВАТЬ", + tribeVotationResults: "Голоса", + tribeVotationClose: "ЗАКРЫТЬ ГОЛОСОВАНИЕ", + tribeVotationOptionPlaceholder: "Вариант", + tribeForumCreate: "Создать форум", + tribeForumEmpty: "Тредов пока нет.", + tribeForumTitle: "Название", + tribeForumText: "Сообщение", + tribeForumCategory: "Категория", + tribeForumReply: "Ответить", + tribeForumReplies: "Ответы", + tribeMarketCreate: "Создать объявление", + tribeMarketEmpty: "Объявлений пока нет.", + tribeMarketTitle: "Название", + tribeMarketDescription: "Описание", + tribeMarketPrice: "Цена", + tribeMarketImage: "Изображение", + tribeMarketCategory: "Категория", + tribeJobCreate: "Создать вакансию", + tribeJobsEmpty: "Вакансий пока нет.", + tribeJobTitle: "Название", + tribeJobDescription: "Описание", + tribeJobLocation: "Местоположение", + tribeJobSalary: "Зарплата", + tribeJobDeadline: "Срок", + tribeProjectCreate: "Создать проект", + tribeProjectsEmpty: "Проектов пока нет.", + tribeProjectTitle: "Название", + tribeProjectDescription: "Описание", + tribeProjectGoal: "Цель", + tribeProjectFunded: "Финансировано", + tribeProjectDeadline: "Срок", + tribeMediaUpload: "Загрузить медиа", + readDocument: "Читать документ", + tribeCreateImage: "Создать изображение", + tribeCreateAudio: "Создать аудио", + tribeCreateVideo: "Создать видео", + tribeCreateDocument: "Создать документ", + tribeCreateBookmark: "Создать закладку", + tribeMediaEmpty: "Медиа пока нет.", + tribeMediaTitle: "Название", + tribeMediaDescription: "Описание", + tribeMediaType: "Тип", + tribeMediaTypeImage: "Изображение", + tribeMediaTypeVideo: "Видео", + tribeMediaTypeAudio: "Аудио", + tribeMediaTypeDocument: "Документ", + tribeMediaTypeBookmark: "Закладка", + tribeContentDelete: "УДАЛИТЬ", + tribeInviteCodeText: "Код приглашения: ", + tribeGroupTribe: "Племя", + tribeGroupOffice: "Офис", + tribeGroupNetwork: "Сеть", + tribeGroupEconomy: "Экономика", + tribeGroupMedia: "Медиа", + tribeStatusOpen: "ОТКРЫТОЕ", + tribeStatusClosed: "ЗАКРЫТОЕ", + tribeStatusInProgress: "В ПРОЦЕССЕ", + tribePriorityLow: "НИЗКИЙ", + tribePriorityMedium: "СРЕДНИЙ", + tribePriorityHigh: "ВЫСОКИЙ", + tribePriorityCritical: "КРИТИЧЕСКИЙ", + tribeTaskFilterAll: "ВСЕ", + tribeMediaFilterAll: "ВСЕ", + tribeReportCatBug: "ОШИБКА", + tribeReportCatAbuse: "ЗЛОУПОТРЕБЛЕНИЕ", + tribeReportCatContent: "КОНТЕНТ", + tribeReportCatOther: "ДРУГОЕ", + tribeForumCatGeneral: "ОБЩЕЕ", + tribeForumCatProposal: "ПРЕДЛОЖЕНИЕ", + tribeForumCatQuestion: "ВОПРОС", + tribeForumCatAnnouncement: "ОБЪЯВЛЕНИЕ", + tribeMarketCatGoods: "ТОВАРЫ", + tribeMarketCatServices: "УСЛУГИ", + tribeMarketCatFood: "ЕДА", + tribeMarketCatOther: "ДРУГОЕ", + tribeStatusLabel: "Статус", + tribeSubTribes: "ПОДПЛЕМЕНА", + tribeSubTribesCreate: "Создать подплемя", + tribeSubTribesStrictDenied: "Строгий режим племени не позволяет создавать новые подплемена. Пожалуйста, свяжитесь с администратором.", + tribeSubTribesEmpty: "Подплемён пока не создано.", + tribeLarpCreateForbidden: "Племена L.A.R.P. нельзя создавать.", + tribeLarpUpdateForbidden: "Племена L.A.R.P. нельзя обновлять.", + tribeActivityJoined: "ВСТУПИЛ", + tribeActivityLeft: "ПОКИНУЛ", + tribeActivityFeed: "ЛЕНТА", + tribeActivityRefeed: "ПЕРЕОПУБЛИКОВАЛ", + tribeGroupAnalytics: "Аналитика", + tribeGroupCreative: "Творчество", + tribeSectionActivity: "АКТИВНОСТЬ", + tribeSectionTrending: "ПОПУЛЯРНОЕ", + tribeSectionOpinions: "МНЕНИЯ", + tribeSectionPixelia: "PIXELIA", + tribeSectionTags: "ТЕГИ", + tribeSectionSearch: "ПОИСК", + tribeActivityEmpty: "Активности пока нет.", + tribeActivityCreated: "создал", + tribeActivityPosted: "опубликовал", + tribeActivityReplied: "ответил", + tribeTrendingEmpty: "Популярного контента пока нет.", + tribeTrendingPeriodDay: "Сегодня", + tribeTrendingPeriodWeek: "Эта неделя", + tribeTrendingPeriodAll: "За всё время", + tribeTrendingEngagement: "вовлечённость", + tribeOpinionsEmpty: "Мнений пока нет.", + tribeOpinionsCast: "Голосовать", + tribeOpinionsRankings: "Рейтинги", + tribeOpinionsAlreadyVoted: "Уже проголосовали", + tribeTopCategory: "Больше голосов", + tribePixeliaTitle: "Pixelia", + tribePixeliaDescription: "Совместный пиксель-арт.", + tribePixeliaPaint: "Рисовать", + tribePixeliaContributors: "участников", + tribePixeliaTotalPixels: "пикселей нарисовано", + tribeTagsEmpty: "Тегов не найдено.", + tribeTagsCloud: "Облако тегов", + tribeTagsContentWith: "Контент с тегом", + tribeSearchPlaceholder: "Поиск контента племени...", + tribeSearchEmpty: "Результаты не найдены.", + tribeSearchResults: "Результаты", + tribeSearchMinChars: "Введите не менее 2 символов для поиска.", + agendaTitle: "Повестка дня", + agendaDescription: "Здесь вы можете найти все назначенные вам элементы.", + agendaFilterAll: "ВСЕ", + agendaFilterOpen: "ОТКРЫТЫЕ", + agendaFilterClosed: "ЗАКРЫТЫЕ", + agendaFilterTasks: "ЗАДАЧИ", + agendaFilterMarket: "РЫНОК", + agendaFilterTribes: "ПЛЕМЕНА", + agendaFilterEvents: "СОБЫТИЯ", + agendaFilterReports: "ОТЧЁТЫ", + agendaFilterTransfers: "ПЕРЕВОДЫ", + agendaFilterJobs: "ВАКАНСИИ", + agendaFilterProjects: "ПРОЕКТЫ", + agendaFilterCalendars: "КАЛЕНДАРИ", + agendaNoItems: "Назначений не найдено.", + agendaAuthor: "Автор", + agendaDiscardButton: "Отклонить", + agendaRestoreButton: "Восстановить", + agendaCreatedAt: "Создано", + agendaTitleLabel: "Название", + agendaMembersCount: "Участники", + agendaDescriptionLabel: "Описание", + agendaStatus: "Статус", + agendaVisibility: "Видимость", + agendaEventDate: "Дата события", + agendaEventLocation: "Местоположение", + agendaEventPrice: "Цена", + agendaEventUrl: "URL", + agendaTaskStart: "Время начала", + agendaLocationLabel: "Местоположение", + agendaLARPLabel: "L.A.R.P.", + agendaYes: "ДА", + agendaNo: "НЕТ", + agendaInviteModeLabel: "Статус", + agendaAnonymousLabel: "Анонимный", + agendaMembersLabel: "Участники", + agendareportCategory: "Категория", + agendareportSeverity: "Серьёзность", + agendareportStatus: "Статус", + agendareportDescription: "Описание", + agendaTaskEnd: "Время окончания", + agendaTaskPriority: "Приоритет", + agendaTransferFrom: "От", + agendaTransferTo: "Кому", + agendaTransferConcept: "Концепция", + agendaTransferAmount: "Сумма", + agendaTransferDeadline: "Срок", + opinionsTitle: "Мнения", + shareYourOpinions: "Открывайте и голосуйте за мнения в вашей сети.", + voteNow: "Голосовать", + noOpinionsFound: "Мнений не найдено.", + interestingButton: "ИНТЕРЕСНОЕ", + necessaryButton: "НЕОБХОДИМОЕ", + funnyButton: "СМЕШНОЕ", + disgustingButton: "ОТВРАТИТЕЛЬНОЕ", + sensibleButton: "РАЗУМНОЕ", + propagandaButton: "ПРОПАГАНДА", + adultOnlyButton: "ТОЛЬКО ДЛЯ ВЗРОСЛЫХ", + boringButton: "СКУЧНОЕ", + confusingButton: "ЗАПУТАННОЕ", + inspiringButton: "ВДОХНОВЛЯЮЩЕЕ", + spamButton: "СПАМ", + usefulButton: "ПОЛЕЗНОЕ", + informativeButton: "ИНФОРМАТИВНОЕ", + wellResearchedButton: "ХОРОШО ИССЛЕДОВАННОЕ", + accurateButton: "ТОЧНОЕ", + needsSourcesButton: "НУЖНЫ ИСТОЧНИКИ", + wrongButton: "НЕПРАВИЛЬНОЕ", + lowQualityButton: "НИЗКОЕ КАЧЕСТВО", + creativeButton: "ТВОРЧЕСКОЕ", + insightfulButton: "ПРОНИЦАТЕЛЬНОЕ", + actionableButton: "ПРИМЕНИМОЕ", + loveButton: "ЛЮБЛЮ", + clearButton: "ЯСНОЕ", + upliftingButton: "ПОДНИМАЮЩЕЕ НАСТРОЙ", + unnecessaryButton: "НЕНУЖНОЕ", + rejectedButton: "ОТКЛОНЁННОЕ", + misleadingButton: "ВВОДЯЩЕЕ В ЗАБЛУЖДЕНИЕ", + offTopicButton: "НЕ ПО ТЕМЕ", + duplicateButton: "ДУБЛИРОВАНИЕ", + clickbaitButton: "КЛИКБЕЙТ", + trollButton: "ТРОЛЛЬ", + nsfwButton: "NSFW", + violentButton: "НАСИЛИЕ", + toxicButton: "ТОКСИЧНОЕ", + harassmentButton: "ПРЕСЛЕДОВАНИЕ", + hateButton: "НЕНАВИСТЬ", + scamButton: "МОШЕННИЧЕСТВО", + triggeringButton: "ПРОВОКАЦИОННОЕ", + opinionsCreatedAt: "Создано", + opinionsTotalCount: "Всего мнений", + voteInteresting: "Интересное", + voteNecessary: "Необходимое", + voteUseful: "Полезное", + voteInformative: "Информативное", + voteWellResearched: "Хорошо исследованное", + voteNeedsSources: "Нужны источники", + voteWrong: "Неправильное", + voteLowQuality: "Низкое качество", + voteLove: "Люблю", + voteClear: "Ясное", + voteMisleading: "Вводящее в заблуждение", + voteOffTopic: "Не по теме", + voteDuplicate: "Дублирование", + voteClickbait: "Кликбейт", + votePropaganda: "Пропаганда", + voteFunny: "Смешное", + voteInspiring: "Вдохновляющее", + voteUplifting: "Поднимающее настрой", + voteUnnecessary: "Ненужное", + voteRejected: "Отклонённое", + voteConfusing: "Запутанное", + voteTroll: "Тролль", + voteNsfw: "NSFW", + voteViolent: "Насилие", + voteToxic: "Токсичное", + voteHarassment: "Преследование", + voteHate: "Ненависть", + voteScam: "Мошенничество", + voteTriggering: "Провокационное", + voteInsightful: "Проницательное", + voteAccurate: "Точное", + voteActionable: "Применимое", + voteCreative: "Творческое", + voteSpam: "Спам", + voteAdultOnly: "Только для взрослых", + publishBlog: "Опубликовать блог", + privateMessage: "ЛС", + pmSendTitle: "Личные сообщения", + pmSend: "Отправить!", + pmDescription: "Используйте эту форму для отправки зашифрованного сообщения другим жителям.", + pmRecipients: "Получатели", + pmRecipientsHint: "Введите Oasis ID через запятую", + pmSubject: "Тема", + pmSubjectHint: "Введите тему сообщения", + pmText: "Сообщение", + pmFile: "Вложение", + pmInvalidMessage: "Недействительное сообщение", + pmNoSubject: "(без темы)", + pmSubjectLabel: "Тема:", + pmBodyLabel: "Тело", + pmBotJobs: "42-JobsBOT", + pmBotProjects: "42-ProjectsBOT", + pmBotMarket: "42-MarketBOT", + inboxJobSubscribedTitle: "Новая подписка на вашу вакансию", + pmInhabitantWithId: "Житель с OASIS ID:", + pmHasSubscribedToYourJobOffer: "подписался на вашу вакансию", + inboxProjectCreatedTitle: "Создан новый проект", + pmHasCreatedAProject: "создал проект", + inboxMarketItemSoldTitle: "Товар продан", + pmYourItem: "Ваш товар", + pmHasBeenSoldTo: "был продан", + pmFor: "за", + inboxProjectPledgedTitle: "Новый взнос в ваш проект", + pmHasPledged: "внёс", + pmToYourProject: "в ваш проект", + blockchain: "BlockExplorer", + blockchainTitle: "BlockExplorer", + blockchainDescription: "Исследуйте и визуализируйте блоки в блокчейне.", + blockchainNoBlocks: "Блоков в блокчейне не найдено.", + blockchainBlockID: "ID блока", + blockchainBlockAuthor: "Автор", + blockchainBlockType: "Тип", + blockchainBlockTimestamp: "Временная метка", + blockchainBlockContent: "Блок", + blockchainBlockURL: "URL:", + blockchainContent: "Блок", + blockchainContentPreview: "Предварительный просмотр содержимого блока", + blockchainLatestDatagram: "Последняя датаграмма", + blockchainDatagram: "Датаграмма", + blockchainDetails: "Просмотр деталей блока", + blockchainBlockInfo: "Информация о блоке", + blockchainBlockDetails: "Детали выбранного блока", + blockchainBack: "Назад в BlockExplorer", + blockchainContentDeleted: "Этот контент был удалён", + visitContent: "Посетить контент", + banking: "Банкинг", + bankingTitle: "Банкинг", + bankingDescription: "Исследуйте текущую стоимость ECOin и соответствующее распределение UBI, распределяемое за эпоху на основе участия и доверия.", + bankOverview: "Обзор", + bankEpochs: "Эпохи", + bankRules: "Правила", + pending: "В ожидании", + closed: "Закрыто", + bankBack: "Назад в Банкинг", + bankViewTx: "Просмотр транзакции", + bankClaimNow: "Получить сейчас", + bankClaimUBI: "Получить UBI!", + bankClaimAndPay: 'Claim & Pay', + bankClaimedPending: 'Claim pending...', + bankStatusUnclaimed: 'Unclaimed', + bankStatusClaimed: 'Claimed', + bankStatusExpired: 'Expired', + bankPubOnly: 'PUB-only operation', + bankNoPendingUBI: "Нет ожидающих распределений UBI для этой эпохи.", + bankEpoch: "Эпоха", + bankPool: "Пул (эта эпоха)", + bankWeightsSum: "Сумма весов", + bankAllocations: "Распределения", + bankNoAllocations: "Распределений не найдено.", + bankNoEpochs: "Эпох не найдено.", + bankEpochAllocations: "Распределения эпохи", + bankAllocDate: "Дата", + bankAllocConcept: "Концепция", + bankAllocFrom: "От", + bankAllocTo: "Кому", + bankAllocAmount: "Сумма", + bankAllocStatus: "Статус", + bankEpochId: "ID эпохи", + bankRuleHash: "Хэш снимка правил", + bankViewEpoch: "Просмотр эпохи", + bankUserBalance: "Ваш баланс", + ecoWalletNotConfigured: "Кошелёк ECOin не настроен", + editWallet: "Редактировать кошелёк", + addWallet: "Добавить кошелёк", + bankAddresses: "Адреса", + bankNoAddresses: "Адресов не найдено.", + bankUser: "Oasis ID", + bankAddress: "Адрес", + bankAddAddressTitle: "Добавить адрес ECOIN", + bankAddAddressUser: "Oasis ID", + bankAddAddressAddress: "Адрес ECOIN", + bankAddAddressSave: "Сохранить", + bankAddressAdded: "Адрес добавлен", + bankAddressUpdated: "Адрес обновлён", + bankAddressExists: "Адрес уже существует", + bankAddressInvalid: "Недействительный адрес", + bankAddressDeleted: "Адрес удалён", + bankAddressNotFound: "Адрес не найден", + bankAddressTotal: "Всего адресов", + bankAddressSearch: "Поиск @жителя или адреса", + bankAddressActions: "Действия", + bankAddressDelete: "Удалить", + bankAddressSource: "Источник", + bankAddressDeleteConfirm: "Удалить этот адрес?", + bankLocal: "Локальный", + bankFromOasis: "Oasis", + bankMyAddress: "Ваш адрес", + bankRemoveMyAddress: "Удалить мой адрес", + bankNotRemovableOasis: "Адреса нельзя удалить локально", + bankingFutureUBI: "UBI", + pubIdTitle: "PUB Wallet", + pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", + pubIdLabel: "PUB ID", + pubIdSave: "Save configuration", + pubIdPlaceholder: "@PUB_ID.ed25519", + bankUbiAvailableNo: "НЕТ СРЕДСТВ!", + bankUbiAvailableOk: "ДОСТУПНО!", + bankUbiAvailability: "Доступность UBI", + bankAlreadyClaimedThisMonth: "Уже получено в этом месяце", + bankUbiThisMonth: "БОД (этот месяц)", + bankUbiLastClaimed: "БОД (последнее получение)", + bankUbiNeverClaimed: "Никогда не получено", + bankUbiTotalClaimed: "БОД (всего получено)", + bankUbiPub: "PUB", + bankUbiInhabitant: "ЖИТЕЛЬ", + bankUbiClaimedAmount: "ПОЛУЧЕНО (ECO)", + typeBankUbiResult: "БАНКИНГ - БОД", + bankNoPubConfigured: "PUB не настроен. Укажите ID PUB в Настройках.", + shopsTitle: "Магазины", + shopDescription: "Откройте и управляйте магазинами в сети.", + shopTitle: "Магазин", + shopFilterAll: "ВСЕ", + shopFilterMine: "МОИ", + shopFilterRecent: "НЕДАВНИЕ", + shopFilterTop: "ТОП", + shopFilterProducts: "ТОВАРЫ", + shopFilterPrices: "ЦЕНЫ", + shopFilterFavorites: "ИЗБРАННЫЕ", + shopUpload: "Создать магазин", + shopAllSectionTitle: "Все магазины", + shopMineSectionTitle: "Мои магазины", + shopRecentSectionTitle: "Недавние магазины", + shopTopSectionTitle: "Лучшие магазины", + shopProductsSectionTitle: "Лучшие товары", + shopPricesSectionTitle: "Товары по цене", + shopFavoritesSectionTitle: "Избранные", + shopCreateSectionTitle: "Создать магазин", + shopUpdateSectionTitle: "Обновить магазин", + shopCreate: "Создать", + shopUpdate: "Обновить", + shopDelete: "Удалить", + shopAddFavorite: "Добавить в избранное", + shopRemoveFavorite: "Убрать из избранного", + shopOpen: "ОТКРЫТ", + shopClosed: "ЗАКРЫТ", + shopOpenShop: "Открыть магазин", + shopCloseShop: "Закрыть магазин", + shopProducts: "Товары", + shopProductAdd: "Добавить товар", + shopProductTitle: "Товар", + shopProductUpdate: "Обновить товар", + shopProductPrice: "Цена (ECO)", + shopProductStock: "Наличие", + shopProductUntitled: "Товар без названия", + shopUntitled: "Магазин без названия", + shopNoItems: "Магазины не найдены.", + shopNoProducts: "Товаров пока нет.", + shopOutOfStock: "Нет в наличии", + shopBuy: "Купить", + shopBackToShop: "Назад в магазин", + shopShareUrl: "Ссылка для обмена", + shopVisitShop: "ПОСЕТИТЬ МАГАЗИН", + shopStatus: "СТАТУС", + shopCreatedAt: "СОЗДАН", + shopSearchPlaceholder: "Поиск магазинов...", + shopUrl: "URL", + shopLocation: "Местоположение", + shopTags: "Теги", + shopVisibility: "Видимость", + shopImage: "Изображение", + shopShortDescription: "Краткое описание", + shopShortDescriptionPlaceholder: "Краткое описание для карточек (макс. 160 символов)", + shopTitlePlaceholder: "Название вашего магазина", + shopDescriptionPlaceholder: "Подробное описание вашего магазина", + shopUrlPlaceholder: "https://url-vashego-magazina.ru", + shopLocationPlaceholder: "Город, Страна", + shopTagsPlaceholder: "тег1, тег2, тег3", + mapTitlePlaceholder: "Название карты", + shopProductFeatured: "Рекомендуемый товар", + shopSendToMarket: "Send to Market", + typeShop: "МАГАЗИН", + typeShopProduct: "ТОВАР МАГАЗИНА", + bankExchange: "Обмен", + bankExchangeCurrentValue: "Стоимость ECOin (1ч)", + bankTotalSupply: "Общий объём ECOin", + bankEcoinHours: "Эквивалент ECOin во времени", + bankHoursOfWork: "часов", + bankUnitMs: "мс", + bankUnitSeconds: "секунды", + bankUnitMinutes: "минуты", + bankUnitDays: "дни", + bankExchangeNoData: "Данные недоступны", + bankExchangeIndex: "Стоимость ECOin (1ч)", + bankInflation: "Инфляция ECOin (anual)", + bankInflationMonthly: "Инфляция ECOin (mensual)", + bankCurrentSupply: "Текущий объём ECOin", + bankingSyncStatus: "Статус ECOin", + bankingSyncStatusSynced: "Синхронизирован", + bankingSyncStatusOutdated: "Устарел", + statsTitle: "Статистика", + statistics: "Статистика", + statsInhabitant: "Статистика жителя", + statsDescription: "Откройте статистику вашей сети.", + TOMBSTONEButton: "НАДГРОБИЯ", + statsYou: "Вы", + statsUserId: "Oasis ID", + statsCreatedAt: "Создано", + statsYourContent: "Контент", + statsYourOpinions: "Мнения", + statsYourTombstone: "Надгробия", + statsNetwork: "Сеть", + statsTotalInhabitants: "Жители", + statsDiscoveredTribes: "Племена (публичные)", + statsPrivateDiscoveredTribes: "Племена (частные)", + statsNetworkContent: "Контент", + statsYourMarket: "Рынок", + statsYourJob: "Вакансии", + statsYourProject: "Проекты", + statsYourTransfer: "Переводы", + statsYourForum: "Форумы", + statsNetworkOpinions: "Мнения", + statsDiscoveredMarket: "Рынок", + statsDiscoveredJob: "Вакансии", + statsDiscoveredProject: "Проекты", + statsBankingTitle: "Банкинг", + statsEcoWalletLabel: "Кошелёк ECOIN", + statsEcoWalletNotConfigured: "Не настроен!", + statsTotalEcoAddresses: "Всего адресов", + statsDiscoveredTransfer: "Переводы", + statsDiscoveredForum: "Форумы", + statsNetworkTombstone: "Надгробия", + statsBookmark: "Закладки", + statsEvent: "События", + statsTask: "Задачи", + statsVotes: "Голоса", + statsMarket: "Рынок", + statsForum: "Форумы", + statsJob: "Вакансии", + statsProject: "Проекты", + statsReport: "Отчёты", + statsFeed: "Ленты", + statsTribe: "Племена", + statsImage: "Изображения", + statsAudio: "Аудио", + statsVideo: "Видео", + statsDocument: "Документы", + statsMap: "Карты", + statsShop: "Магазины", + statsShopProduct: "Товары магазина", + statsTransfer: "Переводы", + statsAiExchange: "ИИ", + statsPUBs: "PUBs", + statsPost: "Посты", + statsOasisID: "Oasis ID", + statsSize: "Итого (размер)", + statsBlockchainSize: "Блокчейн (размер)", + statsBlobsSize: "Блобы (размер)", + statsActivity7d: "Активность (последние 7 дней)", + statsActivity7dTotal: "Итого за 7 дней", + statsActivity30dTotal: "Итого за 30 дней", + statsKarmaScore: "Очки КАРМЫ", + statsPublic: "Публичное", + statsPrivate: "Частное", + messages: "Сообщения", + statsProjectsTitle: "Проекты", + statsProjectsTotal: "Всего проектов", + statsProjectsActive: "Активные", + statsProjectsCompleted: "Завершённые", + statsProjectsPaused: "На паузе", + statsProjectsCancelled: "Отменённые", + statsProjectsGoalTotal: "Общая цель", + statsProjectsPledgedTotal: "Всего поддержано", + statsProjectsSuccessRate: "Процент успеха", + statsProjectsAvgProgress: "Средний прогресс", + statsProjectsMedianProgress: "Медианный прогресс", + statsProjectsActiveFundingAvg: "Среднее активное финансирование", + statsJobsTitle: "Вакансии", + statsJobsTotal: "Всего вакансий", + statsJobsOpen: "Открытые", + statsJobsClosed: "Закрытые", + statsJobsOpenVacants: "Открытые места", + statsJobsSubscribersTotal: "Всего подписчиков", + statsJobsAvgSalary: "Средняя зарплата", + statsJobsMedianSalary: "Медианная зарплата", + statsMarketTitle: "Рынок", + statsMarketTotal: "Всего товаров", + statsMarketForSale: "На продаже", + statsMarketReserved: "Зарезервировано", + statsMarketClosed: "Закрыто", + statsMarketSold: "Продано", + statsMarketRevenue: "Выручка", + statsMarketAvgSoldPrice: "Средняя цена продажи", + statsUsersTitle: "Жители", + user: "Житель", + statsTombstoneTitle: "Надгробия", + statsNetworkTombstones: "Надгробия сети", + statsTombstoneRatio: "Доля надгробий (%)", + statsAITraining: "Обучение ИИ", + statsAIExchanges: "Обмены", + statsParliamentCandidature: "Кандидатуры парламента", + statsParliamentTerm: "Сроки парламента", + statsParliamentProposal: "Предложения парламента", + statsParliamentRevocation: "Отзывы парламента", + statsParliamentLaw: "Законы парламента", + statsCourtsCase: "Судебные дела", + statsCourtsEvidence: "Судебные доказательства", + statsCourtsAnswer: "Судебные ответы", + statsCourtsVerdict: "Судебные приговоры", + statsCourtsSettlement: "Судебные соглашения", + statsCourtsSettlementProposal: "Предложения соглашений", + statsCourtsSettlementAccepted: "Принятые соглашения", + statsCourtsNomination: "Назначения судей", + statsCourtsNominationVote: "Голоса за назначение", + ai: "ИИ", + aiDescription: "Коллективный искусственный интеллект (КИИ) под названием '42', обучающийся на основе вашей сети.", + aiInputPlaceholder: "Как дела?", + aiUserQuestion: "Вопрос", + aiResponseTitle: "Ответ", + aiSubmitButton: "Отправить!", + aiSettingsDescription: "Установите ваш запрос (макс 128 символов) для модели ИИ.", + aiPrompt: "Предоставьте информативный и точный ответ.", + aiConfiguration: "Установить запрос", + aiPromptUsed: "Запрос", + aiClearHistory: "Очистить историю чата", + aiSharePrompt: "Добавить этот ответ в коллективное обучение?", + aiShareYes: "Да", + aiShareNo: "Нет", + aiSharedLabel: "Добавлено в обучение", + aiRejectedLabel: "Не добавлено в обучение", + aiServerError: "ИИ не смог ответить. Пожалуйста, попробуйте снова.", + typeAiExchange: "ИИ", + aiApproveTrain: "Добавить в коллективное обучение", + aiRejectTrain: "Не обучать", + aiTrainPending: "Ожидает одобрения", + aiTrainApproved: "Одобрено для обучения", + aiTrainRejected: "Отклонено для обучения", + aiSnippetsUsed: "Использованные фрагменты", + aiSnippetsLearned: "Изученные фрагменты", + aiApproveCustomTrain: "Обучить используя этот пользовательский ответ", + aiCustomAnswerPlaceholder: "Напишите ваш пользовательский ответ…", + marketMineSectionTitle: "Ваши товары", + marketCreateSectionTitle: "Создать товар", + marketUpdateSectionTitle: "Обновить", + marketAllSectionTitle: "Рынок", + marketRecentSectionTitle: "Последние товары", + marketTitle: "Рынок", + marketDescription: "Торговая площадка для обмена товарами или услугами в вашей сети.", + marketFilterAll: "ВСЕ", + marketFilterMine: "МОИ", + marketFilterAuctions: "АУКЦИОНЫ", + marketFilterItems: "ОБМЕН", + marketFilterNew: "НОВЫЕ", + marketFilterUsed: "ИСПОЛЬЗОВАННЫЕ", + marketFilterBroken: "СЛОМАННЫЕ", + marketFilterForSale: "НА ПРОДАЖЕ", + marketFilterSold: "ПРОДАННЫЕ", + marketFilterDiscarded: "ОТКЛОНЁННЫЕ", + marketFilterRecent: "НЕДАВНИЕ", + marketFilterMyBids: "СТАВКИ", + marketCreateButton: "Создать товар", + marketItemType: "Тип", + marketItemTitle: "Название", + marketItemAvailable: "Срок", + marketItemDescription: "Описание", + marketItemDescriptionPlaceholder: "Опишите продаваемый товар", + marketItemStatus: "Статус", + marketShopLabel: "Магазин", + marketItemCondition: "Состояние", + marketItemPrice: "Цена", + marketItemTags: "Теги", + marketItemTagsPlaceholder: "Введите теги через запятую", + marketItemDeadline: "Срок", + marketItemIncludesShipping: "Включена доставка?", + marketItemHighestBid: "Наибольшая ставка", + marketItemHighestBidder: "Лидер аукциона", + marketItemStock: "Запас", + marketOutOfStock: "Нет в наличии", + marketItemBidTime: "Время ставки", + marketActionsUpdate: "Обновить", + marketUpdateButton: "Обновить товар!", + marketActionsDelete: "Удалить", + marketActionsSold: "Отметить как проданное", + marketActionsChangeStatus: "ИЗМЕНИТЬ СТАТУС", + marketActionsBuy: "КУПИТЬ!", + marketAuctionBids: "Текущие ставки", + marketPlaceBidButton: "Сделать ставку", + marketItemSeller: "Продавец", + marketNoItems: "Товаров пока нет.", + marketYourBid: "Ваша ставка", + marketCreateFormImageLabel: "Загрузить медиа (макс: 50MB)", + marketSearchLabel: "Поиск", + marketSearchPlaceholder: "Поиск по названию или тегам", + marketMinPriceLabel: "Мин. цена", + marketMaxPriceLabel: "Макс. цена", + marketSortLabel: "Сортировать по", + marketSortRecent: "Самые новые", + marketSortPrice: "Цена", + marketSortDeadline: "Срок", + marketSearchButton: "Поиск", + marketAuctionEndsIn: "Завершается", + marketAuctionEnded: "Завершён", + marketMyBidBadge: "Ваша ставка", + marketNoItemsMatch: "Товаров не найдено.", + jobsTitle: "Вакансии", + jobsDescription: "Открывайте и управляйте вакансиями в вашей сети.", + jobsFilterRecent: "НЕДАВНИЕ", + jobsFilterMine: "МОИ", + jobsFilterAll: "ВСЕ", + jobsFilterRemote: "УДАЛЁННЫЕ", + jobsFilterOpen: "ОТКРЫТЫЕ", + jobsFilterClosed: "ЗАКРЫТЫЕ", + jobsCV: "Резюме", + jobsCreateJob: "Создать вакансию", + jobsRecentTitle: "Последние вакансии", + jobsMineTitle: "Ваши вакансии", + jobsAllTitle: "Вакансии", + jobsRemoteTitle: "Удалённые вакансии", + jobsOpenTitle: "Открытые вакансии", + jobsClosedTitle: "Закрытые вакансии", + jobsCVTitle: "Резюме", + jobsFilterPresencial: "ОЧНЫЕ", + jobsFilterFreelancer: "ФРИЛАНС", + jobsFilterEmployee: "СОТРУДНИК", + jobsPresencialTitle: "Очные вакансии", + jobsFreelancerTitle: "Фриланс вакансии", + jobsEmployeeTitle: "Вакансии сотрудников", + jobTitle: "Название", + jobLocation: "Местоположение", + jobSalary: "Зарплата (ECO/1ч)", + jobVacants: "Места", + jobDescription: "Описание", + jobRequirements: "Требования", + jobLanguages: "Языки", + jobStatus: "Статус", + jobStatusOPEN: "ОТКРЫТАЯ", + jobStatusCLOSED: "ЗАКРЫТАЯ", + jobSetOpen: "Открыть", + jobSetClosed: "Закрыть", + jobSubscribeButton: "Откликнуться!", + jobUnsubscribeButton: "Отозвать отклик!", + jobTitlePlaceholder: "Введите название вакансии", + jobDescriptionPlaceholder: "Опишите вакансию", + jobRequirementsPlaceholder: "Введите требования", + jobLanguagesPlaceholder: "Английский, Испанский, Французский, Баскский...", + jobTasksPlaceholder: "Перечислите задачи", + jobLocationPresencial: "На месте", + jobLocationRemote: "Удалённо", + jobVacantsPlaceholder: "Количество позиций", + jobSalaryPlaceholder: "Зарплата в ECO за 1 час работы", + jobImage: "Загрузить медиа (макс: 50MB)", + jobTasks: "Задачи", + jobType: "Тип занятости", + jobTime: "Время занятости", + jobSubscribers: "Подписчики", + noSubscribers: "Нет подписчиков", + jobsFilterTop: "ТОП", + jobsTopTitle: "Топ вакансий по зарплате", + createJobButton: "Опубликовать вакансию", + viewDetailsButton: "Просмотр деталей", + noJobsFound: "Вакансий не найдено.", + jobAuthor: "Автор", + jobTypeFreelance: "Фриланс", + jobTypeSalary: "Сотрудник", + jobTimePartial: "Неполная занятость", + jobTimeComplete: "Полная занятость", + jobsDeleteButton: "УДАЛИТЬ", + jobsUpdateButton: "ОБНОВИТЬ", + jobsFilterApplied: "ПОДАННЫЕ", + jobsAppliedTitle: "Мои заявки", + jobsAppliedBadge: "Подано", + jobsFilterFavs: "Избранное", + jobsFavsTitle: "Избранное", + jobsFilterNeeds: "Нужна помощь", + jobsNeedsTitle: "Нужна помощь", + jobsSearchLabel: "Поиск", + jobsSearchPlaceholder: "Поиск по названию, тегам, описанию...", + jobsMinSalaryLabel: "Мин. зарплата", + jobsMaxSalaryLabel: "Макс. зарплата", + jobsSortLabel: "Сортировать по", + jobsSortRecent: "Самые новые", + jobsSortSalary: "Самая высокая зарплата", + jobsSortSubscribers: "Больше всего заявок", + jobsSearchButton: "Поиск", + jobsFavoriteButton: "Добавить в избранное", + jobsUnfavoriteButton: "Удалить из избранного", + jobsMessageAuthorButton: "ЛС", + jobsApplicants: "Заявители", + jobsUpdatedAt: "Обновлено", + jobNewBadge: "НОВАЯ", + jobsTagsLabel: "Теги", + jobsTagsPlaceholder: "тег1, тег2, тег3", + noJobsMatch: "Вакансий не найдено.", + projectsTitle: "Проекты", + projectsDescription: "Создавайте, финансируйте и следите за проектами сообщества в вашей сети.", + projectCreateProject: "Создать проект", + projectCreateButton: "Создать проект", + projectUpdateButton: "ОБНОВИТЬ", + projectDeleteButton: "УДАЛИТЬ", + projectNoProjectsFound: "Проектов не найдено.", + projectFilterAll: "ВСЕ", + projectFilterMine: "МОИ", + projectFilterActive: "АКТИВНЫЕ", + projectFilterPaused: "НА ПАУЗЕ", + projectFilterCompleted: "ЗАВЕРШЁННЫЕ", + projectFilterFollowing: "ОТСЛЕЖИВАЕМЫЕ", + projectFilterRecent: "НЕДАВНИЕ", + projectFilterTop: "ТОП", + projectAllTitle: "Проекты", + projectMineTitle: "Ваши проекты", + projectActiveTitle: "Активные проекты", + projectPausedTitle: "Проекты на паузе", + projectCompletedTitle: "Завершённые проекты", + projectFollowingTitle: "Отслеживаемые проекты", + projectRecentTitle: "Последние проекты", + projectTopTitle: "Топ по финансированию", + projectTitlePlaceholder: "Название проекта", + projectImage: "Загрузить медиа (макс: 50MB)", + projectDescription: "Описание", + projectDescriptionPlaceholder: "Расскажите историю и цели…", + projectGoal: "Цель (ECO)", + projectGoalPlaceholder: "50000", + projectDeadline: "Срок", + projectProgress: "Начальный прогресс (%)", + projectStatus: "Статус", + projectFunding: "Финансирование", + projectPledged: "Поддержано", + projectSetStatus: "Установить статус", + projectSetProgress: "Обновить прогресс", + projectFollowButton: "СЛЕДИТЬ", + projectUnfollowButton: "ОТПИСАТЬСЯ", + projectStatusACTIVE: "АКТИВНЫЙ", + projectStatusPAUSED: "НА ПАУЗЕ", + projectStatusCOMPLETED: "ЗАВЕРШЁН", + projectStatusCANCELLED: "ОТМЕНЁН", + projectPledgeTitle: "Поддержать проект", + projectPledgePlaceholder: "Сумма в ECO", + projectBounties: "Награды", + projectBountiesInputLabel: "Награды (по одной в строке: Название|Сумма [ECO]|Описание)", + projectBountiesPlaceholder: "Исправить баг UI|100|Ссылка на задачу\nНаписать документацию|250|Примеры использования", + projectNoBounties: "Наград не найдено.", + projectTitle: "Название", + projectAddBountyTitle: "Новая награда", + projectBountyTitle: "Название награды", + projectBountyAmount: "Сумма (ECO)", + projectBountyDescription: "Описание", + projectMilestoneSelect: "Выбрать веху", + projectBountyCreateButton: "Создать награду", + projectBountyStatus: "Статус награды", + projectBountyOpen: "открытая", + projectBountyClaimed: "заявленная", + projectBountyDone: "завершена", + projectBountyClaimedBy: "заявлена", + projectBountyClaimButton: "заявить", + projectBountyCompleteButton: "Отметить завершённой", + projectMilestones: "Вехи", + projectAddMilestoneTitle: "Новая веха", + projectMilestoneTitle: "Название вехи", + projectMilestoneTargetPercent: "Процент (%)", + projectMilestoneDueDate: "Дата", + projectMilestoneCreateButton: "Создать веху", + projectMilestoneStatus: "Статус вехи", + projectMilestoneOpen: "открытая", + projectMilestoneDone: "завершена", + projectMilestoneMarkDone: "Отметить завершённой", + projectMilestoneDue: "дата", + projectNoMilestones: "Вех не найдено.", + projectMilestoneTitlePlaceholder: "Введите название вехи", + projectMilestoneDescriptionPlaceholder: "Введите описание этой вехи", + projectMilestoneDescription: "Описание вехи", + projectBudgetGoal: "Бюджет (Цель)", + projectBudgetAssigned: "Назначено на награды", + projectBudgetRemaining: "Остаток", + projectBudgetOver: "⚠ Превышение бюджета: назначено больше цели", + projectFollowers: "Подписчики", + projectFollowersTitle: "Подписчики", + projectFollowersNone: "Подписчиков пока нет.", + projectMore: "ещё", + projectYouFollowHint: "Вы следите за этим проектом", + projectBackers: "Спонсоры", + projectBackersTitle: "Спонсоры", + projectBackersTotal: "Всего спонсоров", + projectBackersTotalPledged: "Всего поддержано", + projectBackersYourPledge: "Ваш взнос", + projectBackersNone: "Взносов пока нет.", + projectNoRemainingBudget: "Оставшегося бюджета нет.", + projectFilterBackers: "СПОНСОРЫ", + projectFilterApplied: "ПОДАННЫЕ", + projectAppliedTitle: "ПОДАННЫЕ", + projectBackersLeaderboardTitle: "Топ спонсоров", + projectNoBackersFound: "Спонсоров не найдено.", + projectBackerAmount: "Всего вложено", + projectBackerPledges: "Взносы", + projectBackerProjects: "Проекты", + projectPledgeAmount: "Сумма", + projectSelectMilestoneOrBounty: "Выбрать веху или награду", + projectPledgeButton: "Поддержать", + footerLicense: "GPLv3", + footerPackage: "Пакет", + footerVersion: "Версия", + modulesModuleName: "Имя", + modulesModuleDescription: "Описание", + modulesModuleStatus: "Статус", + modulesTotalModulesLabel: "Загруженные модули", + modulesEnabledModulesLabel: "Включённые", + modulesDisabledModulesLabel: "Отключённые", + modulesPopularLabel: "Популярное", + modulesPopularDescription: "Модуль для получения популярных, наиболее просматриваемых или комментируемых постов.", + modulesTopicsLabel: "Темы", + modulesTopicsDescription: "Модуль для получения категорий обсуждений на основе общих интересов.", + modulesSummariesLabel: "Резюме", + modulesSummariesDescription: "Модуль для получения резюме длинных обсуждений или постов.", + modulesLatestLabel: "Последние", + modulesLatestDescription: "Модуль для получения последних постов и обсуждений.", + modulesThreadsLabel: "Треды", + modulesThreadsDescription: "Модуль для получения разговоров, сгруппированных по теме или вопросу.", + modulesMultiverseLabel: "Мультивселенная", + modulesMultiverseDescription: "Модуль для получения контента от других федеративных узлов.", + modulesInvitesLabel: "Приглашения", + modulesInvitesDescription: "Модуль для управления и применения кодов приглашений.", + modulesWalletLabel: "Кошелёк", + modulesWalletDescription: "Модуль для управления вашими цифровыми активами (ECOin).", + modulesLegacyLabel: "Наследие", + modulesLegacyDescription: "Модуль для быстрого и безопасного управления вашим секретом (приватным ключом).", + modulesCipherLabel: "Шифр", + modulesCipherDescription: "Модуль для симметричного шифрования и расшифровки текста (с использованием общего пароля).", + modulesBookmarksLabel: "Закладки", + modulesBookmarksDescription: "Модуль для открытия и управления закладками.", + modulesVideosLabel: "Видео", + modulesVideosDescription: "Модуль для открытия и управления видео.", + modulesDocsLabel: "Документы", + modulesDocsDescription: "Модуль для открытия и управления документами.", + modulesAudiosLabel: "Аудио", + modulesAudiosDescription: "Модуль для открытия и управления аудио.", + modulesTagsLabel: "Теги", + modulesTagsDescription: "Модуль для открытия и исследования паттернов таксономии (теги).", + modulesImagesLabel: "Изображения", + modulesImagesDescription: "Модуль для открытия и управления изображениями.", + modulesTrendingLabel: "Популярное", + modulesTrendingDescription: "Модуль для исследования наиболее популярного контента.", + modulesEventsLabel: "События", + modulesEventsDescription: "Модуль для открытия и управления событиями.", + modulesTasksLabel: "Задачи", + modulesTasksDescription: "Модуль для открытия и управления задачами.", + modulesMarketLabel: "Рынок", + modulesMarketDescription: "Модуль для обмена товарами или услугами.", + modulesShopsLabel: "Магазины", + modulesShopsDescription: "Модуль для управления и поиска магазинов.", + modulesTribesLabel: "Племена", + modulesTribesDescription: "Модуль для исследования или создания племён (групп).", + modulesVotationsLabel: "Голосования", + modulesVotationsDescription: "Модуль для открытия и управления голосованиями.", + modulesReportsLabel: "Отчёты", + modulesReportsDescription: "Модуль для управления и отслеживания отчётов, связанных с проблемами, ошибками, злоупотреблениями и предупреждениями.", + modulesOpinionsLabel: "Мнения", + modulesOpinionsDescription: "Модуль для открытия и голосования за мнения.", + modulesTransfersLabel: "Переводы", + modulesTransfersDescription: "Модуль для открытия и управления смарт-контрактами (переводами).", + modulesFeedLabel: "Лента", + modulesFeedDescription: "Модуль для открытия и публикации коротких текстов (лента).", + modulesParliamentLabel: "Парламент", + modulesParliamentDescription: "Модуль для выборов правительств и голосования за законы.", + modulesCourtsLabel: "Суды", + modulesCourtsDescription: "Модуль для разрешения конфликтов и вынесения приговоров.", + modulesPixeliaLabel: "Pixelia", + modulesPixeliaDescription: "Модуль для рисования на совместной сетке.", + modulesAgendaLabel: "Повестка", + modulesAgendaDescription: "Модуль для управления всеми назначенными вам элементами.", + modulesAILabel: "ИИ", + modulesAIDescription: "Модуль для общения с LLM под названием '42'.", + modulesForumLabel: "Форумы", + modulesForumDescription: "Модуль для открытия и управления форумами.", + modulesJobsLabel: "Вакансии", + modulesJobsDescription: "Модуль для открытия и управления вакансиями.", + modulesProjectsLabel: "Проекты", + modulesProjectsDescription: "Модуль для исследования, краудфандинга и управления проектами.", + modulesBankingLabel: "Банкинг", + modulesBankingDescription: "Модуль для определения реальной стоимости ECOIN и распределения UBI из общей казны.", + modulesFavoritesLabel: "Избранное", + modulesFavoritesDescription: "Модуль для управления избранным контентом.", + fileTooLargeTitle: "Файл слишком большой", + fileTooLargeMessage: "Файл превышает максимально допустимый размер (50 МБ). Пожалуйста, выберите файл меньшего размера.", + goBack: "Назад", + directConnect: "Прямое подключение", + directConnectDescription: "Подключитесь напрямую к узлу, введя его IP-адрес, порт и публичный ключ. Узел будет добавлен как отслеживаемое соединение.", + peerHost: "IP / Имя хоста", + peerPort: "Порт (по умолчанию: 8008)", + peerPublicKey: "Публичный ключ (@...ed25519)", + connectAndFollow: "Подключиться", + deviceSourceLabel: "Источник устройства", + modulesPresetTitle: "Общие конфигурации", + modulesPreset_minimal: "Минимальный", + modulesPreset_basic: "Базовая", + modulesPreset_social: "Социальный", + modulesPreset_economy: "Экономическая", + modulesPreset_full: "Полная", + statsCarbonFootprintTitle: "Углеродный след", + statsCarbonFootprintNetwork: "Углеродный след сети", + statsCarbonFootprintYours: "Ваш углеродный след", + statsCarbonTombstone: "Углеродный след надгробий", + feedSuccessMsg: "Пост успешно опубликован!", + dominantOpinionLabel: "Доминирующее мнение", + uploadMedia: "Загрузить медиа (макс: 50MB)", + feedViewDetails: "Просмотр деталей", + feedOpenDiscussion: "Открыть обсуждение", + feedDetailTitle: "Лента", + feedPostComment: "Опубликовать комментарий", + eventFileLabel: "Прикрепить изображение", + taskFileLabel: "Прикрепить изображение", + courtsRespondentRequired: "ID ответчика обязателен", + courtsRespondentInvalid: "Должен быть действительным SSB ID (@...ed25519)", + noComments: "Пока нет комментариев", + bankAllocId: "ID распределения", + pmFromLabel: "От:", + pmToLabel: "Кому:", + aiTitle: "ИИ", + deviceLabel: "Устройство", + mapsLabel: "Карты", + mapTitle: "Карты", + mapDescription: "Исследуйте и управляйте офлайн-картами в вашей сети.", + mapMineSectionTitle: "Ваши Карты", + mapCreateSectionTitle: "Создать Карту", + mapUpdateSectionTitle: "Обновить Карту", + mapAllSectionTitle: "Карты", + mapRecentSectionTitle: "Недавние Карты", + mapFavoritesSectionTitle: "Избранное", + mapFilterAll: "ВСЕ", + mapFilterMine: "МОИ", + mapFilterRecent: "НЕДАВНИЕ", + mapFilterFavorites: "ИЗБРАННОЕ", + mapUploadButton: "Создать Карту", + mapCreateButton: "Создать Карту", + mapUpdateButton: "Обновить", + mapDeleteButton: "Удалить", + mapAddFavoriteButton: "В избранное", + mapRemoveFavoriteButton: "Из избранного", + mapLatLabel: "Широта", + mapLatPlaceholder: "напр. 55.7558", + mapLngLabel: "Долгота", + mapLngPlaceholder: "напр. 37.6173", + mapDescriptionLabel: "Описание", + mapDescriptionPlaceholder: "Опишите карту или местоположение...", + mapTypeLabel: "Тип карты", + mapTypeSingle: "ОДИНОЧНЫЙ (только начальное местоположение)", + mapTypeOpen: "ОТКРЫТЫЙ (любой может добавлять маркеры)", + mapTypeClosed: "ЗАКРЫТЫЙ (только создатель добавляет маркеры)", + mapTagsLabel: "Теги", + mapTagsPlaceholder: "Введите теги через запятую", + mapUrlLabel: "URL карты", + mapPickCoordLabel: "Или выберите местоположение на сетке:", + mapMarkersLabel: "маркеры", + mapMarkersTitle: "Маркеры", + mapMarkerDefault: "Маркер", + mapMarkerLatLabel: "Широта маркера", + mapMarkerLngLabel: "Долгота маркера", + mapMarkerLabelField: "Метка маркера", + mapMarkerLabelPlaceholder: "Опишите этот маркер...", + markerImageLabel: "Изображение Маркера", + mapAddMarkerTitle: "Добавить Маркер", + mapAddMarkerButton: "Добавить Маркер", + mapCleanMarkerButton: "Clean Marker", + mapApplyZoom: "Применить масштаб", + mapSearchPlaceholder: "Поиск по описанию, тегам, автору...", + mapSearchButton: "Искать", + mapUpdatedAt: "Обновлено", + mapNoMatch: "Нет карт, соответствующих вашему запросу.", + noMaps: "Нет доступных карт.", + mapLocationTitle: "Местоположение", + mapVisitLabel: "Посетить карту", + typeMap: "КАРТЫ", + typeMapMarker: "МАРКЕР КАРТЫ", + modulesMapLabel: "Карты", + modulesMapDescription: "Модуль для управления и обмена офлайн-картами.", + padsTitle: "Пады", + padTitle: "Пад", + modulesPadsLabel: "Пады", + modulesPadsDescription: "Модуль для управления совместными текстовыми редакторами.", + padFilterAll: "ВСЕ", + padFilterMine: "МОИ", + padFilterRecent: "НЕДАВНИЕ", + padFilterOpen: "ОТКРЫТЫЕ", + padFilterClosed: "ЗАКРЫТЫЕ", + padCreate: "Создать Пад", + padUpdate: "Обновить Пад", + padDelete: "Удалить Пад", + padTitleLabel: "Заголовок", + padTitlePlaceholder: "Введите заголовок пада...", + padStatusLabel: "Статус", + padStatusOpen: "ОТКРЫТ", + padStatusInviteOnly: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ", + padStatusClosed: "ЗАКРЫТ", + padDeadlineLabel: "Срок", + padTagsLabel: "Теги", + padTagsPlaceholder: "тег1, тег2, ...", + padMembersLabel: "Участники", + padVisitPad: "Посетить Пад", + padShareUrl: "Поделиться URL", + padCreated: "Создано", + padAuthor: "Автор", + padGenerateCode: "Сгенерировать Код", + padInviteCodeLabel: "Код Приглашения", + padInviteCodePlaceholder: "Введите код приглашения...", + padValidateInvite: "Проверить", + padStartEditing: "НАЧАТЬ РЕДАКТИРОВАНИЕ!", + padEditorPlaceholder: "Начните писать...", + padSubmitEntry: "Отправить", + padNoEntries: "Записей пока нет.", + padAllSectionTitle: "Все Пады", + padMineSectionTitle: "Мои Пады", + padsDescription: "Управляйте совместными зашифрованными текстовыми редакторами в вашей сети.", + padRecentSectionTitle: "Недавние Пады", + padOpenSectionTitle: "Открытые Пады", + padClosedSectionTitle: "Закрытые Пады", + padCreateSectionTitle: "Создать Новый Пад", + padUpdateSectionTitle: "Обновить Пад", + padInviteGenerated: "Код Приглашения Сгенерирован", + typePad: "ПАД", + padNew: "НОВЫЙ", + padAddFavorite: "Добавить в Избранное", + padRemoveFavorite: "Удалить из Избранного", + padClose: "Закрыть Pad", + padBackToEditor: "Назад к редактору", + padSearchPlaceholder: "Поиск падов...", + + modulesChatsLabel: "Чаты", + modulesChatsDescription: "Модуль для обнаружения и управления зашифрованными чатами.", + typeChat: "ЧАТ", + typeChatMessage: "СООБЩЕНИЕ ЧАТА", + chatLabel: "ЧАТЫ", + chatMessageLabel: "СООБЩЕНИЯ ЧАТА", + chatsTitle: "Чаты", + chatMineSectionTitle: "Your Chats", + chatRecentTitle: "Recent Chats", + chatFavoritesTitle: "Избранное", + chatOpenTitle: "Open Chats", + chatClosedTitle: "Closed Chats", + chatDescription: "Описание", + chatCategory: "Категория", + chatStatus: "СТАТУС", + chatFilterAll: "ВСЕ", + chatFilterMine: "МОИ", + chatFilterRecent: "НЕДАВНИЕ", + chatFilterFavorites: "ИЗБРАННОЕ", + chatFilterOpen: "ОТКРЫТЫЕ", + chatFilterClosed: "ЗАКРЫТЫЕ", + chatCreate: "Создать Чат", + chatUpdate: "Обновить Чат", + chatDelete: "Удалить Чат", + chatClose: "Закрыть Чат", + chatVisitChat: "ПЕРЕЙТИ В ЧАТ", + chatUntitled: "Чат без названия", + chatNoItems: "Чаты не найдены.", + chatParticipants: "Участники", + chatStartChatting: "НАЧАТЬ ОБЩЕНИЕ!", + chatGenerateCode: "Создать Код", + chatShareUrl: "Поделиться URL", + chatCreatedAt: "СОЗДАН", + chatSearchPlaceholder: "Поиск чатов...", + chatStatusOpen: "ОТКРЫТЫЙ", + chatStatusInviteOnly: "ТОЛЬКО ПО ПРИГЛАШЕНИЮ", + chatStatusClosed: "ЗАКРЫТЫЙ", + chatSendMessage: "Отправить", + chatMessagePlaceholder: "Введите сообщение...", + chatNoMessages: "Сообщений пока нет.", + chatLeave: "Покинуть Чат", + chatInviteCodeLabel: "Введите код приглашения", + chatJoinByInvite: "Войти", + chatTitlePlaceholder: "Название чата", + chatDescriptionPlaceholder: "Описание чата", + chatTagsPlaceholder: "тег1, тег2, тег3", + chatImageLabel: "Выбрать файл изображения (.jpeg, .jpg, .png, .gif)", + chatInviteCode: "Код Приглашения", + chatAuthor: "Автор", + chatCreated: "Создан", + chatAddFavorite: "Добавить в Избранное", + chatRemoveFavorite: "Убрать из Избранного", + chatPM: "ЛС", + chatStatusLabel: "Статус", + chatCategoryLabel: "Категория", + chatParticipantsLabel: "Участники", + gamesTitle: "Игры", + gamesDescription: "Откройте и играйте в игры.", + gamesFilterAll: "ВСЕ", + gamesPlayButton: "ИГРАТЬ!", + gamesBackToGames: "Назад к играм", + modulesGamesLabel: "Игры", + modulesGamesDescription: "Модуль для открытия и игры в игры.", + gamesCocolandTitle: "Cocoland", + gamesCocolandDesc: "Кокос с глазами прыгает через пальмы и собирает ECOins.", + gamesTheFlowTitle: "ECOinflow", + gamesTheFlowDesc: "Соединяй PUB'ы с жителями через валидаторы, магазины и аккумуляторы. Противостой угрозе CBDC!", + gamesNeonInfiltratorTitle: "Neon Infiltrator", + gamesNeonInfiltratorDesc: "Проникни в сеть, собери секретные данные, избегай дронов безопасности и сбеги. Сколько уровней ты пройдёшь?", + gamesSpaceInvadersTitle: "Space Invaders", + gamesSpaceInvadersDesc: "Остановите вторжение пришельцев! Уничтожайте волны захватчиков.", + gamesArkanoidTitle: "Arkanoid", + gamesArkanoidDesc: "Разбейте все кирпичи своей ракеткой и мячом. Классическая аркада.", + gamesPingPongTitle: "PingPong", + gamesPingPongDesc: "Классический пинг-понг против ИИ. Первый до 5 очков побеждает.", + gamesOutrunTitle: "Outrun", + gamesOutrunDesc: "Гонка со временем! Уворачивайтесь от машин и доберитесь до финиша вовремя.", + gamesAsteroidsTitle: "Asteroids", + gamesAsteroidsDesc: "Пилотируйте корабль через астероидное поле. Уничтожайте их до столкновения.", + gamesRockPaperScissorsTitle: "Камень Ножницы Бумага", + gamesRockPaperScissorsDesc: "Камень, ножницы, бумага против ИИ. Лучший из трёх раундов побеждает.", + gamesTikTakToeTitle: "TikTakToe", + gamesTikTakToeDesc: "Классические крестики-нолики против ИИ. Три в ряд — победа.", + 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.", + gamesCocomanTitle: "Cocoman", + gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.", + 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?", + gamesQuakeTitle: "Quake Arena", + gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", + gamesFilterScoring: "SCORING", + gamesHallOfFame: "Hall of Fame", + gamesHallPlayer: "Player", + gamesHallScore: "Score", + gamesNoScores: "No scores yet.", + calendarsTitle: "Календари", + calendarTitle: "Календарь", + modulesCalendarsLabel: "Календари", + modulesCalendarsDescription: "Модуль для просмотра и управления календарями.", + typeCalendar: "КАЛЕНДАРЬ", + calendarFilterAll: "ВСЕ", + calendarFilterMine: "МОИ", + calendarFilterOpen: "ОТКРЫТЫЕ", + calendarFilterClosed: "ЗАКРЫТЫЕ", + calendarFilterRecent: "НЕДАВНИЕ", + calendarFilterFavorites: "ИЗБРАННОЕ", + calendarCreate: "Создать календарь", + calendarUpdate: "Обновить", + calendarDelete: "Удалить", + calendarTitleLabel: "Название", + calendarTitlePlaceholder: "Название календаря...", + calendarStatusLabel: "Статус", + calendarStatusOpen: "ОТКРЫТЫЙ", + calendarStatusClosed: "ЗАКРЫТЫЙ", + calendarDeadlineLabel: "Deadline", + calendarTagsLabel: "Теги", + calendarTagsPlaceholder: "тег1, тег2...", + calendarParticipantsLabel: "Участники", + calendarParticipantsCount: "Участники", + calendarVisitCalendar: "Открыть календарь", + calendarCreated: "Создан", + calendarAuthor: "Автор", + calendarJoin: "Присоединиться", + calendarJoined: "Участник", + calendarAddDate: "Добавить дату", + calendarAddNote: "Добавить заметку", + calendarDateLabel: "Дата", + calendarDatePlaceholder: "Опишите эту дату...", + calendarNoteLabel: "Заметка", + calendarNotePlaceholder: "Добавить заметку...", + calendarFirstDateLabel: "Дата", + calendarFirstNoteLabel: "Заметки", + calendarIntervalLabel: "Interval", + calendarIntervalWeekly: "Weekly", + calendarIntervalMonthly: "Monthly", + calendarIntervalYearly: "Yearly", + calendarFormDescription: "Описание", + calendarNoDates: "Даты не добавлены.", + calendarNoNotes: "Заметок нет.", + calendarsNoItems: "Календари не найдены.", + calendarsDescription: "Находите и управляйте календарями в вашей сети.", + calendarMonthPrev: "← Назад", + calendarMonthNext: "Вперёд →", + calendarMonthLabel: "Даты", + calendarsShareUrl: "Поделиться URL", + calendarAllSectionTitle: "Календари", + calendarRecentSectionTitle: "Недавние календари", + calendarFavoritesSectionTitle: "Избранное", + calendarMineSectionTitle: "Ваши Календари", + calendarOpenSectionTitle: "Открытые календари", + calendarClosedSectionTitle: "Закрытые календари", + calendarCreateSectionTitle: "Создать новый календарь", + calendarUpdateSectionTitle: "Обновить календарь", + calendarAddFavorite: "Добавить в избранное", + calendarDeleteNote: "Delete", + calendarRemoveFavorite: "Убрать из избранного", + calendarSearchPlaceholder: "Поиск календарей...", + calendarAddEntry: "Добавить запись", + calendarLeave: "Покинуть календарь", + statsCalendar: "Календари", + statsCalendarDate: "Даты календаря", + statsCalendarNote: "Заметки календаря", + chatAccessDenied: "У вас нет доступа к этому чату. Запросите приглашение для доступа к содержимому.", + padAccessDenied: "У вас нет доступа к этому блокноту. Запросите приглашение для доступа к содержимому.", + contentAccessDenied: "У вас нет доступа к этому содержимому.", + blockAccessRestricted: "Доступ ограничен", + tribeContentAccessDenied: "Доступ Запрещён", + tribeContentAccessDeniedMsg: "Этот контент принадлежит племени. Вы должны быть участником, чтобы получить к нему доступ.", + tribeViewTribes: "Посмотреть Племена", + torrentsTitle: "Торренты", + torrentsDescription: "Исследуйте и управляйте торрентами в вашей сети.", + torrentAllSectionTitle: "Торренты", + torrentMineSectionTitle: "Ваши Торренты", + torrentRecentSectionTitle: "Недавние Торренты", + torrentTopSectionTitle: "Лучшие Торренты", + torrentFavoritesSectionTitle: "Избранное", + torrentFilterAll: "ВСЕ", + torrentFilterMine: "МОИ", + torrentFilterRecent: "НЕДАВНИЕ", + torrentFilterTop: "ЛУЧШИЕ", + torrentFilterFavorites: "ИЗБРАННОЕ", + torrentCreateSectionTitle: "Загрузить Торрент", + torrentUpdateSectionTitle: "Обновить Торрент", + torrentCreateButton: "Загрузить Торрент", + torrentUpdateButton: "Обновить", + torrentDeleteButton: "Удалить", + torrentAddFavoriteButton: "Добавить в Избранное", + torrentRemoveFavoriteButton: "Убрать из Избранного", + torrentFileLabel: "Выберите торрент-файл (.torrent)", + torrentTitleLabel: "Название", + torrentTitlePlaceholder: "Название", + torrentDescriptionLabel: "Описание", + torrentDescriptionPlaceholder: "Описание", + torrentTagsLabel: "Теги", + torrentTagsPlaceholder: "Введите теги через запятую", + torrentSizeLabel: "Размер", + torrentDownloadButton: "DOWNLOAD IT!", + torrentNoFile: "Нет торрент-файла", + noTorrents: "Торренты не найдены.", + torrentSearchPlaceholder: "Поиск по названию, тегам, автору...", + torrentSearchButton: "Поиск", + torrentSortRecent: "Самые новые", + torrentSortOldest: "Самые старые", + torrentSortTop: "Самые популярные", + torrentNoMatch: "Совпадений не найдено.", + torrentMessageAuthorButton: "Написать Автору", + torrentUpdatedAt: "Обновлено", + statsTorrent: "Торренты", + typeTorrent: "ТОРРЕНТЫ", + modulesTorrentsLabel: "Торренты", + modulesTorrentsDescription: "Модуль для поиска и управления торрентами.", + favoritesFilterTorrents: "ТОРРЕНТЫ", + tribeSectionTorrents: "ТОРРЕНТЫ", + tribeCreateTorrent: "Загрузить Торрент", + tribeMediaTypeTorrent: "Торрент", + settingsWishTitle: "Желание", + settingsWishDesc: "Настройте желание вашего Аватара.", + settingsWishWhole: "Multiverse", + settingsWishMutuals: "Only mutual-support", + settingsPmVisibilityTitle: "Личные сообщения", + settingsPmVisibilityDesc: "Настройте уровень открытости личных сообщений.", + settingsPmVisibilityWhole: "Multiverse", + settingsPmVisibilityMutuals: "Only mutual-support", + pmMutualNotice: "Исходящие — защита UX. Входящие — фильтр внимания.", + pmBlockedNonMutual: "Личные сообщения можно отправлять только жителям со взаимной поддержкой.", + inhabitantsPendingFollowsTitle: "Ожидающие запросы на поддержку", + inhabitantsPendingAccept: "Принять", + inhabitantsPendingReject: "Отклонить", + bxEncrypted: "ЗАШИФРОВАНО", + bxEncryptedHexLabel: "Шифротекст (превью)", + tribeSectionGovernance: "УПРАВЛЕНИЕ", + tribeSubStatusPublic: "ПУБЛИЧНАЯ", + tribeSubStatusPrivate: "ЧАСТНАЯ", + tribeSubInheritedPrivate: "ЧАСТНАЯ (унаследовано от главного племени)", + tribePadInviteRequired: "Нет доступа к паду. Запросите приглашение.", + tribeChatInviteRequired: "Нет доступа к чату. Запросите приглашение.", + tribeGovernanceDesc: "Внутреннее управление этим племенем.", + tribeGovernanceNoGov: "Нет активного правительства", + tribeGovernanceNoGovDesc: "Это племя ещё не выбрало правительство.", + tribeGovCardTitle: "Текущее правительство", + tribeGovCycleSince: "ЦИКЛ С", + tribeGovCycleEnd: "ЦИКЛ ДО", + tribeGovTimeRemaining: "ВРЕМЯ ОСТАЛОСЬ", + tribeGovPopulation: "НАСЕЛЕНИЕ", + tribeGovMethod: "МЕТОД", + tribeGovVotesReceived: "ПОЛУЧЕННЫЕ ГОЛОСА", + tribeGovLeader: "ЛИДЕР", + tribeGovFilterGovernment: "ПРАВИТЕЛЬСТВО", + tribeGovFilterCandidatures: "КАНДИДАТУРЫ", + tribeGovFilterLaws: "ЗАКОНЫ", + tribeGovCandidatureId: "Кандидатура", + tribeGovCandidatureMethod: "Метод", + tribeGovCandidatureProposeBtn: "Опубликовать кандидатуру", + tribeGovRuleTitle: "Название правила", + tribeGovRuleBody: "Содержание правила", + tribeGovProposals: "ПРЕДЛОЖЕНИЯ", + tribeGovRevocations: "ОТЗЫВЫ", + tribeGovHistorical: "ИСТОРИЯ", + tribeGovRules: "ПРАВИЛА", + tribeGovernanceAlreadyPublished: "У этого племени уже открытая кандидатура.", + tribeGovernanceProposeInternal: "Предложить внутреннюю кандидатуру", + tribeGovernanceInternalCandidatures: "Внутренние кандидатуры", + tribeGovernanceNoCandidatures: "Нет открытых кандидатур.", + tribeGovernanceAddRule: "Добавить правило", + tribeGovernanceNoRules: "Правил пока нет.", + tribeGovernanceNoLeaders: "Лидеры не избраны.", + tribeGovernanceComingSoon: "Скоро в модуле управления.", + logsTitle: "Журнал", + logsDescription: "Записывайте свой опыт в сети.", + logsReadMore: "Читать далее", + logsViewTitle: "Журнал", + logsColumnType: "Тип", + logsView: "Смотреть", + logsManualPrompt: "Напишите ваш журнал", + logsUpdateButton: "Обновить", + logsEditTitle: "Редактировать запись", + logsCreateDescription: "Записывайте свой опыт...", + logsCreateTitle: "Создать запись", + logsWriteButton: "Написать", + logsTextPlaceholder: "Опишите ваши впечатления...", + logsTextField: "Текст", + logsLabelPlaceholder: "Метка...", + logsLabelField: "Напишите ваш журнал (метка)", + logsAiDisabledWarn: "Включите модуль ИИ в /modules для записей от ИИ.", + logsAiContextValue: "День блокчейна", + logsAiContext: "Контекст", + logsAiModStatus: "AImod", + logsModeApply: "Применить!", + logsModeAIWritten: "AI-Assistant", + logsModeManual: "Вручную", + logsModeAI: "ИИ", + logsColumnDelete: "Удалить", + logsColumnEdit: "Редактировать", + logsColumnLog: "Журнал", + logsColumnDate: "Дата", + logsDelete: "Удалить", + logsEdit: "Редактировать", + logsFilterAlways: "ВСЕГДА", + logsFilterYear: "ГОД", + logsFilterMonth: "МЕСЯЦ", + logsFilterWeek: "НЕДЕЛЯ", + logsFilterToday: "СЕГОДНЯ", + logsFilterRecent: "НЕДАВНИЕ", + logsFilterAll: "ВСЕ", + logsCreate: "Создать запись", + logsExport: "Экспорт журнала", + logsExportOne: "Экспорт", + logsViewDetails: "Подробнее", + logsGenerateButton: "Сгенерировать текст", + logsSearchText: "Искать в журналах...", + logsSearchAnyType: "Любой тип", + logsSearchButton: "Искать", + logsEmpty: "Записей пока нет.", + modulesLogsLabel: "Журнал", + modulesLogsDescription: "Модуль для записи (с помощью ИИ-ассистента) ваших впечатлений.", + statsLogsTitle: "Журнал", + statsLogsEntries: "Записи", + typeLog: "ЖУРНАЛ", + blockchainCycle: "Цикл", + + } +}; diff --git a/nodejs-project/nodejs-project/src/client/assets/translations/oasis_zh.js b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_zh.js new file mode 100644 index 00000000..ba19f1ff --- /dev/null +++ b/nodejs-project/nodejs-project/src/client/assets/translations/oasis_zh.js @@ -0,0 +1,3219 @@ +const { a, em, strong } = require('../../../server/node_modules/hyperaxe'); +module.exports = { + zh: { + languageName: "中文", + extended: "多元宇宙", + extendedDescription: [ + "当你支持某人时,你可能会下载他们所支持的居民的帖子,这些帖子会显示在这里,按时间倒序排列。", + ], + popular: "精选", + popularDescription: [ + "来自你网络中居民的帖子,", + strong("按传播量排序"), + "。选择时间段以获取列表。", + ], + day: "日", + week: "周", + month: "月", + year: "年", + latest: "最新", + latestDescription: [ + strong("帖子"), + " 来自你自己和你支持的居民,按时间倒序排列。", + ], + topics: "话题", + topicsDescription: [ + strong("话题"), + " 来自你自己和你支持的居民,按时间倒序排列。", + ], + summaries: "摘要", + summariesDescription: [ + strong("有评论的话题"), + " 来自你自己和你支持的居民,按时间倒序排列。", + ], + threads: "讨论串", + threadsDescription: [ + strong("有评论的帖子"), + " 来自你支持的居民(包括多元宇宙),按时间倒序排列。", + ], + profile: "头像", + inhabitants: "居民", + manualMode: "手动模式", + mentions: "提及", + mentionsDescription: [ + strong("@提及你的帖子"), + ",按时间倒序排列。", + ], + nextPage: "下一页", + previousPage: "上一页", + noMentions: "你还没有收到@提及。", + private: "收件箱", + privateDescription: "查看和管理你的私信。", + privateInbox: "收件箱", + privateSent: "已发送", + privateFrom: "发件人", + privateTo: "收件人", + privateDate: "日期", + privateDelete: "删除", + pmCreateButton: "写私信", + pmReply: "回复", + pmReplies: "回复", + pmNew: "新消息", + pmMarkRead: "标记为已读", + inReplyTo: "回复", + pmPreview: "预览", + pmPreviewTitle: "消息预览", + noPrivateMessages: "你还没有收到任何私信。", + peers: "节点", + privateDescription: ["私信通过",strong("你的公钥加密"),",最多可有7位收件人。"], + search: "搜索", + searchDescription: "描述", + imageSearch: "图片搜索", + searchPlaceholder: "搜索 @居民、#标签和关键词...", + settings: "设置", + continueReading: "继续阅读", + moreComments: "更多评论", + readThread: "阅读剩余讨论串", + pixeliaTitle: 'Pixelia', + pixeliaDescription: '在网格上绘制像素,与网络中的其他人协作创作。', + coordLabel: '坐标(例如 A3)', + coordPlaceholder: '输入坐标', + contributorsTitle: "贡献者", + pixeliaBy: "作者", + colorLabel: '选择颜色', + paintButton: '画!', + invalidCoordinate: '坐标无效', + goToMuralButton: "查看壁画", + totalPixels: '总像素数', + modules: "模块", + modulesViewTitle: "模块", + modulesViewDescription: "通过启用或禁用模块来设置你的环境。", + inbox: "收件箱", + multiverse: "多元宇宙", + popularLabel: "精选", + topicsLabel: "话题", + latestLabel: "最新", + summariesLabel: "摘要", + threadsLabel: "讨论串", + multiverseLabel: "多元宇宙", + inboxLabel: "收件箱", + invitesLabel: "邀请", + walletLabel: "钱包", + legacyLabel: "密钥", + cipherLabel: "加密器", + bookmarksLabel: "书签", + videosLabel: "视频", + torrentsLabel: "种子", + docsLabel: "文档", + audiosLabel: "音频", + tagsLabel: "标签", + imagesLabel: "图片", + inhabitantsLabel: "居民", + trendingLabel: "热门", + eventsLabel: "活动", + tasksLabel: "任务", + transfersTitle: "转账", + marketTitle: "市场", + opinionsTitle: "观点", + saveSettings: "保存配置", + apply: "应用", + menuPersonal: "个人", + menuContent: "内容", + menuGovernance: "治理", + menuOffice: "办公", + menuMultiverse: "多元宇宙", + menuNetwork: "网络", + menuCreative: "创意", + menuEconomy: "经济", + menuMedia: "媒体", + menuTools: "工具", + comment: "评论", + subtopic: "子话题", + json: "JSON", + createdAt: "创建于", + createdBy: "作者", + unfollow: "取消支持", + follow: "支持", + block: "屏蔽", + unblock: "取消屏蔽", + newerPosts: "更新的帖子", + olderPosts: "更早的帖子", + feedRangeEmpty: "该范围内没有内容。请尝试查看", + seeFullFeed: "完整动态", + feedEmpty: "Oasis 网络从未见过此账户的帖子。", + beginningOfFeed: "这是动态的起始位置", + noNewerPosts: "尚未收到更新的帖子。", + relationshipNotFollowing: "你未被支持", + relationshipTheyFollow: "支持你", + relationshipMutuals: "互相支持", + relationshipFollowing: "你正在支持", + relationshipYou: "你", + relationshipBlocking: "你正在屏蔽", + relationshipBlockedBy: "你被屏蔽了", + relationshipMutualBlock: "互相屏蔽", + relationshipNone: "你未支持", + relationshipConflict: "冲突", + relationshipBlockingPost: "已屏蔽的帖子", + viewLikes: "查看传播", + spreadedDescription: "该居民传播的帖子列表。", + totalspreads: "总传播数", + attachFiles: "附加文件", + preview: "预览", + publish: "写作", + contentWarningPlaceholder: "为帖子添加主题(可选)", + privateWarningPlaceholder: "添加居民以发送私密帖子(可选)", + publishWarningPlaceholder: "...", + publishCustomDescription: [ + "提醒:由于区块链技术,帖子一旦发布就无法编辑或删除。", + ], + commentWarning: [ + "提醒:由于区块链技术,帖子一旦发布就无法编辑或删除。", + ], + commentPublic: "公开", + commentPrivate: "私密", + commentLabel: ({ publicOrPrivate, markdownUrl }) => [ + ], + publishLabel: ({ markdownUrl, linkTarget }) => [ + "提醒:由于区块链技术,帖子一旦发布就无法编辑或删除。", + ], + replyLabel: ({ markdownUrl }) => [ + "提醒:由于区块链技术,帖子一旦发布就无法编辑或删除。", + ], + publishCustomInfo: ({ href }) => [ + "如果你有经验,也可以", + a({ href }, "撰写高级帖子"), + "。", + ], + publishBasicInfo: ({ href }) => [ + "如果你没有经验,应该", + a({ href }, "撰写帖子"), + "。", + ], + publishCustom: "撰写高级帖子", + subtopicLabel: "创建此帖子的子话题", + messagePreview: "帖子预览", + mentionsMatching: "匹配的提及", + mentionsName: "名称", + mentionsRelationship: "关系", + updateit: "获取更新!", + updateBannerText: "Oasis 有新版本可用。", + updateBannerAction: "立即更新 →", + info: "信息", + settingsIntro: ({ version }) => [ + `[SNH] ꖒ OASIS [ v.${version} ]`, + ], + timeAgo: "前", + sendTime: "大约 ", + theme: "主题", + legacy: "密钥", + legacyTitle: "密钥", + legacyDescription: "快速安全地管理你的密钥(私钥)。", + legacyExportButton: "导出", + legacyImportButton: "导入", + ssbLogStream: "区块链", + ssbLogStreamDescription: "配置区块链流的消息限制。", + saveSettings: "保存设置", + exportTitle: "导出数据", + exportDescription: "设置密码(至少32个字符)以加密你的密钥", + exportDataTitle: "备份", + exportDataDescription: "下载你的数据(不包含私钥!)", + exportDataButton: "下载数据库", + pubWallet: "PUB 钱包", + pubWalletDescription: "设置 PUB 钱包 URL。这将用于 PUB 交易(包括 UBI)。", + pubWalletConfiguration: "保存配置", + importTitle: "导入数据", + importDescription: "导入你的加密私钥以启用你的头像", + importAttach: "附加加密文件 (.enc)", + passwordLengthInfo: "密码至少需要32个字符。", + passwordImport: "输入密码以解密将保存在系统主目录的数据(文件名:secret)", + randomPassword: "随机密码", + exportPasswordPlaceholder: "使用小写字母、大写字母、数字和符号", + fileInfo: "你的加密私钥将保存在系统主目录(文件名:oasis.enc)", + themeIntro: + "选择一个主题。", + setTheme: "设置主题", + language: "语言", + languageDescription: + "如果你想使用其他语言,请在此选择。", + setLanguage: "设置语言", + status: "状态", + peerConnections: "节点", + peerConnectionsIntro: "管理与其他节点的所有连接。", + online: "在线", + offline: "离线", + discovered: '已发现', + unknown: '未知', + pub: 'PUB', + supported: "已支持", + recommended: "推荐", + blocked: "已屏蔽", + noConnections: "没有已连接的节点。", + noDiscovered: "没有已发现的节点。", + noSupportedConnections: "没有已支持的节点。", + noBlockedConnections: "没有已屏蔽的节点。", + noRecommendedConnections: "没有推荐的节点。", + connectionActionIntro: + "", + startNetworking: "启动网络", + stopNetworking: "停止网络", + restartNetworking: "重启网络", + sync: "同步网络", + indexes: "索引", + indexesDescription: + "重建索引是安全的,可能修复某些类型的错误。", + homePageTitle: "主页", + homePageDescription: "选择你想要作为主页的模块。", + saveHomePage: "设置主页", + invites: "邀请", + invitesTitle: "邀请", + invitesInvites: "邀请", + invitesDescription: "管理和应用你网络中的邀请码。", + invitesTribesTitle: "部落", + invitesTribeInviteCodePlaceholder: "输入部落邀请码", + invitesTribeJoinButton: "加入部落", + invitesPubsTitle: "PUBs", + invitesPubInviteCodePlaceholder: "输入 PUB 邀请码", + invitesAcceptInvite: "加入 PUB", + invitesAcceptedInvites: "已联邦网络", + invitesNoInvites: "尚未接受任何邀请。", + invitesUnfollow: "取消关注", + invitesFollow: "关注", + invitesUnfollowedInvites: "未联邦网络", + invitesNoFederatedPubs: "没有已联邦网络。", + invitesNoUnfollowed: "没有未联邦网络。", + invitesUnreachablePubs: "不可达网络", + invitesNoUnreachablePubs: "没有不可达网络。", + currentlyUnreachable: "错误!", + errorDetails: "错误详情", + genericError: "发生了一个错误。", + panicMode: "紧急模式!", + encryptData: "设置密码(至少32个字符)以加密你的区块链", + decryptData: "输入密码以解密你的区块链", + panicModeDescription: "加密/解密或删除你的区块链", + removeDataDescription: "警告:此操作不可撤销。", + encryptPanicButton: "加密区块链", + decryptPanicButton: "解密区块链", + removePanicButton: "删除所有数据!", + searchTitle: "搜索", + searchDescriptionLabel: "在你的网络中搜索内容。", + searchLanguagesLabel: "语言", + searchSkillsLabel: "技能", + searchPlaceholder:"搜索内容...", + searchSubmit:"搜索!", + tribeLocationLabel:"位置", + tribeModeLabel:"邀请模式", + tribeMembersCount:"成员数", + searchDateLabel:"日期", + searchLocationLabel:"位置", + searchPriceLabel:"价格", + searchUrlLabel:"URL", + searchCategoryLabel:"类别", + searchStartLabel:"开始时间", + searchEndLabel:"结束时间", + searchPriorityLabel:"优先级", + searchStatusLabel:"状态", + statusLabel:"状态", + totalVotesLabel:"总票数", + votesLabel:"投票", + noResultsFound:"未找到结果。", + author:"作者", + createdAtLabel:"创建于", + hashtagDescription:"浏览与此标签相关的内容", + tribeDescriptionLabel:"描述", + votesOption:"投票选项", + voteYesLabel:"赞成", + voteNoLabel:"反对", + allTypesLabel: "无限制", + ABSTENTIONLabel:"弃权", + YESLabel:"赞成", + NOLabel:"反对", + FOLLOW_MAJORITYLabel: "跟随多数", + CONFUSEDLabel: "困惑", + NOT_INTERESTEDLabel: "不感兴趣", + voteOptionYes:"赞成", + voteOptionNo:"反对", + voteOptionAbstention:"弃权", + StatusLabel:"状态", + votesOptionYesLabel:"赞成", + votesOptionNoLabel:"反对", + votesOptionAbstentionLabel:"弃权", + votesQuestionLabel:"问题", + votesCreatedByLabel:"创建者", + voteStatusOpen:"进行中", + voteStatusClosed:"已关闭", + imageSearchLabel: "输入关键词以搜索带有相应标签的图片。", + commentDescription: ({ parentUrl }) => [ + " 评论了 ", + a({ href: parentUrl }, " 讨论串"), + ], + commentTitle: ({ authorName }) => [`对 @${authorName} 帖子的评论`], + subtopicDescription: ({ parentUrl }) => [ + " 从 ", + a({ href: parentUrl }, " 一篇帖子"), + " 创建了子话题", + ], + subtopicTitle: ({ authorName }) => [`@${authorName} 帖子的子话题`], + mysteryDescription: "发布了一篇神秘的帖子", + oasisDescription: "OASIS 项目网络", + searchSubmit: "搜索...", + hashtagDescription: "带有此标签的帖子。", + postLabel: "帖子", + aboutLabel: "居民", + feedLabel: "动态", + votesLabel: "投票", + reportLabel: "报告", + imageLabel: "图片", + videoLabel: "视频", + audioLabel: "音频", + documentLabel: "文档", + torrentLabel: "种子", + pdfFallbackLabel: "PDF 文档", + eventLabel: "活动", + taskLabel: "任务", + transferLabel: "转账", + curriculumLabel: "简历", + bookmarkLabel: "书签", + tribeLabel: "部落", + marketLabel: "市场", + shopLabel: "SHOPS", + shopProductLabel: "SHOP PRODUCTS", + mapLabel: "MAPS", + jobLabel: "JOBS", + forumLabel: "FORUMS", + projectLabel: "PROJECTS", + bankWalletLabel: "钱包", + bankClaimLabel: "UBI CLAIMS", + voteLabel: "VOTES", + contactLabel: "CONTACTS", + pubLabel: "PUBS", + cvLabel: "简历", + submit: "提交", + subjectLabel: "主题", + editProfile: "编辑头像", + editProfileDescription: + "", + profileName: "名称", + profileImage: "头像图片", + profileDescription: "描述", + hashtagDescription: + "来自你网络中引用此 #标签 的居民的帖子,按时间倒序排列。", + rebuildName: "重建数据库", + wallet: "钱包", + walletAddress: "地址", + walletAmount: "金额", + walletAddressLine: ({ address }) => `地址:${address}`, + walletAmountLine: ({ amount }) => `金额:${amount} ECO`, + walletBack: "返回", + walletBalanceTitle: "余额", + walletWalletSendTitle: "发送", + walletReceiveTitle: "接收", + walletHistoryTitle: "历史", + walletBalanceLine: ({ balance }) => `${balance} ECO`, + walletCnfrs: "确认数", + walletConfirm: "确认", + walletDescription: "管理你的数字资产,包括发送和接收 ECOin、查看余额和访问交易历史。", + walletDate: "日期", + walletFee: "手续费(手续费越高,交易处理越快)", + walletFeeLine: ({ fee }) => `手续费:ECO ${fee}`, + walletHistory: "历史", + walletReceive: "接收", + walletReset: "重置", + walletSend: "发送", + walletStatus: "状态", + walletDisconnected: [ + "ECOin ", + strong("钱包已断开连接"), + "。请检查 ", + a({ href: '/settings' }, "你的设置"), + " 或连接状态。", + ], + walletSentToLine: ({ destination, amount }) => `已发送 ECO ${amount} 至 ${destination}`, + walletSettingsTitle: "钱包", + walletSettingsDescription: "将 Oasis 与你的 ECOin 钱包集成。", + walletSettingsDocLink: "ECOin 安装指南", + walletStatusMessages: { + invalid_amount: "无效金额", + invalid_dest: "无效目标地址", + invalid_fee: "无效手续费", + validation_errors: "验证错误", + send_tx_success: "交易成功", + }, + walletTitle: "钱包", + walletTotalCostLine: ({ totalCost }) => `总费用:ECO ${totalCost}`, + walletTransactionId: "交易 ID", + walletTxId: "交易ID", + walletType: "类型", + walletUser: "用户名", + walletPass: "密码", + walletConfiguration: "设置钱包", + cipher: "加密器", + cipherTitle: "加密器", + cipherDescription: "使用共享密码对文本进行对称加密和解密。", + randomPassword: "随机密码", + cipherEncryptTitle: "加密文本", + cipherEncryptDescription: "输入要加密的文本", + cipherTextLabel: "要加密的文本", + cipherTextPlaceholder: "输入要加密的文本...", + cipherPasswordLabel: "设置密码(至少32个字符)以加密你的文本", + cipherPasswordDecryptLabel: "设置密码(至少32个字符)以解密你的文本", + cipherPasswordPlaceholder: "输入密码...", + cipherEncryptButton: "加密", + cipherDecryptTitle: "解密文本", + cipherDecryptDescription: "输入要解密的文本", + cipherEncryptedMessageLabel: "加密文本", + cipherDecryptedMessageLabel: "解密文本", + cipherPasswordUsedLabel: "加密所用密码(请妥善保管!)", + cipherEncryptedTextPlaceholder: "输入加密文本...", + cipherIvLabel: "IV", + cipherIvPlaceholder: "输入初始化向量...", + cipherDecryptButton: "解密", + password: "密码", + text: "文本", + encryptedText: "加密文本", + iv: "初始化向量 (IV)", + encryptTitle: "加密你的文本", + encryptDescription: "输入要加密的文本并提供密码。", + encryptButton: "加密", + decryptTitle: "解密你的文本", + decryptDescription: "输入加密文本并提供相同的加密密码。", + decryptButton: "解密", + passwordLengthError: "密码至少需要32个字符。", + missingFieldsError: "未提供文本、密码或 IV。", + encryptionError: "加密文本时出错。", + decryptionError: "解密文本时出错。", + bookmarkTitle: "书签", + bookmarkDescription: "发现和管理你网络中的书签。", + bookmarkAllSectionTitle: "书签", + bookmarkMineSectionTitle: "你的书签", + bookmarkRecentSectionTitle: "最近的书签", + bookmarkTopSectionTitle: "热门书签", + bookmarkFavoritesSectionTitle: "收藏", + bookmarkCreateSectionTitle: "创建书签", + bookmarkUpdateSectionTitle: "更新书签", + bookmarkFilterAll: "全部", + bookmarkFilterMine: "我的", + bookmarkFilterTop: "热门", + bookmarkFilterFavorites: "收藏", + bookmarkFilterRecent: "最近", + bookmarkCreateButton: "创建书签", + bookmarkUpdateButton: "更新", + bookmarkDeleteButton: "删除", + bookmarkAddFavoriteButton: "添加收藏", + bookmarkRemoveFavoriteButton: "取消收藏", + bookmarkUrlLabel: "链接", + bookmarkUrlPlaceholder: "https://example.com", + bookmarkDescriptionLabel: "描述", + bookmarkDescriptionPlaceholder: "可选", + bookmarkTagsLabel: "标签", + bookmarkTagsPlaceholder: "输入标签,用逗号分隔", + bookmarkCategoryLabel: "类别", + bookmarkCategoryPlaceholder: "可选", + bookmarkLastVisitLabel: "上次访问", + bookmarkSearchPlaceholder: "搜索 URL、标签、类别、作者...", + bookmarkSortRecent: "最近", + bookmarkSortOldest: "最早", + bookmarkSortTop: "最多投票", + bookmarkSearchButton: "搜索", + bookmarkUpdatedAt: "已更新", + bookmarkNoMatch: "没有匹配的书签。", + noBookmarks: "没有可用的书签。", + noUrl: "无链接", + noCategory: "无类别", + noLastVisit: "无访问记录", + videoTitle: "视频", + videoDescription: "探索和管理你网络中的视频内容。", + videoPluginTitle: "标题", + videoPluginDescription: "描述", + videoMineSectionTitle: "你的视频", + videoCreateSectionTitle: "上传视频", + videoUpdateSectionTitle: "更新视频", + videoAllSectionTitle: "视频", + videoRecentSectionTitle: "最近的视频", + videoTopSectionTitle: "热门视频", + videoFavoritesSectionTitle: "收藏", + videoFilterAll: "全部", + videoFilterMine: "我的", + videoFilterRecent: "最近", + videoFilterTop: "热门", + videoFilterFavorites: "收藏", + videoCreateButton: "上传视频", + videoUpdateButton: "更新", + videoDeleteButton: "删除", + videoAddFavoriteButton: "添加收藏", + videoRemoveFavoriteButton: "取消收藏", + videoFileLabel: "选择视频文件 (.mp4, .webm, .ogv, .mov)", + videoTagsLabel: "标签", + videoTagsPlaceholder: "输入标签,用逗号分隔", + videoTitleLabel: "标题", + videoTitlePlaceholder: "可选", + videoDescriptionLabel: "描述", + videoDescriptionPlaceholder: "可选", + videoNoFile: "未提供视频文件", + noVideos: "没有可用的视频。", + videoSearchPlaceholder: "搜索标题、标签、作者...", + videoSortRecent: "最近", + videoSortOldest: "最早", + videoSortTop: "最多投票", + videoSearchButton: "搜索", + videoMessageAuthorButton: "私信", + videoUpdatedAt: "已更新", + videoNoMatch: "没有匹配的视频。", + documentTitle: "文档", + documentDescription: "发现和管理你网络中的文档。", + documentAllSectionTitle: "文档", + documentMineSectionTitle: "你的文档", + documentRecentSectionTitle: "最近的文档", + documentTopSectionTitle: "热门文档", + documentFavoritesSectionTitle: "收藏", + documentCreateSectionTitle: "上传文档", + documentUpdateSectionTitle: "编辑文档", + documentFilterAll: "全部", + documentFilterMine: "我的", + documentFilterRecent: "最近", + documentFilterTop: "热门", + documentFilterFavorites: "收藏", + documentCreateButton: "上传文档", + documentUpdateButton: "更新", + documentDeleteButton: "删除", + documentAddFavoriteButton: "添加收藏", + documentRemoveFavoriteButton: "取消收藏", + documentMessageAuthorButton: "私信", + documentFileLabel: "上传文档 (.pdf)", + documentTagsLabel: "标签", + documentTagsPlaceholder: "输入标签,用逗号分隔", + documentTitleLabel: "标题", + documentTitlePlaceholder: "可选", + documentDescriptionLabel: "描述", + documentDescriptionPlaceholder: "可选", + documentNoFile: "无文件。", + noDocuments: "没有可用的文档。", + documentSearchPlaceholder: "搜索标题、标签、描述、作者...", + documentSortRecent: "最近", + documentSortOldest: "最早", + documentSortTop: "最多投票", + documentSearchButton: "搜索", + documentNoMatch: "没有匹配的文档。", + documentUpdatedAt: "已更新", + audioTitle: "音频", + audioDescription: "探索和管理你网络中的音频内容。", + audioPluginTitle: "标题", + audioPluginDescription: "描述", + audioMineSectionTitle: "你的音频", + audioCreateSectionTitle: "上传音频", + audioUpdateSectionTitle: "更新音频", + audioAllSectionTitle: "音频", + audioRecentSectionTitle: "最近的音频", + audioTopSectionTitle: "热门音频", + audioFilterAll: "全部", + audioFilterMine: "我的", + audioFilterRecent: "最近", + audioFilterTop: "热门", + audioCreateButton: "上传音频", + audioUpdateButton: "更新", + audioDeleteButton: "删除", + audioAddFavoriteButton: "添加收藏", + audioRemoveFavoriteButton: "取消收藏", + audioFileLabel: "选择音频文件 (.mp3, .wav, .ogg)", + audioTagsLabel: "标签", + audioTagsPlaceholder: "输入标签,用逗号分隔", + audioTitleLabel: "标题", + audioTitlePlaceholder: "可选", + audioDescriptionLabel: "描述", + audioDescriptionPlaceholder: "可选", + audioNoFile: "未提供音频文件", + noAudios: "没有可用的音频。", + audioSearchPlaceholder: "搜索标题、标签、作者...", + audioSortRecent: "最近", + audioSortOldest: "最早", + audioSortTop: "最多投票", + audioSearchButton: "搜索", + audioMessageAuthorButton: "私信", + audioUpdatedAt: "已更新", + audioNoMatch: "没有匹配的音频。", + audioFavoritesSectionTitle: "收藏", + audioFilterFavorites: "收藏", + favoritesTitle: "收藏", + favoritesDescription: "所有你收藏的媒体集中在一处。", + favoritesFilterAll: "全部", + favoritesFilterRecent: "最近", + favoritesFilterAudios: "音频", + favoritesFilterBookmarks: "书签", + favoritesFilterDocuments: "文档", + favoritesFilterImages: "图片", + favoritesFilterMaps: "地图", + favoritesFilterPads: "记事本", + favoritesFilterChats: "聊天", + favoritesFilterCalendars: "日历", + favoritesFilterVideos: "视频", + favoritesRemoveButton: "取消收藏", + favoritesNoItems: "还没有收藏。", + yourContacts: "你的联系人", + allInhabitants: "居民", + allCVs: "所有简历", + discoverPeople: "发现你网络中的居民。", + allInhabitantsButton: "全部", + contactsButton: "支持", + CVsButton: "简历", + matchSkills: "匹配技能", + matchSkillsButton: "匹配技能", + suggestedButton: "推荐", + searchInhabitantsPlaceholder: "按名称筛选居民...", + filterLocation: "按位置筛选居民...", + filterLanguage: "按语言筛选居民...", + filterSkills: "按技能筛选居民...", + applyFilters: "应用筛选", + locationLabel: "位置", + languagesLabel: "语言", + skillsLabel: "技能", + commonSkills: "共同技能", + mutualFollowers: "共同关注者", + latestInteractions: "最近互动", + viewAvatar: "查看头像", + viewCV: "查看简历", + suggestedSectionTitle: "推荐", + topkarmaSectionTitle: "最高因缘值", + topactivitySectionTitle: "最高活跃度", + blockedSectionTitle: "已屏蔽", + gallerySectionTitle: "画廊", + blockedButton: "已屏蔽", + blockedLabel: "已屏蔽用户", + inhabitantviewDetails: "查看详情", + viewDetails: "查看详情", + keepReading: "继续阅读...", + oasisId: "ID", + noInhabitantsFound: "尚未找到居民。", + inhabitantActivityLevel: "活跃等级", + deviceLabel: "设备", + parliamentTitle: "议会", + parliamentDescription: "探索政府形式和集体管理法律。", + parliamentFilterGovernment: "政府", + parliamentFilterCandidatures: "候选", + parliamentFilterProposals: "提案", + parliamentFilterLaws: "法律", + parliamentFilterHistorical: "历史", + parliamentFilterLeaders: "领袖", + parliamentFilterRules: "规则", + parliamentGovernmentCard: "现任政府", + parliamentGovMethod: "政府方式", + parliamentActorInPowerInhabitant: '执政居民', + parliamentActorInPowerTribe: '执政部落', + parliamentHistoricalGovernmentsTitle: '政府', + parliamentHistoricalElectionsTitle: '选举周期', + parliamentHistoricalLawsTitle: '历史', + parliamentHistoricalLeadersTitle: '领袖', + parliamentThCycles: '周期', + parliamentThTimesInPower: '执政', + parliamentThTotalCandidatures: '候选', + parliamentThProposed: '提议的法律', + parliamentThApproved: '通过的法律', + parliamentThDeclined: '否决的法律', + parliamentThDiscarded: '废弃的法律', + parliamentVotesReceived: "获得票数", + parliamentMembers: "成员", + parliamentLegSince: "周期起始", + parliamentLegEnd: "周期结束", + parliamentPoliciesProposal: "法律提案", + parliamentPoliciesApproved: "通过的法律", + parliamentPoliciesDeclined: "否决的法律", + parliamentPoliciesDiscarded: "废弃的法律", + parliamentEfficiency: "% 效率", + parliamentFilterRevocations: '撤销', + parliamentRevocationFormTitle: '撤销法律', + parliamentRevocationLaw: '法律', + parliamentRevocationTitle: '标题', + parliamentRevocationReasons: '理由', + parliamentRevocationPublish: '发布撤销', + parliamentCurrentRevocationsTitle: '当前撤销', + parliamentFutureRevocationsTitle: '未来撤销', + parliamentPoliciesRevocated: '已撤销的法律', + parliamentPoliciesTitle: '历史', + parliamentLawsTitle: '已通过的法律', + parliamentRulesRevocations: '任何已通过的法律都可以使用当前政府执政方式进行撤销。', + parliamentNoStableGov: "尚未选择政府。", + parliamentNoGovernments: "还没有政府。", + parliamentCandidatureFormTitle: "提议候选", + parliamentCandidatureId: "候选", + parliamentCandidatureIdPh: "Oasis ID (@...) 或部落名称", + parliamentCandidatureSlogan: "口号(最多140字)", + parliamentCandidatureSloganPh: "一个简短的口号", + parliamentCandidatureMethod: "方式", + parliamentCandidatureProposeBtn: "发布候选", + parliamentThType: "类型", + parliamentThId: "ID", + parliamentThDate: "提议日期", + parliamentThSlogan: "口号", + parliamentThMethod: "方式", + parliamentThKarma: "因缘值", + parliamentThSince: "注册时间", + parliamentThVotes: "获得票数", + parliamentThVoteAction: "投票", + parliamentTypeUser: "居民", + parliamentTypeTribe: "部落", + parliamentVoteBtn: "投票", + parliamentProposalFormTitle: "提议法律", + parliamentProposalTitle: "标题", + parliamentProposalDescription: "描述(不超过1000字)", + parliamentProposalPublish: "发布提案", + parliamentOpenVote: "公开投票", + parliamentFinalize: "结束", + parliamentDeadline: "截止日期", + parliamentStatus: "状态", + parliamentNoProposals: "还没有法律提案。", + parliamentNoLaws: "还没有已通过的法律。", + parliamentLawMethod: "方式", + parliamentLawProposer: "提议者", + parliamentLawVotes: "赞成/总计", + parliamentLawEnacted: "生效于", + parliamentMethodDEMOCRACY: "民主", + parliamentMethodMAJORITY: "多数(80%)", + parliamentMethodMINORITY: "少数(20%)", + parliamentMethodDICTATORSHIP: "独裁", + parliamentMethodKARMATOCRACY: "Karma 制", + parliamentMethodANARCHY: "无政府", + parliamentThId: "ID", + parliamentThProposalDate: "提议日期", + parliamentThMethod: "方式", + parliamentThKarma: "Karma", + parliamentThSupports: "支持", + parliamentThVote: "投票", + parliamentCurrentProposalsTitle: "当前提案", + parliamentVotesSlashTotal: "票数/总计", + parliamentVotesNeeded: "所需票数", + parliamentFutureLawsTitle: "未来法律", + parliamentNoFutureLaws: "还没有未来法律。", + parliamentVoteAction: "投票", + parliamentLeadersTitle: "领袖", + parliamentThLeader: "头像", + parliamentPopulation: "人口", + parliamentThType: "类型", + parliamentThInPower: "执政中", + parliamentThPresented: "候选", + parliamentNoLeaders: "还没有领袖。", + typeParliament: "议会", + typeParliamentCandidature: "议会 · 候选", + typeParliamentTerm: "议会 · 任期", + typeParliamentProposal: "议会 · 提案", + typeParliamentLaw: "议会 · 新法律", + typeCourts: "法庭", + parliamentLawQuestion: "问题", + parliamentStatus: "状态", + parliamentCandidaturesListTitle: "候选列表", + parliamentElectionsEnd: "选举结束", + parliamentTimeRemaining: "剩余时间", + parliamentCurrentLeader: "领先候选", + parliamentNoLeader: "尚无领先候选。", + parliamentElectionsStatusTitle: "下届政府", + parliamentElectionsStart: "选举开始", + parliamentProposalDeadlineLabel: "截止日期", + parliamentProposalTimeLeft: "剩余时间", + parliamentProposalOnTrack: "有望通过", + parliamentProposalOffTrack: "支持不足", + parliamentRulesTitle: "议会运作方式", + parliamentRulesIntro: "选举每2个月进行一次;候选是持续的,在政府选定后重置。", + parliamentRulesCandidates: "任何居民都可以提名自己、其他居民或任何部落。每位居民每个周期最多可提出3项候选;同一周期内的重复候选将被拒绝。", + parliamentRulesElection: "获胜者是在结算时获得最多选票的候选。", + parliamentRulesTies: "平局规则:最高居民 Karma;如果仍然平局,最早注册的;如果仍然平局,最早提出的;然后按 ID 字典序。", + parliamentRulesFallback: "如果没有人投票,最后提出的候选获胜。如果没有候选,将随机选择一个部落。", + parliamentRulesTerm: "政府标签显示当前政府和统计数据。", + parliamentRulesMethods: "形式:无政府(简单多数)、民主(50%+1)、多数(80%)、少数(20%)、Karma 制(最高 Karma 提案)、独裁(即时通过)。", + parliamentRulesAnarchy: "无政府是默认模式:如果在结算时没有候选被选出,宣布无政府状态。在无政府状态下,任何居民都可以提议法律。", + parliamentRulesProposals: "如果你是执政居民或执政部落的成员,你可以发布法律提案。非独裁方式会创建公开投票。", + parliamentRulesLimit: "每位居民每个周期最多可发布3项法律提案。", + parliamentRulesLaws: "当提案达到其门槛时,它成为法律并出现在法律标签中,附有生效日期。", + parliamentRulesHistorical: "在历史标签中,你可以看到已发生的每个政府周期及其管理数据。", + parliamentRulesLeaders: "在领袖标签中,你可以看到曾经执政(或作为候选人)的居民/部落排名,按效率排序。", + parliamentProposalVoteStatusLabel: "投票状态", + parliamentProposalOnTrackYes: "已达门槛", + parliamentProposalOnTrackNo: "低于门槛", + courtsTitle: "法庭", + courtsDescription: "探索冲突解决和集体司法管理形式。", + courtsFilterCases: "案件", + courtsFilterMyCases: "我的", + courtsFilterJudges: "法官", + courtsFilterHistory: "历史", + courtsFilterRules: "规则", + courtsFilterOpenCase: "开立案件", + courtsCaseFormTitle: "开立案件", + courtsCaseTitle: "标题", + courtsCaseRespondent: "被告/答辩人", + courtsCaseRespondentPh: "Oasis ID (@...) 或部落名称", + courtsCaseMediatorsAccuser: "调解员(原告方)", + courtsCaseMediatorsPh: "Oasis ID,用逗号分隔", + courtsCaseMethod: "解决方式", + courtsCaseDescription: "描述(最多1000字)", + courtsCaseEvidenceTitle: "案件证据", + courtsCaseEvidenceHelp: "附加图片、音频、文档(PDF)或视频以支持你的案件。", + courtsCaseSubmit: "提交案件", + courtsNominateJudge: "提名法官", + courtsJudgeId: "法官", + courtsJudgeIdPh: "Oasis ID (@...) 或居民名称", + courtsNominateBtn: "提名", + courtsAddEvidence: "添加证据", + courtsEvidenceText: "文本", + courtsEvidenceLink: "链接", + courtsEvidenceLinkPh: "https://…", + courtsEvidenceSubmit: "附加", + courtsAnswerTitle: "回应诉求", + courtsAnswerText: "答辩摘要", + courtsAnswerSubmit: "发送回应", + courtsStanceDENY: "否认", + courtsStanceADMIT: "承认", + courtsStancePARTIAL: "部分承认", + courtsVerdictTitle: "发布裁决", + courtsVerdictResult: "结果", + courtsVerdictOrders: "命令", + courtsVerdictOrdersPh: "措施、期限、修复步骤...", + courtsIssueVerdict: "发布裁决", + courtsMediationPropose: "提议和解", + courtsSettlementText: "条款", + courtsSettlementProposeBtn: "提议", + courtsNominationsTitle: "司法提名", + courtsThJudge: "法官", + courtsThSupports: "支持", + courtsThDate: "日期", + courtsThVote: "投票", + courtsNoNominations: "还没有提名。", + courtsAccuser: "原告", + courtsRespondent: "被告", + courtsThStatus: "状态", + courtsThAnswerBy: "答辩人", + courtsThEvidenceBy: "举证人", + courtsThDecisionBy: "裁决者", + courtsThCase: "案件", + courtsThCreatedAt: "开始日期", + courtsThActions: "操作", + courtsCaseMediatorsRespondentTitle: "添加辩护调解员", + courtsCaseMediatorsRespondent: "调解员(辩护方)", + courtsMediatorsAccuserLabel: "调解员(原告方)", + courtsMediatorsRespondentLabel: "调解员(辩护方)", + courtsMediatorsSubmit: "保存调解员", + courtsVotesNeeded: "所需票数", + courtsVotesSlashTotal: "赞成 / 总计", + courtsOpenVote: "公开投票", + courtsPublicPrefLabel: "解决后的可见性", + courtsPublicPrefYes: "我同意此案件可完全公开", + courtsPublicPrefNo: "我倾向于保持细节私密", + courtsPublicPrefSubmit: "保存可见性偏好", + courtsNoCases: "没有案件。", + courtsNoMyCases: "你还没有冲突。", + courtsNoHistory: "还没有审判记录。", + courtsMethodJUDGE: "法官", + courtsMethodDICTATOR: "独裁者", + courtsMethodPOPULAR: "民意", + courtsMethodMEDIATION: "调解", + courtsMethodKARMATOCRACY: "Karma 制", + courtsMethod: "方式", + courtsRulesTitle: "法庭运作方式", + courtsRulesIntro: "法庭是社区驱动的冲突解决和恢复性司法流程。优先考虑对话、清晰证据和适当补救。", + courtsRulesLifecycle: "流程:1) 开立案件 2) 选择方式 3) 提交证据 4) 听证和审议 5) 裁决和补救 6) 执行和结案 7) 上诉(如适用)。", + courtsRulesRoles: "原告:开立案件。辩护方:被告人或部落。方式:社区选择的用于促进、评估证据和发布裁决的机制。证人:提供证词或证据。调解员:由原告和/或辩护方邀请的中立人士,可访问所有细节,帮助缓和冲突并共同达成协议。", + courtsRulesEvidence: "描述不超过1000字。附加相关合法的图片、音频、视频和 PDF 文档。未经同意不要分享敏感私人数据。", + courtsRulesDeliberation: "听证可以是公开的或私密的。法官确保尊重、要求澄清,并可能排除不相关或不合法的材料。", + courtsRulesVerdict: "优先考虑修复:道歉、调解协议、内容审核、临时限制或其他适当措施。必须记录推理过程。", + courtsRulesAppeals: "上诉:在有新证据或明显程序错误时允许。除非另有规定,必须在7天内提出。", + courtsRulesPrivacy: "尊重隐私和安全。人肉搜索、仇恨或威胁将被删除。法官可以编辑或封存记录的部分内容以保护有风险的人。", + courtsRulesMisconduct: "骚扰、操纵或伪造证据可能导致立即不利裁决。", + courtsRulesGlossary: "案件:冲突记录。证据:支持诉求的材料。裁决:附有补救措施的决定。上诉:请求审查裁决。", + courtsFilterActions: "操作", + courtsNoActions: "你的角色没有待处理的操作。", + courtsCaseTitlePlaceholder: "冲突的简要描述", + courtsCaseSeverity: "严重程度", + courtsCaseSeverityNone: "无严重程度标签", + courtsCaseSeverityLOW: "低", + courtsCaseSeverityMEDIUM: "中", + courtsCaseSeverityHIGH: "高", + courtsCaseSeverityCRITICAL: "严重", + courtsCaseSubject: "主题", + courtsCaseSubjectNone: "无主题标签", + courtsCaseSubjectBEHAVIOUR: "行为", + courtsCaseSubjectCONTENT: "内容", + courtsCaseSubjectGOVERNANCE: "治理/规则", + courtsCaseSubjectFINANCIAL: "财务/资源", + courtsCaseSubjectOTHER: "其他", + courtsHiddenRespondent: "已隐藏(仅相关角色可见)。", + courtsThRole: "角色", + courtsRoleAccuser: "原告", + courtsRoleDefence: "辩护方", + courtsRoleMediator: "调解员", + courtsRoleJudge: "法官", + courtsRoleDictator: "独裁者", + courtsAssignJudgeTitle: "选择法官", + courtsAssignJudgeBtn: "选择法官", + trendingTitle: "热门", + exploreTrending: "探索你网络中最受欢迎的内容。", + ALLButton: "全部", + MINEButton: "我的", + RECENTButton: "最近", + TOPButton: "热门", + bookmarkButton: "书签", + transferButton: "转账", + eventButton: "活动", + taskButton: "任务", + votesButton: "投票", + reportButton: "报告", + feedButton: "动态", + marketButton: "市场", + imageButton: "图片", + audioButton: "音频", + videoButton: "视频", + documentButton: "文档", + torrentButton: "种子", + author: "作者", + createdAtLabel: "创建于", + totalVotes: "总票数", + noTrendingFound: "未找到热门内容。", + noContentMessage: "暂无热门内容。", + trendingDescription: "描述", + trendingDate: "日期", + trendingLocation: "位置", + trendingPrice: "价格", + trendingUrl: "URL", + trendingCategory: "类别", + trendingStart: "开始", + trendingEnd: "结束", + trendingPriority: "优先级", + trendingStatus: "状态", + trendingFrom: "发件人", + trendingTo: "收件人", + trendingConcept: "概念", + trendingAmount: "金额", + trendingDeadline: "截止日期", + trendingItemStatus: "项目状态", + trendingTotalVotes: "总票数", + trendingTotalOpinions: "总观点数", + trendingNoContentMessage: "暂无热门内容。", + trendingAuthor: "作者", + trendingCreatedAtLabel: "创建于", + trendingTotalCount: "总计", + tasksTitle: "任务", + tasksDescription: "发现和管理你网络中的任务。", + taskTitleLabel: "标题", + taskDescriptionLabel: "描述", + taskStartTimeLabel: "开始时间", + taskEndTimeLabel: "结束时间", + taskPriorityLabel: "优先级", + taskPrioritySelect: "选择优先级", + taskPriorityUrgent: "紧急", + taskPriorityHigh: "高", + taskPriorityMedium: "中", + taskPriorityLow: "低", + taskLocationLabel: "位置", + taskTagsLabel: "标签", + taskVisibilityLabel: "可见性", + taskPublic: "公开", + taskPrivate: "私密", + taskCreatedAt: "创建于", + taskBy: "作者", + taskStatus: "状态", + taskStatusOpen: "开放", + taskStatusInProgress: "进行中", + taskStatusClosed: "已关闭", + taskAssignedTo: "分配给", + taskAssignees: "被分配者", + taskAssignButton: "分配给我", + taskUnassignButton: "取消分配", + taskCreateButton: "创建任务", + taskUpdateButton: "更新", + taskDeleteButton: "删除", + taskFilterAll: "全部", + taskFilterMine: "我的", + taskFilterOpen: "开放", + taskFilterInProgress: "进行中", + taskFilterClosed: "已关闭", + taskFilterAssigned: "已分配", + taskFilterArchived: "已归档", + taskFilterUrgent: "紧急", + taskFilterHigh: "高", + taskFilterMedium: "中", + taskFilterLow: "低", + taskAllSectionTitle: "任务", + taskMineSectionTitle: "你的任务", + taskCreateSectionTitle: "创建任务", + taskUpdateSectionTitle: "更新", + taskOpenTitle: "开放任务", + taskInProgressTitle: "进行中的任务", + taskClosedTitle: "已关闭的任务", + taskAssignedTitle: "已分配的任务", + taskArchivedTitle: "已归档的任务", + taskPublicTitle: "公开任务", + taskPrivateTitle: "私密任务", + notasks: "没有可用的任务。", + noLocation: "未指定位置", + taskSetStatus: "设置状态", + eventTitle: "活动", + eventDateLabel: "日期", + eventsTitle: "活动", + eventsDescription: "发现和管理你网络中的活动。", + eventDescription: "描述", + eventPrice: "价格", + eventStatus: "状态", + eventOrganizer: "组织者", + eventAllSectionTitle: "活动", + eventMineSectionTitle: "你的活动", + eventArchivedTitle: "已归档的活动", + eventCreateSectionTitle: "创建活动", + eventUpdateSectionTitle: "更新活动", + eventDeleteButton: "删除", + eventCreateButton: "创建活动", + eventTitleLabel: "标题", + eventDescriptionLabel: "描述", + eventDescriptionPlaceholder: "输入活动描述...", + eventUpdateButton: "更新", + eventAttendeesLabel: "参与者", + eventAttendeesPlaceholder: "输入参与者,用逗号分隔...", + eventTagsLabel: "标签", + eventTagsPlaceholder: "输入活动标签,用逗号分隔...", + eventTags: "标签", + eventPriceLabel: "价格", + eventUrlLabel: "URL", + eventAttendees: "参与者", + noAttendees: "暂无参与者", + eventCreatedAt: "创建于", + eventLocation: "位置", + eventLocationLabel: "位置", + eventNoLocation: "未指定位置", + eventNoURL: "未指定 URL", + eventBy: "作者", + noevents: "没有可用的活动。", + eventDate: "日期", + eventDateFormat: "YYYY年MM月DD日 HH:mm", + eventAttendButton: "参加活动", + eventUnattendButton: "取消参加", + eventCreatedBy: "创建者", + eventAttendeesCount: "参与人数", + eventCreatedByYou: "你创建了此活动", + eventAttendConfirmation: "你现在正在参加此活动", + eventUnattendConfirmation: "你已取消参加此活动", + eventFilterAll: "全部", + eventFilterMine: "我的", + eventFilterToday: "今天", + eventFilterWeek: "本周", + eventFilterMonth: "本月", + eventFilterYear: "今年", + eventFilterArchived: "已归档", + eventTodayTitle: "今天的活动", + eventThisWeekTitle: "本周的活动", + eventThisMonthTitle: "本月的活动", + eventThisYearTitle: "今年的活动", + eventPrivacyLabel: "可见性", + eventPublic: "公开", + eventPrivate: "私密", + eventPublicTitle: "公开活动", + eventNoPrice: "免费活动", + eventNoImage: "未上传图片", + eventAttendConfirmation: "你现在正在参加此活动", + eventUnattendConfirmation: "你已取消参加此活动", + eventAttended: "已参加", + eventUnattended: "未参加", + eventStatusOpen: "开放", + eventStatusClosed: "已关闭", + tagsTitle: "标签", + tagsDescription: "发现和探索你网络中的分类模式。", + tagsAllSectionTitle: "标签", + tagsTopSectionTitle: "热门标签", + tagsCloudSectionTitle: "标签云", + tagsFilterAll: "全部", + tagsFilterTop: "热门", + tagsFilterCloud: "标签云", + tagsNoItems: "没有可用的标签。", + tagsTableHeaderTag: "标签/链接:", + tagsTableHeaderCount: "计数:", + transfersTitle: "转账", + transfersDescription: "发现和管理你网络中的转账。", + transfersFrom: "发起人", + transfersTo: "接收人", + transfersFilterAll: "全部", + transfersFilterMine: "我的", + transfersFilterUBI: "UBI", + transfersFilterMarket: "市场", + transfersFilterTop: "热门", + transfersFilterPending: "待处理", + transfersFilterUnconfirmed: "未确认", + transfersFilterClosed: "已关闭", + transfersFilterDiscarded: "已废弃", + transfersCreateButton: "创建转账", + transfersUpdateButton: "更新", + transfersDeleteButton: "删除", + transfersToUser: "Oasis ID", + transfersToUserValidation: "有效的 Oasis ID,例如 @…=.ed25519", + transfersConcept: "概念", + transfersAmount: "金额", + transfersDeadline: "截止日期", + transfersTags: "标签", + transfersStatus: "状态", + transfersStatusUnconfirmed: "未确认", + transfersStatusClosed: "已关闭", + transfersStatusDiscarded: "已废弃", + transfersCreatedAt: "创建于", + transfersConfirmations: "确认", + transfersConfirmButton: "确认转账", + transfersNoItems: "未找到转账。", + transfersMineSectionTitle: "你的转账", + transfersUBISectionTitle: "UBI 转账", + transfersMarketSectionTitle: "市场转账", + transfersTopSectionTitle: "热门转账", + transfersPendingSectionTitle: "待处理转账", + transfersUnconfirmedSectionTitle: "未确认转账", + transfersClosedSectionTitle: "已关闭转账", + transfersDiscardedSectionTitle: "已废弃转账", + transfersCreateSectionTitle: "创建转账", + transfersAllSectionTitle: "转账", + transfersFilterFavs: "收藏", + transfersFavsSectionTitle: "收藏的转账", + transfersSearchLabel: "搜索", + transfersSearchPlaceholder: "搜索概念、标签、用户...", + transfersMinAmountLabel: "最低金额", + transfersMaxAmountLabel: "最高金额", + transfersSortLabel: "排序", + transfersSortRecent: "最近", + transfersSortAmount: "最高金额", + transfersSortDeadline: "最近截止", + transfersSearchButton: "搜索", + transfersFavoriteButton: "收藏", + transfersUnfavoriteButton: "取消收藏", + transfersMessageUserButton: "消息", + transfersExpiringSoonBadge: "即将到期", + transfersExpiredBadge: "已过期", + transfersUpdatedAt: "已更新", + transfersNoMatch: "没有匹配的转账。", + votationsTitle: "投票", + votationsDescription: "发现和管理你网络中的投票。", + voteMineSectionTitle: "你的投票", + voteCreateSectionTitle: "创建投票", + voteUpdateSectionTitle: "更新", + voteOpenTitle: "进行中的投票", + voteClosedTitle: "已关闭的投票", + voteAllSectionTitle: "投票", + voteCreateButton: "创建投票", + voteUpdateButton: "更新", + voteDeleteButton: "删除", + voteOptionYes: "赞成", + voteOptionNo: "反对", + voteOptionAbstention: "弃权", + voteConfused: "困惑", + voteFollowMajority: "跟随多数", + voteNotInterested: "不感兴趣", + voteFilterAll: "全部", + voteFilterMine: "我的", + voteFilterOpen: "进行中", + voteFilterClosed: "已关闭", + voteQuestionLabel: "问题", + voteDeadlineLabel: "截止日期", + voteOptionsLabel: "你的投票", + voteBreakdown: "分布", + voteFinalResult: "结果", + voteTagsLabel: "标签", + voteDeadline: "截止日期", + voteStatus: "状态", + voteTotalVotes: "总票数", + voteTags: "标签", + voteOpinions: "观点", + novotes: "没有可用的投票提案。", + voteBy: "作者", + voteCreatedAt: "创建于", + voteNoQuestion: "未提供问题", + voteUnknownCreator: "未知创建者", + voteUnknownDate: "未知日期", + errorVoteNotFound: "未找到投票", + errorAlreadyVoted: "你已经表达了意见。", + errorVoteClosedCannotEdit: "无法编辑已关闭的投票", + errorVoteDeadlinePassed: "此投票的截止日期已过", + errorRetrievingVote: "获取投票时出错", + errorCreatingVote: "创建投票时出错", + errorVoteAlreadyVoted: "意见提交后无法编辑", + errorDeletingOldVote: "删除旧意见时出错", + errorCreatingUpdatedVote: "创建更新的意见时出错", + errorCreatingTombstone: "创建墓碑时出错", + voteDetailSectionTitle: '投票详情', + voteCommentsLabel: '评论', + voteCommentsForumButton: '公开讨论', + voteCommentsSectionTitle: '公开讨论', + voteNoCommentsYet: '还没有评论。成为第一个回复的人。', + voteNewCommentPlaceholder: '在此写下你的评论…', + voteNewCommentButton: '发表评论', + voteNewCommentLabel: '添加评论', + cvTitle: "简历", + cvLabel: "简历 (CV)", + cvEditSectionTitle: "编辑简历", + cvCreateSectionTitle: "创建简历", + cvDescription: "管理和分享你的专业技能和信息。", + cvNameLabel: "全名", + cvDescriptionLabel: "摘要", + cvPhotoLabel: "照片", + cvPersonalExperiencesLabel: "个人经历", + cvPersonalSkillsLabel: "个人技能(逗号分隔)", + cvOasisExperiencesLabel: "Oasis 贡献经历", + cvOasisSkillsLabel: "Oasis 贡献技能(逗号分隔)", + cvEducationExperiencesLabel: "教育经历", + cvEducationalSkillsLabel: "教育技能(逗号分隔)", + cvProfessionalExperiencesLabel: "专业经历", + cvProfessionalSkillsLabel: "专业技能(逗号分隔)", + cvLanguagesLabel: "语言", + cvLocationLabel: "位置", + cvStatusLabel: "状态", + cvPreferencesLabel: "偏好", + cvOasisContributorLabel: "Oasis 贡献者", + cvPersonal: "个人", + cvOasis: "Oasis 贡献者(可选)", + cvOasisContributorView: "Oasis 贡献", + cvEducational: "教育(可选)", + cvEducationalView: "教育", + cvProfessional: "专业(可选)", + cvProfessionalView: "专业", + cvAvailability: "可用性(可选)", + cvAvailabilityView: "可用性", + cvUpdateButton: "更新", + cvCreateButton: "创建简历", + cvContactLabel: "联系方式", + cvCreatedAt: "创建于", + cvUpdatedAt: "更新于", + cvEditButton: "更新", + cvDeleteButton: "删除", + cvNoCV: "未找到简历。", + blogSubject: "主题", + blogMessage: "消息", + blogImage: "上传媒体(最大:50MB)", + blogPublish: "预览", + noPopularMessages: "还没有发布热门消息", + forumTitle: "论坛", + forumCategoryLabel: "类别", + forumTitleLabel: "标题", + forumTitlePlaceholder: "论坛标题...", + forumCreateButton: "创建论坛", + forumCreateSectionTitle: "创建论坛", + forumDescription: "与你网络中的其他居民公开交流。", + forumFilterAll: "全部", + forumFilterMine: "我的", + forumFilterRecent: "最近", + forumFilterTop: "热门", + forumMineSectionTitle: "你的论坛", + forumRecentSectionTitle: "最近的论坛", + forumAllSectionTitle: "论坛", + forumDeleteButton: "删除", + forumParticipants: "参与者", + forumMessages: "消息", + forumLastMessage: "最后消息", + forumMessageLabel: "消息", + forumMessagePlaceholder: "写下你的消息...", + forumSendButton: "发送", + forumVisitForum: "访问论坛", + noForums: "未找到论坛。", + forumVisitButton: "访问论坛", + forumCatGENERAL: "综合", + forumCatOASIS: "Oasis", + forumCatLARP: "L.A.R.P.", + forumCatPOLITICS: "政治", + forumCatTECH: "科技", + forumCatSCIENCE: "科学", + forumCatMUSIC: "音乐", + forumCatART: "艺术", + forumCatGAMING: "游戏", + forumCatBOOKS: "书籍", + forumCatFILMS: "电影", + forumCatPHILOSOPHY: "哲学", + forumCatSOCIETY: "社会", + forumCatPRIVACY: "隐私", + forumCatCYBERWARFARE: "网络战争", + forumCatSURVIVALISM: "生存主义", + imageTitle: "图片", + imageDescription: "探索和管理你网络中的图片内容。", + imagePluginTitle: "标题", + imagePluginDescription: "描述", + imageMineSectionTitle: "你的图片", + imageCreateSectionTitle: "上传图片", + imageUpdateSectionTitle: "更新图片", + imageAllSectionTitle: "图片", + imageRecentSectionTitle: "最近的图片", + imageTopSectionTitle: "热门图片", + imageFavoritesSectionTitle: "收藏", + imageGallerySectionTitle: "画廊", + imageMemeSectionTitle: "梗图", + imageFilterAll: "全部", + imageFilterMine: "我的", + imageFilterRecent: "最近", + imageFilterTop: "热门", + imageFilterFavorites: "收藏", + imageFilterGallery: "画廊", + imageFilterMeme: "梗图", + imageCreateButton: "上传图片", + imageUpdateButton: "更新", + imageDeleteButton: "删除", + imageAddFavoriteButton: "添加收藏", + imageRemoveFavoriteButton: "取消收藏", + imageFileLabel: "选择图片文件 (.jpeg, .jpg, .png, .gif)", + imageTagsLabel: "标签", + imageTagsPlaceholder: "输入标签,用逗号分隔", + imageTitleLabel: "标题", + imageTitlePlaceholder: "可选", + imageDescriptionLabel: "描述", + imageDescriptionPlaceholder: "可选", + imageMemeLabel: "标记为表情包", + imageNoFile: "未提供图片文件", + noImages: "没有可用的图片。", + imageSearchPlaceholder: "搜索标题、标签、描述、作者...", + imageSortRecent: "最近", + imageSortOldest: "最早", + imageSortTop: "最多投票", + imageSearchButton: "搜索", + imageMessageAuthorButton: "消息", + imageUpdatedAt: "已更新", + imageNoMatch: "没有匹配的图片。", + feedTitle: "动态", + createFeedTitle: "创建动态", + createFeedButton: "发送动态!", + feedPlaceholder: "有什么新鲜事?(最多280字)", + ALLButton: "动态", + MINEButton: "你的动态", + TODAYButton: "今天", + TOPButton: "热门动态", + CREATEButton: "创建动态", + totalOpinions: "总观点数", + moreVoted: "最多投票", + alreadyVoted: "你已经表达了意见。", + noFeedsFound: "未找到动态。", + author: "作者", + createdAtLabel: "创建于", + FeedshareYourOpinions: "发现和分享你网络中的短文。", + refeedButton: "转发", + alreadyRefeeded: "你已经转发过了。", + activityTitle: "活动记录", + yourActivity: "你的活动", + globalActivity: "全局活动", + activityList: "活动记录", + activityDesc: "查看你网络中的最新活动。", + allButton: "全部", + mineButton: "我的", + noActions: "没有可用的活动。", + performed: "→", + from: "发起人", + to: "接收人", + amount: "金额", + concept: "概念", + description: "描述", + meme: "表情包", + activityContact: "联系人", + activityBy: "名称", + activityPixelia: "新增像素", + viewImage: "查看图片", + playAudio: "播放音频", + playVideo: "播放视频", + typeRecent: "最近", + errorActivity: "获取活动时出错", + typePost: "帖子", + typeTribe: "部落", + typeAbout: "居民", + typeCurriculum: "简历", + typeImage: "图片", + typeBookmark: "书签", + typeDocument: "文档", + typeVotes: "投票", + typeAudio: "音频", + typeMarket: "市场", + typeJob: "工作", + typeProject: "项目", + typeVideo: "视频", + typeVote: "传播", + typeEvent: "活动", + typeTransfer: "转账", + typeTask: "任务", + typePixelia: "像素画", + typeForum: "论坛", + typeReport: "报告", + typeFeed: "动态", + typeContact: "联系人", + typePub: "PUB", + typeTombstone: "墓碑", + typeBanking: "银行", + typeBankWallet: "银行/钱包", + typeBankClaim: "银行/UBI", + typeKarmaScore: "因缘值", + typeParliament: "议会", + typeSpread: "传播", + typeParliamentCandidature: "议会 · 候选", + typeParliamentTerm: "议会 · 任期", + typeParliamentProposal:"议会 · 提案", + typeParliamentRevocation:"议会 · 撤销", + typeParliamentLaw: "议会 · 新法律", + typeCourts: "法庭", + typeCourtsCase: "法庭 · 案件", + typeCourtsEvidence: "法庭 · 证据", + typeCourtsAnswer: "法庭 · 答辩", + typeCourtsVerdict: "法庭 · 裁决", + typeCourtsSettlement: "法庭 · 和解", + typeCourtsSettlementProposal: "法庭 · 和解提议", + typeCourtsSettlementAccepted: "法庭 · 和解接受", + typeCourtsNomination: "法庭 · 提名", + typeCourtsNominationVote: "法庭 · 提名投票", + activitySupport: "新联盟建立", + activityJoin: "加入新 PUB", + question: "问题", + deadline: "截止日期", + status: "状态", + votes: "投票", + totalVotes: "总票数", + voteTotalVotes: "总票数", + name: "名称", + skills: "技能", + tags: "标签", + title: "标题", + date: "日期", + category: "类别", + attendees: "参与者", + activitySpread: "->", + visitLink: "访问链接", + viewDocument: "查看文档", + location: "位置", + contentWarning: "主题", + personName: "居民名称", + bankWalletConnected: "ECOin 钱包", + bankUbiReceived: "已收到 UBI", + bankTx: "交易", + bankEpochShort: "纪元", + bankAllocId: "分配 ID", + bankingUserEngagementScore: "KARMA 评分", + viewDetails: "查看详情", + link: "链接", + aiSnippetsLearned: "已学习片段", + tribeFeedRefeeds: "转发", + activityProjectFollow: "%OASIS% 正在 %ACTION% 此项目 %PROJECT%", + activityProjectUnfollow: "%OASIS% 正在 %ACTION% 此项目 %PROJECT%", + activityProjectPledged: "%OASIS% 已 %ACTION% %AMOUNT% 至项目 %PROJECT%", + following: "关注中", + unfollowing: "取消关注中", + pledged: "已质押", + parliamentCandidatureId: "候选", + parliamentGovMethod: "方式", + parliamentVotesReceived: "获得票数", + parliamentMethodANARCHY: "无政府", + parliamentMethodVOTE: "社区投票", + parliamentMethodRANKED: "排序选择", + parliamentMethodPLURALITY: "多数制", + parliamentMethodCOUNCIL: "委员会", + parliamentMethodJURY: "陪审团", + parliamentAnarchy: "无政府", + parliamentElectionsStart: "选举开始", + parliamentElectionsEnd: "选举结束", + parliamentCurrentLeader: "领先候选", + parliamentProposalTitle: "标题", + parliamentOpenVote: "公开投票", + parliamentStatus: "状态", + parliamentLawQuestion: "问题", + parliamentLawMethod: "方式", + parliamentLawProposer: "提议者", + parliamentLawEnacted: "生效于", + parliamentLawVotes: "投票", + createdAt: "创建于", + courtsCaseTitle: "案件", + courtsMethod: "方式", + courtsMethodJUDGE: "法官", + courtsMethodJUDGES: "法官组", + courtsMethodSINGLE_JUDGE: "独任法官", + courtsMethodJURY: "陪审团", + courtsMethodCOUNCIL: "委员会", + courtsMethodCOMMUNITY: "社区", + courtsMethodMEDIATION: "调解", + courtsMethodARBITRATION: "仲裁", + courtsMethodVOTE: "社区投票", + courtsAccuser: "原告", + courtsRespondent: "被告", + courtsThStatus: "状态", + courtsThAnswerBy: "答辩人", + courtsThEvidenceBy: "举证人", + courtsThDecisionBy: "裁决者", + courtsVotesNeeded: "所需票数", + courtsVotesSlashTotal: "赞成/总计", + courtsOpenVote: "公开投票", + courtsAnswerTitle: "答辩", + courtsStanceADMIT: "承认", + courtsStanceDENY: "否认", + courtsStancePARTIAL: "部分承认", + courtsStanceCOUNTERCLAIM: "反诉", + courtsStanceNEUTRAL: "中立", + courtsVerdictResult: "结果", + courtsVerdictOrders: "命令", + courtsSettlementText: "和解", + courtsSettlementAccepted: "已接受", + courtsSettlementPending: "待处理", + courtsJudge: "法官", + courtsThSupports: "支持", + courtsFilterOpenCase: '开立案件', + courtsEvidenceFileLabel: '证据文件(图片、音频、视频或 PDF)', + courtsCaseMediators: '调解员', + courtsCaseMediatorsPh: '调解员 Oasis ID,用逗号分隔', + courtsMediatorsLabel: '调解员', + courtsThCase: '案件', + courtsThCreatedAt: '开始日期', + courtsThActions: '操作', + courtsPublicPrefLabel: '解决后的可见性', + courtsPublicPrefYes: '我同意此案件可完全公开', + courtsPublicPrefNo: '我倾向于保持细节私密', + courtsPublicPrefSubmit: '保存可见性偏好', + courtsMethodMEDIATION: '调解', + courtsNoCases: '没有案件。', + reportsTitle: "报告", + reportsDescription: "管理和追踪你网络中与问题、漏洞、滥用和内容警告相关的报告。", + reportsFilterAll: "全部", + reportsFilterMine: "我的", + reportsFilterFeatures: "功能", + reportsFilterBugs: "漏洞", + reportsFilterAbuse: "滥用", + reportsFilterContent: "内容", + reportsFilterConfirmed: "已确认", + reportsFilterResolved: "已解决", + reportsFilterOpen: "开放", + reportsFilterUnderReview: "审查中", + reportsFilterInvalid: "无效", + reportsCreateButton: "创建报告", + reportsTitleLabel: "标题", + reportsDescriptionLabel: "描述", + reportsDescriptionPlaceholder: "请提供详细描述。", + reportsCategory: "类别", + reportsCategoryLabel: "类别", + reportsCategoryFeatures: "功能", + reportsCategoryBugs: "漏洞", + reportsCategoryAbuse: "滥用", + reportsCategoryContent: "内容问题", + reportsUpdateButton: "更新", + reportsDeleteButton: "删除", + reportsDateLabel: "日期", + reportsUploadFile: "上传媒体(最大:50MB)", + reportsCreatedBy: "作者", + reportsMineSectionTitle: "你的报告", + reportsFeaturesSectionTitle: "功能请求", + reportsBugsSectionTitle: "漏洞", + reportsAbuseSectionTitle: "滥用报告", + reportsContentSectionTitle: "内容问题", + reportsAllSectionTitle: "报告", + reportsNoItems: "没有可用的报告。", + reportsValidationTitle: "请输入有效的标题。", + reportsValidationDescription: "描述不能为空。", + reportsValidationCategory: "请选择一个类别。", + reportsCreatedAt: "创建于", + reportsCreatedBy: "作者", + reportsSeverity: "严重程度", + reportsSeverityLow: "低", + reportsSeverityMedium: "中", + reportsSeverityHigh: "高", + reportsSeverityCritical: "严重", + reportsStatus: "状态", + reportsStatusOpen: "开放", + reportsStatusUnderReview: "审查中", + reportsStatusResolved: "已解决", + reportsStatusInvalid: "无效", + reportsUpdateStatusButton: "更新状态", + reportsAnonymityOption: "匿名提交", + reportsAnonymousAuthor: "匿名", + reportsConfirmButton: "确认报告!", + reportsConfirmations: "确认", + reportsConfirmedSectionTitle: "已确认的报告", + reportsCreateTaskButton: "创建任务", + reportsOpenSectionTitle: "开放报告", + reportsUnderReviewSectionTitle: "审查中的报告", + reportsResolvedSectionTitle: "已解决的报告", + reportsInvalidSectionTitle: "无效报告", + reportsTemplateSectionTitle: '报告模板', + reportsBugTemplateTitle: '复现详情(漏洞)', + reportsFeatureTemplateTitle: '详情(功能)', + reportsAbuseTemplateTitle: '详情(滥用)', + reportsContentTemplateTitle: '详情(内容问题)', + reportsStepsToReproduceLabel: '复现步骤', + reportsStepsToReproducePlaceholder: '1) ...\n2) ...\n3) ...', + reportsExpectedBehaviorLabel: '预期结果', + reportsExpectedBehaviorPlaceholder: '应该发生什么?', + reportsActualBehaviorLabel: '实际结果', + reportsActualBehaviorPlaceholder: '实际发生了什么?', + reportsEnvironmentLabel: '环境', + reportsEnvironmentPlaceholder: '版本、设备、操作系统、浏览器、设置、日志等。', + reportsReproduceRateLabel: '复现率', + reportsReproduceRateAlways: '总是', + reportsReproduceRateOften: '经常', + reportsReproduceRateSometimes: '有时', + reportsReproduceRateRarely: '偶尔', + reportsReproduceRateUnable: '无法复现', + reportsReproduceRateUnknown: '未指定', + reportsProblemStatementLabel: '问题/需求', + reportsProblemStatementPlaceholder: '此功能解决什么问题?', + reportsUserStoryLabel: '居民故事', + reportsUserStoryPlaceholder: '作为一个 <居民>,我希望 <动作>,以便 <收益>。', + reportsAcceptanceCriteriaLabel: '验收标准', + reportsAcceptanceCriteriaPlaceholder: '- 假设...\n- 当...\n- 那么...', + reportsWhatHappenedLabel: '发生了什么?', + reportsWhatHappenedPlaceholder: '描述事件的背景和大致日期。', + reportsReportedUserLabel: '被举报的居民/实体', + reportsReportedUserPlaceholder: '@居民、动态、ID、链接等。', + reportsEvidenceLinksLabel: '证据/链接', + reportsEvidenceLinksPlaceholder: '粘贴链接、消息 ID、截图(如适用)等。', + reportsContentLocationLabel: '内容位置', + reportsContentLocationPlaceholder: '链接、ID、频道、讨论串、作者等。', + reportsWhyInappropriateLabel: "为什么不合适", + reportsWhyInappropriatePlaceholder: '说明原因和影响。', + reportsRequestedActionLabel: '请求的操作', + reportsRequestedActionPlaceholder: '删除、隐藏、标记、警告等。', + tribesTitle: "部落", + tribeAllSectionTitle: "部落", + tribeMineSectionTitle: "你的部落", + tribeCreateSectionTitle: "创建部落", + tribeUpdateSectionTitle: "更新部落", + tribeGallerySectionTitle: "部落画廊", + tribeLarpSectionTitle: "L.A.R.P", + tribeRecentSectionTitle: "最近的部落", + tribeTopSectionTitle: "热门部落", + tribeviewTribeButton: "访问部落", + tribeviewSubTribeButton: "访问子部落", + tribeRootLabel: "根", + tribeDescription: "探索或创建你网络中的部落。", + tribeFilterAll: "全部", + tribeFilterMine: "我的", + tribeFilterMembership: "成员资格", + tribeFilterRecent: "最近", + tribeFilterLarp: "L.A.R.P.", + tribeFilterTop: "热门", + tribeFilterSubtribes: "子部落", + tribeFilterGallery: "画廊", + tribeMainTribeLabel: "主部落", + tribeCreateButton: "创建部落", + tribeUpdateButton: "更新", + tribeDeleteButton: "删除", + tribeImageLabel: "上传媒体(最大:50MB)", + tribeTitleLabel: "标题", + searchTribesPlaceholder: "按名称筛选部落...", + tribeTitlePlaceholder: "部落名称", + tribeDescriptionLabel: "描述", + tribeDescriptionPlaceholder: "描述这个部落", + tribeLocationLabel: "位置", + tribeLocationPlaceholder: "这个部落位于哪里?", + tribeTagsLabel: "标签", + tribeTagsPlaceholder: "输入标签,用逗号分隔", + tribeIsLARPLabel: "L.A.R.P. 部落?", + tribeInviteMode: "邀请模式", + tribeLARPLabel: "L.A.R.P.", + tribeModeLabel: "模式", + tribeIsAnonymousLabel: "状态", + tribeMembersCount: "成员", + tribeInviteCodePlaceholder: "输入邀请码", + tribeJoinByCodeButton: "使用邀请码加入", + tribeJoinButton: "加入", + tribeLeaveButton: "离开", + tribeYes: "是", + tribeNo: "否", + tribePublic: "公开", + tribePrivate: "私密", + tribeGenerateInvite: "生成邀请码", + tribeCreatedAt: "创建于", + tribeAuthor: "作者", + tribeAuthorLabel: "作者", + tribeStrict: "严格", + tribeOpen: "开放", + tribeFeedFilterRECENT: "最近", + tribeFeedFilterMINE: "我的", + tribeFeedFilterALL: "全部", + tribeFeedFilterTOP: "热门", + tribeFeedRefeeds: "转发", + tribeFeedRefeed: "转发", + tribeFeedMessagePlaceholder: "写一条动态…", + tribeFeedSend: "发送", + tribeFeedEmpty: "暂无动态消息。", + noTribes: "尚未找到部落。", + tribeNotFound: "未找到部落!", + createTribeTitle: "创建部落", + updateTribeTitle: "更新部落", + tribeSectionOverview: "概览", + tribeSectionInhabitants: "居民", + tribeSectionVotations: "投票", + tribeSectionEvents: "活动", + tribeSectionReports: "报告", + tribeSectionTasks: "任务", + tribeSectionFeed: "动态", + tribeSectionForum: "论坛", + tribeSectionMarket: "市场", + tribeSectionJobs: "工作", + tribeSectionProjects: "项目", + tribeSectionMedia: "媒体", + tribeSectionImages: "图片", + tribeSectionAudios: "音频", + 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.", + tribeInhabitantsEmpty: "此部落中还没有居民。", + tribeEventCreate: "创建活动", + tribeEventsEmpty: "还没有活动。", + tribeEventTitle: "标题", + tribeEventDescription: "描述", + tribeEventDate: "日期", + tribeEventLocation: "位置", + tribeEventAttend: "参加", + tribeEventUnattend: "离开", + tribeEventAttendees: "参与者", + tribeTaskCreate: "创建任务", + tribeTasksEmpty: "还没有任务。", + tribeTaskTitle: "标题", + tribeTaskDescription: "描述", + tribeTaskPriority: "优先级", + tribeTaskDeadline: "截止日期", + tribeTaskAssignees: "被分配者", + tribeTaskStatusInProgress: "进行中", + tribeTaskStatusClosed: "关闭", + tribeTaskAssign: "分配", + tribeTaskUnassign: "取消分配", + tribeReportCreate: "创建报告", + tribeReportsEmpty: "还没有报告。", + tribeReportTitle: "标题", + tribeReportDescription: "描述", + tribeReportCategory: "类别", + tribeVotationCreate: "创建投票", + tribeVotationsEmpty: "还没有投票。", + tribeVotationTitle: "标题", + tribeVotationDescription: "描述", + tribeVotationOptions: "选项", + tribeVotationDeadline: "截止日期", + tribeVotationVote: "投票", + tribeVotationResults: "票数", + tribeVotationClose: "关闭投票", + tribeVotationOptionPlaceholder: "选项", + tribeForumCreate: "创建论坛", + tribeForumEmpty: "还没有讨论串。", + tribeForumTitle: "标题", + tribeForumText: "消息", + tribeForumCategory: "类别", + tribeForumReply: "回复", + tribeForumReplies: "回复", + tribeMarketCreate: "创建商品", + tribeMarketEmpty: "还没有商品。", + tribeMarketTitle: "标题", + tribeMarketDescription: "描述", + tribeMarketPrice: "价格", + tribeMarketImage: "图片", + tribeMarketCategory: "类别", + tribeJobCreate: "创建工作", + tribeJobsEmpty: "还没有工作。", + tribeJobTitle: "标题", + tribeJobDescription: "描述", + tribeJobLocation: "位置", + tribeJobSalary: "薪资", + tribeJobDeadline: "截止日期", + tribeProjectCreate: "创建项目", + tribeProjectsEmpty: "还没有项目。", + tribeProjectTitle: "标题", + tribeProjectDescription: "描述", + tribeProjectGoal: "目标", + tribeProjectFunded: "已筹资", + tribeProjectDeadline: "截止日期", + tribeMediaUpload: "上传媒体", + readDocument: "阅读文档", + tribeCreateImage: "创建图片", + tribeCreateAudio: "创建音频", + tribeCreateVideo: "创建视频", + tribeCreateDocument: "创建文档", + tribeCreateBookmark: "创建书签", + tribeMediaEmpty: "还没有媒体。", + tribeMediaTitle: "标题", + tribeMediaDescription: "描述", + tribeMediaType: "类型", + tribeMediaTypeImage: "图片", + tribeMediaTypeVideo: "视频", + tribeMediaTypeAudio: "音频", + tribeMediaTypeDocument: "文档", + tribeMediaTypeBookmark: "书签", + tribeContentDelete: "删除", + tribeInviteCodeText: "邀请码:", + tribeGroupTribe: "部落", + tribeGroupOffice: "办公", + tribeGroupNetwork: "网络", + tribeGroupEconomy: "经济", + tribeGroupMedia: "媒体", + tribeStatusOpen: "开放", + tribeStatusClosed: "已关闭", + tribeStatusInProgress: "进行中", + tribePriorityLow: "低", + tribePriorityMedium: "中", + tribePriorityHigh: "高", + tribePriorityCritical: "严重", + tribeTaskFilterAll: "全部", + tribeMediaFilterAll: "全部", + tribeReportCatBug: "漏洞", + tribeReportCatAbuse: "滥用", + tribeReportCatContent: "内容", + tribeReportCatOther: "其他", + tribeForumCatGeneral: "综合", + tribeForumCatProposal: "提案", + tribeForumCatQuestion: "问题", + tribeForumCatAnnouncement: "公告", + tribeMarketCatGoods: "商品", + tribeMarketCatServices: "服务", + tribeMarketCatFood: "食品", + tribeMarketCatOther: "其他", + tribeStatusLabel: "状态", + tribeSubTribes: "子部落", + tribeSubTribesCreate: "创建子部落", + tribeSubTribesStrictDenied: "部落的严格模式不允许您创建新的子部落。请联系管理员。", + tribeSubTribesEmpty: "还没有创建子部落。", + tribeLarpCreateForbidden: "无法创建 L.A.R.P. 部落。", + tribeLarpUpdateForbidden: "无法更新 L.A.R.P. 部落。", + tribeActivityJoined: "已加入", + tribeActivityLeft: "已离开", + tribeActivityFeed: "动态", + tribeActivityRefeed: "转发", + tribeGroupAnalytics: "分析", + tribeGroupCreative: "创意", + tribeSectionActivity: "活动记录", + tribeSectionTrending: "热门", + tribeSectionOpinions: "观点", + tribeSectionPixelia: "PIXELIA", + tribeSectionTags: "标签", + tribeSectionSearch: "搜索", + tribeActivityEmpty: "还没有活动。", + tribeActivityCreated: "已创建", + tribeActivityPosted: "已发布", + tribeActivityReplied: "已回复", + tribeTrendingEmpty: "还没有热门内容。", + tribeTrendingPeriodDay: "今天", + tribeTrendingPeriodWeek: "本周", + tribeTrendingPeriodAll: "全部时间", + tribeTrendingEngagement: "参与度", + tribeOpinionsEmpty: "还没有观点。", + tribeOpinionsCast: "投票", + tribeOpinionsRankings: "排名", + tribeOpinionsAlreadyVoted: "已投票", + tribeTopCategory: "最多投票", + tribePixeliaTitle: "Pixelia", + tribePixeliaDescription: "协作像素艺术画布。", + tribePixeliaPaint: "画", + tribePixeliaContributors: "贡献者", + tribePixeliaTotalPixels: "已绘制像素", + tribeTagsEmpty: "未找到标签。", + tribeTagsCloud: "标签云", + tribeTagsContentWith: "带有标签的内容", + tribeSearchPlaceholder: "搜索部落内容...", + tribeSearchEmpty: "未找到结果。", + tribeSearchResults: "结果", + tribeSearchMinChars: "请输入至少2个字符进行搜索。", + agendaTitle: "日程", + agendaDescription: "在这里你可以找到所有分配给你的项目。", + agendaFilterAll: "全部", + agendaFilterOpen: "开放", + agendaFilterClosed: "已关闭", + agendaFilterTasks: "任务", + agendaFilterMarket: "市场", + agendaFilterTribes: "部落", + agendaFilterEvents: "活动", + agendaFilterReports: "报告", + agendaFilterTransfers: "转账", + agendaFilterJobs: "工作", + agendaFilterProjects: "项目", + agendaFilterCalendars: "日历", + agendaNoItems: "未找到分配项目。", + agendaAuthor: "作者", + agendaDiscardButton: "丢弃", + agendaRestoreButton: "恢复", + agendaCreatedAt: "创建于", + agendaTitleLabel: "标题", + agendaMembersCount: "成员", + agendaDescriptionLabel: "描述", + agendaStatus: "状态", + agendaVisibility: "可见性", + agendaEventDate: "活动日期", + agendaEventLocation: "位置", + agendaEventPrice: "价格", + agendaEventUrl: "URL", + agendaTaskStart: "开始时间", + agendaLocationLabel: "位置", + agendaLARPLabel: "L.A.R.P.", + agendaYes: "是", + agendaNo: "否", + agendaInviteModeLabel: "状态", + agendaAnonymousLabel: "匿名", + agendaMembersLabel: "成员", + agendareportCategory: "类别", + agendareportSeverity: "严重程度", + agendareportStatus: "状态", + agendareportDescription: "描述", + agendaTaskEnd: "结束时间", + agendaTaskPriority: "优先级", + agendaTransferFrom: "发起人", + agendaTransferTo: "接收人", + agendaTransferConcept: "概念", + agendaTransferAmount: "金额", + agendaTransferDeadline: "截止日期", + agendaTransferFrom: "发起人", + agendaTransferTo: "接收人", + agendaTransferConcept: "概念", + agendaTransferAmount: "金额", + agendaTransferDeadline: "截止日期", + opinionsTitle: "观点", + shareYourOpinions: "发现并为你网络中的观点投票。", + author: "作者", + voteNow: "立即投票", + alreadyVoted: "你已经表达了意见。", + noOpinionsFound: "未找到观点。", + ALLButton: "全部", + MINEButton: "我的", + RECENTButton: "最近", + TOPButton: "热门", + interestingButton: "有趣", + necessaryButton: "必要", + funnyButton: "搞笑", + disgustingButton: "恶心", + sensibleButton: "明智", + propagandaButton: "宣传", + adultOnlyButton: "仅限成人", + boringButton: "无聊", + confusingButton: "令人困惑", + inspiringButton: "鼓舞人心", + spamButton: "垃圾信息", + usefulButton: "有用", + informativeButton: "信息丰富", + wellResearchedButton: "研究充分", + accurateButton: "准确", + needsSourcesButton: "需要来源", + wrongButton: "错误", + lowQualityButton: "低质量", + creativeButton: "有创意", + insightfulButton: "有洞察力", + actionableButton: "可操作", + inspiringButton: "鼓舞人心", + loveButton: "喜爱", + clearButton: "清晰", + upliftingButton: "振奋人心", + unnecessaryButton: "不必要", + rejectedButton: "被拒绝", + misleadingButton: "误导", + offTopicButton: "离题", + duplicateButton: "重复", + clickbaitButton: "标题党", + spamButton: "垃圾信息", + trollButton: "恶搞", + nsfwButton: "NSFW", + violentButton: "暴力", + toxicButton: "有毒", + harassmentButton: "骚扰", + hateButton: "仇恨", + scamButton: "诈骗", + triggeringButton: "触发性", + opinionsCreatedAt: "创建于", + opinionsTotalCount: "总观点数", + voteInteresting: "有趣", + voteNecessary: "必要", + voteUseful: "有用", + voteInformative: "信息丰富", + voteWellResearched: "研究充分", + voteNeedsSources: "需要来源", + voteWrong: "错误", + voteLowQuality: "低质量", + voteLove: "喜爱", + voteClear: "清晰", + voteMisleading: "误导", + voteOffTopic: "离题", + voteDuplicate: "重复", + voteClickbait: "标题党", + votePropaganda: "宣传", + voteFunny: "搞笑", + voteInspiring: "鼓舞人心", + voteUplifting: "振奋人心", + voteUnnecessary: "不必要", + voteRejected: "被拒绝", + voteConfusing: "令人困惑", + voteTroll: "恶搞", + voteNsfw: "NSFW", + voteViolent: "暴力", + voteToxic: "有毒", + voteHarassment: "骚扰", + voteHate: "仇恨", + voteScam: "诈骗", + voteTriggering: "触发性", + voteInsightful: "有洞察力", + voteAccurate: "准确", + voteActionable: "可操作", + voteCreative: "有创意", + voteSpam: "垃圾信息", + voteAdultOnly: "仅限成人", + publishBlog: "发布博客", + privateMessage: "私信", + pmSendTitle: "私信", + pmSend: "发送!", + pmDescription: "使用此表单向其他居民发送加密消息。", + pmRecipients: "收件人", + pmRecipientsHint: "输入 Oasis ID,用逗号分隔", + pmSubject: "主题", + pmSubjectHint: "输入消息主题", + pmText: "消息", + pmFile: "附件", + private: "私密", + privateDescription: "你的加密消息。", + privateInbox: "收件箱", + privateSent: "已发送", + privateDelete: "删除", + pmCreateButton: "写私信", + noPrivateMessages: "没有私信。", + pmFromLabel: "发件人:", + pmToLabel: "收件人:", + pmInvalidMessage: "无效消息", + pmNoSubject: "(无主题)", + pmSubjectLabel: "主题:", + pmBodyLabel: "正文", + pmBotJobs: "42-JobsBOT", + pmBotProjects: "42-ProjectsBOT", + pmBotMarket: "42-MarketBOT", + inboxJobSubscribedTitle: "你的工作机会有新订阅", + pmInhabitantWithId: "Oasis ID 为以下的居民:", + pmHasSubscribedToYourJobOffer: "已订阅你的工作机会", + inboxProjectCreatedTitle: "新项目已创建", + pmHasCreatedAProject: "已创建一个项目", + inboxMarketItemSoldTitle: "商品已售出", + pmYourItem: "你的商品", + pmHasBeenSoldTo: "已售出给", + pmFor: "售价", + inboxProjectPledgedTitle: "你的项目有新质押", + pmHasPledged: "已质押", + pmToYourProject: "至你的项目", + blockchain: '区块浏览器', + blockchainTitle: '区块浏览器', + blockchainDescription: '探索和可视化区块链中的区块。', + blockchainNoBlocks: '区块链中未找到区块。', + blockchainBlockID: '区块 ID', + blockchainBlockAuthor: '作者', + blockchainBlockType: '类型', + blockchainBlockTimestamp: '时间戳', + blockchainBlockContent: '区块', + blockchainBlockURL: 'URL:', + blockchainContent: '区块', + blockchainContentPreview: '区块内容预览', + blockchainLatestDatagram: '最新数据报', + blockchainDatagram: '数据报', + blockchainDetails: '查看区块详情', + blockchainBlockInfo: '区块信息', + blockchainBlockDetails: '所选区块的详情', + blockchainBack: '返回区块浏览器', + blockchainContentDeleted: "此内容已被标记为墓碑", + visitContent: "访问内容", + banking: '银行', + bankingTitle: '银行', + bankingDescription: '探索 ECOin 的当前价值和相应的 UBI 分配,根据参与度和信任度按纪元分配。', + bankOverview: '概览', + bankEpochs: '纪元', + bankRules: '规则', + pending: '待处理', + closed: '已关闭', + bankBack: '返回银行', + bankViewTx: '查看交易', + bankClaimNow: '立即领取', + bankClaimUBI: '领取 UBI!', + bankClaimAndPay: 'Claim & Pay', + bankClaimedPending: 'Claim pending...', + bankStatusUnclaimed: 'Unclaimed', + bankStatusClaimed: 'Claimed', + bankStatusExpired: 'Expired', + bankPubOnly: 'PUB-only operation', + bankNoPendingUBI: '本期无待领取的 UBI 分配。', + bankEpoch: '纪元', + bankPool: '资金池(本纪元)', + bankWeightsSum: '权重总和', + bankAllocations: '分配', + bankNoAllocations: '未找到分配。', + bankNoEpochs: '未找到纪元。', + bankEpochAllocations: '纪元分配', + bankAllocId: '分配 ID', + bankAllocDate: '日期', + bankAllocConcept: '概念', + bankAllocFrom: '发起人', + bankAllocTo: '接收人', + bankAllocAmount: '金额', + bankAllocStatus: '状态', + bankEpochId: '纪元 ID', + bankRuleHash: '规则快照哈希', + bankViewEpoch: '查看纪元', + bankUserBalance: '你的余额', + ecoWalletNotConfigured: '未配置 ECOin 钱包', + editWallet: '编辑钱包', + addWallet: '添加钱包', + bankAddresses: '地址', + bankNoAddresses: '未找到地址。', + bankUser: 'Oasis ID', + bankAddress: '地址', + bankAddAddressTitle: '添加 ECOIN 地址', + bankAddAddressUser: 'Oasis ID', + bankAddAddressAddress: 'ECOIN 地址', + bankAddAddressSave: '保存', + bankAddressAdded: '地址已添加', + bankAddressUpdated: '地址已更新', + bankAddressExists: '地址已存在', + bankAddressInvalid: '无效地址', + bankAddressDeleted: '地址已删除', + bankAddressNotFound: '未找到地址', + bankAddressTotal: '地址总数', + bankAddressSearch: '搜索 @居民或地址', + bankAddressActions: '操作', + bankAddressDelete: '删除', + bankAddressSource: '来源', + bankAddressDeleteConfirm: '删除此地址?', + search: '搜索!', + bankLocal: '本地', + bankFromOasis: 'Oasis', + bankMyAddress: '你的地址', + bankRemoveMyAddress: '移除我的地址', + bankNotRemovableOasis: '无法在本地移除地址', + bankingFutureUBI: "UBI", + pubIdTitle: "PUB Wallet", + pubIdDescription: "Set the PUB OASIS ID. This will be used for PUB transactions (including the UBI).", + pubIdLabel: "PUB ID", + pubIdSave: "Save configuration", + pubIdPlaceholder: "@PUB_ID.ed25519", + bankUbiAvailableNo: "资金不足!", + bankUbiAvailableOk: "可用!", + bankUbiAvailability: "UBI 可用性", + bankAlreadyClaimedThisMonth: "本月已领取", + bankUbiThisMonth: "UBI(本月)", + bankUbiLastClaimed: "UBI(上次领取)", + bankUbiNeverClaimed: "从未领取", + bankUbiTotalClaimed: "UBI(累计领取)", + bankUbiPub: "PUB", + bankUbiInhabitant: "居民", + bankUbiClaimedAmount: "已领取(ECO)", + typeBankUbiResult: "银行 - UBI", + bankNoPubConfigured: "未配置 PUB。请在设置中设置您的 PUB ID。", + shopsTitle: "商店", + shopDescription: "发现和管理网络中的商店。", + shopTitle: "商店", + shopFilterAll: "全部", + shopFilterMine: "我的", + shopFilterRecent: "最近", + shopFilterTop: "热门", + shopFilterProducts: "产品", + shopFilterPrices: "价格", + shopFilterFavorites: "收藏", + shopUpload: "创建商店", + shopAllSectionTitle: "所有商店", + shopMineSectionTitle: "我的商店", + shopRecentSectionTitle: "最近商店", + shopTopSectionTitle: "热门商店", + shopProductsSectionTitle: "热门产品", + shopPricesSectionTitle: "按价格排列的产品", + shopFavoritesSectionTitle: "收藏", + shopCreateSectionTitle: "创建商店", + shopUpdateSectionTitle: "更新商店", + shopCreate: "创建", + shopUpdate: "更新", + shopDelete: "删除", + shopAddFavorite: "添加收藏", + shopRemoveFavorite: "取消收藏", + shopOpen: "开放", + shopClosed: "关闭", + shopOpenShop: "开放商店", + shopCloseShop: "关闭商店", + shopProducts: "产品", + shopProductAdd: "添加产品", + shopProductTitle: "产品", + shopProductUpdate: "更新产品", + shopProductPrice: "价格 (ECO)", + shopProductStock: "库存", + shopProductUntitled: "无标题产品", + shopUntitled: "无标题商店", + shopNoItems: "未找到商店。", + shopNoProducts: "暂无产品。", + shopOutOfStock: "已售罄", + shopBuy: "购买", + shopBackToShop: "返回商店", + shopShareUrl: "分享链接", + shopVisitShop: "访问商店", + shopStatus: "状态", + shopCreatedAt: "创建时间", + shopSearchPlaceholder: "搜索商店...", + shopUrl: "网址", + shopLocation: "位置", + shopTags: "标签", + shopVisibility: "可见性", + shopImage: "图片", + shopShortDescription: "简短描述", + shopShortDescriptionPlaceholder: "店铺卡片简短描述(最多160个字符)", + shopTitlePlaceholder: "您的店铺名称", + shopDescriptionPlaceholder: "您的店铺详细描述", + shopUrlPlaceholder: "https://您的店铺网址.com", + shopLocationPlaceholder: "城市,国家", + shopTagsPlaceholder: "标签1, 标签2, 标签3", + mapTitlePlaceholder: "地图标题", + shopProductFeatured: "推荐产品", + shopSendToMarket: "Send to Market", + typeShop: "商店", + typeShopProduct: "店铺商品", + bankExchange: '交易所', + bankExchangeCurrentValue: 'ECOin 价值(1小时)', + bankTotalSupply: 'ECOin 总供应量', + bankEcoinHours: "ECOin 时间等价", + bankHoursOfWork: '小时', + bankUnitMs: "毫秒", + bankUnitSeconds: "秒", + bankUnitMinutes: "分钟", + bankUnitDays: "天", + bankExchangeNoData: '无可用数据', + bankExchangeIndex: 'ECOin 价值(1小时)', + bankInflation: 'ECOin 通胀率 (anual)', + bankInflationMonthly: 'ECOin 通胀率 (mensual)', + bankCurrentSupply: 'ECOin 当前供应量', + bankingSyncStatus: 'ECOin 状态', + bankingSyncStatusSynced: '已同步', + bankingSyncStatusOutdated: '已过时', + statsTitle: '统计', + statistics: "统计", + statsInhabitant: "居民统计", + statsDescription: "发现你网络的统计数据。", + ALLButton: "全部", + MINEButton: "我的", + TOMBSTONEButton: "墓碑", + statsYou: "你", + statsUserId: "Oasis ID", + statsCreatedAt: "创建于", + statsYourContent: "内容", + statsYourOpinions: "观点", + statsYourTombstone: "墓碑", + statsNetwork: "网络", + statsTotalInhabitants: "居民", + statsDiscoveredTribes: "部落(公开)", + statsPrivateDiscoveredTribes: "部落(私密)", + statsNetworkContent: "内容", + statsYourMarket: "市场", + statsYourJob: "工作", + statsYourProject: "项目", + statsYourTransfer: "转账", + statsYourForum: "论坛", + statsNetworkOpinions: "观点", + statsDiscoveredMarket: "市场", + statsDiscoveredJob: "工作", + statsDiscoveredProject: "项目", + statsBankingTitle: "银行", + statsEcoWalletLabel: "ECOIN 钱包", + statsEcoWalletNotConfigured: "未配置!", + statsTotalEcoAddresses: "地址总数", + statsDiscoveredTransfer: "转账", + statsDiscoveredForum: "论坛", + statsNetworkTombstone: "墓碑", + statsBookmark: "书签", + statsEvent: "活动", + statsTask: "任务", + statsVotes: "投票", + statsMarket: "市场", + statsForum: "论坛", + statsJob: "工作", + statsProject: "项目", + statsReport: "报告", + statsFeed: "动态", + statsTribe: "部落", + statsImage: "图片", + statsAudio: "音频", + statsVideo: "视频", + statsDocument: "文档", + statsMap: "地图", + statsShop: "店铺", + statsShopProduct: "店铺商品", + statsTransfer: "转账", + statsAiExchange: "AI", + statsPUBs: 'PUB', + statsPost: "帖子", + statsOasisID: "Oasis ID", + statsSize: "总计(大小)", + statsBlockchainSize: "区块链(大小)", + statsBlobsSize: "Blob(大小)", + statsActivity7d: "活动(最近7天)", + statsActivity7dTotal: "7天总计", + statsActivity30dTotal: "30天总计", + statsKarmaScore: "KARMA 评分", + statsPublic: "公开", + statsPrivate: "私密", + day: "日", + messages: "消息", + statsProject: "项目", + statsProjectsTitle: "项目", + statsProjectsTotal: "项目总数", + statsProjectsActive: "活跃", + statsProjectsCompleted: "已完成", + statsProjectsPaused: "已暂停", + statsProjectsCancelled: "已取消", + statsProjectsGoalTotal: "目标总额", + statsProjectsPledgedTotal: "质押总额", + statsProjectsSuccessRate: "成功率", + statsProjectsAvgProgress: "平均进度", + statsProjectsMedianProgress: "中位数进度", + statsProjectsActiveFundingAvg: "平均活跃筹资", + statsJobsTitle: "工作", + statsJobsTotal: "工作总数", + statsJobsOpen: "开放", + statsJobsClosed: "已关闭", + statsJobsOpenVacants: "开放职位", + statsJobsSubscribersTotal: "订阅者总数", + statsJobsAvgSalary: "平均薪资", + statsJobsMedianSalary: "中位数薪资", + statsMarketTitle: "市场", + statsMarketTotal: "商品总数", + statsMarketForSale: "在售", + statsMarketReserved: "已预订", + statsMarketClosed: "已关闭", + statsMarketSold: "已售出", + statsMarketRevenue: "收入", + statsMarketAvgSoldPrice: "平均售价", + statsUsersTitle: "居民", + user: "居民", + statsTombstoneTitle: "墓碑", + statsNetworkTombstones: "网络墓碑", + statsTombstoneRatio: "墓碑比率 (%)", + statsAITraining: "AI 训练", + statsAIExchanges: "交流", + statsParliamentCandidature: "议会候选", + statsParliamentTerm: "议会任期", + statsParliamentProposal: "议会提案", + statsParliamentRevocation: "议会撤销", + statsParliamentLaw: "议会法律", + statsCourtsCase: "法庭案件", + statsCourtsEvidence: "法庭证据", + statsCourtsAnswer: "法庭答辩", + statsCourtsVerdict: "法庭裁决", + statsCourtsSettlement: "法庭和解", + statsCourtsSettlementProposal: "和解提议", + statsCourtsSettlementAccepted: "已接受的和解", + statsCourtsNomination: "法官提名", + statsCourtsNominationVote: "提名投票", + ai: "AI", + aiTitle: "AI", + aiDescription: "一个名为 '42' 的集体人工智能 (CAI),从你的网络中学习。", + aiInputPlaceholder: "有什么问题?", + aiUserQuestion: "问题", + aiResponseTitle: "回复", + aiSubmitButton: "发送!", + aiSettingsDescription: "为 AI 模型设置你的提示语(最多128个字符)。", + aiPrompt: "提供信息丰富且精确的回答。", + aiConfiguration: "设置提示语", + aiPromptUsed: "提示语", + aiClearHistory: "清除聊天记录", + aiSharePrompt: "将此回答添加到集体训练?", + aiShareYes: "是", + aiShareNo: "否", + aiSharedLabel: "已添加到训练", + aiRejectedLabel: "未添加到训练", + aiServerError: "AI 无法回答。请重试。", + aiInputPlaceholder: "什么是 Oasis?", + typeAiExchange: "AI", + aiApproveTrain: "添加到集体训练", + aiRejectTrain: "不训练", + aiTrainPending: "待批准", + aiTrainApproved: "已批准训练", + aiTrainRejected: "已拒绝训练", + aiSnippetsUsed: "使用的片段", + aiSnippetsLearned: "已学习的片段", + statsAITraining: "AI 训练", + aiApproveCustomTrain: "使用此自定义回答训练", + aiCustomAnswerPlaceholder: "写下你的自定义回答…", + statsAIExchanges: "模型交流", + marketMineSectionTitle: "你的商品", + marketCreateSectionTitle: "创建商品", + marketUpdateSectionTitle: "更新", + marketAllSectionTitle: "市场", + marketRecentSectionTitle: "最近的市场", + marketTitle: "市场", + marketDescription: "在你的网络中交换商品或服务的市场。", + marketFilterAll: "全部", + marketFilterMine: "我的", + marketFilterAuctions: "拍卖", + marketFilterItems: "交换", + marketFilterNew: "全新", + marketFilterUsed: "二手", + marketFilterBroken: "损坏", + marketFilterForSale: "出售中", + marketFilterSold: "已售出", + marketFilterDiscarded: "已废弃", + marketFilterRecent: "最近", + marketFilterMyBids: "出价", + marketCreateButton: "创建商品", + marketItemType: "类型", + marketItemTitle: "标题", + marketItemAvailable: "截止日期", + marketItemDescription: "描述", + marketItemDescriptionPlaceholder: "描述你要出售的商品", + marketItemStatus: "状态", + marketShopLabel: "商店", + marketItemCondition: "状况", + marketItemPrice: "价格", + marketItemTags: "标签", + marketItemTagsPlaceholder: "输入标签,用逗号分隔", + marketItemDeadline: "截止日期", + marketItemIncludesShipping: "包含运费?", + marketItemHighestBid: "最高出价", + marketItemHighestBidder: "最高出价者", + marketItemStock: "库存", + marketOutOfStock: "缺货", + marketItemBidTime: "出价时间", + marketActionsUpdate: "更新", + marketUpdateButton: "更新商品!", + marketActionsDelete: "删除", + marketActionsSold: "标记为已售出", + marketActionsChangeStatus: "更改状态", + marketActionsBuy: "购买!", + marketAuctionBids: "当前出价", + marketPlaceBidButton: "出价", + marketItemSeller: "卖家", + marketNoItems: "暂无可用商品。", + marketYourBid: "你的出价", + marketCreateFormImageLabel: "上传媒体(最大:50MB)", + marketSearchLabel: "搜索", + marketSearchPlaceholder: "搜索标题或标签", + marketMinPriceLabel: "最低价格", + marketMaxPriceLabel: "最高价格", + marketSortLabel: "排序", + marketSortRecent: "最近", + marketSortPrice: "价格", + marketSortDeadline: "截止日期", + marketSearchButton: "搜索", + marketAuctionEndsIn: "结束于", + marketAuctionEnded: "已结束", + marketMyBidBadge: "你已出价", + marketNoItemsMatch: "没有匹配的商品。", + jobsTitle: "工作", + jobsDescription: "发现和管理你网络中的工作。", + jobsFilterRecent: "最近", + jobsFilterMine: "我的", + jobsFilterAll: "全部", + jobsFilterRemote: "远程", + jobsFilterOpen: "开放", + jobsFilterClosed: "已关闭", + jobsCV: "简历", + jobsCreateJob: "创建工作", + jobsRecentTitle: "最近的工作", + jobsMineTitle: "你的工作", + jobsAllTitle: "工作", + jobsRemoteTitle: "远程工作", + jobsOpenTitle: "开放的工作", + jobsClosedTitle: "已关闭的工作", + jobsCVTitle: "简历", + jobsFilterPresencial: "现场", + jobsFilterFreelancer: "自由职业", + jobsFilterEmployee: "全职", + jobsPresencialTitle: "现场工作", + jobsFreelancerTitle: "自由职业工作", + jobsEmployeeTitle: "全职工作", + jobTitle: "标题", + jobLocation: "位置", + jobSalary: "薪资 (ECO/1小时)", + jobVacants: "空缺", + jobDescription: "描述", + jobRequirements: "要求", + jobLanguages: "语言", + jobStatus: "状态", + jobStatusOPEN: "开放", + jobStatusCLOSED: "已关闭", + jobSetOpen: "设为开放", + jobSetClosed: "设为已关闭", + jobSubscribeButton: "加入此机会!", + jobUnsubscribeButton: "离开此机会!", + jobTitlePlaceholder: "输入工作标题", + jobDescriptionPlaceholder: "描述工作内容", + jobRequirementsPlaceholder: "输入要求", + jobLanguagesPlaceholder: "中文、英文、西班牙文...", + jobTasksPlaceholder: "列出任务", + jobLocationPresencial: "现场", + jobLocationRemote: "远程", + jobVacantsPlaceholder: "职位数量", + jobSalaryPlaceholder: "每小时 ECO 薪资", + jobImage: "上传媒体(最大:50MB)", + jobTasks: "任务", + jobType: "工作类型", + jobTime: "工作时间", + jobSubscribers: "订阅者", + noSubscribers: "没有订阅者", + jobsFilterTop: "热门", + jobsTopTitle: "最高薪资工作", + createJobButton: "发布工作", + viewDetailsButton: "查看详情", + noJobsFound: "未找到工作机会。", + jobAuthor: "作者", + jobTypeFreelance: "自由职业", + jobTypeSalary: "全职", + jobTimePartial: "兼职", + jobTimeComplete: "全职", + jobsDeleteButton: "删除", + jobsUpdateButton: "更新", + jobsFilterApplied: "已申请", + jobsAppliedTitle: "我的申请", + jobsAppliedBadge: "已申请", + jobsFilterFavs: "收藏", + jobsFavsTitle: "收藏", + jobsFilterNeeds: "需要帮助", + jobsNeedsTitle: "需要帮助", + jobsSearchLabel: "搜索", + jobsSearchPlaceholder: "搜索标题、标签、描述...", + jobsMinSalaryLabel: "最低薪资", + jobsMaxSalaryLabel: "最高薪资", + jobsSortLabel: "排序", + jobsSortRecent: "最近", + jobsSortSalary: "最高薪资", + jobsSortSubscribers: "最多申请者", + jobsSearchButton: "搜索", + jobsFavoriteButton: "收藏", + jobsUnfavoriteButton: "取消收藏", + jobsMessageAuthorButton: "私信", + jobsApplicants: "申请者", + jobsUpdatedAt: "已更新", + jobSetOpen: "设为开放", + jobNewBadge: "新", + jobsTagsLabel: "标签", + jobsTagsPlaceholder: "标签1, 标签2, 标签3", + noJobsMatch: "没有匹配的工作。", + projectsTitle: "项目", + projectsDescription: "创建、资助和关注你网络中的社区驱动项目。", + projectCreateProject: "创建项目", + projectCreateButton: "创建项目", + projectUpdateButton: "更新", + projectDeleteButton: "删除", + projectNoProjectsFound: "未找到项目。", + projectFilterAll: "全部", + projectFilterMine: "我的", + projectFilterActive: "活跃", + projectFilterPaused: "已暂停", + projectFilterCompleted: "已完成", + projectFilterFollowing: "已关注", + projectFilterRecent: "最近", + projectFilterTop: "热门", + projectAllTitle: "项目", + projectMineTitle: "你的项目", + projectActiveTitle: "活跃项目", + projectPausedTitle: "已暂停项目", + projectCompletedTitle: "已完成项目", + projectFollowingTitle: "已关注项目", + projectRecentTitle: "最近的项目", + projectTopTitle: "最高筹资", + projectTitlePlaceholder: "项目名称", + projectImage: "上传媒体(最大:50MB)", + projectDescription: "描述", + projectDescriptionPlaceholder: "讲述故事和目标…", + projectGoal: "目标 (ECO)", + projectGoalPlaceholder: "50000", + projectDeadline: "截止日期", + projectProgress: "起始进度 (%)", + projectStatus: "状态", + projectFunding: "筹资", + projectPledged: "已质押", + projectSetStatus: "设置状态", + projectSetProgress: "更新进度", + projectFollowButton: "关注", + projectUnfollowButton: "取消关注", + projectStatusACTIVE: "活跃", + projectStatusPAUSED: "已暂停", + projectStatusCOMPLETED: "已完成", + projectStatusCANCELLED: "已取消", + projectPledgeTitle: "支持此项目", + projectPledgePlaceholder: "ECO 金额", + projectBounties: "悬赏", + projectBountiesInputLabel: "悬赏(每行一个:标题|金额 [ECO]|描述)", + projectBountiesPlaceholder: "修复 UI 漏洞|100|问题链接\n编写文档|250|列出使用示例", + projectNoBounties: "未找到悬赏。", + projectTitle: "标题", + projectAddBountyTitle: "新悬赏", + projectBountyTitle: "悬赏标题", + projectBountyAmount: "金额 (ECO)", + projectBountyDescription: "描述", + projectMilestoneSelect: "选择里程碑", + projectBountyCreateButton: "创建悬赏", + projectBountyStatus: "悬赏状态", + projectBountyOpen: "开放", + projectBountyClaimed: "已认领", + projectBountyDone: "已完成", + projectBountyClaimedBy: "认领者", + projectBountyClaimButton: "认领", + projectBountyCompleteButton: "标记为已完成", + projectMilestones: "里程碑", + projectAddMilestoneTitle: "新里程碑", + projectMilestoneTitle: "里程碑标题", + projectMilestoneTargetPercent: "百分比 (%)", + projectMilestoneDueDate: "日期", + projectMilestoneCreateButton: "创建里程碑", + projectMilestoneStatus: "里程碑状态", + projectMilestoneOpen: "开放", + projectMilestoneDone: "已完成", + projectMilestoneMarkDone: "标记为已完成", + projectMilestoneDue: "截止", + projectNoMilestones: "未找到里程碑。", + projectMilestoneMarkDone: "标记为已完成", + projectMilestoneTitlePlaceholder: "输入里程碑标题", + projectMilestoneDescriptionPlaceholder: "输入此里程碑的描述", + projectMilestoneDescription: "里程碑描述", + projectBudgetGoal: "预算(目标)", + projectBudgetAssigned: "已分配至悬赏", + projectBudgetRemaining: "剩余", + projectBudgetOver: "⚠ 超出预算:分配金额超过目标", + projectFollowers: "关注者", + projectFollowersTitle: "关注者", + projectFollowersNone: "还没有关注者。", + projectMore: "更多", + projectYouFollowHint: "你关注了此项目", + projectBackers: "支持者", + projectBackersTitle: "支持者", + projectBackersTotal: "支持者总数", + projectBackersTotalPledged: "质押总额", + projectBackersYourPledge: "你的质押", + projectBackersNone: "还没有质押。", + projectNoRemainingBudget: "没有剩余预算。", + projectFilterBackers: "支持者", + projectFilterApplied: "已申请", + projectAppliedTitle: "已申请", + projectBackersLeaderboardTitle: "顶级支持者", + projectNoBackersFound: "未找到支持者。", + projectBackerAmount: "总贡献", + projectBackerPledges: "质押", + projectBackerProjects: "项目", + projectPledgeAmount: "金额", + projectSelectMilestoneOrBounty: "选择里程碑或悬赏", + projectPledgeButton: "质押", + footerLicense: "GPLv3", + footerPackage: "软件包", + footerVersion: "版本", + modulesModuleName: "名称", + modulesModuleDescription: "描述", + modulesModuleStatus: "状态", + modulesTotalModulesLabel: "已加载模块", + modulesEnabledModulesLabel: "已启用", + modulesDisabledModulesLabel: "已禁用", + modulesPopularLabel: "精选", + modulesPopularDescription: "接收热门、最多浏览或最多评论帖子的模块。", + modulesTopicsLabel: "话题", + modulesTopicsDescription: "接收基于共同兴趣的讨论类别的模块。", + modulesSummariesLabel: "摘要", + modulesSummariesDescription: "接收长讨论或帖子摘要的模块。", + modulesLatestLabel: "最新", + modulesLatestDescription: "接收最新帖子和讨论的模块。", + modulesThreadsLabel: "讨论串", + modulesThreadsDescription: "接收按话题或问题分组的对话的模块。", + modulesMultiverseLabel: "多元宇宙", + modulesMultiverseDescription: "接收来自其他联邦节点内容的模块。", + modulesInvitesLabel: "邀请", + modulesInvitesDescription: "管理和应用邀请码的模块。", + modulesWalletLabel: "钱包", + modulesWalletDescription: "管理你的数字资产 (ECOin) 的模块。", + modulesLegacyLabel: "密钥", + modulesLegacyDescription: "快速安全地管理你的私钥的模块。", + modulesCipherLabel: "加密器", + modulesCipherDescription: "使用共享密码对文本进行对称加密和解密的模块。", + modulesBookmarksLabel: "书签", + modulesBookmarksDescription: "发现和管理书签的模块。", + modulesVideosLabel: "视频", + modulesVideosDescription: "发现和管理视频的模块。", + modulesDocsLabel: "文档", + modulesDocsDescription: "发现和管理文档的模块。", + modulesAudiosLabel: "音频", + modulesAudiosDescription: "发现和管理音频的模块。", + modulesTagsLabel: "标签", + modulesTagsDescription: "发现和探索分类模式(标签)的模块。", + modulesImagesLabel: "图片", + modulesImagesDescription: "发现和管理图片的模块。", + modulesTrendingLabel: "热门", + modulesTrendingDescription: "探索最受欢迎内容的模块。", + modulesEventsLabel: "活动", + modulesEventsDescription: "发现和管理活动的模块。", + modulesTasksLabel: "任务", + modulesTasksDescription: "发现和管理任务的模块。", + modulesMarketLabel: "市场", + modulesMarketDescription: "交换商品或服务的模块。", + modulesShopsLabel: "商店", + modulesShopsDescription: "管理和发现商店的模块。", + modulesTribesLabel: "部落", + modulesTribesDescription: "探索或创建部落(群组)的模块。", + modulesVotationsLabel: "投票", + modulesVotationsDescription: "发现和管理投票的模块。", + modulesReportsLabel: "报告", + modulesReportsDescription: "管理和追踪与问题、漏洞、滥用和内容警告相关报告的模块。", + modulesOpinionsLabel: "观点", + modulesOpinionsDescription: "发现和为观点投票的模块。", + modulesTransfersLabel: "转账", + modulesTransfersDescription: "发现和管理智能合约(转账)的模块。", + modulesFeedLabel: "动态", + modulesFeedDescription: "发现和分享短文(动态)的模块。", + modulesParliamentLabel: "议会", + modulesParliamentDescription: "选举政府和投票法律的模块。", + modulesCourtsLabel: "法庭", + modulesCourtsDescription: "解决冲突和发布裁决的模块。", + modulesPixeliaLabel: "Pixelia", + modulesPixeliaDescription: "在协作网格上绘画的模块。", + modulesAgendaLabel: "日程", + modulesAgendaDescription: "管理所有分配给你的项目的模块。", + modulesAILabel: "AI", + modulesAIDescription: "与名为 '42' 的 LLM 对话的模块。", + modulesForumLabel: "论坛", + modulesForumDescription: "发现和管理论坛的模块。", + modulesJobsLabel: "工作", + modulesJobsDescription: "发现和管理工作的模块。", + modulesProjectsLabel: "项目", + modulesProjectsDescription: "探索、众筹和管理项目的模块。", + modulesBankingLabel: "银行", + modulesBankingDescription: "确定 ECOIN 真实价值并使用公共金库分配 UBI 的模块。", + modulesFavoritesLabel: "收藏", + modulesFavoritesDescription: "管理你收藏内容的模块。", + fileTooLargeTitle: "文件过大", + fileTooLargeMessage: "文件超过了允许的最大大小(50 MB)。请选择较小的文件。", + goBack: "返回", + directConnect: "直接连接", + directConnectDescription: "通过输入对方的 IP 地址、端口和公钥直接连接到节点。该节点将被添加为已关注的连接。", + peerHost: "IP / 主机名", + peerPort: "端口(默认:8008)", + peerPublicKey: "公钥 (@...ed25519)", + connectAndFollow: "连接", + deviceSourceLabel: "设备来源", + modulesPresetTitle: "常用配置", + modulesPreset_minimal: "极简", + modulesPreset_basic: "基础", + modulesPreset_social: "社交", + modulesPreset_economy: "经济", + modulesPreset_full: "完整", + statsCarbonFootprintTitle: "碳足迹", + statsCarbonFootprintNetwork: "网络碳足迹", + statsCarbonFootprintYours: "你的碳足迹", + statsCarbonTombstone: "墓碑碳足迹", + feedSuccessMsg: "动态发布成功!", + dominantOpinionLabel: "主流观点", + uploadMedia: "上传媒体(最大:50MB)", + feedOpenDiscussion: "公开讨论", + feedDetailTitle: "动态", + feedPostComment: "发表评论", + courtsRespondentInvalid: "必须是有效的 SSB ID (@...ed25519)", + noComments: "还没有评论", + mapsLabel: "地图", + mapTitle: "地图", + mapDescription: "在您的网络中探索和管理离线地图。", + mapMineSectionTitle: "我的地图", + mapCreateSectionTitle: "创建地图", + mapUpdateSectionTitle: "更新地图", + mapAllSectionTitle: "地图", + mapRecentSectionTitle: "最近的地图", + mapFavoritesSectionTitle: "收藏", + mapFilterAll: "全部", + mapFilterMine: "我的", + mapFilterRecent: "最近", + mapFilterFavorites: "收藏", + mapUploadButton: "创建地图", + mapCreateButton: "创建地图", + mapUpdateButton: "更新", + mapDeleteButton: "删除", + mapAddFavoriteButton: "添加收藏", + mapRemoveFavoriteButton: "取消收藏", + mapLatLabel: "纬度", + mapLatPlaceholder: "例如 39.9042", + mapLngLabel: "经度", + mapLngPlaceholder: "例如 116.4074", + mapDescriptionLabel: "描述", + mapDescriptionPlaceholder: "描述地图或位置...", + mapTypeLabel: "地图类型", + mapTypeSingle: "单一(仅初始位置)", + mapTypeOpen: "开放(任何人可添加标记)", + mapTypeClosed: "封闭(仅创建者可添加标记)", + mapTagsLabel: "标签", + mapTagsPlaceholder: "输入以逗号分隔的标签", + mapUrlLabel: "地图链接", + mapPickCoordLabel: "或在网格上选择位置:", + mapMarkersLabel: "标记", + mapMarkersTitle: "标记", + mapMarkerDefault: "标记", + mapMarkerLatLabel: "标记纬度", + mapMarkerLngLabel: "标记经度", + mapMarkerLabelField: "标记名称", + mapMarkerLabelPlaceholder: "描述此标记...", + markerImageLabel: "标记图片", + mapAddMarkerTitle: "添加标记", + mapAddMarkerButton: "添加标记", + mapCleanMarkerButton: "Clean Marker", + mapApplyZoom: "应用缩放", + mapSearchPlaceholder: "搜索描述、标签、作者...", + mapSearchButton: "搜索", + mapUpdatedAt: "已更新", + mapNoMatch: "没有匹配的地图。", + noMaps: "没有可用的地图。", + mapLocationTitle: "位置", + mapVisitLabel: "访问地图", + typeMap: "地图", + typeMapMarker: "地图标记", + modulesMapLabel: "地图", + modulesMapDescription: "管理和分享离线地图的模块。", + padsTitle: "协作板", + padTitle: "协作板", + modulesPadsLabel: "协作板", + modulesPadsDescription: "管理协作文本编辑器的模块。", + padFilterAll: "全部", + padFilterMine: "我的", + padFilterRecent: "最近", + padFilterOpen: "开放", + padFilterClosed: "关闭", + padCreate: "创建协作板", + padUpdate: "更新协作板", + padDelete: "删除协作板", + padTitleLabel: "标题", + padTitlePlaceholder: "输入协作板标题...", + padStatusLabel: "状态", + padStatusOpen: "开放", + padStatusInviteOnly: "仅限受邀者", + padStatusClosed: "关闭", + padDeadlineLabel: "截止日期", + padTagsLabel: "标签", + padTagsPlaceholder: "标签1, 标签2, ...", + padMembersLabel: "成员", + padVisitPad: "访问协作板", + padShareUrl: "分享链接", + padCreated: "创建时间", + padAuthor: "作者", + padGenerateCode: "生成邀请码", + padInviteCodeLabel: "邀请码", + padInviteCodePlaceholder: "输入邀请码...", + padValidateInvite: "验证", + padStartEditing: "开始编辑!", + padEditorPlaceholder: "开始写作...", + padSubmitEntry: "提交", + padNoEntries: "暂无内容。", + padAllSectionTitle: "全部协作板", + padMineSectionTitle: "我的协作板", + padsDescription: "在您的网络中管理协作加密的文本编辑器。", + padRecentSectionTitle: "最近协作板", + padOpenSectionTitle: "开放协作板", + padClosedSectionTitle: "关闭协作板", + padCreateSectionTitle: "创建新协作板", + padUpdateSectionTitle: "更新协作板", + padInviteGenerated: "邀请码已生成", + typePad: "协作板", + padNew: "新建", + padAddFavorite: "添加到收藏", + padRemoveFavorite: "从收藏中移除", + padClose: "关闭记事本", + padBackToEditor: "返回编辑器", + padSearchPlaceholder: "搜索共享文本...", + + modulesChatsLabel: "聊天", + modulesChatsDescription: "发现和管理加密聊天室的模块。", + typeChat: "聊天", + typeChatMessage: "聊天消息", + chatLabel: "聊天", + chatMessageLabel: "聊天消息", + chatsTitle: "聊天", + chatMineSectionTitle: "Your Chats", + chatRecentTitle: "Recent Chats", + chatFavoritesTitle: "收藏", + chatOpenTitle: "Open Chats", + chatClosedTitle: "Closed Chats", + chatDescription: "描述", + chatCategory: "类别", + chatStatus: "状态", + chatFilterAll: "全部", + chatFilterMine: "我的", + chatFilterRecent: "最近", + chatFilterFavorites: "收藏", + chatFilterOpen: "开放", + chatFilterClosed: "已关闭", + chatCreate: "创建聊天", + chatUpdate: "更新聊天", + chatDelete: "删除聊天", + chatClose: "关闭聊天", + chatVisitChat: "访问聊天", + chatUntitled: "无标题聊天", + chatNoItems: "未找到聊天。", + chatParticipants: "参与者", + chatStartChatting: "开始聊天!", + chatGenerateCode: "生成代码", + chatShareUrl: "分享链接", + chatCreatedAt: "创建时间", + chatSearchPlaceholder: "搜索聊天...", + chatStatusOpen: "开放", + chatStatusInviteOnly: "仅限邀请", + chatStatusClosed: "已关闭", + chatSendMessage: "发送", + chatMessagePlaceholder: "输入您的消息...", + chatNoMessages: "暂无消息。", + chatLeave: "离开聊天", + chatInviteCodeLabel: "输入邀请码", + chatJoinByInvite: "加入", + chatTitlePlaceholder: "聊天标题", + chatDescriptionPlaceholder: "聊天描述", + chatTagsPlaceholder: "标签1, 标签2", + chatImageLabel: "选择图片文件 (.jpeg, .jpg, .png, .gif)", + chatInviteCode: "邀请码", + chatAuthor: "作者", + chatCreated: "创建", + chatAddFavorite: "添加到收藏", + chatRemoveFavorite: "从收藏中移除", + chatPM: "私信", + chatStatusLabel: "状态", + chatCategoryLabel: "类别", + chatParticipantsLabel: "参与者", + gamesTitle: "游戏", + gamesDescription: "发现并玩一些游戏。", + gamesFilterAll: "全部", + gamesPlayButton: "开始游戏!", + gamesBackToGames: "返回游戏", + modulesGamesLabel: "游戏", + modulesGamesDescription: "用于发现和玩游戏的模块。", + gamesCocolandTitle: "Cocoland", + gamesCocolandDesc: "一颗有眼睛的椰子跳过棕榈树,收集ECOins。", + gamesTheFlowTitle: "ECOinflow", + gamesTheFlowDesc: "通过验证者、商店和累积器将PUB连接到居民。抵御CBDC威胁!", + gamesNeonInfiltratorTitle: "Neon Infiltrator", + gamesNeonInfiltratorDesc: "渗透网格,收集机密数据,辺开安全无人机并逃脱。能通过多少层关?", + gamesSpaceInvadersTitle: "Space Invaders", + gamesSpaceInvadersDesc: "阻止外星人入侵!在入侵者抵达地面之前击落它们。", + gamesArkanoidTitle: "Arkanoid", + gamesArkanoidDesc: "用你的球拍和球打破所有砖块。经典街机挑战。", + gamesPingPongTitle: "PingPong", + gamesPingPongDesc: "与AI对战的经典乒乓球。先得5分者获胜。", + gamesOutrunTitle: "Outrun", + gamesOutrunDesc: "与时间赛跑!躲避交通障碍,在时间用完前到达终点。", + gamesAsteroidsTitle: "Asteroids", + gamesAsteroidsDesc: "驾驶飞船穿越小行星带。在它们撞上你之前将其摧毁。", + gamesRockPaperScissorsTitle: "石头剪刀布", + gamesRockPaperScissorsDesc: "与AI对战石头、剪刀、布。三局两胜获胜。", + gamesTikTakToeTitle: "TikTakToe", + gamesTikTakToeDesc: "与AI对战经典井字游戏。连成三个即可获胜。", + 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.", + gamesCocomanTitle: "Cocoman", + gamesCocomanDesc: "Eat all the dots, avoid the ghosts. Turn-based Pac-Man — every key press counts.", + 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?", + gamesQuakeTitle: "Quake Arena", + gamesQuakeDesc: "First-person raycasting arena. Move and shoot your way through waves of enemies.", + gamesFilterScoring: "SCORING", + gamesHallOfFame: "Hall of Fame", + gamesHallPlayer: "Player", + gamesHallScore: "Score", + gamesNoScores: "No scores yet.", + calendarsTitle: "日历", + calendarTitle: "日历", + modulesCalendarsLabel: "日历", + modulesCalendarsDescription: "用于发现和管理日历的模块。", + typeCalendar: "日历", + calendarFilterAll: "全部", + calendarFilterMine: "我的", + calendarFilterOpen: "开放", + calendarFilterClosed: "关闭", + calendarFilterRecent: "最近", + calendarFilterFavorites: "收藏", + calendarCreate: "创建日历", + calendarUpdate: "更新", + calendarDelete: "删除", + calendarTitleLabel: "标题", + calendarTitlePlaceholder: "日历标题...", + calendarStatusLabel: "状态", + calendarStatusOpen: "开放", + calendarStatusClosed: "关闭", + calendarDeadlineLabel: "Deadline", + calendarTagsLabel: "标签", + calendarTagsPlaceholder: "标签1, 标签2...", + calendarParticipantsLabel: "参与者", + calendarParticipantsCount: "参与者", + calendarVisitCalendar: "访问日历", + calendarCreated: "已创建", + calendarAuthor: "作者", + calendarJoin: "加入", + calendarJoined: "已加入", + calendarAddDate: "添加日期", + calendarAddNote: "添加笔记", + calendarDateLabel: "日期", + calendarDatePlaceholder: "描述这个日期...", + calendarNoteLabel: "笔记", + calendarNotePlaceholder: "添加笔记...", + calendarFirstDateLabel: "日期", + calendarFirstNoteLabel: "备注", + calendarIntervalLabel: "Interval", + calendarIntervalWeekly: "Weekly", + calendarIntervalMonthly: "Monthly", + calendarIntervalYearly: "Yearly", + calendarFormDescription: "描述", + calendarNoDates: "尚未添加日期。", + calendarNoNotes: "暂无笔记。", + calendarsNoItems: "未找到日历。", + calendarsDescription: "在您的网络中发现和管理日历。", + calendarMonthPrev: "← 上一月", + calendarMonthNext: "下一月 →", + calendarMonthLabel: "日期", + calendarsShareUrl: "分享链接", + calendarAllSectionTitle: "日历", + calendarRecentSectionTitle: "最近的日历", + calendarFavoritesSectionTitle: "收藏", + calendarMineSectionTitle: "你的日历", + calendarOpenSectionTitle: "开放日历", + calendarClosedSectionTitle: "关闭日历", + calendarCreateSectionTitle: "创建新日历", + calendarUpdateSectionTitle: "更新日历", + calendarAddFavorite: "添加到收藏", + calendarDeleteNote: "Delete", + calendarRemoveFavorite: "从收藏移除", + calendarSearchPlaceholder: "搜索日历...", + calendarAddEntry: "添加条目", + calendarLeave: "离开日历", + statsCalendar: "日历", + statsCalendarDate: "日历日期", + statsCalendarNote: "日历笔记", + chatAccessDenied: "您没有访问此聊天室的权限。请申请邀请以访问内容。", + padAccessDenied: "您没有访问此协作板的权限。请申请邀请以访问内容。", + contentAccessDenied: "您没有访问此内容的权限。", + blockAccessRestricted: "访问受限", + tribeContentAccessDenied: "访问被拒绝", + tribeContentAccessDeniedMsg: "此内容属于一个部落。您必须是成员才能访问它。", + tribeViewTribes: "查看部落", + torrentsTitle: "种子", + torrentsDescription: "浏览和管理网络中的种子。", + torrentAllSectionTitle: "种子", + torrentMineSectionTitle: "我的种子", + torrentRecentSectionTitle: "最近的种子", + torrentTopSectionTitle: "热门种子", + torrentFavoritesSectionTitle: "收藏", + torrentFilterAll: "全部", + torrentFilterMine: "我的", + torrentFilterRecent: "最近", + torrentFilterTop: "热门", + torrentFilterFavorites: "收藏", + torrentCreateSectionTitle: "上传种子", + torrentUpdateSectionTitle: "更新种子", + torrentCreateButton: "上传种子", + torrentUpdateButton: "更新", + torrentDeleteButton: "删除", + torrentAddFavoriteButton: "添加到收藏", + torrentRemoveFavoriteButton: "从收藏移除", + torrentFileLabel: "选择种子文件 (.torrent)", + torrentTitleLabel: "标题", + torrentTitlePlaceholder: "标题", + torrentDescriptionLabel: "描述", + torrentDescriptionPlaceholder: "描述", + torrentTagsLabel: "标签", + torrentTagsPlaceholder: "输入以逗号分隔的标签", + torrentSizeLabel: "大小", + torrentDownloadButton: "DOWNLOAD IT!", + torrentNoFile: "没有种子文件", + noTorrents: "未找到种子。", + torrentSearchPlaceholder: "搜索标题、标签、作者...", + torrentSearchButton: "搜索", + torrentSortRecent: "最新", + torrentSortOldest: "最旧", + torrentSortTop: "最多投票", + torrentNoMatch: "没有匹配的种子。", + torrentMessageAuthorButton: "给作者发消息", + torrentUpdatedAt: "已更新", + statsTorrent: "种子", + typeTorrent: "种子", + modulesTorrentsLabel: "种子", + modulesTorrentsDescription: "发现和管理种子的模块。", + favoritesFilterTorrents: "种子", + tribeSectionTorrents: "种子", + tribeCreateTorrent: "上传种子", + tribeMediaTypeTorrent: "种子", + settingsWishTitle: "愿望", + settingsWishDesc: "配置您的头像愿望。", + settingsWishWhole: "Multiverse", + settingsWishMutuals: "Only mutual-support", + settingsPmVisibilityTitle: "私信", + settingsPmVisibilityDesc: "配置您希望在网络中的私信曝光级别。", + settingsPmVisibilityWhole: "Multiverse", + settingsPmVisibilityMutuals: "Only mutual-support", + pmMutualNotice: "出站是 UX 保护。入站是关注过滤器。", + pmBlockedNonMutual: "只能向相互支持的居民发送私信。", + inhabitantsPendingFollowsTitle: "待处理的支持请求", + inhabitantsPendingAccept: "接受", + inhabitantsPendingReject: "拒绝", + bxEncrypted: "已加密", + bxEncryptedHexLabel: "密文(预览)", + tribeSectionGovernance: "治理", + tribeSubStatusPublic: "公开", + tribeSubStatusPrivate: "私密", + tribeSubInheritedPrivate: "私密(继承自主部落)", + tribePadInviteRequired: "您无权访问 pad。请求邀请。", + tribeChatInviteRequired: "您无权访问聊天。请求邀请。", + tribeGovernanceDesc: "此部落的内部治理。", + tribeGovernanceNoGov: "无活跃政府", + tribeGovernanceNoGovDesc: "此部落尚未选举政府。", + tribeGovCardTitle: "当前政府", + tribeGovCycleSince: "周期开始", + tribeGovCycleEnd: "周期结束", + tribeGovTimeRemaining: "剩余时间", + tribeGovPopulation: "人口", + tribeGovMethod: "方法", + tribeGovVotesReceived: "收到的投票", + tribeGovLeader: "领导者", + tribeGovFilterGovernment: "政府", + tribeGovFilterCandidatures: "候选", + tribeGovFilterLaws: "法律", + tribeGovCandidatureId: "候选", + tribeGovCandidatureMethod: "方法", + tribeGovCandidatureProposeBtn: "发布候选", + tribeGovRuleTitle: "规则标题", + tribeGovRuleBody: "规则内容", + tribeGovProposals: "提案", + tribeGovRevocations: "撤销", + tribeGovHistorical: "历史", + tribeGovRules: "规则", + tribeGovernanceAlreadyPublished: "此部落在当前周期已有候选人。", + tribeGovernanceProposeInternal: "提议内部候选人", + tribeGovernanceInternalCandidatures: "内部候选人", + tribeGovernanceNoCandidatures: "无开放候选人。", + tribeGovernanceAddRule: "添加规则", + tribeGovernanceNoRules: "暂无规则。", + tribeGovernanceNoLeaders: "尚无领导人被选出。", + tribeGovernanceComingSoon: "治理模块即将推出。", + logsTitle: "日志", + logsDescription: "记录您在网络中的体验。", + logsReadMore: "阅读更多", + logsViewTitle: "日志", + logsColumnType: "类型", + logsView: "查看", + logsManualPrompt: "撰写您的日志", + logsUpdateButton: "更新", + logsEditTitle: "编辑条目", + logsCreateDescription: "记录您的体验...", + logsCreateTitle: "创建条目", + logsWriteButton: "撰写", + logsTextPlaceholder: "描述您的体验...", + logsTextField: "文本", + logsLabelPlaceholder: "标签...", + logsLabelField: "撰写您的日志(标签)", + logsAiDisabledWarn: "在 /modules 中启用 AI 模块以使用 AI 撰写的日志。", + logsAiContextValue: "区块链日", + logsAiContext: "上下文", + logsAiModStatus: "AImod", + logsModeApply: "应用!", + logsModeAIWritten: "AI-Assistant", + logsModeManual: "手动", + logsModeAI: "AI", + logsColumnDelete: "删除", + logsColumnEdit: "编辑", + logsColumnLog: "日志", + logsColumnDate: "日期", + logsDelete: "删除", + logsEdit: "编辑", + logsFilterAlways: "始终", + logsFilterYear: "去年", + logsFilterMonth: "上月", + logsFilterWeek: "上周", + logsFilterToday: "今天", + logsFilterRecent: "最近", + logsFilterAll: "全部", + logsCreate: "创建条目", + logsExport: "导出日志", + logsExportOne: "导出", + logsViewDetails: "查看详情", + logsGenerateButton: "生成文本", + logsSearchText: "在日志中搜索...", + logsSearchAnyType: "任意类型", + logsSearchButton: "搜索", + logsEmpty: "暂无条目。", + modulesLogsLabel: "日志", + modulesLogsDescription: "用于(通过 AI 助手)记录体验的模块。", + statsLogsTitle: "日志", + statsLogsEntries: "条目", + typeLog: "日志", + blockchainCycle: "周期", + + } +}; diff --git a/nodejs-project/nodejs-project/src/models/calendars_model.js b/nodejs-project/nodejs-project/src/models/calendars_model.js index 01448ac6..0d4a98d4 100644 --- a/nodejs-project/nodejs-project/src/models/calendars_model.js +++ b/nodejs-project/nodejs-project/src/models/calendars_model.js @@ -30,7 +30,7 @@ const expandRecurrence = (firstDate, deadline, weekly, monthly, yearly) => { return out.sort((a, b) => a.getTime() - b.getTime()) } -module.exports = ({ cooler, pmModel }) => { +module.exports = ({ cooler, pmModel, tribeCrypto, tribesModel }) => { let ssb const openSsb = async () => { if (!ssb) ssb = await cooler.open(); return ssb } @@ -39,24 +39,38 @@ module.exports = ({ cooler, pmModel }) => { pull(ssbClient.createLogStream({ limit: logLimit }), pull.collect((err, msgs) => err ? reject(err) : resolve(msgs))) ) + const tribeHelpers = tribeCrypto ? tribeCrypto.createHelpers(tribesModel) : null + const encryptIfTribe = tribeHelpers ? tribeHelpers.encryptIfTribe : async (c) => c + const decryptIfTribe = tribeHelpers ? tribeHelpers.decryptIfTribe : async (c) => c + const assertReadable = tribeHelpers ? tribeHelpers.assertReadable : () => {} + const decryptIndexNodes = tribeHelpers ? tribeHelpers.decryptIndexNodes : async () => {} + const buildIndex = (messages) => { const tomb = new Set() const nodes = new Map() const parent = new Map() const child = new Map() + const authorByKey = new Map() + const tombRequests = [] for (const m of messages) { const k = m.key const v = m.value || {} const c = v.content if (!c) continue - if (c.type === "tombstone" && c.target) { tomb.add(c.target); continue } + if (c.type === "tombstone" && c.target) { tombRequests.push({ target: c.target, author: v.author }); continue } if (c.type === "calendar") { nodes.set(k, { key: k, ts: v.timestamp || m.timestamp || 0, c, author: v.author }) + authorByKey.set(k, v.author) if (c.replaces) { parent.set(k, c.replaces); child.set(c.replaces, k) } } } + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target) + if (targetAuthor && t.author === targetAuthor) tomb.add(t.target) + } + const rootOf = (id) => { let cur = id; while (parent.has(cur)) cur = parent.get(cur); return cur } const tipOf = (id) => { let cur = id; while (child.has(cur)) cur = child.get(cur); return cur } @@ -71,21 +85,24 @@ module.exports = ({ cooler, pmModel }) => { const buildCalendar = (node, rootId) => { const c = node.c || {} if (c.type !== "calendar") return null + const undec = c.encryptedPayload && c._decrypted === false return { key: node.key, rootId, - title: safeText(c.title), + title: undec ? "" : safeText(c.title), status: c.status || "OPEN", - deadline: c.deadline || "", + deadline: undec ? "" : (c.deadline || ""), tags: Array.isArray(c.tags) ? c.tags : [], author: c.author || node.author, participants: Array.isArray(c.participants) ? c.participants : [], createdAt: c.createdAt || new Date(node.ts).toISOString(), updatedAt: c.updatedAt || null, - tribeId: c.tribeId || null + tribeId: c.tribeId || null, + encrypted: !!undec } } + const isClosed = (calendar) => { if (calendar.status === "CLOSED") return true if (!calendar.deadline) return false @@ -126,7 +143,7 @@ module.exports = ({ cooler, pmModel }) => { if (deadline && new Date(deadline).getTime() <= Date.now()) throw new Error("Deadline must be in the future") if (!firstDate || new Date(firstDate).getTime() <= Date.now()) throw new Error("First date must be in the future") - const content = { + let content = { type: "calendar", title: safeText(title), status: validStatus, @@ -138,6 +155,7 @@ module.exports = ({ cooler, pmModel }) => { updatedAt: now, ...(tribeId ? { tribeId } : {}) } + content = await encryptIfTribe(content) const calMsg = await new Promise((resolve, reject) => { ssbClient.publish(content, (err, msg) => err ? reject(err) : resolve(msg)) @@ -148,30 +166,36 @@ module.exports = ({ cooler, pmModel }) => { const allDateMsgs = [] for (const d of dates) { + let dateContent = { + type: "calendarDate", + calendarId, + date: d.toISOString(), + label: safeText(firstDateLabel), + author: userId, + createdAt: new Date().toISOString(), + ...(tribeId ? { tribeId } : {}) + } + dateContent = await encryptIfTribe(dateContent) const dateMsg = await new Promise((resolve, reject) => { - ssbClient.publish({ - type: "calendarDate", - calendarId, - date: d.toISOString(), - label: safeText(firstDateLabel), - author: userId, - createdAt: new Date().toISOString() - }, (err, msg) => err ? reject(err) : resolve(msg)) + ssbClient.publish(dateContent, (err, msg) => err ? reject(err) : resolve(msg)) }) allDateMsgs.push(dateMsg) } if (firstNote && safeText(firstNote) && allDateMsgs.length > 0) { for (const dateMsg of allDateMsgs) { + let noteContent = { + type: "calendarNote", + calendarId, + dateId: dateMsg.key, + text: safeText(firstNote), + author: userId, + createdAt: new Date().toISOString(), + ...(tribeId ? { tribeId } : {}) + } + noteContent = await encryptIfTribe(noteContent) await new Promise((resolve, reject) => { - ssbClient.publish({ - type: "calendarNote", - calendarId, - dateId: dateMsg.key, - text: safeText(firstNote), - author: userId, - createdAt: new Date().toISOString() - }, (err, msg) => err ? reject(err) : resolve(msg)) + ssbClient.publish(noteContent, (err, msg) => err ? reject(err) : resolve(msg)) }) } } @@ -183,90 +207,112 @@ module.exports = ({ cooler, pmModel }) => { const tipId = await this.resolveCurrentId(id) const ssbClient = await openSsb() const userId = ssbClient.id - - return new Promise((resolve, reject) => { - ssbClient.get(tipId, (err, item) => { - if (err || !item?.content) return reject(new Error("Calendar not found")) - if (item.content.author !== userId) return reject(new Error("Not the author")) - const c = item.content - const updated = { - ...c, - title: data.title !== undefined ? safeText(data.title) : c.title, - status: data.status !== undefined ? (["OPEN","CLOSED"].includes(String(data.status).toUpperCase()) ? String(data.status).toUpperCase() : c.status) : c.status, - deadline: data.deadline !== undefined ? data.deadline : c.deadline, - tags: data.tags !== undefined ? normalizeTags(data.tags) : c.tags, - updatedAt: new Date().toISOString(), - replaces: tipId - } - const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } - ssbClient.publish(tombstone, (e1) => { - if (e1) return reject(e1) - ssbClient.publish(updated, (e2, res) => e2 ? reject(e2) : resolve(res)) - }) - }) + const item = await new Promise((resolve, reject) => { + ssbClient.get(tipId, (err, it) => err ? reject(err) : resolve(it)) }) + if (!item || !item.content) throw new Error("Calendar not found") + const oldDec = await decryptIfTribe(item.content) + assertReadable(oldDec, "Calendar") + if ((oldDec.author || item.content.author) !== userId) throw new Error("Not the author") + let updated = { + type: "calendar", + title: data.title !== undefined ? safeText(data.title) : (oldDec.title || ""), + status: data.status !== undefined ? (["OPEN","CLOSED"].includes(String(data.status).toUpperCase()) ? String(data.status).toUpperCase() : oldDec.status) : (oldDec.status || "OPEN"), + deadline: data.deadline !== undefined ? data.deadline : (oldDec.deadline || ""), + tags: data.tags !== undefined ? normalizeTags(data.tags) : (Array.isArray(oldDec.tags) ? oldDec.tags : []), + author: oldDec.author || userId, + participants: oldDec.participants || [userId], + ...(item.content.tribeId ? { tribeId: item.content.tribeId } : {}), + createdAt: oldDec.createdAt, + updatedAt: new Date().toISOString(), + replaces: tipId + } + updated = await encryptIfTribe(updated) + const result = await new Promise((resolve, reject) => ssbClient.publish(updated, (e, res) => e ? reject(e) : resolve(res))) + const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } + await new Promise((resolve, reject) => ssbClient.publish(tombstone, e => e ? reject(e) : resolve())) + return result }, async deleteCalendarById(id) { const tipId = await this.resolveCurrentId(id) const ssbClient = await openSsb() const userId = ssbClient.id - return new Promise((resolve, reject) => { - ssbClient.get(tipId, (err, item) => { - if (err || !item?.content) return reject(new Error("Calendar not found")) - if (item.content.author !== userId) return reject(new Error("Not the author")) - const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } - ssbClient.publish(tombstone, (e) => e ? reject(e) : resolve()) - }) - }) + const item = await new Promise((resolve, reject) => ssbClient.get(tipId, (e, it) => e ? reject(e) : resolve(it))) + if (!item || !item.content) throw new Error("Calendar not found") + const dec = await decryptIfTribe(item.content) + assertReadable(dec, "Calendar") + if ((dec.author || item.content.author) !== userId) throw new Error("Not the author") + const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } + return new Promise((resolve, reject) => ssbClient.publish(tombstone, e => e ? reject(e) : resolve())) }, async joinCalendar(calendarId) { const tipId = await this.resolveCurrentId(calendarId) const ssbClient = await openSsb() const userId = ssbClient.id - - return new Promise((resolve, reject) => { - ssbClient.get(tipId, (err, item) => { - if (err || !item?.content) return reject(new Error("Calendar not found")) - const c = item.content - const participants = Array.isArray(c.participants) ? c.participants : [] - if (participants.includes(userId)) return resolve() - const updated = { ...c, participants: [...participants, userId], updatedAt: new Date().toISOString(), replaces: tipId } - const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } - ssbClient.publish(tombstone, (e1) => { - if (e1) return reject(e1) - ssbClient.publish(updated, (e2, res) => e2 ? reject(e2) : resolve(res)) - }) - }) - }) + const item = await new Promise((resolve, reject) => ssbClient.get(tipId, (e, it) => e ? reject(e) : resolve(it))) + if (!item || !item.content) throw new Error("Calendar not found") + const dec = await decryptIfTribe(item.content) + assertReadable(dec, "Calendar") + const participants = Array.isArray(dec.participants) ? dec.participants : [] + if (participants.includes(userId)) return + let updated = { + type: "calendar", + title: dec.title || "", + status: dec.status || "OPEN", + deadline: dec.deadline || "", + tags: Array.isArray(dec.tags) ? dec.tags : [], + author: dec.author, + participants: [...participants, userId], + ...(item.content.tribeId ? { tribeId: item.content.tribeId } : {}), + createdAt: dec.createdAt, + updatedAt: new Date().toISOString(), + replaces: tipId + } + updated = await encryptIfTribe(updated) + const result = await new Promise((resolve, reject) => ssbClient.publish(updated, (e, res) => e ? reject(e) : resolve(res))) + const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } + await new Promise((resolve, reject) => ssbClient.publish(tombstone, e => e ? reject(e) : resolve())) + return result }, async leaveCalendar(calendarId) { const tipId = await this.resolveCurrentId(calendarId) const ssbClient = await openSsb() const userId = ssbClient.id - return new Promise((resolve, reject) => { - ssbClient.get(tipId, (err, item) => { - if (err || !item?.content) return reject(new Error("Calendar not found")) - const c = item.content - if (c.author === userId) return reject(new Error("Author cannot leave")) - const participants = Array.isArray(c.participants) ? c.participants : [] - if (!participants.includes(userId)) return resolve() - const updated = { ...c, participants: participants.filter(p => p !== userId), updatedAt: new Date().toISOString(), replaces: tipId } - const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } - ssbClient.publish(tombstone, (e1) => { - if (e1) return reject(e1) - ssbClient.publish(updated, (e2, res) => e2 ? reject(e2) : resolve(res)) - }) - }) - }) + const item = await new Promise((resolve, reject) => ssbClient.get(tipId, (e, it) => e ? reject(e) : resolve(it))) + if (!item || !item.content) throw new Error("Calendar not found") + const dec = await decryptIfTribe(item.content) + assertReadable(dec, "Calendar") + if ((dec.author || item.content.author) === userId) throw new Error("Author cannot leave") + const participants = Array.isArray(dec.participants) ? dec.participants : [] + if (!participants.includes(userId)) return + let updated = { + type: "calendar", + title: dec.title || "", + status: dec.status || "OPEN", + deadline: dec.deadline || "", + tags: Array.isArray(dec.tags) ? dec.tags : [], + author: dec.author, + participants: participants.filter(p => p !== userId), + ...(item.content.tribeId ? { tribeId: item.content.tribeId } : {}), + createdAt: dec.createdAt, + updatedAt: new Date().toISOString(), + replaces: tipId + } + updated = await encryptIfTribe(updated) + const result = await new Promise((resolve, reject) => ssbClient.publish(updated, (e, res) => e ? reject(e) : resolve(res))) + const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId } + await new Promise((resolve, reject) => ssbClient.publish(tombstone, e => e ? reject(e) : resolve())) + return result }, async getCalendarById(id) { const ssbClient = await openSsb() const messages = await readAll(ssbClient) const idx = buildIndex(messages) + await decryptIndexNodes(idx) let tip = id while (idx.child.has(tip)) tip = idx.child.get(tip) if (idx.tomb.has(tip)) return null @@ -285,6 +331,7 @@ module.exports = ({ cooler, pmModel }) => { const uid = viewerId || ssbClient.id const messages = await readAll(ssbClient) const idx = buildIndex(messages) + await decryptIndexNodes(idx) const items = [] for (const [rootId, tipId] of idx.tipByRoot.entries()) { if (idx.tomb.has(tipId)) continue @@ -319,15 +366,18 @@ module.exports = ({ cooler, pmModel }) => { const dates = expandRecurrence(date, deadlineForExpansion, intervalWeekly, intervalMonthly, intervalYearly) const allMsgs = [] for (const d of dates) { + let dateContent = { + type: "calendarDate", + calendarId: rootId, + date: d.toISOString(), + label: safeText(label), + author: userId, + createdAt: new Date().toISOString(), + ...(cal.tribeId ? { tribeId: cal.tribeId } : {}) + } + dateContent = await encryptIfTribe(dateContent) const msg = await new Promise((resolve, reject) => { - ssbClient.publish({ - type: "calendarDate", - calendarId: rootId, - date: d.toISOString(), - label: safeText(label), - author: userId, - createdAt: new Date().toISOString() - }, (err, m) => err ? reject(err) : resolve(m)) + ssbClient.publish(dateContent, (err, m) => err ? reject(err) : resolve(m)) }) allMsgs.push(msg) } @@ -338,10 +388,15 @@ module.exports = ({ cooler, pmModel }) => { const rootId = await this.resolveRootId(calendarId) const ssbClient = await openSsb() const messages = await readAll(ssbClient) + const authorByKey = new Map() + for (const m of messages) authorByKey.set(m.key, (m.value || {}).author) const tombstoned = new Set() for (const m of messages) { const c = (m.value || {}).content - if (c && c.type === "tombstone" && c.target) tombstoned.add(c.target) + if (c && c.type === "tombstone" && c.target) { + const targetAuthor = authorByKey.get(c.target) + if (targetAuthor && (m.value || {}).author === targetAuthor) tombstoned.add(c.target) + } } const dates = [] for (const m of messages) { @@ -350,13 +405,19 @@ module.exports = ({ cooler, pmModel }) => { const c = v.content if (!c || c.type !== "calendarDate") continue if (c.calendarId !== rootId) continue + let dec = c + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const r = await tribeCrypto.decryptFromTribe(c, tribesModel) + dec = r && !r._undecryptable ? r : c + if (r && r._undecryptable) continue + } dates.push({ key: m.key, - calendarId: c.calendarId, - date: c.date, - label: c.label || "", - author: c.author || v.author, - createdAt: c.createdAt || new Date(v.timestamp || 0).toISOString() + calendarId: dec.calendarId || c.calendarId, + date: dec.date, + label: dec.label || "", + author: dec.author || v.author, + createdAt: dec.createdAt || new Date(v.timestamp || 0).toISOString() }) } dates.sort((a, b) => new Date(a.date) - new Date(b.date)) @@ -370,10 +431,15 @@ module.exports = ({ cooler, pmModel }) => { const cal = await this.getCalendarById(rootId) if (!cal) throw new Error("Calendar not found") const messages = await readAll(ssbClient) + const authorByKey = new Map() + for (const m of messages) authorByKey.set(m.key, (m.value || {}).author) const tombstoned = new Set() for (const m of messages) { const c = (m.value || {}).content - if (c && c.type === "tombstone" && c.target) tombstoned.add(c.target) + if (c && c.type === "tombstone" && c.target) { + const targetAuthor = authorByKey.get(c.target) + if (targetAuthor && (m.value || {}).author === targetAuthor) tombstoned.add(c.target) + } } let dateAuthor = null for (const m of messages) { @@ -381,7 +447,12 @@ module.exports = ({ cooler, pmModel }) => { const c = (m.value || {}).content if (!c || c.type !== "calendarDate") continue if (tombstoned.has(m.key)) break - dateAuthor = c.author || (m.value || {}).author + let dec = c + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const r = await tribeCrypto.decryptFromTribe(c, tribesModel) + if (r && !r._undecryptable) dec = r + } + dateAuthor = dec.author || (m.value || {}).author break } if (!dateAuthor) throw new Error("Date not found") @@ -407,27 +478,30 @@ module.exports = ({ cooler, pmModel }) => { const cal = await this.getCalendarById(rootId) if (!cal) throw new Error("Calendar not found") if (!cal.participants.includes(userId)) throw new Error("Only participants can add notes") + let noteContent = { + type: "calendarNote", + calendarId: rootId, + dateId, + text: safeText(text), + author: userId, + createdAt: new Date().toISOString(), + ...(cal.tribeId ? { tribeId: cal.tribeId } : {}) + } + noteContent = await encryptIfTribe(noteContent) return new Promise((resolve, reject) => { - ssbClient.publish({ - type: "calendarNote", - calendarId: rootId, - dateId, - text: safeText(text), - author: userId, - createdAt: new Date().toISOString() - }, (err, msg) => err ? reject(err) : resolve(msg)) + ssbClient.publish(noteContent, (err, msg) => err ? reject(err) : resolve(msg)) }) }, async deleteNote(noteId) { const ssbClient = await openSsb() const userId = ssbClient.id + const item = await new Promise((resolve, reject) => ssbClient.get(noteId, (e, it) => e ? reject(e) : resolve(it))) + if (!item || !item.content) throw new Error("Note not found") + const dec = await decryptIfTribe(item.content) + if ((dec.author || item.content.author) !== userId) throw new Error("Not the author") return new Promise((resolve, reject) => { - ssbClient.get(noteId, (err, item) => { - if (err || !item?.content) return reject(new Error("Note not found")) - if (item.content.author !== userId) return reject(new Error("Not the author")) - ssbClient.publish({ type: "tombstone", target: noteId, deletedAt: new Date().toISOString(), author: userId }, (e, msg) => e ? reject(e) : resolve(msg)) - }) + ssbClient.publish({ type: "tombstone", target: noteId, deletedAt: new Date().toISOString(), author: userId }, (e, msg) => e ? reject(e) : resolve(msg)) }) }, @@ -435,10 +509,15 @@ module.exports = ({ cooler, pmModel }) => { const rootId = await this.resolveRootId(calendarId) const ssbClient = await openSsb() const messages = await readAll(ssbClient) + const authorByKey = new Map() + for (const m of messages) authorByKey.set(m.key, (m.value || {}).author) const tombstoned = new Set() for (const m of messages) { const c = (m.value || {}).content - if (c && c.type === "tombstone" && c.target) tombstoned.add(c.target) + if (c && c.type === "tombstone" && c.target) { + const targetAuthor = authorByKey.get(c.target) + if (targetAuthor && (m.value || {}).author === targetAuthor) tombstoned.add(c.target) + } } const notes = [] for (const m of messages) { @@ -447,13 +526,19 @@ module.exports = ({ cooler, pmModel }) => { if (!c || c.type !== "calendarNote") continue if (tombstoned.has(m.key)) continue if (c.calendarId !== rootId || c.dateId !== dateId) continue + let dec = c + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const r = await tribeCrypto.decryptFromTribe(c, tribesModel) + if (r && !r._undecryptable) dec = r + else continue + } notes.push({ key: m.key, - calendarId: c.calendarId, - dateId: c.dateId, - text: c.text || "", - author: c.author || v.author, - createdAt: c.createdAt || new Date(v.timestamp || 0).toISOString() + calendarId: dec.calendarId || c.calendarId, + dateId: dec.dateId || c.dateId, + text: dec.text || "", + author: dec.author || v.author, + createdAt: dec.createdAt || new Date(v.timestamp || 0).toISOString() }) } notes.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt)) @@ -473,10 +558,15 @@ module.exports = ({ cooler, pmModel }) => { sentMarkers.add(`${c.calendarId}::${c.dateId}`) } + const authorByKey = new Map() + for (const m of messages) authorByKey.set(m.key, (m.value || {}).author) const tombstoned = new Set() for (const m of messages) { const c = (m.value || {}).content - if (c && c.type === "tombstone" && c.target) tombstoned.add(c.target) + if (c && c.type === "tombstone" && c.target) { + const targetAuthor = authorByKey.get(c.target) + if (targetAuthor && (m.value || {}).author === targetAuthor) tombstoned.add(c.target) + } } const dueByCalendar = new Map() @@ -485,9 +575,15 @@ module.exports = ({ cooler, pmModel }) => { const v = m.value || {} const c = v.content if (!c || c.type !== "calendarDate") continue - if (new Date(c.date).getTime() > now) continue + let dec = c + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const r = await tribeCrypto.decryptFromTribe(c, tribesModel) + if (!r || r._undecryptable) continue + dec = r + } + if (!dec.date || new Date(dec.date).getTime() > now) continue if (sentMarkers.has(`${c.calendarId}::${m.key}`)) continue - const entry = { key: m.key, calendarId: c.calendarId, date: c.date, label: c.label || "" } + const entry = { key: m.key, calendarId: c.calendarId, date: dec.date, label: dec.label || "" } const list = dueByCalendar.get(c.calendarId) || [] list.push(entry) dueByCalendar.set(c.calendarId, list) diff --git a/nodejs-project/nodejs-project/src/models/chats_model.js b/nodejs-project/nodejs-project/src/models/chats_model.js index fc18d773..24301f51 100644 --- a/nodejs-project/nodejs-project/src/models/chats_model.js +++ b/nodejs-project/nodejs-project/src/models/chats_model.js @@ -42,21 +42,30 @@ module.exports = ({ cooler, tribeCrypto, tribesModel }) => { const parent = new Map() const child = new Map() const msgNodes = new Map() + const authorByKey = new Map() + const tombRequests = [] for (const m of messages) { const k = m.key const v = m.value || {} const c = v.content if (!c) continue - if (c.type === "tombstone" && c.target) { tomb.add(c.target); continue } + if (c.type === "tombstone" && c.target) { tombRequests.push({ target: c.target, author: v.author }); continue } if (c.type === "chat") { nodes.set(k, { key: k, ts: v.timestamp || m.timestamp || 0, c, author: v.author }) + authorByKey.set(k, v.author) if (c.replaces) { parent.set(k, c.replaces); child.set(c.replaces, k) } } else if (c.type === "chatMessage") { msgNodes.set(k, { key: k, ts: v.timestamp || m.timestamp || 0, c, author: v.author }) + authorByKey.set(k, v.author) } } + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target) + if (targetAuthor && t.author === targetAuthor) tomb.add(t.target) + } + const rootOf = (id) => { let cur = id; while (parent.has(cur)) cur = parent.get(cur); return cur } const tipOf = (id) => { let cur = id; while (child.has(cur)) cur = child.get(cur); return cur } diff --git a/nodejs-project/nodejs-project/src/models/maps_model.js b/nodejs-project/nodejs-project/src/models/maps_model.js index 0b20c3d0..e0b5fe5a 100644 --- a/nodejs-project/nodejs-project/src/models/maps_model.js +++ b/nodejs-project/nodejs-project/src/models/maps_model.js @@ -13,7 +13,7 @@ const normalizeTags = (raw) => { const ALLOWED_MAP_TYPES = new Set(["OPEN", "CLOSED", "SINGLE"]); -module.exports = ({ cooler }) => { +module.exports = ({ cooler, tribeCrypto, tribesModel }) => { let ssb; const openSsb = async () => { @@ -21,6 +21,12 @@ module.exports = ({ cooler }) => { return ssb; }; + const tribeHelpers = tribeCrypto ? tribeCrypto.createHelpers(tribesModel) : null; + const encryptIfTribe = tribeHelpers ? tribeHelpers.encryptIfTribe : async (c) => c; + const decryptIfTribe = tribeHelpers ? tribeHelpers.decryptIfTribe : async (c) => c; + const assertReadable = tribeHelpers ? tribeHelpers.assertReadable : () => {}; + const decryptIndexNodes = tribeHelpers ? tribeHelpers.decryptIndexNodes : async () => {}; + const getAllMessages = async (ssbClient) => new Promise((resolve, reject) => { pull( @@ -30,8 +36,8 @@ module.exports = ({ cooler }) => { }); const getMsg = async (ssbClient, key) => - new Promise((resolve, reject) => { - ssbClient.get(key, (err, msg) => (err ? reject(err) : resolve(msg))); + new Promise((resolve) => { + ssbClient.get(key, (err, msg) => (err ? resolve(null) : resolve(msg))); }); const buildIndex = (messages) => { @@ -40,6 +46,9 @@ module.exports = ({ cooler }) => { const parent = new Map(); const child = new Map(); const markers = new Map(); + const rawMarkers = new Map(); + const authorByKey = new Map(); + const tombRequests = []; for (const m of messages) { const k = m.key; @@ -48,22 +57,20 @@ module.exports = ({ cooler }) => { if (!c) continue; if (c.type === "tombstone" && c.target) { - tomb.add(c.target); + tombRequests.push({ target: c.target, author: v.author }); continue; } if (c.type === "mapMarker") { const mapId = c.mapId; if (mapId) { - if (!markers.has(mapId)) markers.set(mapId, []); - markers.get(mapId).push({ + authorByKey.set(k, v.author); + if (!rawMarkers.has(mapId)) rawMarkers.set(mapId, []); + rawMarkers.get(mapId).push({ key: k, - lat: parseFloat(c.lat) || 0, - lng: parseFloat(c.lng) || 0, - label: c.label || "", - image: c.image || "", - author: v.author || c.author, - createdAt: c.createdAt || new Date(v.timestamp || m.timestamp || 0).toISOString() + ts: v.timestamp || m.timestamp || 0, + c, + envAuthor: v.author }); } continue; @@ -73,6 +80,7 @@ module.exports = ({ cooler }) => { const ts = v.timestamp || m.timestamp || 0; nodes.set(k, { key: k, ts, c }); + authorByKey.set(k, v.author); if (c.replaces) { parent.set(k, c.replaces); @@ -92,6 +100,11 @@ module.exports = ({ cooler }) => { return cur; }; + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target); + if (targetAuthor && t.author === targetAuthor) tomb.add(t.target); + } + const roots = new Set(); for (const id of nodes.keys()) roots.add(rootOf(id)); @@ -101,24 +114,51 @@ module.exports = ({ cooler }) => { const forward = new Map(); for (const [newId, oldId] of parent.entries()) forward.set(oldId, newId); - return { tomb, nodes, parent, child, rootOf, tipOf, tipByRoot, forward, markers }; + return { tomb, nodes, parent, child, rootOf, tipOf, tipByRoot, forward, markers, rawMarkers }; }; + const expandMarkers = async (idx) => { + for (const [mapId, raws] of idx.rawMarkers.entries()) { + const list = []; + for (const r of raws) { + let c = r.c; + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const dec = await tribeCrypto.decryptFromTribe(c, tribesModel); + if (dec && !dec._undecryptable) c = dec; + } + list.push({ + key: r.key, + lat: parseFloat(c.lat) || 0, + lng: parseFloat(c.lng) || 0, + label: c.label || "", + image: c.image || "", + author: c.author || r.envAuthor, + encrypted: !!(r.c.encryptedPayload && (!c || c._undecryptable)), + createdAt: c.createdAt || new Date(r.ts).toISOString() + }); + } + idx.markers.set(mapId, list); + } + }; + + const buildMap = (node, rootId, viewerId, markerList = []) => { const c = node.c || {}; + const undec = c.encryptedPayload && c._decrypted === false; return { key: node.key, rootId, - title: c.title || "", + title: undec ? "" : (c.title || ""), lat: parseFloat(c.lat) || 0, lng: parseFloat(c.lng) || 0, - description: c.description || "", - markerLabel: c.markerLabel || "", - image: c.image || "", + description: undec ? "" : (c.description || ""), + markerLabel: undec ? "" : (c.markerLabel || ""), + image: undec ? "" : (c.image || ""), mapType: ALLOWED_MAP_TYPES.has(c.mapType) ? c.mapType : "SINGLE", tags: safeArr(c.tags), author: c.author, tribeId: c.tribeId || null, + encrypted: !!undec, createdAt: c.createdAt || new Date(node.ts).toISOString(), updatedAt: c.updatedAt || null, markers: markerList.filter((mk) => !mk.tombstoned) @@ -159,7 +199,7 @@ module.exports = ({ cooler }) => { const now = new Date().toISOString(); const mType = ALLOWED_MAP_TYPES.has(mapType) ? mapType : "SINGLE"; - const content = { + let content = { type: "map", title: title || "", lat: parseFloat(lat) || 0, @@ -175,6 +215,8 @@ module.exports = ({ cooler }) => { updatedAt: now }; + content = await encryptIfTribe(content); + return new Promise((resolve, reject) => { ssbClient.publish(content, (err, res) => (err ? reject(err) : resolve(res))); }); @@ -187,32 +229,39 @@ module.exports = ({ cooler }) => { const oldMsg = await getMsg(ssbClient, tipId); if (!oldMsg || oldMsg.content?.type !== "map") throw new Error("Map not found"); - if (oldMsg.content.author !== userId) throw new Error("Not the author"); + const oldDecrypted = await decryptIfTribe(oldMsg.content); + assertReadable(oldDecrypted, "Map"); + if ((oldDecrypted.author || oldMsg.content.author) !== userId) throw new Error("Not the author"); - const tags = tagsRaw !== undefined ? normalizeTags(tagsRaw) || [] : safeArr(oldMsg.content.tags); + const tags = tagsRaw !== undefined ? normalizeTags(tagsRaw) || [] : safeArr(oldDecrypted.tags); const now = new Date().toISOString(); - const mType = mapType && ALLOWED_MAP_TYPES.has(mapType) ? mapType : oldMsg.content.mapType; + const mType = mapType && ALLOWED_MAP_TYPES.has(mapType) ? mapType : oldDecrypted.mapType; - const updated = { - ...oldMsg.content, + let updated = { + type: "map", replaces: tipId, - title: title !== undefined ? title || "" : oldMsg.content.title || "", - lat: lat !== undefined ? parseFloat(lat) || 0 : oldMsg.content.lat, - lng: lng !== undefined ? parseFloat(lng) || 0 : oldMsg.content.lng, - description: description !== undefined ? description || "" : oldMsg.content.description || "", + title: title !== undefined ? title || "" : oldDecrypted.title || "", + lat: lat !== undefined ? parseFloat(lat) || 0 : oldDecrypted.lat, + lng: lng !== undefined ? parseFloat(lng) || 0 : oldDecrypted.lng, + description: description !== undefined ? description || "" : oldDecrypted.description || "", + markerLabel: oldDecrypted.markerLabel || "", mapType: mType, tags, - ...(image ? { image } : {}), - createdAt: oldMsg.content.createdAt, + author: oldDecrypted.author || userId, + ...(oldMsg.content.tribeId ? { tribeId: oldMsg.content.tribeId } : {}), + ...(image ? { image } : (oldDecrypted.image ? { image: oldDecrypted.image } : {})), + createdAt: oldDecrypted.createdAt, updatedAt: now }; + updated = await encryptIfTribe(updated); + + const result = await new Promise((resolve, reject) => { + ssbClient.publish(updated, (err, res) => (err ? reject(err) : resolve(res))); + }); const tombstone = { type: "tombstone", target: tipId, deletedAt: now, author: userId }; await new Promise((res, rej) => ssbClient.publish(tombstone, (e) => (e ? rej(e) : res()))); - - return new Promise((resolve, reject) => { - ssbClient.publish(updated, (err, result) => (err ? reject(err) : resolve(result))); - }); + return result; }, async deleteMapById(id) { @@ -222,7 +271,8 @@ module.exports = ({ cooler }) => { const msg = await getMsg(ssbClient, tipId); if (!msg || msg.content?.type !== "map") throw new Error("Map not found"); - if (msg.content.author !== userId) throw new Error("Not the author"); + const decrypted = await decryptIfTribe(msg.content); + if ((decrypted.author || msg.content.author) !== userId) throw new Error("Not the author"); const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId }; @@ -245,22 +295,28 @@ module.exports = ({ cooler }) => { const node = idx.nodes.get(tipId); if (!node) throw new Error("Map not found"); - const mapType = node.c.mapType || "SINGLE"; + const mapDecrypted = await decryptIfTribe(node.c); + assertReadable(mapDecrypted, "Map"); + const mapType = mapDecrypted.mapType || node.c.mapType || "SINGLE"; + const mapAuthor = mapDecrypted.author || node.c.author; if (mapType === "SINGLE") throw new Error("Map does not allow markers"); - if (mapType === "CLOSED" && node.c.author !== userId) throw new Error("Only the map creator can add markers"); + if (mapType === "CLOSED" && mapAuthor !== userId) throw new Error("Only the map creator can add markers"); const now = new Date().toISOString(); - const content = { + let content = { type: "mapMarker", mapId: tipId, lat: parseFloat(lat) || 0, lng: parseFloat(lng) || 0, label: label || "", author: userId, - createdAt: now + createdAt: now, + ...(node.c.tribeId ? { tribeId: node.c.tribeId } : {}) }; if (image) content.image = image; + content = await encryptIfTribe(content); + return new Promise((resolve, reject) => { ssbClient.publish(content, (err, res) => (err ? reject(err) : resolve(res))); }); @@ -276,6 +332,8 @@ module.exports = ({ cooler }) => { const messages = await getAllMessages(ssbClient); const idx = buildIndex(messages); + await decryptIndexNodes(idx); + await expandMarkers(idx); const items = []; for (const [rootId, tipId] of idx.tipByRoot.entries()) { @@ -312,6 +370,8 @@ module.exports = ({ cooler }) => { const messages = await getAllMessages(ssbClient); const idx = buildIndex(messages); + await decryptIndexNodes(idx); + await expandMarkers(idx); let tip = id; while (idx.forward.has(tip)) tip = idx.forward.get(tip); @@ -324,8 +384,13 @@ module.exports = ({ cooler }) => { if (!node) { const msg = await getMsg(ssbClient, tip); if (!msg || msg.content?.type !== "map") throw new Error("Map not found"); + let c = msg.content; + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const dec = await tribeCrypto.decryptFromTribe(c, tribesModel); + c = dec && !dec._undecryptable ? { ...dec, _decrypted: true } : { ...c, _decrypted: false }; + } const markerList = safeArr(idx.markers.get(tip)).concat(safeArr(idx.markers.get(root))); - return buildMap({ key: tip, ts: msg.timestamp || 0, c: msg.content }, root, viewer, markerList); + return buildMap({ key: tip, ts: msg.timestamp || 0, c }, root, viewer, markerList); } const markerList = safeArr(idx.markers.get(tip)).concat(safeArr(idx.markers.get(root))); diff --git a/nodejs-project/nodejs-project/src/models/pads_model.js b/nodejs-project/nodejs-project/src/models/pads_model.js index 3a6c180c..3219ec38 100644 --- a/nodejs-project/nodejs-project/src/models/pads_model.js +++ b/nodejs-project/nodejs-project/src/models/pads_model.js @@ -106,19 +106,27 @@ module.exports = ({ cooler, cipherModel, tribeCrypto, tribesModel }) => { const nodes = new Map() const parent = new Map() const child = new Map() + const authorByKey = new Map() + const tombRequests = [] for (const m of messages) { const k = m.key const v = m.value || {} const c = v.content if (!c) continue - if (c.type === "tombstone" && c.target) { tomb.add(c.target); continue } + if (c.type === "tombstone" && c.target) { tombRequests.push({ target: c.target, author: v.author }); continue } if (c.type === "pad") { nodes.set(k, { key: k, ts: v.timestamp || m.timestamp || 0, c, author: v.author }) + authorByKey.set(k, v.author) if (c.replaces) { parent.set(k, c.replaces); child.set(c.replaces, k) } } } + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target) + if (targetAuthor && t.author === targetAuthor) tomb.add(t.target) + } + const rootOf = (id) => { let cur = id; while (parent.has(cur)) cur = parent.get(cur); return cur } const tipOf = (id) => { let cur = id; while (child.has(cur)) cur = child.get(cur); return cur } diff --git a/nodejs-project/nodejs-project/src/models/parliament_model.js b/nodejs-project/nodejs-project/src/models/parliament_model.js index ce24cc3b..8745587e 100644 --- a/nodejs-project/nodejs-project/src/models/parliament_model.js +++ b/nodejs-project/nodejs-project/src/models/parliament_model.js @@ -444,7 +444,10 @@ module.exports = ({ cooler, services = {} }) => { const isTribe = term.powerType === 'tribe'; let members = 1; if (isTribe && term.powerId) { - const tribe = services.tribes ? await services.tribes.getTribeById(term.powerId) : null; + let tribe = null; + if (services.tribes) { + try { tribe = await services.tribes.getTribeById(term.powerId); } catch {} + } members = tribe && Array.isArray(tribe.members) ? tribe.members.length : 0; } const pol = await summarizePoliciesForTerm({ ...term }); @@ -1067,7 +1070,7 @@ module.exports = ({ cooler, services = {} }) => { if (latestAny && !isExpiredTerm(latestAny)) return latestAny; if (latestAny && isExpiredTerm(latestAny)) { - try { await enactApprovedChanges(latestAny); } catch {} + try { await enactApprovedChanges(latestAny); } catch (e) { console.error('enactApprovedChanges failed:', e); } } const open = await listCandidaturesOpen(); @@ -1183,7 +1186,10 @@ module.exports = ({ cooler, services = {} }) => { if (String(term.method || '').toUpperCase() === 'ANARCHY') return true; if (term.powerType === 'inhabitant') return term.powerId === userId; if (term.powerType === 'tribe') { - const tribe = services.tribes ? await services.tribes.getTribeById(term.powerId) : null; + let tribe = null; + if (services.tribes) { + try { tribe = await services.tribes.getTribeById(term.powerId); } catch {} + } const members = ensureArray(tribe?.members); return members.includes(userId); } @@ -1201,6 +1207,13 @@ module.exports = ({ cooler, services = {} }) => { }; const tribeListByType = async (type, tribeId) => { + let chainIds; + try { + chainIds = services.tribes && services.tribes.getChainIds + ? await services.tribes.getChainIds(tribeId) + : [tribeId]; + } catch (_) { chainIds = [tribeId]; } + const tribeIdSet = new Set(Array.isArray(chainIds) && chainIds.length ? chainIds : [tribeId]); const msgs = await tribeReadLog(); const tomb = new Set(); const replaced = new Set(); @@ -1209,7 +1222,7 @@ module.exports = ({ cooler, services = {} }) => { const c = m.value?.content; if (!c) continue; if (c.type === 'tombstone' && c.target) { tomb.add(c.target); continue; } if (c.type !== type) continue; - if (c.tribeId !== tribeId) continue; + if (!tribeIdSet.has(c.tribeId)) continue; if (c.replaces) replaced.add(c.replaces); items.set(m.key, { ...c, id: m.key, _ts: m.value?.timestamp || 0 }); } @@ -1226,6 +1239,77 @@ module.exports = ({ cooler, services = {} }) => { return terms[0] || null; }; + const tribeElectionInFlight = new Map(); + + async function tribePublishInitialTerm(tribeId) { + if (!tribeId) throw new Error('Missing tribeId'); + await openSsb(); + const existing = await tribeListByType('tribeParliamentTerm', tribeId); + if (existing.length > 0) return existing[0]; + const startAt = moment().toISOString(); + const endAt = moment(startAt).add(TERM_DAYS, 'days').toISOString(); + const term = { + type: 'tribeParliamentTerm', + tribeId, + method: 'ANARCHY', + leaderId: null, + winnerVotes: 0, + totalVotes: 0, + startAt, + endAt, + createdBy: userId, + createdAt: nowISO() + }; + return await publishMsg(term); + } + + async function tribeResolveElectionImpl(tribeId) { + const latest = await tribeGetCurrentTerm(tribeId); + if (latest && !isExpiredTerm(latest)) return latest; + const opens = (await tribeListCandidatures(tribeId)).filter(c => (c.status || 'OPEN') === 'OPEN'); + let chosen = null, totalVotes = 0, winnerVotes = 0; + if (opens.length) { + opens.sort((a, b) => Number(b.votes || 0) - Number(a.votes || 0) || new Date(a.createdAt) - new Date(b.createdAt)); + chosen = opens[0]; + totalVotes = opens.reduce((s, c) => s + Number(c.votes || 0), 0); + winnerVotes = Number(chosen.votes || 0); + if (winnerVotes <= 0) chosen = null; + } + const startAt = moment().toISOString(); + const endAt = moment(startAt).add(TERM_DAYS, 'days').toISOString(); + const term = { + type: 'tribeParliamentTerm', + tribeId, + method: chosen ? String(chosen.method || 'DEMOCRACY').toUpperCase() : 'ANARCHY', + leaderId: chosen ? chosen.candidateId : null, + winnerVotes, + totalVotes, + startAt, + endAt, + createdBy: userId, + createdAt: nowISO() + }; + const res = await publishMsg(term); + for (const c of opens) { + try { await publishMsg({ type: 'tombstone', target: c.id, deletedAt: nowISO(), author: userId }); } catch {} + } + return res; + } + + async function tribeResolveElection(tribeId) { + if (tribeElectionInFlight.has(tribeId)) return tribeElectionInFlight.get(tribeId); + const p = tribeResolveElectionImpl(tribeId).catch(e => { console.error('tribeResolveElection failed:', e); return null; }).finally(() => tribeElectionInFlight.delete(tribeId)); + tribeElectionInFlight.set(tribeId, p); + return p; + } + + async function tribeEnsureTerm(tribeId) { + const cur = await tribeGetCurrentTerm(tribeId); + if (cur && !isExpiredTerm(cur)) return cur; + if (!cur) return await tribePublishInitialTerm(tribeId); + return await tribeResolveElection(tribeId); + } + const tribeListCandidatures = (tribeId) => tribeListByType('tribeParliamentCandidature', tribeId); const tribeListRules = (tribeId) => tribeListByType('tribeParliamentRule', tribeId); @@ -1285,11 +1369,18 @@ module.exports = ({ cooler, services = {} }) => { }; const tribeHasCandidatureInGlobalCycle = async (tribeId, globalTermStart) => { + let chainIds; + try { + chainIds = services.tribes && services.tribes.getChainIds + ? await services.tribes.getChainIds(tribeId) + : [tribeId]; + } catch (_) { chainIds = [tribeId]; } + const tribeIdSet = new Set(Array.isArray(chainIds) && chainIds.length ? chainIds : [tribeId]); const msgs = await tribeReadLog(); const cutoff = globalTermStart ? new Date(globalTermStart) : new Date(Date.now() - TERM_DAYS * 86400000); return msgs.some(m => { const c = m.value?.content; if (!c) return false; - return c.type === 'parliamentCandidature' && c.targetType === 'tribe' && c.targetId === tribeId && (c.status || 'OPEN') === 'OPEN' && new Date(c.createdAt) >= cutoff; + return c.type === 'parliamentCandidature' && c.targetType === 'tribe' && tribeIdSet.has(c.targetId) && (c.status || 'OPEN') === 'OPEN' && new Date(c.createdAt) >= cutoff; }); }; @@ -1326,7 +1417,10 @@ module.exports = ({ cooler, services = {} }) => { voteTribeCandidature: tribeVoteCandidature, publishTribeRule: tribePublishRule, deleteTribeRule: tribeDeleteRule, - hasCandidatureInGlobalCycle: tribeHasCandidatureInGlobalCycle + hasCandidatureInGlobalCycle: tribeHasCandidatureInGlobalCycle, + publishInitialTerm: tribePublishInitialTerm, + resolveElection: tribeResolveElection, + ensureTerm: tribeEnsureTerm } }; }; diff --git a/nodejs-project/nodejs-project/src/models/torrents_model.js b/nodejs-project/nodejs-project/src/models/torrents_model.js index 8b28720c..13d4035e 100644 --- a/nodejs-project/nodejs-project/src/models/torrents_model.js +++ b/nodejs-project/nodejs-project/src/models/torrents_model.js @@ -23,7 +23,7 @@ const parseBlobId = (blobMarkdown) => { const voteSum = (opinions = {}) => Object.values(opinions || {}).reduce((s, n) => s + (Number(n) || 0), 0); -module.exports = ({ cooler }) => { +module.exports = ({ cooler, tribeCrypto, tribesModel }) => { let ssb; const openSsb = async () => { @@ -31,14 +31,20 @@ module.exports = ({ cooler }) => { return ssb; }; + const tribeHelpers = tribeCrypto ? tribeCrypto.createHelpers(tribesModel) : null; + const encryptIfTribe = tribeHelpers ? tribeHelpers.encryptIfTribe : async (c) => c; + const decryptIfTribe = tribeHelpers ? tribeHelpers.decryptIfTribe : async (c) => c; + const assertReadable = tribeHelpers ? tribeHelpers.assertReadable : () => {}; + const decryptIndexNodes = tribeHelpers ? tribeHelpers.decryptIndexNodes : async () => {}; + const getAllMessages = async (ssbClient) => new Promise((resolve, reject) => { pull(ssbClient.createLogStream({ limit: logLimit }), pull.collect((err, msgs) => (err ? reject(err) : resolve(msgs)))); }); const getMsg = async (ssbClient, key) => - new Promise((resolve, reject) => { - ssbClient.get(key, (err, msg) => (err ? reject(err) : resolve(msg))); + new Promise((resolve) => { + ssbClient.get(key, (err, msg) => (err ? resolve(null) : resolve(msg))); }); const buildIndex = (messages) => { @@ -46,6 +52,8 @@ module.exports = ({ cooler }) => { const nodes = new Map(); const parent = new Map(); const child = new Map(); + const authorByKey = new Map(); + const tombRequests = []; for (const m of messages) { const k = m.key; @@ -54,7 +62,7 @@ module.exports = ({ cooler }) => { if (!c) continue; if (c.type === "tombstone" && c.target) { - tomb.add(c.target); + tombRequests.push({ target: c.target, author: v.author }); continue; } @@ -62,6 +70,7 @@ module.exports = ({ cooler }) => { const ts = v.timestamp || m.timestamp || 0; nodes.set(k, { key: k, ts, c }); + authorByKey.set(k, v.author); if (c.replaces) { parent.set(k, c.replaces); @@ -81,6 +90,11 @@ module.exports = ({ cooler }) => { return cur; }; + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target); + if (targetAuthor && t.author === targetAuthor) tomb.add(t.target); + } + const roots = new Set(); for (const id of nodes.keys()) roots.add(rootOf(id)); @@ -95,24 +109,28 @@ module.exports = ({ cooler }) => { const buildTorrent = (node, rootId, viewerId) => { const c = node.c || {}; + const undec = c.encryptedPayload && c._decrypted === false; const voters = safeArr(c.opinions_inhabitants); return { key: node.key, rootId, - url: c.url, + url: undec ? "" : c.url, createdAt: c.createdAt || new Date(node.ts).toISOString(), updatedAt: c.updatedAt || null, tags: safeArr(c.tags), author: c.author, - title: c.title || "", - description: c.description || "", + title: undec ? "" : (c.title || ""), + description: undec ? "" : (c.description || ""), size: c.size || 0, opinions: c.opinions || {}, opinions_inhabitants: voters, - hasVoted: viewerId ? voters.includes(viewerId) : false + hasVoted: viewerId ? voters.includes(viewerId) : false, + tribeId: c.tribeId || null, + encrypted: !!undec }; }; + return { type: "torrent", @@ -141,13 +159,13 @@ module.exports = ({ cooler }) => { return root; }, - async createTorrent(blobMarkdown, tagsRaw, title, description, size) { + async createTorrent(blobMarkdown, tagsRaw, title, description, size, tribeId) { const ssbClient = await openSsb(); const blobId = parseBlobId(blobMarkdown); const tags = normalizeTags(tagsRaw) || []; const now = new Date().toISOString(); - const content = { + let content = { type: "torrent", url: blobId, createdAt: now, @@ -158,9 +176,12 @@ module.exports = ({ cooler }) => { description: description || "", size: Number(size) || 0, opinions: {}, - opinions_inhabitants: [] + opinions_inhabitants: [], + ...(tribeId ? { tribeId } : {}) }; + content = await encryptIfTribe(content); + return new Promise((resolve, reject) => { ssbClient.publish(content, (err, res) => (err ? reject(err) : resolve(res))); }); @@ -173,30 +194,39 @@ module.exports = ({ cooler }) => { const oldMsg = await getMsg(ssbClient, tipId); if (!oldMsg || oldMsg.content?.type !== "torrent") throw new Error("Torrent not found"); - if (Object.keys(oldMsg.content.opinions || {}).length > 0) throw new Error("Cannot edit torrent after it has received opinions."); - if (oldMsg.content.author !== userId) throw new Error("Not the author"); + const oldDec = await decryptIfTribe(oldMsg.content); + assertReadable(oldDec, "Torrent"); + if (Object.keys(oldDec.opinions || oldMsg.content.opinions || {}).length > 0) throw new Error("Cannot edit torrent after it has received opinions."); + if ((oldDec.author || oldMsg.content.author) !== userId) throw new Error("Not the author"); - const tags = tagsRaw !== undefined ? normalizeTags(tagsRaw) || [] : safeArr(oldMsg.content.tags); + const tags = tagsRaw !== undefined ? normalizeTags(tagsRaw) || [] : safeArr(oldDec.tags); const blobId = blobMarkdown ? parseBlobId(blobMarkdown) : null; const now = new Date().toISOString(); - const updated = { - ...oldMsg.content, + let updated = { + type: "torrent", replaces: tipId, - url: blobId || oldMsg.content.url, + url: blobId || oldDec.url, tags, - title: title !== undefined ? title || "" : oldMsg.content.title || "", - description: description !== undefined ? description || "" : oldMsg.content.description || "", - createdAt: oldMsg.content.createdAt, + title: title !== undefined ? title || "" : oldDec.title || "", + description: description !== undefined ? description || "" : oldDec.description || "", + size: oldDec.size || 0, + opinions: oldDec.opinions || {}, + opinions_inhabitants: oldDec.opinions_inhabitants || [], + author: oldDec.author || userId, + ...(oldMsg.content.tribeId ? { tribeId: oldMsg.content.tribeId } : {}), + createdAt: oldDec.createdAt, updatedAt: now }; + updated = await encryptIfTribe(updated); + + const result = await new Promise((resolve, reject) => { + ssbClient.publish(updated, (err, res) => (err ? reject(err) : resolve(res))); + }); const tombstone = { type: "tombstone", target: tipId, deletedAt: now, author: userId }; await new Promise((res, rej) => ssbClient.publish(tombstone, (e) => (e ? rej(e) : res()))); - - return new Promise((resolve, reject) => { - ssbClient.publish(updated, (err, result) => (err ? reject(err) : resolve(result))); - }); + return result; }, async deleteTorrentById(id) { @@ -206,7 +236,8 @@ module.exports = ({ cooler }) => { const msg = await getMsg(ssbClient, tipId); if (!msg || msg.content?.type !== "torrent") throw new Error("Torrent not found"); - if (msg.content.author !== userId) throw new Error("Not the author"); + const dec = await decryptIfTribe(msg.content); + if ((dec.author || msg.content.author) !== userId) throw new Error("Not the author"); const tombstone = { type: "tombstone", target: tipId, deletedAt: new Date().toISOString(), author: userId }; @@ -226,6 +257,7 @@ module.exports = ({ cooler }) => { const messages = await getAllMessages(ssbClient); const idx = buildIndex(messages); + await decryptIndexNodes(idx); const items = []; for (const [rootId, tipId] of idx.tipByRoot.entries()) { @@ -270,6 +302,7 @@ module.exports = ({ cooler }) => { const viewer = viewerId || ssbClient.id; const messages = await getAllMessages(ssbClient); const idx = buildIndex(messages); + await decryptIndexNodes(idx); let tip = id; while (idx.forward.has(tip)) tip = idx.forward.get(tip); @@ -283,7 +316,12 @@ module.exports = ({ cooler }) => { const msg = await getMsg(ssbClient, tip); if (!msg || msg.content?.type !== "torrent") throw new Error("Torrent not found"); - return buildTorrent({ key: tip, ts: msg.timestamp || 0, c: msg.content }, root, viewer); + let c = msg.content; + if (c.encryptedPayload && tribeCrypto && tribesModel) { + const dec = await tribeCrypto.decryptFromTribe(c, tribesModel); + c = dec && !dec._undecryptable ? { ...dec, _decrypted: true } : { ...c, _decrypted: false }; + } + return buildTorrent({ key: tip, ts: msg.timestamp || 0, c }, root, viewer); }, async createOpinion(id, category) { @@ -297,27 +335,39 @@ module.exports = ({ cooler }) => { if (!msg || msg.content?.type !== "torrent") throw new Error("Torrent not found"); - const voters = safeArr(msg.content.opinions_inhabitants); + const oldDec = await decryptIfTribe(msg.content); + assertReadable(oldDec, "Torrent"); + const voters = safeArr(oldDec.opinions_inhabitants || msg.content.opinions_inhabitants); if (voters.includes(userId)) throw new Error("Already voted"); const now = new Date().toISOString(); - const updated = { - ...msg.content, + let updated = { + type: "torrent", replaces: tipId, + url: oldDec.url, + tags: oldDec.tags || [], + title: oldDec.title || "", + description: oldDec.description || "", + size: oldDec.size || 0, opinions: { - ...msg.content.opinions, - [category]: (msg.content.opinions?.[category] || 0) + 1 + ...(oldDec.opinions || {}), + [category]: ((oldDec.opinions || {})[category] || 0) + 1 }, opinions_inhabitants: voters.concat(userId), + author: oldDec.author, + ...(msg.content.tribeId ? { tribeId: msg.content.tribeId } : {}), + createdAt: oldDec.createdAt, updatedAt: now }; + updated = await encryptIfTribe(updated); + + const result = await new Promise((resolve, reject) => { + ssbClient.publish(updated, (err, res) => (err ? reject(err) : resolve(res))); + }); const tombstone = { type: "tombstone", target: tipId, deletedAt: now, author: userId }; await new Promise((res, rej) => ssbClient.publish(tombstone, (e) => (e ? rej(e) : res()))); - - return new Promise((resolve, reject) => { - ssbClient.publish(updated, (err, result) => (err ? reject(err) : resolve(result))); - }); + return result; } }; }; diff --git a/nodejs-project/nodejs-project/src/models/tribe_crypto.js b/nodejs-project/nodejs-project/src/models/tribe_crypto.js index 25076674..99e5db3a 100644 --- a/nodejs-project/nodejs-project/src/models/tribe_crypto.js +++ b/nodejs-project/nodejs-project/src/models/tribe_crypto.js @@ -6,9 +6,16 @@ const SENSITIVE_FIELDS = [ 'title', 'description', 'location', 'price', 'salary', 'options', 'votes', 'category', 'tags', 'image', 'url', 'attendees', 'assignees', 'deadline', 'goal', 'funded', 'refeeds', 'refeeds_inhabitants', 'opinions', - 'opinions_inhabitants', 'parentId', 'status', 'priority', 'date', 'mediaType' + 'opinions_inhabitants', 'status', 'priority', 'date', 'mediaType' ]; +const ENVELOPE_PRESERVE = new Set([ + 'type', 'tribeId', 'contentType', 'replaces', 'target', 'author', + 'createdAt', 'updatedAt', 'encryptedPayload', + 'mapId', 'calendarId', 'dateId', 'padId', 'roomId', 'parentId', + '_decrypted', '_undecryptable' +]); + const INVITE_SALT = 'SolarNET.HuB'; module.exports = (configPath) => { @@ -26,7 +33,9 @@ module.exports = (configPath) => { }; const saveKeyring = () => { - fs.writeFileSync(keyringPath, JSON.stringify(keyring, null, 2), 'utf8'); + const tmp = keyringPath + '.tmp.' + process.pid + '.' + Date.now(); + fs.writeFileSync(tmp, JSON.stringify(keyring, null, 2), 'utf8'); + fs.renameSync(tmp, keyringPath); }; const generateTribeKey = () => crypto.randomBytes(32).toString('hex'); @@ -89,6 +98,23 @@ module.exports = (configPath) => { return decryptWithKey(encryptedKey, derived.toString('hex')); }; + const encryptChainForInvite = (ancestryRootIds, inviteCode) => { + const chain = ancestryRootIds.map(rootId => ({ rootId, key: getKey(rootId), gen: getGen(rootId) })); + if (chain.some(e => !e.key)) return null; + const derived = crypto.scryptSync(inviteCode, INVITE_SALT, 32); + return encryptWithKey(JSON.stringify(chain), derived.toString('hex')); + }; + + const decryptChainFromInvite = (encryptedPayload, inviteCode) => { + const derived = crypto.scryptSync(inviteCode, INVITE_SALT, 32); + try { + const json = decryptWithKey(encryptedPayload, derived.toString('hex')); + const parsed = JSON.parse(json); + if (Array.isArray(parsed) && parsed.every(e => e && e.rootId && e.key)) return parsed; + } catch (_) {} + return null; + }; + const encryptChain = (plaintext, keyChain) => { let data = plaintext; for (const keyHex of keyChain) { @@ -106,18 +132,25 @@ module.exports = (configPath) => { return data; }; - const encryptContent = (content, keyChain) => { + const encryptContent = (content, keyChain, customFields) => { const payload = {}; - for (const field of SENSITIVE_FIELDS) { - if (content[field] !== undefined) { - payload[field] = content[field]; + if (customFields) { + for (const [k, v] of Object.entries(content)) { + if (ENVELOPE_PRESERVE.has(k)) continue; + payload[k] = v; + } + } else { + for (const field of SENSITIVE_FIELDS) { + if (content[field] !== undefined) payload[field] = content[field]; } } const plaintext = JSON.stringify(payload); const encryptedPayload = encryptChain(plaintext, keyChain); const result = {}; for (const [k, v] of Object.entries(content)) { - if (!SENSITIVE_FIELDS.includes(k)) result[k] = v; + if (customFields ? ENVELOPE_PRESERVE.has(k) : !SENSITIVE_FIELDS.includes(k)) { + result[k] = v; + } } result.encryptedPayload = encryptedPayload; return result; @@ -137,7 +170,7 @@ module.exports = (configPath) => { continue; } } - return { ...content, encrypted: true }; + return { ...content, _undecryptable: true }; }; const boxKeyForMember = (tribeKeyHex, memberFeedId, ssbKeys) => { @@ -165,17 +198,85 @@ module.exports = (configPath) => { return sets; }; + const resolveKeyChain = async (tribeId, tribesModel) => { + if (!tribeId || !tribesModel) return null; + let ancestryIds; + try { ancestryIds = await tribesModel.getAncestryChain(tribeId); } catch (_) { return null; } + if (!Array.isArray(ancestryIds) || !ancestryIds.length) return null; + const chain = []; + for (const rootId of ancestryIds) { + const key = getKey(rootId); + if (!key) return null; + chain.push(key); + } + return chain.length ? chain : null; + }; + + const resolveKeyChainSets = async (tribeId, tribesModel) => { + if (!tribeId || !tribesModel) return null; + let ancestryIds; + try { ancestryIds = await tribesModel.getAncestryChain(tribeId); } catch (_) { return null; } + if (!Array.isArray(ancestryIds) || !ancestryIds.length) return null; + return buildKeyChainSets(ancestryIds); + }; + + const encryptForTribe = async (content, tribeId, tribesModel) => { + const chain = await resolveKeyChain(tribeId, tribesModel); + if (!chain) throw new Error('Missing tribe key chain — cannot encrypt content for this tribe'); + return encryptContent(content, chain, true); + }; + + const decryptFromTribe = async (content, tribesModel) => { + if (!content || !content.encryptedPayload) return content; + const tid = content.tribeId; + if (!tid) return content; + const sets = await resolveKeyChainSets(tid, tribesModel); + if (!sets || !sets.length) return { ...content, _undecryptable: true }; + return decryptContent(content, sets); + }; + + const createHelpers = (tribesModel) => ({ + async encryptIfTribe(content) { + if (!content.tribeId || !tribesModel) return content; + return await encryptForTribe(content, content.tribeId, tribesModel); + }, + async decryptIfTribe(content) { + if (!content || !content.encryptedPayload || !tribesModel) return content; + return await decryptFromTribe(content, tribesModel); + }, + assertReadable(decrypted, what) { + if (decrypted && decrypted._undecryptable) throw new Error(`${what} is tribe-encrypted and cannot be decrypted with available keys`); + }, + async decryptIndexNodes(idx) { + if (!tribesModel) return; + for (const [k, n] of idx.nodes.entries()) { + if (!n.c || !n.c.encryptedPayload) continue; + const dec = await decryptFromTribe(n.c, tribesModel); + if (dec && !dec._undecryptable) { + idx.nodes.set(k, { ...n, c: { ...dec, _decrypted: true } }); + } else { + idx.nodes.set(k, { ...n, c: { ...n.c, _decrypted: false } }); + } + } + } + }); + loadKeyring(); return { SENSITIVE_FIELDS, + ENVELOPE_PRESERVE, loadKeyring, saveKeyring, generateTribeKey, getKey, getKeys, getGen, setKey, addNewKey, encryptWithKey, decryptWithKey, encryptForInvite, decryptFromInvite, + encryptChainForInvite, decryptChainFromInvite, encryptChain, decryptChain, encryptContent, decryptContent, boxKeyForMember, unboxKeyFromMember, buildKeyChainSets, + resolveKeyChain, resolveKeyChainSets, + encryptForTribe, decryptFromTribe, + createHelpers, }; }; diff --git a/nodejs-project/nodejs-project/src/models/tribes_content_model.js b/nodejs-project/nodejs-project/src/models/tribes_content_model.js index dad2d876..fb96e0c4 100644 --- a/nodejs-project/nodejs-project/src/models/tribes_content_model.js +++ b/nodejs-project/nodejs-project/src/models/tribes_content_model.js @@ -7,12 +7,18 @@ const categories = require('../backend/opinion_categories'); const VALID_STATUSES = ['OPEN', 'CLOSED', 'IN-PROGRESS']; const VALID_PRIORITIES = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL']; -module.exports = ({ cooler }) => { +module.exports = ({ cooler, tribeCrypto, tribesModel }) => { let ssb; const openSsb = async () => { if (!ssb) ssb = await cooler.open(); return ssb; }; const TYPE = 'tribe-content'; + const resolveKeyChain = async (tribeId) => + (tribeCrypto && tribesModel) ? tribeCrypto.resolveKeyChain(tribeId, tribesModel) : null; + + const resolveKeyChainSets = async (tribeId) => + (tribeCrypto && tribesModel) ? tribeCrypto.resolveKeyChainSets(tribeId, tribesModel) : null; + const publish = async (content) => { const ssbClient = await openSsb(); return new Promise((resolve, reject) => @@ -30,26 +36,48 @@ module.exports = ({ cooler }) => { ); }; - const buildIndex = (msgs, tribeId, contentType) => { + const buildIndex = async (msgs, tribeId, contentType) => { const tombstoned = new Set(); const replaced = new Map(); const items = new Map(); + const authorByKey = new Map(); + const tombRequests = []; for (const m of msgs) { const c = m.value?.content; if (!c) continue; - if (c.type === 'tombstone' && c.target) { tombstoned.add(c.target); continue; } + if (c.type === 'tombstone' && c.target) { tombRequests.push({ target: c.target, author: m.value?.author }); continue; } if (c.type !== TYPE) continue; + authorByKey.set(m.key, m.value?.author); if (tribeId && c.tribeId !== tribeId) continue; if (contentType && c.contentType !== contentType) continue; if (c.replaces) replaced.set(c.replaces, m.key); items.set(m.key, { id: m.key, ...c, _ts: m.value?.timestamp }); } + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target); + if (targetAuthor && t.author === targetAuthor) tombstoned.add(t.target); + } + for (const id of tombstoned) items.delete(id); for (const oldId of replaced.keys()) items.delete(oldId); - return [...items.values()].sort((a, b) => { + const result = [...items.values()]; + if (tribeCrypto && tribesModel) { + const keyChainCache = new Map(); + for (let i = 0; i < result.length; i++) { + if (!result[i].encryptedPayload) continue; + const tid = result[i].tribeId; + if (!keyChainCache.has(tid)) { + const sets = await tribeCrypto.resolveKeyChainSets(tid, tribesModel); + keyChainCache.set(tid, sets || []); + } + result[i] = tribeCrypto.decryptContent(result[i], keyChainCache.get(tid)); + } + } + + return result.sort((a, b) => { const ta = Date.parse(a.updatedAt || a.createdAt) || a._ts || 0; const tb = Date.parse(b.updatedAt || b.createdAt) || b._ts || 0; return tb - ta; @@ -102,12 +130,17 @@ module.exports = ({ cooler }) => { createdAt: now, updatedAt: now, }; + const keyChain = await resolveKeyChain(tribeId); + if (keyChain && keyChain.length > 0) { + return publish(tribeCrypto.encryptContent(content, keyChain)); + } return publish(content); }, async update(contentId, data, existing) { if (!existing) existing = await this.getById(contentId); if (!existing) throw new Error('Content not found'); + if (existing._undecryptable) throw new Error('Content is tribe-encrypted and cannot be decrypted with available keys'); if (data.status && !VALID_STATUSES.includes(data.status)) { throw new Error('Invalid status. Must be OPEN, CLOSED, or IN-PROGRESS'); } @@ -149,6 +182,10 @@ module.exports = ({ cooler }) => { createdAt: existing.createdAt, updatedAt: now, }; + const keyChain = await resolveKeyChain(existing.tribeId); + if (keyChain && keyChain.length > 0) { + return publish(tribeCrypto.encryptContent(updated, keyChain)); + } return publish(updated); }, @@ -167,25 +204,35 @@ module.exports = ({ cooler }) => { const tombstoned = new Set(); const replaced = new Map(); const items = new Map(); + const authorByKey = new Map(); + const tombRequests = []; for (const m of msgs) { const c = m.value?.content; if (!c) continue; - if (c.type === 'tombstone' && c.target) { tombstoned.add(c.target); continue; } + if (c.type === 'tombstone' && c.target) { tombRequests.push({ target: c.target, author: m.value?.author }); continue; } if (c.type !== TYPE) continue; + authorByKey.set(m.key, m.value?.author); if (c.replaces) replaced.set(c.replaces, m.key); items.set(m.key, { id: m.key, ...c, _ts: m.value?.timestamp }); } + for (const t of tombRequests) { + const targetAuthor = authorByKey.get(t.target); + if (targetAuthor && t.author === targetAuthor) tombstoned.add(t.target); + } let latestId = contentId; while (replaced.has(latestId)) latestId = replaced.get(latestId); if (tombstoned.has(latestId)) return null; - return items.get(latestId) || null; + const item = items.get(latestId) || null; + if (!item || !item.encryptedPayload || !tribeCrypto || !tribesModel) return item; + const keyChainSets = await tribeCrypto.resolveKeyChainSets(item.tribeId, tribesModel); + return tribeCrypto.decryptContent(item, keyChainSets || []); }, async listByTribe(tribeId, contentType, filter) { const msgs = await readLog(); - let items = buildIndex(msgs, tribeId, contentType); + let items = await buildIndex(msgs, tribeId, contentType); if (filter === 'open') items = items.filter(i => i.status === 'OPEN'); if (filter === 'closed') items = items.filter(i => i.status === 'CLOSED'); diff --git a/nodejs-project/nodejs-project/src/models/tribes_model.js b/nodejs-project/nodejs-project/src/models/tribes_model.js index c656d6a3..5d331a7e 100644 --- a/nodejs-project/nodejs-project/src/models/tribes_model.js +++ b/nodejs-project/nodejs-project/src/models/tribes_model.js @@ -6,13 +6,52 @@ const logLimit = getConfig().ssbLogStream?.limit || 1000; const INVITE_CODE_BYTES = 16; const VALID_INVITE_MODES = ['strict', 'open']; -module.exports = ({ cooler }) => { +module.exports = ({ cooler, tribeCrypto }) => { let ssb; const openSsb = async () => { if (!ssb) ssb = await cooler.open(); return ssb }; let tribeIndex = null; let tribeIndexTs = 0; + const STRUCTURAL_FIELDS = ['title', 'description', 'image', 'location', 'tags', 'isLARP', 'isAnonymous', 'inviteMode', 'status', 'parentTribeId', 'mapUrl']; + + const arraysEqual = (a, b) => { + const aa = Array.isArray(a) ? a : []; + const bb = Array.isArray(b) ? b : []; + if (aa.length !== bb.length) return false; + for (let i = 0; i < aa.length; i++) if (aa[i] !== bb[i]) return false; + return true; + }; + + const validMembershipDelta = (prevMembers, nextMembers, author) => { + const prev = Array.isArray(prevMembers) ? prevMembers : []; + const next = Array.isArray(nextMembers) ? nextMembers : []; + const added = next.filter(m => !prev.includes(m)); + const removed = prev.filter(m => !next.includes(m)); + if (added.length === 0 && removed.length === 0) return true; + if (added.length === 1 && removed.length === 0 && added[0] === author) return true; + if (removed.length === 1 && added.length === 0 && removed[0] === author) return true; + return false; + }; + + const validInvitesDelta = (prevInvites, nextInvites, author, rootAuthor) => { + if (author === rootAuthor) return true; + const prevCodes = new Set((prevInvites || []).map(i => typeof i === 'string' ? i : i?.code).filter(Boolean)); + const nextCodes = new Set((nextInvites || []).map(i => typeof i === 'string' ? i : i?.code).filter(Boolean)); + for (const c of nextCodes) if (!prevCodes.has(c)) return false; + return true; + }; + + const structuralFieldsEqual = (prev, next) => { + for (const f of STRUCTURAL_FIELDS) { + const a = prev[f]; + const b = next[f]; + if (Array.isArray(a) || Array.isArray(b)) { if (!arraysEqual(a, b)) return false; continue; } + if (a !== b && !(a == null && b == null)) return false; + } + return true; + }; + const buildTribeIndex = async () => { if (tribeIndex && Date.now() - tribeIndexTs < 5000) return tribeIndex; const client = await openSsb(); @@ -21,23 +60,68 @@ module.exports = ({ cooler }) => { client.createLogStream({ limit: logLimit }), pull.collect((err, msgs) => { if (err) return reject(err); - const tombstoned = new Set(); - const parent = new Map(); - const child = new Map(); - const tribes = new Map(); + const tombstones = new Map(); + const tribeMsgs = new Map(); for (const msg of msgs) { const k = msg.key; const c = msg.value?.content; if (!c) continue; - if (c.type === 'tombstone' && c.target) { tombstoned.add(c.target); continue; } - if (c.type !== 'tribe') continue; - if (c.replaces) { - parent.set(k, c.replaces); - child.set(c.replaces, k); + const author = msg.value?.author; + if (c.type === 'tombstone' && c.target) { + tombstones.set(c.target, { author, ts: msg.value?.timestamp }); + continue; } - tribes.set(k, { id: k, content: c, _ts: msg.value?.timestamp }); + if (c.type !== 'tribe') continue; + tribeMsgs.set(k, { id: k, content: c, author, _ts: msg.value?.timestamp }); } - const rootOf = (id) => { let cur = id; while (parent.has(cur)) cur = parent.get(cur); return cur; }; + const tribes = new Map(); + const parent = new Map(); + const child = new Map(); + const rootByTip = new Map(); + for (const [k, entry] of tribeMsgs.entries()) { + const c = entry.content; + if (!c.replaces) { + tribes.set(k, entry); + rootByTip.set(k, k); + } + } + let progress = true; + while (progress) { + progress = false; + for (const [k, entry] of tribeMsgs.entries()) { + if (tribes.has(k)) continue; + const replaces = entry.content.replaces; + if (!replaces) continue; + const parentEntry = tribes.get(replaces); + if (!parentEntry) continue; + if (child.has(replaces)) continue; + const root = rootByTip.get(replaces); + const rootEntry = tribes.get(root); + const rootAuthor = rootEntry?.author; + const isRootAuthor = entry.author === rootAuthor; + const prevMembers = Array.isArray(parentEntry.content.members) ? parentEntry.content.members : []; + if (!isRootAuthor) { + if (!prevMembers.includes(entry.author) && !(entry.content.members || []).includes(entry.author)) continue; + if (!validMembershipDelta(prevMembers, entry.content.members, entry.author)) continue; + if (!validInvitesDelta(parentEntry.content.invites, entry.content.invites, entry.author, rootAuthor)) continue; + if (!structuralFieldsEqual(parentEntry.content, entry.content)) continue; + } + parent.set(k, replaces); + child.set(replaces, k); + tribes.set(k, entry); + rootByTip.set(k, root); + progress = true; + } + } + const tombstoned = new Set(); + for (const [target, t] of tombstones.entries()) { + const tribeEntry = tribes.get(target); + if (!tribeEntry) continue; + const root = rootByTip.get(target); + const rootAuthor = tribes.get(root)?.author; + if (t.author === rootAuthor) tombstoned.add(target); + } + const rootOf = (id) => rootByTip.get(id) || id; const tipOf = (id) => { let cur = id; while (child.has(cur)) cur = child.get(cur); return cur; }; const tipByRoot = new Map(); for (const k of tribes.keys()) { @@ -45,7 +129,7 @@ module.exports = ({ cooler }) => { const tip = tipOf(root); tipByRoot.set(root, tip); } - tribeIndex = { tribes, tombstoned, parent, child, tipByRoot }; + tribeIndex = { tribes, tombstoned, parent, child, tipByRoot, rootByTip }; tribeIndexTs = Date.now(); resolve(tribeIndex); }) @@ -56,7 +140,7 @@ module.exports = ({ cooler }) => { return { type: 'tribe', - async createTribe(title, description, image, location, tagsRaw = [], isLARP = false, isAnonymous = true, inviteMode = 'strict', parentTribeId = null, status = 'OPEN') { + async createTribe(title, description, image, location, tagsRaw = [], isLARP = false, isAnonymous = true, inviteMode = 'strict', parentTribeId = null, status = 'OPEN', mapUrl = '') { if (!VALID_INVITE_MODES.includes(inviteMode)) { throw new Error('Invalid invite mode. Must be "strict" or "open"'); } @@ -83,11 +167,16 @@ module.exports = ({ cooler }) => { inviteMode, status: status || 'OPEN', parentTribeId: parentTribeId || null, + mapUrl: String(mapUrl || '').trim(), createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), author: userId, }; const result = await new Promise((res, rej) => ssb.publish(content, (e, r) => e ? rej(e) : res(r))); + if (tribeCrypto) { + const tribeKey = tribeCrypto.generateTribeKey(); + tribeCrypto.setKey(result.key, tribeKey, 1); + } tribeIndex = null; return result; }, @@ -103,7 +192,15 @@ module.exports = ({ cooler }) => { throw new Error('Only tribe members can generate invites in open mode'); } const code = crypto.randomBytes(INVITE_CODE_BYTES).toString('hex'); - const invites = Array.isArray(tribe.invites) ? [...tribe.invites, code] : [code]; + let invite = code; + if (tribeCrypto) { + const ancestryIds = await this.getAncestryChain(tribeId).catch(() => null); + if (Array.isArray(ancestryIds) && ancestryIds.length) { + const ekChain = tribeCrypto.encryptChainForInvite(ancestryIds, code); + if (ekChain) invite = { code, ekChain, gen: tribeCrypto.getGen(ancestryIds[0]) }; + } + } + const invites = Array.isArray(tribe.invites) ? [...tribe.invites, invite] : [invite]; const inviteLog = Array.isArray(tribe.inviteLog) ? [...tribe.inviteLog] : []; inviteLog.push({ code, generatedBy: userId, generatedAt: new Date().toISOString(), status: 'pending', usedBy: null, usedAt: null }); await this.updateTribeById(tribeId, { invites, inviteLog }); @@ -126,27 +223,75 @@ module.exports = ({ cooler }) => { const idx = members.indexOf(userId); if (idx === -1) throw new Error('User is not a member of this tribe'); members.splice(idx, 1); - return this.updateTribeById(tribeId, { members }); + await this.updateTribeById(tribeId, { members }); + await this.rotateTribeKey(tribeId, members); }, async joinByInvite(code) { const ssb = await openSsb(); const userId = ssb.id; const tribes = await this.listAll(); - const tribe = tribes.find(t => t.invites && t.invites.includes(code)); - if (!tribe) throw new Error('Invalid or expired invite code'); - if (tribe.members.includes(userId)) { + let matchedTribe = null; + let matchedInvite = null; + for (const t of tribes) { + if (!t.invites) continue; + for (const inv of t.invites) { + if (typeof inv === 'string' && inv === code) { + matchedTribe = t; matchedInvite = inv; break; + } + if (typeof inv === 'object' && inv.code === code) { + matchedTribe = t; matchedInvite = inv; break; + } + } + if (matchedTribe) break; + } + if (!matchedTribe) throw new Error('Invalid or expired invite code'); + if (matchedTribe.members.includes(userId)) { throw new Error('Already a member of this tribe'); } - const members = [...tribe.members, userId]; - const invites = tribe.invites.filter(c => c !== code); - const inviteLog = Array.isArray(tribe.inviteLog) ? tribe.inviteLog.map(entry => - entry.code === code - ? { ...entry, status: 'used', usedBy: userId, usedAt: new Date().toISOString() } - : entry + let storedTribeKey = null; + let storedGen = 1; + let storedRootId = null; + if (tribeCrypto && typeof matchedInvite === 'object') { + if (matchedInvite.ekChain) { + const chain = tribeCrypto.decryptChainFromInvite(matchedInvite.ekChain, code); + if (Array.isArray(chain) && chain.length) { + for (const entry of chain) tribeCrypto.setKey(entry.rootId, entry.key, entry.gen || 1); + storedRootId = chain[0].rootId; + storedTribeKey = chain[0].key; + storedGen = chain[0].gen || 1; + } + } else if (matchedInvite.ek) { + storedTribeKey = tribeCrypto.decryptFromInvite(matchedInvite.ek, code); + storedRootId = await this.getRootId(matchedTribe.id); + storedGen = matchedInvite.gen || 1; + tribeCrypto.setKey(storedRootId, storedTribeKey, storedGen); + } + } + const members = [...matchedTribe.members, userId]; + const invites = matchedTribe.invites.filter(inv => { + if (typeof inv === 'string') return inv !== code; + return inv.code !== code; + }); + const inviteLog = Array.isArray(matchedTribe.inviteLog) ? matchedTribe.inviteLog.map(entry => + entry.code === code ? { ...entry, status: 'used', usedBy: userId, usedAt: new Date().toISOString() } : entry ) : []; - await this.updateTribeById(tribe.id, { members, invites, inviteLog }); - return tribe.id; + await this.updateTribeById(matchedTribe.id, { members, invites, inviteLog }); + if (tribeCrypto && storedTribeKey && storedRootId) { + const ssbKeys = require('../server/node_modules/ssb-keys'); + const memberKeys = {}; + try { memberKeys[userId] = tribeCrypto.boxKeyForMember(storedTribeKey, userId, ssbKeys); } catch (_) {} + if (matchedTribe.author && matchedTribe.author !== userId) { + try { memberKeys[matchedTribe.author] = tribeCrypto.boxKeyForMember(storedTribeKey, matchedTribe.author, ssbKeys); } catch (_) {} + } + if (Object.keys(memberKeys).length) { + await new Promise((resolve) => { + ssb.publish({ type: 'tribe-keys', tribeId: storedRootId, generation: storedGen, memberKeys }, () => resolve()); + }); + } + } + await this.ensureFollowTribeMembers(matchedTribe.id).catch(() => {}); + return matchedTribe.id; }, async deleteTribeById(tribeId) { @@ -154,7 +299,61 @@ module.exports = ({ cooler }) => { }, async updateTribeMembers(tribeId, members) { - return this.updateTribeById(tribeId, { members }); + const tribe = await this.getTribeById(tribeId); + const oldMembers = tribe.members || []; + await this.updateTribeById(tribeId, { members }); + const removed = oldMembers.filter(m => !members.includes(m)); + const added = members.filter(m => !oldMembers.includes(m)); + if (removed.length > 0) { + await this.rotateTribeKey(tribeId, members); + } else if (added.length > 0) { + await this.distributeTribeKey(tribeId, added); + } + }, + + async distributeTribeKey(tribeId, toMembers) { + if (!tribeCrypto) return; + const ssb = await openSsb(); + const ssbKeys = require('../server/node_modules/ssb-keys'); + const rootId = await this.getRootId(tribeId); + const currentKey = tribeCrypto.getKey(rootId); + if (!currentKey) return; + const gen = tribeCrypto.getGen(rootId); + const memberKeys = {}; + for (const memberId of toMembers) { + try { memberKeys[memberId] = tribeCrypto.boxKeyForMember(currentKey, memberId, ssbKeys); } catch (_) {} + } + if (!Object.keys(memberKeys).length) return; + await new Promise((resolve, reject) => { + ssb.publish({ type: 'tribe-keys', tribeId: rootId, generation: gen, memberKeys }, (err, res) => err ? reject(err) : resolve(res)); + }); + await this.ensureFollowTribeMembers(tribeId).catch(() => {}); + }, + + async ensureTribeKeyDistribution(tribeId) { + if (!tribeCrypto) return; + const ssb = await openSsb(); + const userId = ssb.id; + const tribe = await this.getTribeById(tribeId).catch(() => null); + if (!tribe || tribe.author !== userId) return; + const rootId = await this.getRootId(tribeId); + const currentKey = tribeCrypto.getKey(rootId); + if (!currentKey) return; + const gen = tribeCrypto.getGen(rootId); + const msgs = await new Promise((resolve, reject) => { + pull(ssb.createLogStream({ limit: logLimit }), pull.collect((err, m) => err ? reject(err) : resolve(m))); + }); + const distributed = new Set(); + for (const m of msgs) { + const c = m.value?.content; + if (!c || c.type !== 'tribe-keys') continue; + if (c.tribeId !== rootId) continue; + if ((c.generation || 0) < gen) continue; + for (const mid of Object.keys(c.memberKeys || {})) distributed.add(mid); + } + const members = Array.isArray(tribe.members) ? tribe.members : []; + const missing = members.filter(m => m !== userId && !distributed.has(m)); + if (missing.length > 0) await this.distributeTribeKey(tribeId, missing); }, async publishUpdatedTribe(tribeId, updatedTribe) { @@ -174,6 +373,7 @@ module.exports = ({ cooler }) => { inviteMode: updatedTribe.inviteMode, status: updatedTribe.status || 'OPEN', parentTribeId: updatedTribe.parentTribeId || null, + mapUrl: updatedTribe.mapUrl || "", createdAt: updatedTribe.createdAt, updatedAt: new Date().toISOString(), author: updatedTribe.author, @@ -206,6 +406,7 @@ module.exports = ({ cooler }) => { inviteMode: tribe.content.inviteMode || 'strict', status: tribe.content.status || 'OPEN', parentTribeId: tribe.content.parentTribeId || null, + mapUrl: tribe.content.mapUrl || "", createdAt: tribe.content.createdAt, updatedAt: tribe.content.updatedAt, author: tribe.content.author, @@ -214,7 +415,12 @@ module.exports = ({ cooler }) => { }, async listAll() { - const { tribes, tombstoned, tipByRoot } = await buildTribeIndex(); + const { tribes, tombstoned, tipByRoot, rootByTip } = await buildTribeIndex(); + const resolveParent = (pid) => { + if (!pid) return null; + const root = rootByTip.get(pid) || pid; + return tipByRoot.get(root) || pid; + }; const items = []; for (const [root, tip] of tipByRoot) { if (tombstoned.has(root) || tombstoned.has(tip)) continue; @@ -234,7 +440,8 @@ module.exports = ({ cooler }) => { invites: Array.isArray(c.invites) ? c.invites : [], inviteMode: c.inviteMode || 'strict', status: c.status || 'OPEN', - parentTribeId: c.parentTribeId || null, + parentTribeId: resolveParent(c.parentTribeId), + mapUrl: c.mapUrl || "", createdAt: c.createdAt, updatedAt: c.updatedAt, author: c.author, @@ -254,6 +461,148 @@ module.exports = ({ cooler }) => { while (child.has(cur)) { cur = child.get(cur); ids.push(cur); } return ids; }, + + async getRootId(tribeId) { + const { parent } = await buildTribeIndex(); + let root = tribeId; + while (parent.has(root)) root = parent.get(root); + return root; + }, + + async getAncestryChain(tribeId) { + const rootId = await this.getRootId(tribeId); + const tribe = await this.getTribeById(tribeId); + const chain = [rootId]; + let currentTribe = tribe; + while (currentTribe.parentTribeId) { + const parentRootId = await this.getRootId(currentTribe.parentTribeId); + chain.push(parentRootId); + try { + currentTribe = await this.getTribeById(currentTribe.parentTribeId); + } catch (e) { + break; + } + } + return chain; + }, + + async rotateTribeKey(tribeId, remainingMembers) { + if (!tribeCrypto) return; + const ssb = await openSsb(); + const ssbKeys = require('../server/node_modules/ssb-keys'); + const rootId = await this.getRootId(tribeId); + const oldKey = tribeCrypto.getKey(rootId); + if (!oldKey) return; + const newKey = tribeCrypto.generateTribeKey(); + const newGen = tribeCrypto.addNewKey(rootId, newKey); + const memberKeys = {}; + for (const memberId of remainingMembers) { + memberKeys[memberId] = tribeCrypto.boxKeyForMember(newKey, memberId, ssbKeys); + } + const entries = Object.entries(memberKeys); + const BATCH_SIZE = 20; + for (let i = 0; i < entries.length; i += BATCH_SIZE) { + const batch = Object.fromEntries(entries.slice(i, i + BATCH_SIZE)); + await new Promise((resolve, reject) => { + ssb.publish({ type: 'tribe-keys', tribeId: rootId, generation: newGen, memberKeys: batch }, + (err, res) => err ? reject(err) : resolve(res)); + }); + } + const tribe = await this.getTribeById(tribeId); + if (Array.isArray(tribe.invites) && tribe.invites.length > 0) { + const ancestryIds = await this.getAncestryChain(tribeId).catch(() => [rootId]); + const updatedInvites = tribe.invites.map(inv => { + if (typeof inv === 'object' && inv.code) { + const ekChain = tribeCrypto.encryptChainForInvite(ancestryIds, inv.code); + if (ekChain) return { code: inv.code, ekChain, gen: newGen }; + return { code: inv.code, ek: tribeCrypto.encryptForInvite(newKey, inv.code), gen: newGen }; + } + return inv; + }); + await this.updateTribeInvites(tribeId, updatedInvites); + } + }, + + async processIncomingKeys() { + if (!tribeCrypto) return; + const ssb = await openSsb(); + const ssbKeys = require('../server/node_modules/ssb-keys'); + const config = require('../server/ssb_config'); + const msgs = await new Promise((resolve, reject) => { + pull( + ssb.createLogStream({ limit: logLimit }), + pull.collect((err, msgs) => err ? reject(err) : resolve(msgs)) + ); + }); + for (const m of msgs) { + const c = m.value?.content; + if (!c || c.type !== 'tribe-keys') continue; + const myEntry = c.memberKeys && c.memberKeys[ssb.id]; + if (!myEntry) continue; + const currentGen = tribeCrypto.getGen(c.tribeId); + if (c.generation <= currentGen) continue; + const newKey = tribeCrypto.unboxKeyFromMember(myEntry, config.keys, ssbKeys); + if (newKey) { + tribeCrypto.addNewKey(c.tribeId, newKey); + } + } + }, + + async ensureFollowTribeMembers(tribeId) { + const ssb = await openSsb(); + const me = ssb.id; + let tribe; + try { tribe = await this.getTribeById(tribeId); } catch { return; } + const rootId = await this.getRootId(tribeId).catch(() => tribeId); + const tribeChainIds = await this.getChainIds(tribeId).catch(() => [tribeId]); + const tribeRootSet = new Set([rootId]); + const tribeChainSet = new Set(tribeChainIds); + tribeChainSet.add(tribeId); + const discovered = new Set(); + const myFollows = new Map(); + await new Promise((resolve, reject) => { + pull( + ssb.createLogStream({ limit: logLimit }), + pull.collect((err, msgs) => { + if (err) return reject(err); + for (const m of msgs) { + const v = m.value; + if (!v) continue; + const c = v.content; + if (!c) continue; + if (v.author === me && c.type === 'contact' && c.contact && typeof c.following === 'boolean') { + myFollows.set(c.contact, c.following); + continue; + } + if (c.type === 'tribe-keys' && c.tribeId && tribeRootSet.has(c.tribeId) && c.memberKeys && typeof c.memberKeys === 'object') { + for (const fid of Object.keys(c.memberKeys)) discovered.add(fid); + if (v.author) discovered.add(v.author); + continue; + } + if (c.type === 'tribe' && Array.isArray(c.members)) { + if (tribeChainSet.has(m.key) || tribeChainSet.has(c.replaces || '')) { + for (const fid of c.members) if (fid) discovered.add(fid); + if (c.author) discovered.add(c.author); + } + } + } + resolve(); + }) + ); + }); + const baseMembers = Array.isArray(tribe.members) ? tribe.members : []; + for (const fid of baseMembers) discovered.add(fid); + if (tribe.author) discovered.add(tribe.author); + discovered.delete(me); + const members = [...discovered].filter(Boolean); + if (!members.length) return; + for (const memberId of members) { + if (myFollows.get(memberId) === true) continue; + await new Promise((resolve) => { + ssb.publish({ type: 'contact', contact: memberId, following: true }, () => resolve()); + }); + } + }, async updateTribeById(tribeId, updatedContent) { const ssb = await openSsb(); @@ -293,6 +642,70 @@ module.exports = ({ cooler }) => { const parentRoot = rootOf(parentId); const all = await this.listAll(); return all.filter(t => t.parentTribeId && rootOf(t.parentTribeId) === parentRoot); + }, + + async isTribeMember(userId, tribeId) { + if (!userId || !tribeId) return false; + try { + const tribe = await this.getTribeById(tribeId); + if (!tribe) return false; + if (tribe.author === userId) return true; + return Array.isArray(tribe.members) && tribe.members.includes(userId); + } catch (e) { + return false; + } + }, + + async canAccessTribe(userId, tribeId) { + if (!userId || !tribeId) return false; + try { + const tribe = await this.getTribeById(tribeId); + if (!tribe) return false; + if (tribe.author === userId) return true; + if (Array.isArray(tribe.members) && tribe.members.includes(userId)) return true; + const effective = await this.getEffectiveStatus(tribeId); + return !effective.isPrivate; + } catch (e) { + return false; + } + }, + + async getEffectiveStatus(tribeId) { + let current; + try { current = await this.getTribeById(tribeId); } catch (e) { return { isPrivate: true, chain: [] }; } + const chain = [{ id: current.id, isAnonymous: !!current.isAnonymous, author: current.author }]; + let cursor = current; + const seen = new Set([current.id]); + while (cursor.parentTribeId && !seen.has(cursor.parentTribeId)) { + seen.add(cursor.parentTribeId); + try { + cursor = await this.getTribeById(cursor.parentTribeId); + chain.push({ id: cursor.id, isAnonymous: !!cursor.isAnonymous, author: cursor.author }); + } catch (e) { break; } + } + const isPrivate = chain.some(c => c.isAnonymous); + return { isPrivate, chain }; + }, + + async listTribesForViewer(userId) { + const all = await this.listAll(); + const out = []; + for (const t of all) { + if (!t.isAnonymous) { out.push(t); continue; } + if (t.author === userId || (Array.isArray(t.members) && t.members.includes(userId))) out.push(t); + } + return out; + }, + + async getViewerTribeScope(userId) { + const all = await this.listAll(); + const memberOf = new Set(); + const createdBy = new Set(); + for (const t of all) { + if (t.author === userId) { createdBy.add(t.id); memberOf.add(t.id); continue; } + if (Array.isArray(t.members) && t.members.includes(userId)) memberOf.add(t.id); + } + return { memberOf, createdBy, allTribes: all }; } }; }; diff --git a/nodejs-project/nodejs-project/src/server/package.json b/nodejs-project/nodejs-project/src/server/package.json index 212c655e..df1f8a68 100644 --- a/nodejs-project/nodejs-project/src/server/package.json +++ b/nodejs-project/nodejs-project/src/server/package.json @@ -1,6 +1,6 @@ { "name": "@krakenslab/oasis", - "version": "0.7.4", + "version": "0.7.5", "description": "Oasis Social Networking Project Utopia", "repository": { "type": "git", diff --git a/nodejs-project/nodejs-project/src/server/ssb_config.js b/nodejs-project/nodejs-project/src/server/ssb_config.js index 39b66f63..d4b4b8c5 100644 --- a/nodejs-project/nodejs-project/src/server/ssb_config.js +++ b/nodejs-project/nodejs-project/src/server/ssb_config.js @@ -14,7 +14,6 @@ const cliArgs = ~i ? argv.slice(0, i) : argv; let config = Config('ssb', minimist(conf)); config = { ...config, ...configData }; -// Set blob size limit to 50MB const megabyte = Math.pow(2, 20); config.blobs = config.blobs || {}; config.blobs.max = 50 * megabyte; diff --git a/nodejs-project/nodejs-project/src/views/blockchain_view.js b/nodejs-project/nodejs-project/src/views/blockchain_view.js index 07f52451..1433ac07 100644 --- a/nodejs-project/nodejs-project/src/views/blockchain_view.js +++ b/nodejs-project/nodejs-project/src/views/blockchain_view.js @@ -79,6 +79,7 @@ const generateFilterButtons = (filters, currentFilter, action, search = {}) => ); const getViewDetailsAction = (type, block) => { + if (block && block.content && typeof block.content.encryptedPayload === 'string') return null; switch (type) { case 'votes': return `/votes/${encodeURIComponent(block.id)}`; case 'transfer': return `/transfers/${encodeURIComponent(block.id)}`; @@ -119,6 +120,10 @@ const getViewDetailsAction = (type, block) => { case 'courtsSettlementAccepted': return `/courts`; case 'courtsNomination': return `/courts`; case 'courtsNominationVote': return `/courts`; + case 'calendarDate': + case 'calendarNote': return block.content?.calendarId ? `/calendars/${encodeURIComponent(block.content.calendarId)}` : `/calendars`; + case 'padEntry': return block.content?.padId ? `/pads/${encodeURIComponent(block.content.padId)}` : `/pads`; + case 'chatMessage': return block.content?.roomId ? `/chats/${encodeURIComponent(block.content.roomId)}` : `/chats`; default: return null; } }; @@ -196,9 +201,10 @@ const renderBlockDiagram = (blocks, qs) => { ].filter(Boolean).join(' | ') || '—'; const datagramQs = qs ? `${qs}&view=datagram` : '?view=datagram'; + const typeClass = `bd-type-${String(block.type || 'unknown').replace(/[^a-zA-Z0-9_-]/g, '-')}`; return a({ href: `/blockexplorer/block/${encodeURIComponent(block.id)}${datagramQs}`, class: 'block-diagram-link' }, - div({ class: 'block-diagram', style: `border-color:${color};` }, - div({ class: 'block-diagram-ruler', style: `border-bottom-color:${color};` }, + div({ class: `block-diagram ${typeClass}` }, + div({ class: 'block-diagram-ruler' }, span('0'), span('4'), span('8'), span('16'), span('24'), span('31') ), div({ class: 'block-diagram-grid' }, diff --git a/nodejs-project/nodejs-project/src/views/chats_view.js b/nodejs-project/nodejs-project/src/views/chats_view.js index cc999dee..e39f3285 100644 --- a/nodejs-project/nodejs-project/src/views/chats_view.js +++ b/nodejs-project/nodejs-project/src/views/chats_view.js @@ -213,7 +213,7 @@ exports.singleChatView = async (chat, filter, messages = [], params = {}) => { const q = safeText(params.q || "") const returnTo = safeText(params.returnTo) || buildReturnTo(filter, { q }) const isAuthor = String(chat.author) === String(userId) - const isMember = safeArr(chat.members).includes(userId) + const isMember = safeArr(chat.members).includes(userId) || (!!chat.tribeId && !!chat.isTribeMember) const fullShareUrl = `/chats/${encodeURIComponent(chat.key)}` const isRestrictedInviteOnly = !isMember && !isAuthor && chat.status === "INVITE-ONLY" @@ -250,7 +250,7 @@ exports.singleChatView = async (chat, filter, messages = [], params = {}) => { ) : null ), isRestrictedInviteOnly ? null : div({ class: "tribe-side-actions" }, - isAuthor + isAuthor && chat.status === "INVITE-ONLY" ? form({ method: "POST", action: `/chats/generate-invite` }, input({ type: "hidden", name: "chatId", value: chat.key }), input({ type: "hidden", name: "returnTo", value: returnTo }), diff --git a/nodejs-project/nodejs-project/src/views/pads_view.js b/nodejs-project/nodejs-project/src/views/pads_view.js index fcfdeaf8..1cc2baa7 100644 --- a/nodejs-project/nodejs-project/src/views/pads_view.js +++ b/nodejs-project/nodejs-project/src/views/pads_view.js @@ -202,7 +202,7 @@ exports.padsView = async (pads, filter, padToEdit, params) => { exports.singlePadView = async (pad, entries, params) => { const isAuthor = String(pad.author) === String(userId) - const isMember = pad.members.includes(userId) + const isMember = pad.members.includes(userId) || (!!pad.tribeId && !!pad.isTribeMember) const padClosed = pad.isClosed const returnTo = `/pads/${encodeURIComponent(pad.rootId)}` const shareUrl = `/pads/${encodeURIComponent(pad.rootId)}` @@ -231,7 +231,7 @@ exports.singlePadView = async (pad, entries, params) => { isRestrictedInviteOnly ? null : tr(td({ class: "tribe-info-label" }, i18n.padDeadlineLabel || "Deadline"), td({ class: "tribe-info-value", colspan: "3" }, pad.deadline ? moment(pad.deadline).format("YYYY-MM-DD HH:mm") : "\u2014")) ), isRestrictedInviteOnly ? null : div({ class: "tribe-side-actions" }, - isAuthor + isAuthor && pad.status === "INVITE-ONLY" ? form({ method: "POST", action: `/pads/generate-invite/${encodeURIComponent(pad.rootId)}` }, button({ type: "submit", class: "tribe-action-btn" }, i18n.padGenerateCode || "Generate Code") ) @@ -271,7 +271,7 @@ exports.singlePadView = async (pad, entries, params) => { ) ) : null, - !isRestrictedInviteOnly && (!isAuthor && (pad.status === "OPEN" || isMember) && !padClosed) + !isRestrictedInviteOnly && !isAuthor && !isMember && pad.status === "OPEN" && !padClosed ? form({ method: "POST", action: `/pads/join/${encodeURIComponent(pad.rootId)}` }, button({ type: "submit", class: "create-button" }, i18n.padStartEditing || "START EDITING!") ) diff --git a/nodejs-project/nodejs-project/src/views/stats_view.js b/nodejs-project/nodejs-project/src/views/stats_view.js index 4c8b8c37..881eb274 100644 --- a/nodejs-project/nodejs-project/src/views/stats_view.js +++ b/nodejs-project/nodejs-project/src/views/stats_view.js @@ -95,7 +95,7 @@ exports.statsView = (stats, filter) => { h2(title), p(description) ), - div({ class: 'mode-buttons' }, + div({ class: 'mode-buttons stats-grid' }, modes.map(m => form({ method: 'GET', action: '/stats' }, input({ type: 'hidden', name: 'filter', value: m }), @@ -105,15 +105,15 @@ exports.statsView = (stats, filter) => { ), section( div({ style: headerStyle }, - h3({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsCreatedAt}: `, span({ style: 'color:#888;' }, stats.createdAt)), - h3({ style: 'font-size:18px; color:#555; margin:8px 0; font-weight:600;' }, - a({ class: "user-link", href: `/author/${encodeURIComponent(stats.id)}`, style: 'color:#007bff; text-decoration:none;' }, stats.id) + h3({ class: 'stats-h-row' }, `${i18n.statsCreatedAt}: `, span({ class: 'stats-muted-888' }, stats.createdAt)), + h3({ class: 'stats-section-h' }, + a({ class: "user-link", href: `/author/${encodeURIComponent(stats.id)}`, class: 'stats-link' }, stats.id) ), - div({ style: 'margin-bottom:16px;' }, - ul({ style: 'list-style-type:none; padding:0; margin:0;' }, - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsBlobsSize}: `, span({ style: 'color:#888;' }, stats.statsBlobsSize)), - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsBlockchainSize}: `, span({ style: 'color:#888;' }, stats.statsBlockchainSize)), - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, strong(`${i18n.statsSize}: `, span({ style: 'color:#888;' }, span({ style: 'color:#555;' }, stats.folderSize)))) + div({ class: 'stats-mb-16' }, + ul({ class: 'stats-list-reset' }, + li({ class: 'stats-h-row' }, `${i18n.statsBlobsSize}: `, span({ class: 'stats-muted-888' }, stats.statsBlobsSize)), + li({ class: 'stats-h-row' }, `${i18n.statsBlockchainSize}: `, span({ class: 'stats-muted-888' }, stats.statsBlockchainSize)), + li({ class: 'stats-h-row' }, strong(`${i18n.statsSize}: `, span({ class: 'stats-muted-888' }, span({ class: 'stats-muted-555' }, stats.folderSize)))) ) ) ), @@ -157,7 +157,7 @@ exports.statsView = (stats, filter) => { span(`${networkCO2} g CO₂`) ), div({ class: 'carbon-bar-track' }, - div({ class: 'carbon-bar-fill carbon-bar-network', style: 'width:100%;' }) + div({ class: 'carbon-bar-fill carbon-bar-network stats-w-100' }) ), p({ class: 'carbon-bar-note' }, strong(`${pct}%`), ` ${i18n.statsCarbonOfNetwork || 'of network total'}`), p({ class: 'carbon-bar-formula' }, 'Based on local data storage weight ', strong('(0.0002 kWh/MB × 475 g CO₂/kWh)')) @@ -182,7 +182,7 @@ exports.statsView = (stats, filter) => { span(`${networkCO2} g CO₂`) ), div({ class: 'carbon-bar-track' }, - div({ class: 'carbon-bar-fill carbon-bar-network', style: 'width:100%;' }) + div({ class: 'carbon-bar-fill carbon-bar-network stats-w-100' }) ), p({ class: 'carbon-bar-note' }, strong(`${tombPct}%`), ` ${i18n.statsCarbonOfNetwork || 'of network total'} (${tombCount} tombstones × ~${avgTombBytes} bytes)`), p({ class: 'carbon-bar-formula' }, 'Based on estimated tombstone message size ', strong('(0.0002 kWh/MB × 475 g CO₂/kWh)')) @@ -202,7 +202,7 @@ exports.statsView = (stats, filter) => { span(`${maxAnnualCO2} g CO₂`) ), div({ class: 'carbon-bar-track' }, - div({ class: 'carbon-bar-fill carbon-bar-max', style: 'width:100%;' }) + div({ class: 'carbon-bar-fill carbon-bar-max stats-w-100' }) ), p({ class: 'carbon-bar-note' }, strong(`${pct}%`), ` ${i18n.statsCarbonOfEstMax || 'of estimated max capacity'}`), p({ class: 'carbon-bar-formula' }, 'Based on local data storage weight ', strong('(0.0002 kWh/MB × 475 g CO₂/kWh)')) @@ -210,22 +210,22 @@ exports.statsView = (stats, filter) => { })() ), div({ style: headerStyle }, - h3({ style: 'font-size:18px; color:#555; margin:8px 0; font-weight:600;' }, i18n.statsBankingTitle), - ul({ style: 'list-style-type:none; padding:0; margin:0;' }, - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsEcoWalletLabel}: `, a({ href: '/wallet', style: 'color:#007bff; text-decoration:none; word-break:break-all;' }, stats?.banking?.myAddress || i18n.statsEcoWalletNotConfigured)), - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsTotalEcoAddresses}: `, span({ style: 'color:#888;' }, String(stats?.banking?.totalAddresses || 0))) + h3({ class: 'stats-section-h' }, i18n.statsBankingTitle), + ul({ class: 'stats-list-reset' }, + li({ class: 'stats-h-row' }, `${i18n.statsEcoWalletLabel}: `, a({ href: '/wallet', class: 'stats-link-break' }, stats?.banking?.myAddress || i18n.statsEcoWalletNotConfigured)), + li({ class: 'stats-h-row' }, `${i18n.statsTotalEcoAddresses}: `, span({ class: 'stats-muted-888' }, String(stats?.banking?.totalAddresses || 0))) ) ), div({ style: headerStyle }, - h3({ style: 'font-size:18px; color:#555; margin:8px 0; font-weight:600;' }, i18n.statsLogsTitle || 'Logs'), - ul({ style: 'list-style-type:none; padding:0; margin:0;' }, - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsLogsEntries || 'Entries'}: `, span({ style: 'color:#888;' }, String(stats?.logsCount || 0))) + h3({ class: 'stats-section-h' }, i18n.statsLogsTitle || 'Logs'), + ul({ class: 'stats-list-reset' }, + li({ class: 'stats-h-row' }, `${i18n.statsLogsEntries || 'Entries'}: `, span({ class: 'stats-muted-888' }, String(stats?.logsCount || 0))) ) ), div({ style: headerStyle }, - h3({ style: 'font-size:18px; color:#555; margin:8px 0; font-weight:600;' }, i18n.statsAITraining), - ul({ style: 'list-style-type:none; padding:0; margin:0;' }, - li({ style: 'font-size:18px; color:#555; margin:8px 0;' }, `${i18n.statsAIExchanges}: `, span({ style: 'color:#888;' }, String(C(stats, 'aiExchange') || 0))) + h3({ class: 'stats-section-h' }, i18n.statsAITraining), + ul({ class: 'stats-list-reset' }, + li({ class: 'stats-h-row' }, `${i18n.statsAIExchanges}: `, span({ class: 'stats-muted-888' }, String(C(stats, 'aiExchange') || 0))) ) ), div({ style: headerStyle }, h3(`${i18n.statsPUBs}: ${String(stats.pubsCount || 0)}`)), @@ -233,7 +233,7 @@ exports.statsView = (stats, filter) => { ? div({ class: 'stats-container' }, [ div({ style: blockStyle }, h2(i18n.statsActivity7d), - table({ style: 'width:100%; border-collapse: collapse;' }, + table({ class: 'stats-table' }, tr(th(i18n.day), th(i18n.messages)), ...(Array.isArray(stats.activity?.daily7) ? stats.activity.daily7 : []).map(row => tr(td(row.day), td(String(row.count)))) ), @@ -242,7 +242,7 @@ exports.statsView = (stats, filter) => { ), div({ style: blockStyle }, h2(`${i18n.statsDiscoveredTribes}: ${stats.allTribesPublic.length}`), - table({ style: 'width:100%; border-collapse: collapse; margin-top: 8px;' }, + table({ class: 'stats-table-mt8' }, ...stats.allTribesPublic.map(t => tr(td(a({ href: `/tribe/${encodeURIComponent(t.id)}`, class: 'tribe-link' }, t.name)))) ) ), @@ -317,7 +317,7 @@ exports.statsView = (stats, filter) => { ? div({ class: 'stats-container' }, [ div({ style: blockStyle }, h2(i18n.statsActivity7d), - table({ style: 'width:100%; border-collapse: collapse;' }, + table({ class: 'stats-table' }, tr(th(i18n.day), th(i18n.messages)), ...(Array.isArray(stats.activity?.daily7) ? stats.activity.daily7 : []).map(row => tr(td(row.day), td(String(row.count)))) ), @@ -326,14 +326,14 @@ exports.statsView = (stats, filter) => { ), div({ style: blockStyle }, h2(`${i18n.statsDiscoveredTribes}: ${stats.memberTribesDetailed.length}`), - table({ style: 'width:100%; border-collapse: collapse; margin-top: 8px;' }, + table({ class: 'stats-table-mt8' }, ...stats.memberTribesDetailed.map(t => tr(td(a({ href: `/tribe/${encodeURIComponent(t.id)}`, class: 'tribe-link' }, t.name)))) ) ), Array.isArray(stats.myPrivateTribesDetailed) && stats.myPrivateTribesDetailed.length ? div({ style: blockStyle }, h2(`${i18n.statsPrivateDiscoveredTribes}: ${stats.myPrivateTribesDetailed.length}`), - table({ style: 'width:100%; border-collapse: collapse; margin-top: 8px;' }, + table({ class: 'stats-table-mt8' }, ...stats.myPrivateTribesDetailed.map(tp => tr(td(a({ href: `/tribe/${encodeURIComponent(tp.id)}`, class: 'tribe-link' }, tp.name)))) ) ) diff --git a/nodejs-project/nodejs-project/src/views/torrents_view.js b/nodejs-project/nodejs-project/src/views/torrents_view.js index 0c03ca4f..b26e9d51 100644 --- a/nodejs-project/nodejs-project/src/views/torrents_view.js +++ b/nodejs-project/nodejs-project/src/views/torrents_view.js @@ -205,6 +205,7 @@ const renderTorrentTable = (torrents, filter, params = {}) => { const renderTorrentForm = (filter, torrentId, torrentToEdit, params = {}) => { const returnTo = safeText(params.returnTo) || buildReturnTo("all", params); + const tribeId = safeText(params.tribeId || ""); return div( { class: "div-center audio-form" }, form( @@ -214,6 +215,7 @@ const renderTorrentForm = (filter, torrentId, torrentToEdit, params = {}) => { enctype: "multipart/form-data" }, input({ type: "hidden", name: "returnTo", value: returnTo }), + tribeId ? input({ type: "hidden", name: "tribeId", value: tribeId }) : null, span(i18n.torrentFileLabel), br(), input({ type: "file", name: "torrent", accept: ".torrent", required: filter !== "edit" }), diff --git a/nodejs-project/nodejs-project/src/views/tribes_view.js b/nodejs-project/nodejs-project/src/views/tribes_view.js index 473cfdb8..df55fc9a 100644 --- a/nodejs-project/nodejs-project/src/views/tribes_view.js +++ b/nodejs-project/nodejs-project/src/views/tribes_view.js @@ -1,4 +1,5 @@ -const { div, h2, h3, p, section, button, form, a, input, img, label, select, option, br, textarea, h1, span, nav, ul, li, video, audio, table, tr, td } = require("../server/node_modules/hyperaxe"); +const { div, h2, h3, p, section, button, form, a, input, img, label, select, option, br, textarea, h1, span, nav, ul, li, video, audio, table, tr, td, thead, tbody, th } = require("../server/node_modules/hyperaxe"); +const moment = require("../server/node_modules/moment"); const QRCode = require('../server/node_modules/qrcode'); const { template, i18n } = require('./main_views'); const { config } = require('../server/SSB_server.js'); @@ -201,7 +202,8 @@ exports.tribesView = async (tribes, filter, tribeId, query = {}, allTribes = nul ); const isEdit = filter === 'edit' && tribeId; - const tribeToEdit = isEdit ? tribes.find(t => t.id === tribeId) : {}; + const tribeToEdit = (isEdit ? tribes.find(t => t.id === tribeId) : null) || {}; + const isSubEdit = isEdit && !!tribeToEdit.parentTribeId; const createForm = (filter === 'create' || isEdit) ? div({ class: 'create-tribe-form' }, h2(isEdit ? i18n.updateTribeTitle : i18n.createTribeTitle), form({ @@ -233,23 +235,25 @@ exports.tribesView = async (tribes, filter, tribeId, query = {}, allTribes = nul br, input({ type: 'text', name: 'tags', id: 'tags', placeholder: i18n.tribeTagsPlaceholder, value: (tribeToEdit.tags || []).join(', ') }), br, - label({ for: 'isAnonymous' }, i18n.tribeIsAnonymousLabel), - br, - select({ name: 'isAnonymous', id: 'isAnonymous' }, + isSubEdit ? null : label({ for: 'isAnonymous' }, i18n.tribeIsAnonymousLabel), + isSubEdit ? null : br, + isSubEdit ? null : select({ name: 'isAnonymous', id: 'isAnonymous' }, option({ value: 'true', selected: tribeToEdit.isAnonymous === true ? 'selected' : undefined }, i18n.tribePrivate), option({ value: 'false', selected: tribeToEdit.isAnonymous === false ? 'selected' : undefined }, i18n.tribePublic) ), - br(), br(), + isSubEdit ? null : br(), + isSubEdit ? null : br(), label({ for: 'inviteMode' }, i18n.tribeModeLabel), br, select({ name: 'inviteMode', id: 'inviteMode' }, option({ value: 'strict', selected: tribeToEdit.inviteMode === 'strict' ? 'selected' : undefined }, i18n.tribeStrict), option({ value: 'open', selected: tribeToEdit.inviteMode === 'open' ? 'selected' : undefined }, i18n.tribeOpen) ), - br(), br(), - label({ for: 'isLARP' }, i18n.tribeIsLARPLabel), - br, - select({ name: 'isLARP', id: 'isLARP' }, + isSubEdit ? null : br(), + isSubEdit ? null : br(), + isSubEdit ? null : label({ for: 'isLARP' }, i18n.tribeIsLARPLabel), + isSubEdit ? null : br, + isSubEdit ? null : select({ name: 'isLARP', id: 'isLARP' }, option({ value: 'false', selected: tribeToEdit.isLARP !== true ? 'selected' : undefined }, i18n.tribeNo), option({ value: 'true', selected: tribeToEdit.isLARP === true ? 'selected' : undefined }, i18n.tribeYes) ),