From bc00ecf08cfdf8f7b2a5659b50dfdff11c42852c Mon Sep 17 00:00:00 2001 From: openhands Date: Sun, 27 Sep 2026 18:38:58 +0200 Subject: [PATCH] feat(i18n): complete message parity across all 25 locales The admin.studio.nitroCleanup section (102 keys) only existed in en and nl, so 23 locales fell back to English for the entire Nitro Cleanup panel. The referrals and dailyRewards keys were missing from the same 23 locales, and en itself was missing 6 keys that nl had. Add the missing keys to every locale with translations, so all 25 locales now carry the same 6063 keys. --- src/messages/ar.json | 206 ++++++++++++++++++++++++++++++++++++++++-- src/messages/bg.json | 199 +++++++++++++++++++++++++++++++++++++++-- src/messages/cs.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/da.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/de.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/el.json | 201 +++++++++++++++++++++++++++++++++++++++-- src/messages/en.json | 6 ++ src/messages/es.json | 201 +++++++++++++++++++++++++++++++++++++++-- src/messages/fi.json | 206 ++++++++++++++++++++++++++++++++++++++++-- src/messages/fr.json | 201 +++++++++++++++++++++++++++++++++++++++-- src/messages/hr.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/hu.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/it.json | 194 ++++++++++++++++++++++++++++++++++++---- src/messages/ja.json | 206 ++++++++++++++++++++++++++++++++++++++++-- src/messages/no.json | 201 +++++++++++++++++++++++++++++++++++++++-- src/messages/pl.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/pt.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/ro.json | 199 +++++++++++++++++++++++++++++++++++++++-- src/messages/ru.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/sk.json | 203 ++++++++++++++++++++++++++++++++++++++++-- src/messages/sr.json | 207 ++++++++++++++++++++++++++++++++++++++++--- src/messages/sv.json | 205 ++++++++++++++++++++++++++++++++++++++++-- src/messages/tr.json | 201 +++++++++++++++++++++++++++++++++++++++-- src/messages/uk.json | 205 ++++++++++++++++++++++++++++++++++++++++-- 24 files changed, 4483 insertions(+), 182 deletions(-) diff --git a/src/messages/ar.json b/src/messages/ar.json index d314fa26..d5c05619 100644 --- a/src/messages/ar.json +++ b/src/messages/ar.json @@ -175,7 +175,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "الإحالات", + "dailyRewards": "المكافآت اليومية" }, "logs": { "audit": { @@ -1806,7 +1808,8 @@ "saving": "Saving…", "deleteAd": "Delete ad", "cancel": "Cancel" - } + }, + "colId": "المعرف" }, "writeableBoxes": { "title": "Writeable Boxes", @@ -3361,7 +3364,9 @@ "errors": "Errors", "alerts": "Alerts", "toolsGroup": "Tools", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "الإحالات", + "dailyRewards": "المكافآت اليومية" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -4969,6 +4974,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "الإحالات", + "subtitle": "نظام الدعوات", + "referralsToday": "إحالات اليوم", + "referralsTotal": "إجمالي الإحالات", + "invitedTotal": "الدعوات المحتسبة", + "claims": "المكافآت المطالبة بها", + "settings": "إعدادات المكافأة", + "needed": "الإحالات المطلوبة", + "rewardAmount": "مبلغ المكافأة", + "rewardCurrency": "عملة المكافأة", + "blockSameIp": "رفض الإحالات التي تشترك في عنوان IP الحالي للداعي", + "save": "حفظ الإعدادات", + "saving": "جارٍ الحفظ…", + "saved": "تم حفظ إعدادات الإحالة.", + "saveError": "تعذر حفظ إعدادات الإحالة.", + "recent": "الإحالات الأخيرة", + "unavailable": "بيانات الإحالة غير متاحة مؤقتًا.", + "empty": "لا توجد إحالات بعد.", + "inviter": "الداعي", + "invitee": "المستخدم المدعو", + "ip": "عنوان IP", + "date": "التاريخ" + }, + "dailyRewards": { + "title": "مكافآت تسجيل الدخول اليومية", + "subtitle": "جدول مكافآت تسجيل الدخول اليومية", + "enabled": "حالة الميزة", + "yes": "مُفعّلة", + "no": "مُعطّلة", + "scheduleDays": "أيام الجدول", + "claimsToday": "المطالبات اليوم", + "claimsTotal": "إجمالي المطالبات", + "status": "حالة الميزة", + "statusHint": "عند التعطيل، تُخفى بطاقة المكافأة وتُرفض المطالبات الجديدة.", + "disable": "تعطيل", + "enable": "تفعيل", + "schedule": "جدول المكافآت", + "day": "اليوم {day}", + "reward": "المكافأة", + "amount": "المبلغ", + "actions": "إجراءات", + "addDay": "اليوم", + "add": "إضافة يوم", + "save": "حفظ", + "saving": "جارٍ الحفظ…", + "saved": "تم حفظ جدول المكافآت.", + "cancel": "إلغاء", + "edit": "تعديل", + "delete": "حذف", + "created": "تمت إضافة يوم المكافأة.", + "updated": "تم تحديث يوم المكافأة.", + "deleted": "تمت إزالة يوم المكافأة.", + "saveError": "تعذر حفظ يوم المكافأة.", + "deleteError": "تعذر إزالة يوم المكافأة.", + "confirmDeleteTitle": "إزالة يوم المكافأة", + "confirmDeleteBody": "لن يتم منح يوم المكافأة هذا بعد الآن. تبقى المطالبات السابقة مسجلة." } }, "myDashboard": { @@ -5049,8 +5112,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "مكافأتك اليومية جاهزة للمطالبة" + }, + "dailyClaimed": "تم المطالبة بالمكافأة اليومية — أراك غدًا!", + "dailyErrors": { + "already_claimed": "لقد طالبت بالفعل بالمكافأة اليومية اليوم.", + "disabled": "المكافآت اليومية معطلة حاليًا.", + "bad_config": "جدول المكافأة اليومية غير مهيأ بشكل صحيح. اتصل بالطاقم.", + "ratelimit": "محاولات كثيرة جدًا. انتظر لحظة وحاول مرة أخرى.", + "error": "تعذر المطالبة بالمكافأة اليومية. يرجى المحاولة مرة أخرى." + }, + "dailyRewardTitle": "المكافآت اليومية", + "dailyRewardHint": "سجل الدخول كل يوم وطالب بمكافأتك — تنمو السلاسل حتى الأيام الكبيرة.", + "dailyRewardDay": "اليوم {day}", + "dailyRewardStreak": "{count, plural, one {السلسلة: # يوم} other {السلسلة: # أيام}}", + "dailyRewardNextClaim": "المطالبة التالية: {amount} {currency}", + "dailyRewardTomorrow": "غدًا: {amount} {currency}", + "dailyRewardClaim": "المطالبة بالمكافأة اليومية", + "dailyRewardClaimedToday": "تمت المطالبة اليوم — عد غدًا للمكافأة التالية.", + "dailyRewardDisabled": "المكافآت اليومية معطلة حاليًا. يمكنك استكشاف الفندق.", + "dailyRewardUnavailable": "تعذر تحميل جدول المكافأة اليومية. يرجى المحاولة مرة أخرى." }, "error": { "code": "Error", @@ -6045,7 +6127,9 @@ "emailRequired": "Email is required.", "passwordRequired": "Password is required.", "passwordsDontMatch": "Passwords do not match.", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "أبلغ 18+ وأوافق على شرط العمر.", + "invitedBy": "بدعوة من {username}" }, "forgot": { "title": "Reset password", @@ -6479,7 +6563,11 @@ "sprite": "· sprite", "Git": "Git:" } - } + }, + "title": "الحسابات المرتبطة", + "subtitle": "اربط حسابًا اجتماعيًا لتسجيل الدخول بنقرة واحدة", + "connected": "مرتبط", + "unavailable": "غير متاح" }, "toolbar": { "home": "الرئيسية", @@ -6497,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "هناك مسح قيد التشغيل بالفعل — تم الاتصال به.", + "ageUnknown": "العمر غير معروف", + "ageBelow": "< يوم", + "scanButton": "مسح أصول الأثاث", + "scanningAssets": "جارٍ مسح الأصول…", + "cancelButton": "إلغاء", + "deleteSelected": "حذف المحدد ({count})", + "deleting": "جارٍ الحذف…", + "redownloadBroken": "إعادة تنزيل التالفة", + "redownloading": "جارٍ إعادة التنزيل…", + "autoClean": "تنظيف تلقائي للوهمية القديمة", + "cleaning": "جارٍ التنظيف…", + "exportManifest": "تصدير البيان", + "exporting": "جارٍ التصدير…", + "phaseStems": "جارٍ تحميل سيقان الأثاث…", + "phaseReaddir": "جارٍ قراءة دلائل الأصول…", + "phaseValidate": "جارٍ التحقق من حزم .nitro…", + "phaseScanning": "جارٍ المسح…", + "scanProgressFiles": "{count} ملف", + "repairProgress": "ناجح {ok}، فشل {failed}", + "attachedNotice": "يستمر المسح في الخلفية — ستظهر النتائج عند انتهائه.", + "sessionCancelled": "تم إلغاء المسح.", + "onlyOldLabel": "عرض الملفات الأقدم من فقط", + "onlyOldAgeLabel": "الحد الأدنى للعمر بالأيام للعرض", + "onlyOldToggle": "إخفاء الملفات الحديثة", + "daysLabel": "أيام", + "autoAgeLabel": "الحد الأدنى للعمر بالأيام للتنظيف التلقائي", + "loadingResult": "جارٍ تحميل نتيجة المسح…", + "scannedStat": "ملف أصول تم مسحه", + "cachedNotice": "(مخزن مؤقتًا — الدلائل لم تتغير)", + "fakeStat": "nitros وهمية (لا يوجد عنصر مطابق)", + "brokenStat": "nitros تالفة (لا يمكن تحليلها)", + "groupEmpty": "لم يتم العثور على شيء", + "selectedCount": "{count} محدد", + "copiesBadge": "{count} نسخ", + "groupFakeLabel": "nitros وهمية", + "groupFakeDescription": "هذه الملفات لا تطابق أي عنصر في items_base — بقايا أثاث محذوف أو معاد تسميته.", + "groupBrokenLabel": "nitros تالفة", + "groupBrokenDescription": "هذه الملفات تنتمي إلى عنصر ولكن لا يمكن تحليلها كحزمة Nitro صالحة.", + "groupSwfLabel": "ملفات SWF يتيمة", + "groupSwfDescription": "ملفات .swf لا تطابق أي عنصر في items_base.", + "groupIconLabel": "أيقونات يتيمة", + "groupIconDescription": "ملفات أيقونات لا تطابق أي عنصر في items_base.", + "warningText": "حذف .nitro التالفة يترك عنصره في قاعدة البيانات بدون حزمة — يُفضّل إعادة تنزيله، أو ترك تدقيق الكتالوج يحصل عليه لاحقًا. لا تتم إزالة صفوف قاعدة البيانات أبدًا بواسطة هذه الأداة.", + "onlyAssetsTouched": "يتم لمس ملفات الأصول فقط — يبقى FurnitureData.json وصفوف قاعدة البيانات كما هي.", + "emptyHint": "امسح كل دليل أصول الأثاث للعثور على حزم nitro الوهمية والتالفة بالإضافة إلى ملفات SWF والأيقونات اليتيمة. احذفها، أعد تنزيل التالفة، أو نظّف المخلفات القديمة تلقائيًا.", + "noResult": "لا توجد نتيجة مسح بعد — قم بتشغيل مسح أصول الأثاث أولاً.", + "scanFailed": "فشل المسح.", + "confirmDeleteTitle": "حذف {count} ملف (ملفات)؟", + "confirmDeleteDescription": "ستتم إزالة الملفات من كل الدلائل (public + gamedata المعكوسة). لا يتم لمس صفوف قاعدة البيانات أبدًا.", + "confirmDeleteLabel": "حذف", + "confirmRepairTitle": "إعادة تنزيل {count} حزمة .nitro تالفة؟", + "confirmRepairDescription": "سيتم جلب الحزم مرة أخرى من مصادر nitro المهيأة وكتابتها فوق كل الدلائل (public + gamedata المعكوسة).", + "confirmRepairLabel": "إعادة التنزيل", + "confirmAutoCleanTitle": "تنظيف nitros الوهمية الأقدم من {days} يوم (أيام) تلقائيًا؟", + "confirmAutoCleanDescription": "تتم إزالة ملفات .nitro الوهمية فقط (لا يوجد عنصر مطابق) الأقدم من الحد. لا يتم لمس الحزم التالفة والملفات الحديثة أبدًا.", + "confirmAutoCleanLabel": "تنظيف تلقائي", + "toastDeletePartial": "تم حذف {copies} نسخة، ولكن تعذر إزالة بعض الملفات", + "toastDeleteDone": "تم حذف {copies} نسخة ملف ({deleted} ملف)", + "toastRepairDone": "تم إصلاح {count} حزمة .nitro", + "toastRepairFailed": "تعذر الحصول على أي حزمة ({failed} فشل)", + "toastRepairCancelled": "تم إلغاء الإصلاح", + "toastAutoCleanDone": "تم تنظيف {deleted} ملف .nitro وهمي قديم ({copies} نسخ). تم تخطي {recent} حديثة + {broken} تالفة.", + "toastAutoCleanNothing": "لا شيء قديم بما يكفي للإزالة (تم تخطي {recent} حديثة، {broken} تالفة)", + "toastManifestDownload": "تم تنزيل بيان المسح", + "gamedataTitle": "تنظيف بيانات اللعبة", + "gamedataHint": "عاين أولاً: هذا يعيد كتابة FurnitureData.json وFigureMap.json وFigureData.json. على عكس أدوات الأصول أعلاه، يزيل الصفوف التي لا تشير إلى أي شيء — راجع الأعداد قبل تشغيله.", + "gamedataScan": "معاينة بيانات اللعبة", + "gamedataScanning": "جارٍ المسح…", + "gamedataRun": "تشغيل المحدد", + "gamedataRunning": "جارٍ التنظيف…", + "gamedataNoResult": "لا توجد معاينة بعد — امسح ملفات JSON لبيانات اللعبة أولاً.", + "gamedataCount_duplicates": "FurnitureData مكرر", + "gamedataCount_orphans": "FurnitureData يتيمة", + "gamedataCount_figureMap": "مشاكل FigureMap", + "gamedataCount_figureData": "FigureData غير مستخدم", + "gamedataPass_dedupeFurnitureData": "إزالة تكرار FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "يزيل أسماء الفئات المكررة داخل قسم واحد، مع الاحتفاظ بالإدخال ذو أعلى مراجعة.", + "gamedataPass_cleanFurnitureData": "تنظيف FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "يزيل الإدخالات التي لا يوجد لها حزمة .nitro في أي دليل.", + "gamedataPass_cleanFigureMap": "تنظيف FigureMap", + "gamedataPassDesc_cleanFigureMap": "يزيل الأجزاء التي تشير إلى مجموعة مفقودة من FigureData، بالإضافة إلى الأجزاء المكررة تمامًا.", + "gamedataPass_cleanFigureData": "تنظيف FigureData", + "gamedataPassDesc_cleanFigureData": "يزيل المجموعات التي لا يشير إليها أي جزء في FigureMap، ثم اللوحات التي لا يستخدمها أي نوع مجموعة. يجب أن يعمل بعد تنظيف FigureMap.", + "gamedataNothingSelected": "اختر خطوة تنظيف واحدة على الأقل", + "gamedataConfirmTitle": "إعادة كتابة ملفات JSON لبيانات اللعبة؟", + "gamedataConfirmDescription": "ستعمل {passes} خطوة (خطوات) على {duplicates} مجموعة مكررة، {orphans} صف يتيم، {figureMap} مشكلة FigureMap و{figureData} إدخال FigureData غير مستخدم. تتم إزالة الصفوف بدون نسخة احتياطية — لا يمكن التراجع عن هذا.", + "gamedataConfirmLabel": "إعادة كتابة الملفات", + "gamedataDifferingWarning": "يوجد تكرار واحد على الأقل ليس نسخة مطابقة للإدخال الذي سيتم الاحتفاظ به، لذا فإن الصف المحذوف كان يحتوي على بيانات لا يمتلكها الناجي.", + "gamedataCrossSectionNote": "{count} اسم فئة (أسماء فئات) موجود في كل من roomitemtypes وwallitemtypes. يتم الإبلاغ عن هذه فقط — إزالة واحد سيغير نوع العنصر.", + "gamedataToastDone": "أزال تنظيف بيانات اللعبة {removed} صفًا", + "gamedataToastNothing": "بيانات اللعبة كانت نظيفة بالفعل", + "gamedataMaxRemovalsLabel": "أقصى عدد صفوف لكل خطوة", + "gamedataMaxRemovalsHint": "0 يستخدم الافتراضي 500. الخطوة التي ستزيل أكثر تتوقف وتطلب بدلاً من الكتابة.", + "gamedataLimitTitle": "{pass} سيزيل {wouldRemove} صفًا، فوق حد {maxRemovals}.", + "gamedataLimitDescription": "لم تكتب تلك الخطوة شيئًا، لذا الملفات دون تغيير. تحقق من مسارات الأصول أولاً — الدليل الخاطئ يجعل كل صف يبدو يتيمًا. رفع الحد هو تشغيل منفصل ومتعمد.", + "gamedataLimitOverride": "إزالة {wouldRemove} صفًا على أي حال", + "historyTitle": "سجل التنظيف التلقائي", + "historyScheduled": "مجدول", + "historyManual": "يدوي", + "historyEntry": "تمت إزالة {deleted} ({copies} نسخ)؛ تم تخطي {recent} حديثة و{broken} تالفة", + "historyErrors": "{count} أخطاء" + }, "importDiagnostics": { "attempts": "تشخيص الملفات", "preliminary": "فحص أولي للعناوين؛ سيتم التحقق من المحتوى عند الاستيراد.", diff --git a/src/messages/bg.json b/src/messages/bg.json index 27d1ecc0..3660df38 100644 --- a/src/messages/bg.json +++ b/src/messages/bg.json @@ -818,7 +818,7 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Свързани акаунти", - "subtitle": "Свържете социален акаунт, за да можете да влезете с едно щракване", + "subtitle": "Свържете социален акаунт, за да влезнете с едно кликване", "connected": "Свързан", "unavailable": "Недостъпен", "login": { @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Над 18 годишен съм и съгласен с изискването за възраст.", + "invitedBy": "Поканен от {username}" }, "forgot": { "title": "Нулирайте паролата", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Препоръки", + "dailyRewards": "Дневни награди" }, "dashboard": { "title": "Табло за управление", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Препоръки", + "dailyRewards": "Дневни награди" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Препоръки", + "subtitle": "Система за покани", + "referralsToday": "Препоръки днес", + "referralsTotal": "Общо препоръки", + "invitedTotal": "Преброени покани", + "claims": "Изтеглени награди", + "settings": "Настройки на наградата", + "needed": "Необходими препоръки", + "rewardAmount": "Размер на наградата", + "rewardCurrency": "Валута на наградата", + "blockSameIp": "Отхвърляне на препоръки, споделящи текущия IP адрес на поканителя", + "save": "Запазване на настройките", + "saving": "Запазване…", + "saved": "Настройките за препоръки са запазени.", + "saveError": "Настройките за препоръки не можаха да бъдат запазени.", + "recent": "Последни препоръки", + "unavailable": "Данните за препоръки са временно недостъпни.", + "empty": "Все още няма препоръки.", + "inviter": "Поканител", + "invitee": "Поканен потребител", + "ip": "IP адрес", + "date": "Дата" + }, + "dailyRewards": { + "title": "Дневни награди за вход", + "subtitle": "График на дневните награди за вход", + "enabled": "Състояние на функцията", + "yes": "Активна", + "no": "Неактивна", + "scheduleDays": "Дни от графика", + "claimsToday": "Изтегляния днес", + "claimsTotal": "Общо изтегляния", + "status": "Състояние на функцията", + "statusHint": "Когато е деактивирана, картата с награда се скрива и новите изтегляния се отхвърлят.", + "disable": "Деактивиране", + "enable": "Активиране", + "schedule": "График на наградите", + "day": "Ден {day}", + "reward": "Награда", + "amount": "Сума", + "actions": "Действия", + "addDay": "Ден", + "add": "Добавяне на ден", + "save": "Запазване", + "saving": "Запазване…", + "saved": "Графикът на наградите е запазен.", + "cancel": "Отказ", + "edit": "Редактиране", + "delete": "Изтриване", + "created": "Добавен е ден с награда.", + "updated": "Денят с награда е обновен.", + "deleted": "Денят с награда е премахнат.", + "saveError": "Денят с награда не можа да бъде запазен.", + "deleteError": "Денят с награда не можа да бъде премахнат.", + "confirmDeleteTitle": "Премахване на ден с награда", + "confirmDeleteBody": "Този ден с награда вече няма да се дава. Миналите изтегляния остават записани." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Вашата дневна награда е готова за изтегляне" + }, + "dailyClaimed": "Дневната награда е изтеглена — до утре!", + "dailyErrors": { + "already_claimed": "Вече сте изтеглили дневната награда днес.", + "disabled": "Дневните награди са деактивирани в момента.", + "bad_config": "Графикът на дневната награда не е конфигуриран правилно. Свържете се с екипа.", + "ratelimit": "Твърде много опити. Изчакайте малко и опитайте отново.", + "error": "Дневната награда не можа да бъде изтеглена. Моля, опитайте отново." + }, + "dailyRewardTitle": "Дневни награди", + "dailyRewardHint": "Влизвайте всеки ден и изтегляйте наградата си — серията расте до големите дни.", + "dailyRewardDay": "Ден {day}", + "dailyRewardStreak": "{count, plural, one {Серия: # ден} other {Серия: # дни}}", + "dailyRewardNextClaim": "Следващо изтегляне: {amount} {currency}", + "dailyRewardTomorrow": "Утре: {amount} {currency}", + "dailyRewardClaim": "Изтегляне на дневна награда", + "dailyRewardClaimedToday": "Изтеглено днес — върнете се утре за следващата награда.", + "dailyRewardDisabled": "Дневните награди са деактивирани в момента. Можете да разгледате хотела.", + "dailyRewardUnavailable": "Графикът на дневната награда не можа да бъде зареден. Моля, опитайте отново." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Сканиране вече е в ход — прикачено към него.", + "ageUnknown": "възрастта е неизвестна", + "ageBelow": "< 1д", + "scanButton": "Сканиране на мебелни активи", + "scanningAssets": "Сканиране на активите…", + "cancelButton": "Отказ", + "deleteSelected": "Изтриване на избраните ({count})", + "deleting": "Изтриване…", + "redownloadBroken": "Изтегляне на повредените отново", + "redownloading": "Повторно изтегляне…", + "autoClean": "Автоматично почистване на старите фалшиви", + "cleaning": "Почистване…", + "exportManifest": "Експортиране на манифест", + "exporting": "Експортиране…", + "phaseStems": "Зареждане на мебелните стебла…", + "phaseReaddir": "Четене на директориите на активите…", + "phaseValidate": "Проверка на .nitro пакети…", + "phaseScanning": "Сканиране…", + "scanProgressFiles": "{count} файла", + "repairProgress": "успешни {ok}, неуспешни {failed}", + "attachedNotice": "Сканирането продължава във фонов режим — резултатите ще се появят при приключване.", + "sessionCancelled": "Сканирането е отменено.", + "onlyOldLabel": "Показване само на файлове по-стари от", + "onlyOldAgeLabel": "Минимална възраст в дни за показване", + "onlyOldToggle": "Скриване на скорошните файлове", + "daysLabel": "дни", + "autoAgeLabel": "Минимална възраст в дни за автоматично почистване", + "loadingResult": "Зареждане на резултата от сканирането…", + "scannedStat": "сканирани файла с активи", + "cachedNotice": "(кеширано — директориите не са променени)", + "fakeStat": "Фалшиви nitros (без съответстващ елемент)", + "brokenStat": "Повредени nitros (нечетими)", + "groupEmpty": "Нищо не е намерено", + "selectedCount": "{count} избрани", + "copiesBadge": "{count} копия", + "groupFakeLabel": "Фалшиви nitros", + "groupFakeDescription": "Тези файлове не съответстват на нито един елемент в items_base — остатъци от изтрити или преименувани мебели.", + "groupBrokenLabel": "Повредени nitros", + "groupBrokenDescription": "Тези файлове принадлежат на елемент, но не могат да бъдат разбрани като валиден Nitro пакет.", + "groupSwfLabel": "Осиротели SWF файлове", + "groupSwfDescription": ".swf файлове, които не съответстват на нито един елемент в items_base.", + "groupIconLabel": "Осиротели икони", + "groupIconDescription": "Файлове с икони, които не съответстват на нито един елемент в items_base.", + "warningText": "Изтриването на повреден .nitro оставя елемента в базата данни без пакет — предпочетете повторно изтегляне или оставете одитът на каталога да го вземе по-късно. Редовете в базата данни никога не се премахват от този инструмент.", + "onlyAssetsTouched": "Само файловете с активи се променят — FurnitureData.json и редовете в базата данни остават непроменени.", + "emptyHint": "Сканирайте всяка директория с мебели, за да намерите фалшиви и повредени nitro пакети плюс осиротели SWF файлове и икони. Изтрийте ги, изтеглете отново повредените или почистете автоматично старите остатъци.", + "noResult": "Все още няма резултат от сканиране — първо стартирайте сканиране на мебелни активи.", + "scanFailed": "Сканирането не бе успешно.", + "confirmDeleteTitle": "Изтриване на {count} файл (файла)?", + "confirmDeleteDescription": "Файловете ще бъдат премахнати от всяка директория (public + огледални gamedata). Редовете в базата данни никога не се променят.", + "confirmDeleteLabel": "Изтриване", + "confirmRepairTitle": "Изтегляне отново на {count} повреден(и) .nitro пакет(а)?", + "confirmRepairDescription": "Пакетите ще бъдат изтеглени отново от конфигурираните nitro източници и записани върху всяка директория (public + огледални gamedata).", + "confirmRepairLabel": "Изтегляне отново", + "confirmAutoCleanTitle": "Автоматично почистване на фалшиви nitros по-стари от {days} ден (дни)?", + "confirmAutoCleanDescription": "Премахват се само фалшиви .nitro файлове (без съответстващ елемент) по-стари от прага. Повредените пакети и скорошните файлове никога не се променят.", + "confirmAutoCleanLabel": "Автоматично почистване", + "toastDeletePartial": "Изтрити са {copies} копия, но някои файлове не можаха да бъдат премахнати", + "toastDeleteDone": "Изтрити са {copies} копия на файлове ({deleted} файла)", + "toastRepairDone": "Поправени са {count} .nitro пакета", + "toastRepairFailed": "Нито един пакет не можа да бъде получен ({failed} неуспешни)", + "toastRepairCancelled": "Поправката е отменена", + "toastAutoCleanDone": "Почистени са {deleted} стари фалшиви .nitro файла ({copies} копия). Пропуснати са {recent} скорошни + {broken} повредени.", + "toastAutoCleanNothing": "Няма нищо достатъчно старо за премахване (пропуснати {recent} скорошни, {broken} повредени)", + "toastManifestDownload": "Манифестът на сканирането е изтеглен", + "gamedataTitle": "Почистване на игровите данни", + "gamedataHint": "Първо прегледайте: това презаписва FurnitureData.json, FigureMap.json и FigureData.json. За разлика от инструментите за активи по-горе, премахва редове, които не сочат към нищо — прегледайте брояките преди да стартирате.", + "gamedataScan": "Преглед на игровите данни", + "gamedataScanning": "Сканиране…", + "gamedataRun": "Стартиране на избраните", + "gamedataRunning": "Почистване…", + "gamedataNoResult": "Все още няма преглед — първо сканирайте JSON файловете с игрови данни.", + "gamedataCount_duplicates": "Дублиран FurnitureData", + "gamedataCount_orphans": "Oсиротели FurnitureData", + "gamedataCount_figureMap": "Проблеми с FigureMap", + "gamedataCount_figureData": "Неизползван FigureData", + "gamedataPass_dedupeFurnitureData": "Дедупликация на FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Премахва повторени classnames в една секция, като запазва записа с най-висока ревизия.", + "gamedataPass_cleanFurnitureData": "Почистване на FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Премахва записите, на които няма .nitro пакет в нито една директория.", + "gamedataPass_cleanFigureMap": "Почистване на FigureMap", + "gamedataPassDesc_cleanFigureMap": "Премахва частите, сочещи към липсващ набор от FigureData, плюс точно дублирани части.", + "gamedataPass_cleanFigureData": "Почистване на FigureData", + "gamedataPassDesc_cleanFigureData": "Премахва наборите, които нито една част от FigureMap не сочи, след това палитрите, които нито един тип набор не използва. Трябва да се стартира след Почистване на FigureMap.", + "gamedataNothingSelected": "Изберете поне една стъпка за почистване", + "gamedataConfirmTitle": "Презаписване на JSON файловете с игрови данни?", + "gamedataConfirmDescription": "{passes} стъпка (стъпки) ще се изпълни срещу {duplicates} дублирани групи, {orphans} осиротели реда, {figureMap} проблема с FigureMap и {figureData} неизползвани записи в FigureData. Редовете се премахват без резервно копие — това не може да бъде отменено.", + "gamedataConfirmLabel": "Презаписване на файловете", + "gamedataDifferingWarning": "Поне едно дублиране не е точно копие на записа, който се запазва, така че изтритият ред е съдържал данни, които целевият няма.", + "gamedataCrossSectionNote": "{count} classname (classnames) съществуват и в roomitemtypes, и в wallitemtypes. Те се докладват само — премахването на едно ще промени типа на елемента.", + "gamedataToastDone": "Почистването на игровите данни премахна {removed} реда", + "gamedataToastNothing": "Игровите данни вече бяха чисти", + "gamedataMaxRemovalsLabel": "Макс. реда на стъпка", + "gamedataMaxRemovalsHint": "0 използва стандартната стойност 500. Стъпката, която би премахнала повече, спира и пита вместо да пише.", + "gamedataLimitTitle": "{pass} би премахнал {wouldRemove} реда, над лимита от {maxRemovals}.", + "gamedataLimitDescription": "Тази стъпка нищо не е записала, така че файловете са непроменени. Първо проверете пътищата до активите — грешна директория прави всеки ред осиротял. Вдигането на лимита е отделно, умишлено изпълнение.", + "gamedataLimitOverride": "Премахване на {wouldRemove} реда все пак", + "historyTitle": "История на автоматичното почистване", + "historyScheduled": "по график", + "historyManual": "ръчно", + "historyEntry": "Премахнати {deleted} ({copies} копия); пропуснати {recent} скорошни и {broken} повредени", + "historyErrors": "{count} грешки" + }, "importDiagnostics": { "attempts": "Диагностика на файловете", "preliminary": "Предварителна проверка на адресите; съдържанието се проверява при импортиране.", diff --git a/src/messages/cs.json b/src/messages/cs.json index 6458d4b0..c1a55ec5 100644 --- a/src/messages/cs.json +++ b/src/messages/cs.json @@ -818,9 +818,9 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Propojené účty", - "subtitle": "Propojte sociální účet, abyste se mohli přihlásit jedním kliknutím", - "connected": "Připojeno", - "unavailable": "Není k dispozici", + "subtitle": "Propojte sociální účet a přihlaste se jedním kliknutím", + "connected": "Propojeno", + "unavailable": "Nedostupné", "login": { "title": "Přihlaste se", "subtitle": "Vítejte zpět – přihlaste se pro vstup do hotelu.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Je mi 18+ a souhlasím s věkovým požadavkem.", + "invitedBy": "Pozván uživatelem {username}" }, "forgot": { "title": "Obnovit heslo", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Doporučení", + "dailyRewards": "Denní odměny" }, "dashboard": { "title": "Dashboard", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Doporučení", + "dailyRewards": "Denní odměny" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Doporučení", + "subtitle": "Systém pozvánek", + "referralsToday": "Doporučení dnes", + "referralsTotal": "Celkem doporučení", + "invitedTotal": "Spočítané pozvánky", + "claims": "Vyzvednuté odměny", + "settings": "Nastavení odměny", + "needed": "Potřebná doporučení", + "rewardAmount": "Výše odměny", + "rewardCurrency": "Měna odměny", + "blockSameIp": "Odmítnout doporučení sdílející aktuální IP adresu zvatele", + "save": "Uložit nastavení", + "saving": "Ukládání…", + "saved": "Nastavení doporučení bylo uloženo.", + "saveError": "Nastavení doporučení se nepodařilo uložit.", + "recent": "Nedávná doporučení", + "unavailable": "Data o doporučeních jsou dočasně nedostupná.", + "empty": "Zatím žádná doporučení.", + "inviter": "Zvatele", + "invitee": "Pozvaný uživatel", + "ip": "IP adresa", + "date": "Datum" + }, + "dailyRewards": { + "title": "Denní odměny za přihlášení", + "subtitle": "Plán denních odměn za přihlášení", + "enabled": "Stav funkce", + "yes": "Povoleno", + "no": "Zakázáno", + "scheduleDays": "Dny plánu", + "claimsToday": "Vyzvednutí dnes", + "claimsTotal": "Celkem vyzvednutí", + "status": "Stav funkce", + "statusHint": "Při zakázání se karta odměny skryje a nová vyzvednutí budou odmítnuta.", + "disable": "Zakázat", + "enable": "Povolit", + "schedule": "Plán odměn", + "day": "Den {day}", + "reward": "Odměna", + "amount": "Částka", + "actions": "Akce", + "addDay": "Den", + "add": "Přidat den", + "save": "Uložit", + "saving": "Ukládání…", + "saved": "Plán odměn byl uložen.", + "cancel": "Zrušit", + "edit": "Upravit", + "delete": "Smazat", + "created": "Den odměny byl přidán.", + "updated": "Den odměny byl aktualizován.", + "deleted": "Den odměny byl odstraněn.", + "saveError": "Den odměny se nepodařilo uložit.", + "deleteError": "Den odměny se nepodařilo odstranit.", + "confirmDeleteTitle": "Odstranit den odměny", + "confirmDeleteBody": "Tento den odměny již nebude udělen. Minulá vyzvednutí zůstávají zaznamenána." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Vaše denní odměna je připravena k vyzvednutí" + }, + "dailyClaimed": "Denní odměna vyzvednuta — zítra se uvidíme!", + "dailyErrors": { + "already_claimed": "Dnešní denní odměnu jste již vyzvedli.", + "disabled": "Denní odměny jsou momentálně zakázány.", + "bad_config": "Plán denní odměny není správně nakonfigurovaný. Kontaktujte personál.", + "ratelimit": "Příliš mnoho pokusů. Počkejte chvíli a zkuste to znovu.", + "error": "Denní odměnu se nepodařilo vyzvednout. Zkuste to prosím znovu." + }, + "dailyRewardTitle": "Denní odměny", + "dailyRewardHint": "Přihlašte se každý den a vyzvedněte si odměnu — série rostou až do velkých dnů.", + "dailyRewardDay": "Den {day}", + "dailyRewardStreak": "{count, plural, one {Série: # den} few {Série: # dny} other {Série: # dnů}}", + "dailyRewardNextClaim": "Další vyzvednutí: {amount} {currency}", + "dailyRewardTomorrow": "Zítra: {amount} {currency}", + "dailyRewardClaim": "Vyzvednout denní odměnu", + "dailyRewardClaimedToday": "Vyzvednuto dnes — vraťte se zítra pro další odměnu.", + "dailyRewardDisabled": "Denní odměny jsou momentálně zakázány. Můžete prozkoumat hotel.", + "dailyRewardUnavailable": "Plán denní odměny se nepodařilo načíst. Zkuste to prosím znovu." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Skenování již běží — připojeno k němu.", + "ageUnknown": "věk neznámý", + "ageBelow": "< 1d", + "scanButton": "Skenovat nábytek", + "scanningAssets": "Skenování aktiv…", + "cancelButton": "Zrušit", + "deleteSelected": "Smazat vybrané ({count})", + "deleting": "Mazání…", + "redownloadBroken": "Stáhnout poškozené znovu", + "redownloading": "Opětovné stahování…", + "autoClean": "Automatické čištění starých falešných", + "cleaning": "Čištění…", + "exportManifest": "Exportovat manifest", + "exporting": "Exportování…", + "phaseStems": "Načítání stonků nábytku…", + "phaseReaddir": "Čtení adresářů aktiv…", + "phaseValidate": "Ověřování balíčků .nitro…", + "phaseScanning": "Skenování…", + "scanProgressFiles": "{count} souborů", + "repairProgress": "ok {ok}, selhalo {failed}", + "attachedNotice": "Skenování pokračuje na pozadí — výsledky se zobrazí po dokončení.", + "sessionCancelled": "Skenování zrušeno.", + "onlyOldLabel": "Zobrazit pouze soubory starší než", + "onlyOldAgeLabel": "Minimální věk ve dnech pro zobrazení", + "onlyOldToggle": "Skrýt nedávné soubory", + "daysLabel": "dny", + "autoAgeLabel": "Minimální věk ve dnech pro automatické čištění", + "loadingResult": "Načítání výsledku skenování…", + "scannedStat": "souborů aktiv skenováno", + "cachedNotice": "(ve vyrovnávací paměti — adresáře se nezměnily)", + "fakeStat": "Falešné nitro (bez odpovídající položky)", + "brokenStat": "Poškozené nitro (nečitelné)", + "groupEmpty": "Nic nenalezeno", + "selectedCount": "vybráno {count}", + "copiesBadge": "{count} kopií", + "groupFakeLabel": "Falešné nitro", + "groupFakeDescription": "Tyto soubory neodpovídají žádné položce v items_base — zbytky po smazaném nebo přejmenovaném nábytku.", + "groupBrokenLabel": "Poškozené nitro", + "groupBrokenDescription": "Tyto soubory patří položce, ale nelze je rozpoznat jako platný Nitro balíček.", + "groupSwfLabel": "Osiřelé SWF soubory", + "groupSwfDescription": "Soubory .swf, které neodpovídají žádné položce v items_base.", + "groupIconLabel": "Osiřelé ikony", + "groupIconDescription": "Soubory ikon, které neodpovídají žádné položce v items_base.", + "warningText": "Smazání poškozeného .nitro zanechá položku v databázi bez balíčku — raději si jej stáhněte znovu, nebo jej nechte získat audit katalogu později. Řádky databazé nikdy nesmaže tento nástroj.", + "onlyAssetsTouched": "Mění se pouze soubory aktiv — FurnitureData.json a řádky databáze zůstávají nedotčeny.", + "emptyHint": "Skenujte každý adresář s nábytkem a najděte falešné a poškozené nitro balíčky plus osiřelé SWF soubory a ikony. Smažte je, stáhněte poškozené znovu nebo automaticky uklidte staré zbytky.", + "noResult": "Zatím žádný výsledek skenování — nejprvě spusťte skenování aktiv nábytku.", + "scanFailed": "Skenování selhalo.", + "confirmDeleteTitle": "Smazat {count} soubor(ů)?", + "confirmDeleteDescription": "Soubory budou odstraněny ze všech adresářů (public + zrcadlená gamedata). Řádky databáze se nikdy nemění.", + "confirmDeleteLabel": "Smazat", + "confirmRepairTitle": "Stáhnout znovu {count} poškozený(ch) .nitro balíček(ů)?", + "confirmRepairDescription": "Balíčky budou znovu staženy z nakonfigurovaných nitro zdrojů a přepsány do všech adresářů (public + zrcadlená gamedata).", + "confirmRepairLabel": "Stáhnout znovu", + "confirmAutoCleanTitle": "Automaticky uklidit falešné nitro starší než {days} dn(ů)?", + "confirmAutoCleanDescription": "Odstraní se pouze falešné .nitro soubory (bez odpovídající položky) starší než prahová hodnota. Poškozené balíčky a nedávné soubory se nikdy nedotknou.", + "confirmAutoCleanLabel": "Automaticky uklidit", + "toastDeletePartial": "Smazáno {copies} kopií, ale některé soubory nelze odstranit", + "toastDeleteDone": "Smazáno {copies} kopií souborů ({deleted} souborů)", + "toastRepairDone": "Opraveno {count} .nitro balíčků", + "toastRepairFailed": "Nepodařilo se získat žádný balíček ({failed} selhalo)", + "toastRepairCancelled": "Oprava zrušena", + "toastAutoCleanDone": "Uklizeno {deleted} starých falešných .nitro souborů ({copies} kopií). Přeskočeno {recent} nedávných + {broken} poškozených.", + "toastAutoCleanNothing": "Nic není dostatečně staré k odstranění (přeskočeno {recent} nedávných, {broken} poškozených)", + "toastManifestDownload": "Manifest skenování stažen", + "gamedataTitle": "Čištění herních dat", + "gamedataHint": "Nejprvě zobrazit náhled: tepíše FurnitureData.json, FigureMap.json a FigureData.json. Na rozdíl od nástrojů výše odstraňuje řádky, které na nic neukazují — zkontrolujte počty před spuštěním.", + "gamedataScan": "Náhled herních dat", + "gamedataScanning": "Skenování…", + "gamedataRun": "Spustit vybrané", + "gamedataRunning": "Čištění…", + "gamedataNoResult": "Zatím žádný náhled — nejprvě naskenujte JSON soubory herních dat.", + "gamedataCount_duplicates": "Duplikáty FurnitureData", + "gamedataCount_orphans": "Osiřelé FurnitureData", + "gamedataCount_figureMap": "Problémy FigureMap", + "gamedataCount_figureData": "Nepoužitý FigureData", + "gamedataPass_dedupeFurnitureData": "Odstranit duplikáty FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Odstraní opakující se classnames v jedné sekci a zachová záznam s nejvyšší revizí.", + "gamedataPass_cleanFurnitureData": "Uklidit FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Odstraní záznamy, pro které neexistuje .nitro balíček v žádném adresáři.", + "gamedataPass_cleanFigureMap": "Uklidit FigureMap", + "gamedataPassDesc_cleanFigureMap": "Odstraní části odkazující na chybějící sadu v FigureData plus přesné duplicitní části.", + "gamedataPass_cleanFigureData": "Uklidit FigureData", + "gamedataPassDesc_cleanFigureData": "Odstraní sady, na které neodkazuje žádná část FigureMap, pak palety, které nepoužívá žádný typ sady. Musí běžet po Uklidit FigureMap.", + "gamedataNothingSelected": "Vyberte alespoň jeden krok čištění", + "gamedataConfirmTitle": "Přepsat JSON soubory herních dat?", + "gamedataConfirmDescription": "{passes} krok(ů) poběží proti {duplicates} duplicitním skupinám, {orphans} osiřelým řádkům, {figureMap} problémům FigureMap a {figureData} nepoužitým záznamům FigureData. Řádky se odstraňují bez zálohy — to nelze vrátit zpět.", + "gamedataConfirmLabel": "Přepsat soubory", + "gamedataDifferingWarning": "Alespoň jeden duplicit není přesná kopie záznamu, který se zachová, takže odstraněný řádek obsahoval data, které zachovaný nemá.", + "gamedataCrossSectionNote": "{count} classname(ů) existuje jak v roomitemtypes, tak ve wallitemtypes. Ty jsou pouze hlášeny — odstranění jednoho změní typ položky.", + "gamedataToastDone": "Čištění herních dat odstranilo {removed} řádků", + "gamedataToastNothing": "Herní data již byla čistá", + "gamedataMaxRemovalsLabel": "Max. řádků na krok", + "gamedataMaxRemovalsHint": "0 používá výchozí hodnotu 500. Krok, který by odstranil více, se zastaví a zeptá se místo zápisu.", + "gamedataLimitTitle": "{pass} by odstranil {wouldRemove} řádků, nad limitem {maxRemovals}.", + "gamedataLimitDescription": "Tento krok nic nezapsal, takže soubory jsou nezměněné. Nejprvě zkontrolujte cesty k aktivům — chybný adresář vytvoří z každého řádku osiřelého. Zvednutí limitu je samostatné, záměrné spuštění.", + "gamedataLimitOverride": "Přesto odstranit {wouldRemove} řádků", + "historyTitle": "Historie automatického čištění", + "historyScheduled": "naplánováno", + "historyManual": "ručně", + "historyEntry": "Odstraněno {deleted} ({copies} kopií); přeskočeno {recent} nedávných a {broken} poškozených", + "historyErrors": "{count} chyb" + }, "importDiagnostics": { "attempts": "Diagnostika souborů", "preliminary": "Předběžná kontrola adres; obsah se ověří při importu.", diff --git a/src/messages/da.json b/src/messages/da.json index c9731ac8..1d83abb7 100644 --- a/src/messages/da.json +++ b/src/messages/da.json @@ -817,9 +817,9 @@ "enable": "Aktiver 2FA", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Tilknyttede konti", - "subtitle": "Link en social konto, så du kan logge ind med et enkelt klik", - "connected": "Forbundet", + "title": "Linkede konti", + "subtitle": "Link en social konto, så du kan logge med et klik", + "connected": "Linket", "unavailable": "Ikke tilgængelig", "login": { "title": "Log ind", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Jeg er 18+ og accepterer alderskravet.", + "invitedBy": "Inviteret af {username}" }, "forgot": { "title": "Nulstil adgangskode", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Henvisninger", + "dailyRewards": "Daglige belønninger" }, "dashboard": { "title": "Dashboard", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Henvisninger", + "dailyRewards": "Daglige belønninger" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Henvisninger", + "subtitle": "Invitationssystem", + "referralsToday": "Henvisninger i dag", + "referralsTotal": "Samlede henvisninger", + "invitedTotal": "Inviterede talt op", + "claims": "Belønninger hævet", + "settings": "Belønningsindstillinger", + "needed": "Nødvendige henvisninger", + "rewardAmount": "Belønningsbeløb", + "rewardCurrency": "Belønningsvaluta", + "blockSameIp": "Afvis henvisninger, der deler invitererens nuværende IP", + "save": "Gem indstillinger", + "saving": "Gemmer…", + "saved": "Henvisningsindstillinger gemt.", + "saveError": "Henvisningsindstillinger kunne ikke gemmes.", + "recent": "Seneste henvisninger", + "unavailable": "Henvisningsdata er midlertidigt utilgængelig.", + "empty": "Ingen henvisninger endnu.", + "inviter": "Inviterer", + "invitee": "Inviteret bruger", + "ip": "IP", + "date": "Dato" + }, + "dailyRewards": { + "title": "Daglige login-belønninger", + "subtitle": "Daglig login-belønningsplan", + "enabled": "Funktionsstatus", + "yes": "Aktiveret", + "no": "Deaktiveret", + "scheduleDays": "Planens dage", + "claimsToday": "Hævninger i dag", + "claimsTotal": "Samlede hævninger", + "status": "Funktionsstatus", + "statusHint": "Når deaktiveret, skjules belønningkortet og nye hævninger afvises.", + "disable": "Deaktiver", + "enable": "Aktiver", + "schedule": "Belønningsplan", + "day": "Dag {day}", + "reward": "Belønning", + "amount": "Beløb", + "actions": "Handlinger", + "addDay": "Dag", + "add": "Tilføj dag", + "save": "Gem", + "saving": "Gemmer…", + "saved": "Belønningsplan gemt.", + "cancel": "Annuller", + "edit": "Rediger", + "delete": "Slet", + "created": "Belønningsdag tilføjet.", + "updated": "Belønningsdag opdateret.", + "deleted": "Belønningsdag fjernet.", + "saveError": "Belønningsdag kunne ikke gemmes.", + "deleteError": "Belønningsdag kunne ikke fjernes.", + "confirmDeleteTitle": "Fjern belønningsdag", + "confirmDeleteBody": "Denne belønningsdag vil ikke længere blive givet. Tidligere hævninger forbliver registreret." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Din daglige belønning er klar til at blive hævet" + }, + "dailyClaimed": "Daglig belønning hævet — ses i morgen!", + "dailyErrors": { + "already_claimed": "Du har allerede hævet dagens daglige belønning.", + "disabled": "Daglige belønninger er deaktiveret i øjeblikket.", + "bad_config": "Den daglige belønningsplan er ikke konfigureret korrekt. Kontakt personalet.", + "ratelimit": "For mange forsøg. Vent et øjeblik og prøv igen.", + "error": "Den daglige belønning kunne ikke hæves. Prøv venligst igen." + }, + "dailyRewardTitle": "Daglige belønninger", + "dailyRewardHint": "Log ind hver dag og hæv din belønning — serier vokser indtil de store dage.", + "dailyRewardDay": "Dag {day}", + "dailyRewardStreak": "{count, plural, one {Serie: # dag} other {Serie: # dage}}", + "dailyRewardNextClaim": "Næste hævning: {amount} {currency}", + "dailyRewardTomorrow": "I morgen: {amount} {currency}", + "dailyRewardClaim": "Hæv daglig belønning", + "dailyRewardClaimedToday": "Hævet i dag — kom tilbage i morgen for den næste belønning.", + "dailyRewardDisabled": "Daglige belønninger er deaktiveret i øjeblikket. Du kan udforske hotellet.", + "dailyRewardUnavailable": "Den daglige belønningsplan kunne ikke indlæses. Prøv venligst igen." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "En scan kører allerede — tilsluttet den.", + "ageUnknown": "alder ukendt", + "ageBelow": "< 1d", + "scanButton": "Scan møbelaktiver", + "scanningAssets": "Scanner aktiver…", + "cancelButton": "Annuller", + "deleteSelected": "Slet valgte ({count})", + "deleting": "Sletter…", + "redownloadBroken": "Download beskadigede igen", + "redownloading": "Downloader igen…", + "autoClean": "Ryd automatisk gamle falske", + "cleaning": "Rydder op…", + "exportManifest": "Eksportér manifest", + "exporting": "Eksporterer…", + "phaseStems": "Indlæser møbelstammer…", + "phaseReaddir": "Læser aktiverkataloger…", + "phaseValidate": "Validerer .nitro-pakker…", + "phaseScanning": "Scanner…", + "scanProgressFiles": "{count} filer", + "repairProgress": "ok {ok}, fejlede {failed}", + "attachedNotice": "Scan fortsætter i baggrunden — resultaterne vises, når den er færdig.", + "sessionCancelled": "Scan annulleret.", + "onlyOldLabel": "Vis kun filer ældre end", + "onlyOldAgeLabel": "Mindste alder i dage for visning", + "onlyOldToggle": "Skjul nylige filer", + "daysLabel": "dage", + "autoAgeLabel": "Mindste alder i dage for automatisk oprydning", + "loadingResult": "Indlæser scanresultat…", + "scannedStat": "aktiver-filer scannet", + "cachedNotice": "(cachet — katalogerne er uændrede)", + "fakeStat": "Falske nitro (intet matchende element)", + "brokenStat": "Beskadigede nitro (kan ikke parses)", + "groupEmpty": "Intet fundet", + "selectedCount": "{count} valgt", + "copiesBadge": "{count} kopier", + "groupFakeLabel": "Falske nitro", + "groupFakeDescription": "Disse filer matcher intet element i items_base — rester fra slettede eller omdøbte møbler.", + "groupBrokenLabel": "Beskadigede nitro", + "groupBrokenDescription": "Disse filer tilhører et element, men kan ikke parses som en gyldig Nitro-pakke.", + "groupSwfLabel": "Forældreløse SWF-filer", + "groupSwfDescription": ".swf-filer, der matcher intet element i items_base.", + "groupIconLabel": "Forældreløse ikoner", + "groupIconDescription": "Ikonfiler, der matcher intet element i items_base.", + "warningText": "Hvis du sletter en beskadiget .nitro, forbliver elementet i databasen uden pakke — overvej at downloade den igen, eller lad katalogrevisionen finde den senere. Database-rækker fjernes aldrig af dette værktøj.", + "onlyAssetsTouched": "Kun aktiver-filer berøres — FurnitureData.json og database-rækker forbliver intakte.", + "emptyHint": "Scan hvert møbelaktiver-katalog for at finde falske og beskadigede nitro-pakker samt forældreløse SWF-filer og ikoner. Slet dem, download de beskadigede igen eller ryd automatisk gamle rester op.", + "noResult": "Endnu intet scanresultat — kør en møbelaktiver-scan først.", + "scanFailed": "Scanningen fejlede.", + "confirmDeleteTitle": "Slet {count} fil(er)?", + "confirmDeleteDescription": "Filerne fjernes fra alle kataloger (public + spejlede gamedata). Database-rækker berøres aldrig.", + "confirmDeleteLabel": "Slet", + "confirmRepairTitle": "Download {count} beskadiget(ede) .nitro-pakke(r) igen?", + "confirmRepairDescription": "Pakkerne hentes igen fra de konfigurerede nitro-kilder og skrives over alle kataloger (public + spejlede gamedata).", + "confirmRepairLabel": "Download igen", + "confirmAutoCleanTitle": "Ryd automatisk falske nitro ældre end {days} dag(e)?", + "confirmAutoCleanDescription": "Kun falske .nitro-filer (intet matchende element) ældre end tærsklen fjernes. Beskadigede pakker og nylige filer berøres aldrig.", + "confirmAutoCleanLabel": "Ryd automatisk", + "toastDeletePartial": "Slettede {copies} kopier, men nogle filer kunne ikke fjernes", + "toastDeleteDone": "Slettede {copies} filkopier ({deleted} filer)", + "toastRepairDone": "Reparerede {count} .nitro-pakker", + "toastRepairFailed": "Kunne ikke finde nogen pakke ({failed} fejlede)", + "toastRepairCancelled": "Reparation annulleret", + "toastAutoCleanDone": "Ryddede {deleted} gamle falske .nitro-filer op ({copies} kopier). Sprang {recent} nylige + {broken} beskadigede over.", + "toastAutoCleanNothing": "Intet gammelt nok til at fjernes (sprang {recent} nylige, {broken} beskadigede over)", + "toastManifestDownload": "Scanmanifest downloadet", + "gamedataTitle": "Oprydnig af spilledata", + "gamedataHint": "Vis forhåndsvisning først: dette omskriver FurnitureData.json, FigureMap.json og FigureData.json. I modsætning til aktiver-værktøjene ovenfor fjerner det rækker, der ikke refererer til noget — gennemgå tællingerne før du kører det.", + "gamedataScan": "Forhåndsvis spilledata", + "gamedataScanning": "Scanner…", + "gamedataRun": "Kør valgte", + "gamedataRunning": "Rydder op…", + "gamedataNoResult": "Ingen forhåndsvisning endnu — scan JSON-filerne for spilledata først.", + "gamedataCount_duplicates": "FurnitureData-dubletter", + "gamedataCount_orphans": "FurnitureData-forældreløse", + "gamedataCount_figureMap": "FigureMap-problemer", + "gamedataCount_figureData": "Ubrugt FigureData", + "gamedataPass_dedupeFurnitureData": "Fjern dubletter i FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Fjerner gentagne classnames i én sektion og beholde posten med den højeste revision.", + "gamedataPass_cleanFurnitureData": "Ryd FurnitureData op", + "gamedataPassDesc_cleanFurnitureData": "Fjerner postere, hvor der ikke findes en .nitro-pakke i noget katalog.", + "gamedataPass_cleanFigureMap": "Ryd FigureMap op", + "gamedataPassDesc_cleanFigureMap": "Fjerner dele, der peger på en manglende sæt i FigureData, plus nøjagtige dubletter.", + "gamedataPass_cleanFigureData": "Ryd FigureData op", + "gamedataPassDesc_cleanFigureData": "Fjerner sæt, som ingen FigureMap-del refererer til, derefter paletter, som ingen sæt-type bruger. Skal køre efter Ryd FigureMap op.", + "gamedataNothingSelected": "Vælg mindst ét oprydnings Trin", + "gamedataConfirmTitle": "Omskriv JSON-filer for spilledata?", + "gamedataConfirmDescription": "{passes} trin vil køre mod {duplicates} dubletgrupper, {orphans} forældreløse rækker, {figureMap} FigureMap-problemer og {figureData} ubrugte FigureData-poster. Rækker fjernes uden backup — dette kan ikke fortrydes.", + "gamedataConfirmLabel": "Omskriv filer", + "gamedataDifferingWarning": "Mindst ét dublet er ikke en nøjagtig kopi af posten, der beholdes, så den slettede række indeholdt data, som den overlevende ikke har.", + "gamedataCrossSectionNote": "{count} classname(r) findes både i roomitemtypes og wallitemtypes. Disse rapporteres kun — fjerne én ville ændre et elements type.", + "gamedataToastDone": "Oprydning af spilledata fjernede {removed} rækker", + "gamedataToastNothing": "Spilledata var allerede ren", + "gamedataMaxRemovalsLabel": "Maks. rækker pr. trin", + "gamedataMaxRemovalsHint": "0 bruger standardværdien 500. Et trin, der ville fjerne mere, stopper og spørger i stedet for at skrive.", + "gamedataLimitTitle": "{pass} ville fjerne {wouldRemove} rækker, over grænsen på {maxRemovals}.", + "gamedataLimitDescription": "Dette trin skrev intet, så filerne er uændrede. Tjek aktiver-stierne først — en forkert mappe får hver række til at se forældreløs ud. Hæve grænsen er en separat, bevidst kørsel.", + "gamedataLimitOverride": "Fjern alligevel {wouldRemove} rækker", + "historyTitle": "Historik for automatisk oprydning", + "historyScheduled": "planlagt", + "historyManual": "manuelt", + "historyEntry": "Fjernet {deleted} ({copies} kopier); sprang {recent} nylige og {broken} beskadigede over", + "historyErrors": "{count} fejl" + }, "importDiagnostics": { "attempts": "Fildiagnostik", "preliminary": "Foreløbig kontrol af adresser; indholdet valideres under import.", diff --git a/src/messages/de.json b/src/messages/de.json index d4e2a5d6..30ff7516 100644 --- a/src/messages/de.json +++ b/src/messages/de.json @@ -787,9 +787,9 @@ "enable": "2FA aktivieren", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Verbundene Konten", - "subtitle": "Verknüpfe ein Social-Media-Konto, damit du dich mit einem Klick anmelden kannst", - "connected": "Verbunden", + "title": "Verknüpfte Konten", + "subtitle": "Verknüpfe ein soziales Konto, um mit einem Klick anzumelden", + "connected": "Verknüpft", "unavailable": "Nicht verfügbar", "login": { "title": "Anmelden", @@ -852,7 +852,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Ich bin 18+ und stimme der Altersanforderung zu.", + "invitedBy": "Eingeladen von {username}" }, "forgot": { "title": "Passwort zurücksetzen", @@ -1018,7 +1020,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Empfehlungen", + "dailyRewards": "Tägliche Belohnungen" }, "dashboard": { "title": "Dashboard", @@ -4306,7 +4310,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Empfehlungen", + "dailyRewards": "Tägliche Belohnungen" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5813,6 +5819,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Empfehlungen", + "subtitle": "Einladungssystem", + "referralsToday": "Empfehlungen heute", + "referralsTotal": "Empfehlungen gesamt", + "invitedTotal": "Einladungen gezählt", + "claims": "Belohnungen abgeholt", + "settings": "Belohnungseinstellungen", + "needed": "Benötigte Empfehlungen", + "rewardAmount": "Belohnungsbetrag", + "rewardCurrency": "Belohnungswährung", + "blockSameIp": "Empfehlungen mit der aktuellen IP des Einladenden ablehnen", + "save": "Einstellungen speichern", + "saving": "Speichern…", + "saved": "Empfehlungseinstellungen gespeichert.", + "saveError": "Empfehlungseinstellungen konnten nicht gespeichert werden.", + "recent": "Letzte Empfehlungen", + "unavailable": "Empfehlungsdaten sind vorübergehend nicht verfügbar.", + "empty": "Noch keine Empfehlungen.", + "inviter": "Einladender", + "invitee": "Eingeladener Benutzer", + "ip": "IP", + "date": "Datum" + }, + "dailyRewards": { + "title": "Tägliche Login-Belohnungen", + "subtitle": "Täglicher Login-Belohnungsplan", + "enabled": "Funktionsstatus", + "yes": "Aktiviert", + "no": "Deaktiviert", + "scheduleDays": "Planungstage", + "claimsToday": "Abholungen heute", + "claimsTotal": "Abholungen gesamt", + "status": "Funktionsstatus", + "statusHint": "Wenn deaktiviert, wird die Belohnungskarte ausgeblendet und neue Abholungen werden abgelehnt.", + "disable": "Deaktivieren", + "enable": "Aktivieren", + "schedule": "Belohnungsplan", + "day": "Tag {day}", + "reward": "Belohnung", + "amount": "Betrag", + "actions": "Aktionen", + "addDay": "Tag", + "add": "Tag hinzufügen", + "save": "Speichern", + "saving": "Speichern…", + "saved": "Belohnungsplan gespeichert.", + "cancel": "Abbrechen", + "edit": "Bearbeiten", + "delete": "Löschen", + "created": "Belohnungstag hinzugefügt.", + "updated": "Belohnungstag aktualisiert.", + "deleted": "Belohnungstag entfernt.", + "saveError": "Belohnungstag konnte nicht gespeichert werden.", + "deleteError": "Belohnungstag konnte nicht entfernt werden.", + "confirmDeleteTitle": "Belohnungstag entfernen", + "confirmDeleteBody": "Dieser Belohnungstag wird nicht mehr vergeben. Frühere Abholungen bleiben aufgezeichnet." } }, "radioRequests": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Deine tägliche Belohnung ist bereit zur Abholung" + }, + "dailyClaimed": "Tägliche Belohnung abgeholt — bis morgen!", + "dailyErrors": { + "already_claimed": "Du hast die tägliche Belohnung heute bereits abgeholt.", + "disabled": "Tägliche Belohnungen sind derzeit deaktiviert.", + "bad_config": "Der tägliche Belohnungsplan ist nicht richtig konfiguriert. Kontaktiere das Team.", + "ratelimit": "Zu viele Versuche. Warte einen Moment und versuche es erneut.", + "error": "Die tägliche Belohnung konnte nicht abgeholt werden. Bitte versuche es erneut." + }, + "dailyRewardTitle": "Tägliche Belohnungen", + "dailyRewardHint": "Melde dich jeden Tag an und hole deine Belohnung ab — Serien wachsen bis zu den großen Tagen.", + "dailyRewardDay": "Tag {day}", + "dailyRewardStreak": "{count, plural, one {Serie: # Tag} other {Serie: # Tage}}", + "dailyRewardNextClaim": "Nächste Abholung: {amount} {currency}", + "dailyRewardTomorrow": "Morgen: {amount} {currency}", + "dailyRewardClaim": "Tägliche Belohnung abholen", + "dailyRewardClaimedToday": "Heute abgeholt — komm morgen für die nächste Belohnung wieder.", + "dailyRewardDisabled": "Tägliche Belohnungen sind derzeit deaktiviert. Du kannst das Hotel erkunden.", + "dailyRewardUnavailable": "Der tägliche Belohnungsplan konnte nicht geladen werden. Bitte versuche es erneut." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Ein Scan läuft bereits — an ihn angehängt.", + "ageUnknown": "Alter unbekannt", + "ageBelow": "< 1T", + "scanButton": "Möbel-Assets scannen", + "scanningAssets": "Assets werden gescannt…", + "cancelButton": "Abbrechen", + "deleteSelected": "Ausgewählte löschen ({count})", + "deleting": "Löschen…", + "redownloadBroken": "Beschädigte erneut herunterladen", + "redownloading": "Erneutes Herunterladen…", + "autoClean": "Alte Fakes automatisch bereinigen", + "cleaning": "Bereinigen…", + "exportManifest": "Manifest exportieren", + "exporting": "Exportieren…", + "phaseStems": "Möbel-Stämme werden geladen…", + "phaseReaddir": "Asset-Verzeichnisse werden gelesen…", + "phaseValidate": ".nitro-Pakete werden validiert…", + "phaseScanning": "Scannen…", + "scanProgressFiles": "{count} Dateien", + "repairProgress": "ok {ok}, fehlgeschlagen {failed}", + "attachedNotice": "Der Scan läuft im Hintergrund weiter — die Ergebnisse erscheinen, wenn er fertig ist.", + "sessionCancelled": "Scan abgebrochen.", + "onlyOldLabel": "Nur Dateien älter als anzeigen", + "onlyOldAgeLabel": "Mindestalter in Tagen für Anzeige", + "onlyOldToggle": "Aktuelle Dateien ausblenden", + "daysLabel": "Tage", + "autoAgeLabel": "Mindestalter in Tagen für automatische Bereinigung", + "loadingResult": "Scan-Ergebnis wird geladen…", + "scannedStat": "Asset-Dateien gescannt", + "cachedNotice": "(zwischengespeichert — Verzeichnisse unverändert)", + "fakeStat": "Falsche Nitros (kein passendes Element)", + "brokenStat": "Beschädigte Nicht lesbar)", + "groupEmpty": "Nichts gefunden", + "selectedCount": "{count} ausgewählt", + "copiesBadge": "{count} Kopien", + "groupFakeLabel": "Falsche Nitros", + "groupFakeDescription": "Diese Dateien passen zu keinem Element in items_base — Reste von gelöschten oder umbenannten Möbeln.", + "groupBrokenLabel": "Beschädigte Nitros", + "groupBrokenDescription": "Diese Dateien gehören zu einem Element, können aber nicht als gültiges Nitro-Paket gelesen werden.", + "groupSwfLabel": "Verwaiste SWFs", + "groupSwfDescription": ".swf-Dateien, die zu keinem Element in items_base passen.", + "groupIconLabel": "Verwaiste Icons", + "groupIconDescription": "Icon-Dateien, die zu keinem Element in items_base passen.", + "warningText": "Das Löschen eines beschädigten .nitro lässt sein Element in der Datenbank ohne Paket — laden Sie es erneut herunter oder lassen Sie die Katalog-Prüfung es später beschaffen. Datenbankzeilen werden von diesem Werkzeug niemals entfernt.", + "onlyAssetsTouched": "Nur Asset-Dateien werden verändert — FurnitureData.json und Datenbankzeilen bleiben unberührt.", + "emptyHint": "Scannen Sie jedes Möbel-Asset-Verzeichnis, um falsche und beschädigte Nitro-Pakete sowie verwaiste SWFs und Icons zu finden. Löschen Sie sie, laden Sie die Beschädigten erneut herunter oder bereinigen Sie alte Reste automatisch.", + "noResult": "Noch kein Scan-Ergebnis — führen Sie zuerst einen Möbel-Asset-Scan durch.", + "scanFailed": "Der Scan ist fehlgeschlagen.", + "confirmDeleteTitle": "{count} Asset-Datei(en) löschen?", + "confirmDeleteDescription": "Die Dateien werden aus jedem Verzeichnis entfernt (public + gespiegelte gamedata). Datenbankzeilen werden niemals verändert.", + "confirmDeleteLabel": "Löschen", + "confirmRepairTitle": "{count} beschädigte(s) .nitro-Paket(e) erneut herunterladen?", + "confirmRepairDescription": "Die Pakete werden erneut aus den konfigurierten nitro-Quellen abgerufen und in jedem Verzeichnis überschrieben (public + gespiegelte gamedata).", + "confirmRepairLabel": "Erneut herunterladen", + "confirmAutoCleanTitle": "Falsche Nitros älter als {days} Tag(e) automatisch bereinigen?", + "confirmAutoCleanDescription": "Nur falsche .nitro-Dateien (kein passendes Element) älter als der Schwellenwert werden entfernt. Beschädigte Pakete und aktuelle Dateien werden niemals verändert.", + "confirmAutoCleanLabel": "Automatisch bereinigen", + "toastDeletePartial": "{copies} Kopie(n) gelöscht, aber einige Dateien konnten nicht entfernt werden", + "toastDeleteDone": "{copies} Dateikopie(n) gelöscht ({deleted} Datei(en))", + "toastRepairDone": "{count} .nitro-Paket(e) repariert", + "toastRepairFailed": "Kein Paket konnte beschafft werden ({failed} fehlgeschlagen)", + "toastRepairCancelled": "Reparatur abgebrochen", + "toastAutoCleanDone": "{deleted} alte falsche .nitro-Dateien bereinigt ({copies} Kopien). {recent} aktuelle + {broken} beschädigte übersprungen.", + "toastAutoCleanNothing": "Nichts alt genug zum Entfernen ({recent} aktuelle, {broken} beschädigte übersprungen)", + "toastManifestDownload": "Scan-Manifest heruntergeladen", + "gamedataTitle": "Spieldaten bereinigen", + "gamedataHint": "Zuerst Vorschau: Dies überschreibt FurnitureData.json, FigureMap.json und FigureData.json. Anders als die Asset-Werkzeuge oben entfernt es Zeilen, die auf nichts verweisen — prüfen Sie die Zahlen, bevor Sie es ausführen.", + "gamedataScan": "Spieldaten-Vorschau", + "gamedataScanning": "Scannen…", + "gamedataRun": "Ausgewählte ausführen", + "gamedataRunning": "Bereinigen…", + "gamedataNoResult": "Noch keine Vorschau — scannen Sie zuerst die Spieldaten-JSON-Dateien.", + "gamedataCount_duplicates": "FurnitureData-Duplikate", + "gamedataCount_orphans": "FurnitureData-Waisen", + "gamedataCount_figureMap": "FigureMap-Probleme", + "gamedataCount_figureData": "Unbenutztes FigureData", + "gamedataPass_dedupeFurnitureData": "FurnitureData deduplizieren", + "gamedataPassDesc_dedupeFurnitureData": "Entfernt wiederholte classnames innerhalb eines Abschnitts und behält den Eintrag mit der höchsten Revision.", + "gamedataPass_cleanFurnitureData": "FurnitureData bereinigen", + "gamedataPassDesc_cleanFurnitureData": "Entfernt Einträge, deren .nitro-Paket in keinem Verzeichnis vorhanden ist.", + "gamedataPass_cleanFigureMap": "FigureMap bereinigen", + "gamedataPassDesc_cleanFigureMap": "Entfernt Teile, die auf eine fehlende Menge in FigureData verweisen, sowie exakte Duplikate.", + "gamedataPass_cleanFigureData": "FigureData bereinigen", + "gamedataPassDesc_cleanFigureData": "Entfernt Mengen, auf die kein FigureMap-Teil verweist, dann Paletten, die kein Mengentyp verwendet. Muss nach FigureMap bereinigen laufen.", + "gamedataNothingSelected": "Wählen Sie mindestens einen Bereinigungsschritt", + "gamedataConfirmTitle": "Spieldaten-JSON-Dateien überschreiben?", + "gamedataConfirmDescription": "{passes} Schritt(e) laufen gegen {duplicates} Duplikatgruppen, {orphans} Waisenzeilen, {figureMap} FigureMap-Probleme und {figureData} unbenutzte FigureData-Einträge. Zeilen werden ohne Sicherungskopie entfernt — dies kann nicht rückgängig gemacht werden.", + "gamedataConfirmLabel": "Dateien überschreiben", + "gamedataDifferingWarning": "Mindestens ein Duplikat ist keine exakte Kopie des Eintrags, der behalten wird, also enthielt die gelöschte Zeile Daten, die der Überlebende nicht hat.", + "gamedataCrossSectionNote": "{count} classname(s) existieren sowohl in roomitemtypes als auch in wallitemtypes. Diese werden nur gemeldet — eines zu entfernen würde den Typ eines Elements ändern.", + "gamedataToastDone": "Bereinigung der Spieldaten entfernte {removed} Zeile(n)", + "gamedataToastNothing": "Spieldaten waren bereits sauber", + "gamedataMaxRemovalsLabel": "Max. Zeilen pro Schritt", + "gamedataMaxRemovalsHint": "0 verwendet den Standardwert 500. Ein Schritt, der mehr entfernen würde, stoppt und fragt statt zu schreiben.", + "gamedataLimitTitle": "{pass} würde {wouldRemove} Zeile(n) entfernen, über dem Limit von {maxRemovals}.", + "gamedataLimitDescription": "Dieser Schritt hat nichts geschrieben, also sind die Dateien unverändert. Prüfen Sie zuerst die Asset-Pfade — ein falsches Verzeichnis lässt jede Zeile wie eine Waise aussehen. Das Anheben des Limits ist ein separater, bewusster Lauf.", + "gamedataLimitOverride": "{wouldRemove} Zeile(n) trotzdem entfernen", + "historyTitle": "Verlauf der automatischen Bereinigung", + "historyScheduled": "geplant", + "historyManual": "manuell", + "historyEntry": "{deleted} entfernt ({copies} Kopien); {recent} aktuelle und {broken} beschädigte übersprungen", + "historyErrors": "{count} Fehler" + }, "importDiagnostics": { "attempts": "Dateidiagnose", "preliminary": "Vorprüfung der Adressen; der Inhalt wird beim Import geprüft.", diff --git a/src/messages/el.json b/src/messages/el.json index bc0eeb8b..d8b141a1 100644 --- a/src/messages/el.json +++ b/src/messages/el.json @@ -818,8 +818,8 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Συνδεδεμένοι λογαριασμοί", - "subtitle": "Συνδέστε έναν λογαριασμό κοινωνικής δικτύωσης για να μπορείτε να συνδεθείτε με ένα κλικ", - "connected": "Συνδεδεμένος", + "subtitle": "Συνδέστε έναν κοινωνικό λογαριασμό για σύνδεση με ένα κλικ", + "connected": "Συνδεδεμένο", "unavailable": "Μη διαθέσιμο", "login": { "title": "Συνδεθείτε", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Είμαι 18+ και αποδέχομαι την απαίτηση ηλικίας.", + "invitedBy": "Προσκλήθηκε από {username}" }, "forgot": { "title": "Επαναφορά κωδικού πρόσβασης", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Παραπομπές", + "dailyRewards": "Ημερήσιες ανταμοιβές" }, "dashboard": { "title": "Ταμπλό", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Παραπομπές", + "dailyRewards": "Ημερήσιες ανταμοιβές" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Παραπομπές", + "subtitle": "Σύστημα προσκλήσεων", + "referralsToday": "Παραπομπές σήμερα", + "referralsTotal": "Σύνολο παραπομπών", + "invitedTotal": "Μετρημένες προσκλήσεις", + "claims": "Ανταμοιβές που τράβηξαν", + "settings": "Ρυθμίσεις ανταμοιβής", + "needed": "Απαιτούμενες παραπομπές", + "rewardAmount": "Ποσό ανταμοιβής", + "rewardCurrency": "Νόμισμα ανταμοιβής", + "blockSameIp": "Απόρριψη παραπομπών που μοιράζονται την τρέχουσα IP του προσκαλούντος", + "save": "Αποθήκευση ρυθμίσεων", + "saving": "Αποθήκευση…", + "saved": "Οι ρυθμίσεις παραπομπών αποθηκεύτηκαν.", + "saveError": "Οι ρυθμίσεις παραπομπών δεν μπόρεσαν να αποθηκευτούν.", + "recent": "Πρόσφατες παραπομπές", + "unavailable": "Τα δεδομένα παραπομπών είναι προσωρινά μη διαθέσιμα.", + "empty": "Δεν υπάρχουν παραπομπές ακόμη.", + "inviter": "Προσκαλών", + "invitee": "Προσκληθείς χρήστης", + "ip": "IP", + "date": "Ημερομηνία" + }, + "dailyRewards": { + "title": "Ημερήσιες ανταμοιβές σύνδεσης", + "subtitle": "Πρόγραμμα ημερήσιων ανταμοιβών σύνδεσης", + "enabled": "Κατάσταση λειτουργίας", + "yes": "Ενεργοποιημένο", + "no": "Απενεργοποιημένο", + "scheduleDays": "Ημέρες προγράμματος", + "claimsToday": "Τραβήξεις σήμερα", + "claimsTotal": "Σύνολο τραβηγμάτων", + "status": "Κατάσταση λειτουργίας", + "statusHint": "Όταν απενεργοποιηθεί, η κάρτα ανταμοιβής κρύβεται και οι νέες τραβήξεις απορρίπτονται.", + "disable": "Απενεργοποίηση", + "enable": "Ενεργοποίηση", + "schedule": "Πρόγραμμα ανταμοιβών", + "day": "Ημέρα {day}", + "reward": "Ανταμοιβή", + "amount": "Ποσό", + "actions": "Ενέργειες", + "addDay": "Ημέρα", + "add": "Προσθήκη ημέρας", + "save": "Αποθήκευση", + "saving": "Αποθήκευση…", + "saved": "Το πρόγραμμα ανταμοιβών αποθηκεύτηκε.", + "cancel": "Ακύρωση", + "edit": "Επεξεργασία", + "delete": "Διαγραφή", + "created": "Η ημέρα ανταμοιβής προστέθηκε.", + "updated": "Η ημέρα ανταμοιβής ενημερώθηκε.", + "deleted": "Η ημέρα ανταμοιβής αφαιρέθηκε.", + "saveError": "Η ημέρα ανταμοιβής δεν μπόρεσε να αποθηκευτεί.", + "deleteError": "Η ημέρα ανταμοιβής δεν μπόρεσε να αφαιρεθεί.", + "confirmDeleteTitle": "Αφαίρεση ημέρας ανταμοιβής", + "confirmDeleteBody": "Αυτή η ημέρα ανταμοιβής δεν θα δίνεται πια. Οι προηγούμενες τραβήξεις παραμένουν καταγεγραμμένες." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Η ημερήσια ανταμοιβή σου είναι έτοιμη για τράβηγμα" + }, + "dailyClaimed": "Η ημερήσια ανταμοιβή τράβηξε — τα λέμε αύριο!", + "dailyErrors": { + "already_claimed": "Έχεις ήδη τραβήξει τη σημερινή ημερήσια ανταμοιβή.", + "disabled": "Οι ημερήσιες ανταμοιβές είναι απενεργοποιημένες αυτή τη στιγμή.", + "bad_config": "Το πρόγραμμα ημερήσιας ανταμοιβής δεν είναι σωστά ρυθμισμένο. Επικοινώνησε με το προσωπικό.", + "ratelimit": "Πάρα πολλές προσπάθειες. Περίμενε μια στιγμή και δοκίμασε ξανά.", + "error": "Η ημερήσια ανταμοιβή δεν μπόρεσε να τραβηχτεί. Δοκίμασε ξανά παρακαλώ." + }, + "dailyRewardTitle": "Ημερήσιες ανταμοιβές", + "dailyRewardHint": "Συνδέσου κάθε μέρα και τράβα την ανταμοιβή σου — οι σειρές μεγαλώνουν μέχρι τις μεγάλες μέρες.", + "dailyRewardDay": "Ημέρα {day}", + "dailyRewardStreak": "{count, plural, one {Σειρά: # ημέρα} other {Σειρά: # ημέρες}}", + "dailyRewardNextClaim": "Επόμενη τραβήξη: {amount} {currency}", + "dailyRewardTomorrow": "Αύριο: {amount} {currency}", + "dailyRewardClaim": "Τράβα ημερήσια ανταμοιβή", + "dailyRewardClaimedToday": "Τράβηξες σήμερα — γύρνα αύριο για την επόμενη ανταμοιβή.", + "dailyRewardDisabled": "Οι ημερήσιες ανταμοιβές είναι απενεργοποιημένες αυτή τη στιγμή. Μπορείς να εξερευνήσεις το ξενοδοχείο.", + "dailyRewardUnavailable": "Το πρόγραμμα ημερήσιας ανταμοιβής δεν μπόρεσε να φορτωθεί. Δοκίμασε ξανά παρακαλώ." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Μια σάρωση εκτελείται ήδη — συνδέθηκε σε αυτήν.", + "ageUnknown": "ηλικία άγνωστη", + "ageBelow": "< 1η", + "scanButton": "Σάρωση περιουσιών επίπλων", + "scanningAssets": "Σάρωση περιουσιών…", + "cancelButton": "Ακύρωση", + "deleteSelected": "Διαγραφή επιλεγμένων ({count})", + "deleting": "Διαγραφή…", + "redownloadBroken": "Επαναφόρτωση κατεστραμμένων", + "redownloading": "Επαναφόρτωση…", + "autoClean": "Αυτόματος καθαρισμός παλιών ψευδών", + "cleaning": "Καθαρισμός…", + "exportManifest": "Εξαγωγή μανιφέστου", + "exporting": "Εξαγωγή…", + "phaseStems": "Φόρτωση βλαστών επίπλων…", + "phaseReaddir": "Ανάγνωση καταλόγων περιουσιών…", + "phaseValidate": "Επικύρωση πακέτων .nitro…", + "phaseScanning": "Σάρωση…", + "scanProgressFiles": "{count} αρχεία", + "repairProgress": "ok {ok}, απέτυχαν {failed}", + "attachedNotice": "Η σάρωση συνεχίζεται στο παρασκήνιο — τα αποτελέσματα θα εμφανιστούν όταν ολοκληρωθεί.", + "sessionCancelled": "Η σάρωση ακυρώθηκε.", + "onlyOldLabel": "Εμφάνιση μόνο αρχείων παλαιότερων από", + "onlyOldAgeLabel": "Ελάχιστη ηλικία σε ημέρες για εμφάνιση", + "onlyOldToggle": "Απόκρυψη πρόσφατων αρχείων", + "daysLabel": "ημέρες", + "autoAgeLabel": "Ελάχιστη ηλικία σε ημέρες για αυτόματο καθαρισμό", + "loadingResult": "Φόρτωση αποτελέσματος σάρωσης…", + "scannedStat": "αρχεία περιουσιών σαρώθηκαν", + "cachedNotice": "(σε προσωρινή μνήμη — οι κατάλογοι δεν άλλαξαν)", + "fakeStat": "Ψευδή nitro (χωρίς αντίστοιχο στοιχείο)", + "brokenStat": "Κατεστραμμένα nitro (μη αναγνώσιμα)", + "groupEmpty": "Δεν βρέθηκε τίποτα", + "selectedCount": "επιλέχθηκαν {count}", + "copiesBadge": "{count} αντίγραφα", + "groupFakeLabel": "Ψευδή nitro", + "groupFakeDescription": "Αυτά τα αρχεία δεν ταιριάζουν με κανένα στοιχείο στο items_base — υπολείμματα διαγραμμένων ή μετονομασμένων επίπλων.", + "groupBrokenLabel": "Κατεστραμμένα nitro", + "groupBrokenDescription": "Αυτά τα αρχεία ανήκουν σε ένα στοιχείο αλλά δεν μπορούν να αναγνωστούν ως έγκυρο πακέτο Nitro.", + "groupSwfLabel": "Ορφανά SWF", + "groupSwfDescription": "Αρχεία .swf που δεν ταιριάζουν με κανένα στοιχείο στο items_base.", + "groupIconLabel": "Ορφανά εικονίδια", + "groupIconDescription": "Αρχεία εικονιδίων που δεν ταιριάζουν με κανένα στοιχείο στο items_base.", + "warningText": "Η διαγραφή ενός κατεστραμμένου .nitro αφήνει το στοιχείο του στη βάση δεδομένων χωρίς πακέτο — προτιμήστε επαναφόρτωση ή αφήστε τον έλεγχο καταλόγου να το αποκτήσει αργότερα. Οι γραμμές της βάσης δεν αφαιρούνται ποτέ από αυτό το εργαλείο.", + "onlyAssetsTouched": "Αλλάζουν μόνο τα αρχεία περιουσιών — το FurnitureData.json και οι γραμμές της βάσης παραμένουν ανέπαφες.", + "emptyHint": "Σαρώστε κάθε κατάλογο περιουσιών επίπλων για να βρείτε ψευδή και κατεστραμμένα πακέτο nitro καθώς και ορφανά SWF και εικονίδια. Διαγράψτε τα, επαναφορτώστε τα κατεστραμμένα ή καθαρίστε αυτόματα τα παλιά υπολείμματα.", + "noResult": "Κανένα αποτέλεσμα σάρωσης ακόμη — εκτελέστε πρώτα σάρωση περιουσιών επίπλων.", + "scanFailed": "Η σάρωση απέτυχε.", + "confirmDeleteTitle": "Διαγραφή {count} αρχείου(ων);", + "confirmDeleteDescription": "Τα αρχεία θα αφαιρεθούν από κάθε κατάλογο (public + κατοπτρισμένα gamedata). Οι γραμμές της βάσης δεν αλλάζουν ποτέ.", + "confirmDeleteLabel": "Διαγραφή", + "confirmRepairTitle": "Επαναφόρτωση {count} κατεστραμμένου(ων) πακέτου(ων) .nitro;", + "confirmRepairDescription": "Τα πακέτα θα ανακτηθούν ξανά από τις ρυθμισμένες πηγές nitro και θα επικαλύψουν κάθε κατάλογο (public + κατοπτρισμένα gamedata).", + "confirmRepairLabel": "Επαναφόρτωση", + "confirmAutoCleanTitle": "Αυτόματος καθαρισμός ψευδών nitro παλαιότερων από {days} ημέρα(ες);", + "confirmAutoCleanDescription": "Αφαιρούνται μόνο ψευδή αρχεία .nitro (χωρίς αντίστοιχο στοιχείο) παλαιότερα από το όριο. Τα κατεστραμμένα πακέτα και τα πρόσφατα αρχεία δεν αλλάζουν ποτέ.", + "confirmAutoCleanLabel": "Αυτόματος καθαρισμός", + "toastDeletePartial": "Διαγράφηκαν {copies} αντίγραφα, αλλά ορισμένα αρχεία δεν μπόρεσαν να αφαιρεθούν", + "toastDeleteDone": "Διαγράφηκαν {copies} αντίγραφα αρχείων ({deleted} αρχεία)", + "toastRepairDone": "Επιδιορθώθηκαν {count} πακέτα .nitro", + "toastRepairFailed": "Δεν ήταν δυνατή η απόκτηση πακέτου ({failed} απέτυχαν)", + "toastRepairCancelled": "Η επιδιόρθωση ακυρώθηκε", + "toastAutoCleanDone": "Καθαρίστηκαν {deleted} παλιά ψευδή αρχεία .nitro ({copies} αντίγραφα). Παραλείφθηκαν {recent} πρόσφατα + {broken} κατεστραμμένα.", + "toastAutoCleanNothing": "Τίποτα αρκετά παλιό για αφαίρεση (παραλείφθηκαν {recent} πρόσφατα, {broken} κατεστραμμένα)", + "toastManifestDownload": "Το μανιφέστο σάρωσης λήφθηκε", + "gamedataTitle": "Καθαρισμός δεδομένων παιχνιδιού", + "gamedataHint": "Προεπισκόπηση πρώτα: Αυτό ξαναγράφει τα FurnitureData.json, FigureMap.json και FigureData.json. Σε αντίθεση με τα εργαλεία περιουσιών παραπάνω, αφαιρεί γραμμές που δεν αναφέρουν τίποτα — ελέγξτε τους αριθμούς πριν το εκτελέσετε.", + "gamedataScan": "Προεπισκόπηση δεδομένων παιχνιδιού", + "gamedataScanning": "Σάρωση…", + "gamedataRun": "Εκτέλεση επιλεγμένων", + "gamedataRunning": "Καθαρισμός…", + "gamedataNoResult": "Καμία προεπισκόπηση ακόμη — σαρώστε πρώτα τα αρχεία JSON δεδομένων παιχνιδιού.", + "gamedataCount_duplicates": "Διπλότυπα FurnitureData", + "gamedataCount_orphans": "Ορφανά FurnitureData", + "gamedataCount_figureMap": "Προβλήματα FigureMap", + "gamedataCount_figureData": "Αχρησιμοποιητό FigureData", + "gamedataPass_dedupeFurnitureData": "Απομάκρυνση διπλοτύπων FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Αφαιρεί επαναλαμβανόμενα classnames μέσα σε μία ενότητα, διατηρώντας την καταχώρηση με την υψηλότερη αναθεώρηση.", + "gamedataPass_cleanFurnitureData": "Καθαρισμός FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Αφαιρεί καταχωρήσεις των οποίων το πακέτο .nitro λείπει από κάθε κατάλογο.", + "gamedataPass_cleanFigureMap": "Καθαρισμός FigureMap", + "gamedataPassDesc_cleanFigureMap": "Αφαιρεί μέρη που αναφέρονται σε ανύπαρκτο σύνολο στο FigureData, καθώς και ακριβή διπλότυπα.", + "gamedataPass_cleanFigureData": "Καθαρισμός FigureData", + "gamedataPassDesc_cleanFigureData": "Αφαιρεί σύνολα στα οποία δεν αναφέρεται κανένα μέρος FigureMap, έπειτα παλέτες που δεν χρησιμοποιεί κανένας τύπος συνόλου. Πρέπει να εκτελεστεί μετά τον Καθαρισμό FigureMap.", + "gamedataNothingSelected": "Επιλέξτε τουλάχιστον ένα βήμα καθαρισμού", + "gamedataConfirmTitle": "Επανεγγραφή αρχείων JSON δεδομένων παιχνιδιού;", + "gamedataConfirmDescription": "{passes} βήμα(τα) θα εκτελεστούν σε {duplicates} ομάδες διπλοτύπων, {orphans} ορφανές γραμμές, {figureMap} προβλήματα FigureMap και {figureData} αχρησιμοποιητές καταχωρήσεις FigureData. Οι γραμμές αφαιρούνται χωρίς αντίγραφο ασφαλείας — αυτό δεν μπορεί να αναιρεθεί.", + "gamedataConfirmLabel": "Επανεγγραφή αρχείων", + "gamedataDifferingWarning": "Τουλάχιστον ένα διπλότυπο δεν είναι ακριβές αντίγραφο της καταχώρησης που διατηρείται, οπότε η διαγραμμένη γραμμή κρατούσε δεδομένα που δεν έχει ο επιζών.", + "gamedataCrossSectionNote": "{count} classname(s) υπάρχουν τόσο στο roomitemtypes όσο και στο wallitemtypes. Αυτές αναφέρονται μόνο — η αφαίρεση μιας θα άλλαζε τον τύπο ενός στοιχείου.", + "gamedataToastDone": "Ο καθαρισμός δεδομένων παιχνιδιού αφαίρεσε {removed} γραμμές", + "gamedataToastNothing": "Τα δεδομένα παιχνιδιού ήταν ήδη καθαρά", + "gamedataMaxRemovalsLabel": "Μέγ. γραμμές ανά βήμα", + "gamedataMaxRemovalsHint": "Το 0 χρησιμοποιεί την προεπιλογή 500. Ένα βήμα που θα αφαιρούσε περισσότερες σταματά και ρωτά αντί να γράψει.", + "gamedataLimitTitle": "{pass} θα αφαιρούσε {wouldRemove} γραμμές, πάνω από το όριο των {maxRemovals}.", + "gamedataLimitDescription": "Αυτό το βήμα δεν έγραψε τίποτα, οπότε τα αρχεία είναι αμετάβλητα. Ελέγξτε πρώτα τις διαδρομές περιουσιών — ένας λάθος κατάλογος κάνει κάθε γραμμή να φαίνεται ορφανή. Η αύξηση του ορίου είναι ξεχωριστή, σκόπιμη εκτέλεση.", + "gamedataLimitOverride": "Αφαίρεση {wouldRemove} γραμμών ούτως ή άλλως", + "historyTitle": "Ιστορικό αυτόματου καθαρισμού", + "historyScheduled": "προγραμματισμένο", + "historyManual": "χειροκίνητο", + "historyEntry": "Αφαιρέθηκαν {deleted} ({copies} αντίγραφα); παραλείφθηκαν {recent} πρόσφατα και {broken} κατεστραμμένα", + "historyErrors": "{count} σφάλματα" + }, "importDiagnostics": { "attempts": "Διαγνωστικός έλεγχος αρχείων", "preliminary": "Προκαταρκτικός έλεγχος διευθύνσεων· το περιεχόμενο ελέγχεται στην εισαγωγή.", diff --git a/src/messages/en.json b/src/messages/en.json index 43a31968..9504a930 100644 --- a/src/messages/en.json +++ b/src/messages/en.json @@ -57,6 +57,10 @@ } }, "pages": { + "title": "Linked accounts", + "subtitle": "Link a social account so you can log in with one click", + "connected": "Linked", + "unavailable": "Unavailable", "error": { "code": "Error", "title": "Something went wrong", @@ -1026,6 +1030,7 @@ "confirmPasswordPlaceholder": "Repeat password", "selectOutfit": "Select your outfit", "termsAccept": "I am 18+ and accept the {hotel} terms & rules.", + "ageVerified": "I am 18+ and agree to the age requirement.", "accepted": "Accepted & agreed", "showPassword": "Show", "hidePassword": "Hide", @@ -1596,6 +1601,7 @@ }, "ads": { "title": "Advertisements", + "colId": "ID", "subtitle": "Manage hotel advertisements and promotional banners", "newAd": "+ New ad", "edit": "Edit", diff --git a/src/messages/es.json b/src/messages/es.json index 1a0c0c7e..fa6eed16 100644 --- a/src/messages/es.json +++ b/src/messages/es.json @@ -787,9 +787,9 @@ "enable": "Activar 2FA", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Cuentas conectadas", + "title": "Cuentas vinculadas", "subtitle": "Vincula una cuenta social para iniciar sesión con un clic", - "connected": "Conectado", + "connected": "Vinculado", "unavailable": "No disponible", "login": { "title": "Iniciar sesión", @@ -852,7 +852,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Tengo 18+ y acepto el requisito de edad.", + "invitedBy": "Invitado por {username}" }, "forgot": { "title": "Restablecer contraseña", @@ -1018,7 +1020,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Recomendaciones", + "dailyRewards": "Recompensas diarias" }, "dashboard": { "title": "Panel", @@ -4306,7 +4310,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Recomendaciones", + "dailyRewards": "Recompensas diarias" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5813,6 +5819,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Recomendaciones", + "subtitle": "Sistema de invitaciones", + "referralsToday": "Recomendaciones hoy", + "referralsTotal": "Recomendaciones totales", + "invitedTotal": "Invitaciones contadas", + "claims": "Recompensas reclamadas", + "settings": "Configuración de recompensas", + "needed": "Recomendaciones necesarias", + "rewardAmount": "Cantidad de recompensa", + "rewardCurrency": "Moneda de recompensa", + "blockSameIp": "Rechazar recomendaciones que comparten la IP actual del invitador", + "save": "Guardar configuración", + "saving": "Guardando…", + "saved": "Configuración de recomendaciones guardada.", + "saveError": "No se pudo guardar la configuración de recomendaciones.", + "recent": "Recomendaciones recientes", + "unavailable": "Los datos de recomendaciones no están disponibles temporalmente.", + "empty": "Aún no hay recomendaciones.", + "inviter": "Invitador", + "invitee": "Usuario invitado", + "ip": "IP", + "date": "Fecha" + }, + "dailyRewards": { + "title": "Recompensas diarias de inicio de sesión", + "subtitle": "Programa de recompensas diarias de inicio de sesión", + "enabled": "Estado de la función", + "yes": "Activado", + "no": "Desactivado", + "scheduleDays": "Días del programa", + "claimsToday": "Reclamaciones hoy", + "claimsTotal": "Reclamaciones totales", + "status": "Estado de la función", + "statusHint": "Cuando está desactivado, la tarjeta de recompensa se oculta y las nuevas reclamaciones se rechazan.", + "disable": "Desactivar", + "enable": "Activar", + "schedule": "Programa de recompensas", + "day": "Día {day}", + "reward": "Recompensa", + "amount": "Cantidad", + "actions": "Acciones", + "addDay": "Día", + "add": "Añadir día", + "save": "Guardar", + "saving": "Guardando…", + "saved": "Programa de recompensas guardado.", + "cancel": "Cancelar", + "edit": "Editar", + "delete": "Eliminar", + "created": "Día de recompensa añadido.", + "updated": "Día de recompensa actualizado.", + "deleted": "Día de recompensa eliminado.", + "saveError": "No se pudo guardar el día de recompensa.", + "deleteError": "No se pudo eliminar el día de recompensa.", + "confirmDeleteTitle": "Eliminar día de recompensa", + "confirmDeleteBody": "Este día de recompensa ya no se otorgará. Las reclamaciones pasadas permanecen registradas." } }, "radioRequests": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Tu recompensa diaria está lista para reclamar" + }, + "dailyClaimed": "Recompensa diaria reclamada — ¡hasta mañana!", + "dailyErrors": { + "already_claimed": "Ya reclamaste la recompensa diaria de hoy.", + "disabled": "Las recompensas diarias están desactivadas actualmente.", + "bad_config": "El programa de recompensas diarias no está configurado correctamente. Contacta con el personal.", + "ratelimit": "Demasiados intentos. Espera un momento y vuelve a intentarlo.", + "error": "No se pudo reclamar la recompensa diaria. Inténtalo de nuevo." + }, + "dailyRewardTitle": "Recompensas diarias", + "dailyRewardHint": "Inicia sesión cada día y reclama tu recompensa — las rachas crecen hasta los días grandes.", + "dailyRewardDay": "Día {day}", + "dailyRewardStreak": "{count, plural, one {Racha: # día} other {Racha: # días}}", + "dailyRewardNextClaim": "Próxima reclamación: {amount} {currency}", + "dailyRewardTomorrow": "Mañana: {amount} {currency}", + "dailyRewardClaim": "Reclamar recompensa diaria", + "dailyRewardClaimedToday": "Reclamado hoy — vuelve mañana para la próxima recompensa.", + "dailyRewardDisabled": "Las recompensas diarias están desactivadas actualmente. Puedes explorar el hotel.", + "dailyRewardUnavailable": "No se pudo cargar el programa de recompensas diarias. Inténtalo de nuevo." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Ya hay un escaneo en curso — conectado a él.", + "ageUnknown": "edad desconocida", + "ageBelow": "< 1d", + "scanButton": "Escanear activos de muebles", + "scanningAssets": "Escaneando activos…", + "cancelButton": "Cancelar", + "deleteSelected": "Eliminar seleccionados ({count})", + "deleting": "Eliminando…", + "redownloadBroken": "Descargar de nuevo los dañados", + "redownloading": "Descargando de nuevo…", + "autoClean": "Limpiar automáticamente los falsos antiguos", + "cleaning": "Limpiando…", + "exportManifest": "Exportar manifiesto", + "exporting": "Exportando…", + "phaseStems": "Cargando tallos de muebles…", + "phaseReaddir": "Leyendo directorios de activos…", + "phaseValidate": "Validando paquetes .nitro…", + "phaseScanning": "Escaneando…", + "scanProgressFiles": "{count} archivos", + "repairProgress": "ok {ok}, fallidos {failed}", + "attachedNotice": "El escaneo continúa en segundo plano — los resultados aparecerán cuando termine.", + "sessionCancelled": "Escaneo cancelado.", + "onlyOldLabel": "Mostrar solo archivos más antiguos que", + "onlyOldAgeLabel": "Edad mínima en días para mostrar", + "onlyOldToggle": "Ocultar archivos recientes", + "daysLabel": "días", + "autoAgeLabel": "Edad mínima en días para limpieza automática", + "loadingResult": "Cargando resultado del escaneo…", + "scannedStat": "archivos de activos escaneados", + "cachedNotice": "(en caché — los directorios no cambiaron)", + "fakeStat": "Nitros falsos (sin elemento coincidente)", + "brokenStat": "Nitros dañados (no legibles)", + "groupEmpty": "No se encontró nada", + "selectedCount": "{count} seleccionados", + "copiesBadge": "{count} copias", + "groupFakeLabel": "Nitros falsos", + "groupFakeDescription": "Estos archivos no coinciden con ningún elemento en items_base — restos de muebles eliminados o renombrados.", + "groupBrokenLabel": "Nitros dañados", + "groupBrokenDescription": "Estos archivos pertenecen a un elemento pero no se pueden leer como un paquete Nitro válido.", + "groupSwfLabel": "SWFs huérfanos", + "groupSwfDescription": "Archivos .swf que no coinciden con ningún elemento en items_base.", + "groupIconLabel": "Iconos huérfanos", + "groupIconDescription": "Archivos de iconos que no coinciden con ningún elemento en items_base.", + "warningText": "Eliminar un .nitro dañado deja su elemento en la base de datos sin paquete — prefiera descargarlo de nuevo o deje que la auditoría del catálogo lo obtenga más tarde. Las filas de la base de datos nunca se eliminan con esta herramienta.", + "onlyAssetsTouched": "Solo se tocan los archivos de activos — FurnitureData.json y las filas de la base de datos permanecen intactas.", + "emptyHint": "Escanee cada directorio de activos de muebles para encontrar paquetes nitro falsos y dañados además de SWFs e iconos huérfanos. Elimínelos, descargue de nuevo los dañados o limpie automáticamente los restos antiguos.", + "noResult": "Aún no hay resultado de escaneo — ejecute primero un escaneo de activos de muebles.", + "scanFailed": "El escaneo falló.", + "confirmDeleteTitle": "¿Eliminar {count} archivo(s)?", + "confirmDeleteDescription": "Los archivos se eliminarán de todos los directorios (public + gamedata reflejada). Las filas de la base de datos nunca se tocan.", + "confirmDeleteLabel": "Eliminar", + "confirmRepairTitle": "¿Descargar de nuevo {count} paquete(s) .nitro dañado(s)?", + "confirmRepairDescription": "Los paquetes se obtendrán de nuevo de las fuentes nitro configuradas y se escribirán sobre todos los directorios (public + gamedata reflejada).", + "confirmRepairLabel": "Descargar de nuevo", + "confirmAutoCleanTitle": "¿Limpiar automáticamente nitros falsos más antiguos que {days} día(s)?", + "confirmAutoCleanDescription": "Solo se eliminan archivos .nitro falsos (sin elemento coincidente) más antiguos que el umbral. Los paquetes dañados y los archivos recientes nunca se tocan.", + "confirmAutoCleanLabel": "Limpiar automáticamente", + "toastDeletePartial": "Eliminadas {copies} copias, pero algunos archivos no se pudieron eliminar", + "toastDeleteDone": "Eliminadas {copies} copias de archivos ({deleted} archivos)", + "toastRepairDone": "Reparados {count} paquetes .nitro", + "toastRepairFailed": "No se pudo obtener ningún paquete ({failed} fallidos)", + "toastRepairCancelled": "Reparación cancelada", + "toastAutoCleanDone": "Limpiados {deleted} archivos .nitro falsos antiguos ({copies} copias). Omitidos {recent} recientes + {broken} dañados.", + "toastAutoCleanNothing": "Nada lo suficientemente antiguo para eliminar (omitidos {recent} recientes, {broken} dañados)", + "toastManifestDownload": "Manifiesto de escaneo descargado", + "gamedataTitle": "Limpiar datos del juego", + "gamedataHint": "Vista previa primero: esto reescribe FurnitureData.json, FigureMap.json y FigureData.json. A diferencia de las herramientas de activos anteriores, elimina filas que no hacen referencia a nada — revise los recuentos antes de ejecutarlo.", + "gamedataScan": "Vista previa de datos del juego", + "gamedataScanning": "Escaneando…", + "gamedataRun": "Ejecutar seleccionados", + "gamedataRunning": "Limpiando…", + "gamedataNoResult": "Aún no hay vista previa — escanee primero los archivos JSON de datos del juego.", + "gamedataCount_duplicates": "Duplicados de FurnitureData", + "gamedataCount_orphans": "Huérfanos de FurnitureData", + "gamedataCount_figureMap": "Problemas de FigureMap", + "gamedataCount_figureData": "FigureData sin usar", + "gamedataPass_dedupeFurnitureData": "Deduplicar FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Elimina classnames repetidos dentro de una sección, conservando la entrada con la revisión más alta.", + "gamedataPass_cleanFurnitureData": "Limpiar FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Elimina las entradas cuyo paquete .nitro falta en todos los directorios.", + "gamedataPass_cleanFigureMap": "Limpiar FigureMap", + "gamedataPassDesc_cleanFigureMap": "Elimina las partes que apuntan a un conjunto que falta en FigureData, además de duplicados exactos.", + "gamedataPass_cleanFigureData": "Limpiar FigureData", + "gamedataPassDesc_cleanFigureData": "Elimina los conjuntos a los que ninguna parte de FigureMap hace referencia, luego las paletas que ningún tipo de conjunto usa. Debe ejecutarse después de Limpiar FigureMap.", + "gamedataNothingSelected": "Seleccione al menos un paso de limpieza", + "gamedataConfirmTitle": "¿Reescribir los archivos JSON de datos del juego?", + "gamedataConfirmDescription": "{passes} paso(s) se ejecutarán contra {duplicates} grupo(s) duplicado(s), {orphans} fila(s) huérfana(s), {figureMap} problema(s) de FigureMap y {figureData} entrada(s) FigureData sin usar. Las filas se eliminan sin copia de seguridad — esto no se puede deshacer.", + "gamedataConfirmLabel": "Reescribir archivos", + "gamedataDifferingWarning": "Al menos un duplicado no es una copia exacta de la entrada que se conserva, por lo que la fila eliminada contenía datos que el superviviente no tiene.", + "gamedataCrossSectionNote": "{count} classname(s) existen tanto en roomitemtypes como en wallitemtypes. Estos solo se informan — eliminar uno cambiaría el tipo de un elemento.", + "gamedataToastDone": "La limpieza de datos del juego eliminó {removed} fila(s)", + "gamedataToastNothing": "Los datos del juego ya estaban limpios", + "gamedataMaxRemovalsLabel": "Máx. filas por paso", + "gamedataMaxRemovalsHint": "0 usa el valor predeterminado de 500. Un paso que eliminaría más se detiene y pregunta en lugar de escribir.", + "gamedataLimitTitle": "{pass} eliminaría {wouldRemove} fila(s), por encima del límite de {maxRemovals}.", + "gamedataLimitDescription": "Ese paso no escribió nada, por lo que los archivos no cambiaron. Revise primero las rutas de los activos — un directorio incorrecto hace que cada fila parezca huérfana. Aumentar el límite es una ejecución separada y deliberada.", + "gamedataLimitOverride": "Eliminar {wouldRemove} fila(s) de todos modos", + "historyTitle": "Historial de limpieza automática", + "historyScheduled": "programado", + "historyManual": "manual", + "historyEntry": "Eliminados {deleted} ({copies} copias); omitidos {recent} recientes y {broken} dañados", + "historyErrors": "{count} errores" + }, "importDiagnostics": { "attempts": "Diagnóstico de archivos", "preliminary": "Comprobación preliminar de direcciones; el contenido se valida al importar.", diff --git a/src/messages/fi.json b/src/messages/fi.json index 4d6cc017..e37128c5 100644 --- a/src/messages/fi.json +++ b/src/messages/fi.json @@ -175,7 +175,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Suositukset", + "dailyRewards": "Päivittäiset palkinnot" }, "logs": { "audit": { @@ -1806,7 +1808,8 @@ "saving": "Saving…", "deleteAd": "Delete ad", "cancel": "Cancel" - } + }, + "colId": "ID" }, "writeableBoxes": { "title": "Writeable Boxes", @@ -3361,7 +3364,9 @@ "errors": "Errors", "alerts": "Alerts", "toolsGroup": "Tools", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Suositukset", + "dailyRewards": "Päivittäiset palkinnot" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -4969,6 +4974,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Suositukset", + "subtitle": "Kutsujärjestelmä", + "referralsToday": "Suositukset tänään", + "referralsTotal": "Suositukset yhteensä", + "invitedTotal": "Kutsut laskettu", + "claims": "Palkinnot nostettu", + "settings": "Palkkioasetukset", + "needed": "Tarvittavat suositukset", + "rewardAmount": "Palkkiosumma", + "rewardCurrency": "Palkkioraha", + "blockSameIp": "Hylkää suositukset, jotka jakavat kutsujan nykyisen IP-osoitteen", + "save": "Tallenna asetukset", + "saving": "Tallennetaan…", + "saved": "Suositusasetukset tallennettu.", + "saveError": "Suositusasetuksia ei voitu tallentaa.", + "recent": "Viimeisimmät suositukset", + "unavailable": "Suositustiedot ovat tilapäisesti saatavilla.", + "empty": "Ei suosituksia vielä.", + "inviter": "Kutsuja", + "invitee": "Kutsuttu käyttäjä", + "ip": "IP", + "date": "Päivämäärä" + }, + "dailyRewards": { + "title": "Päivittäiset kirjautumispalkinnot", + "subtitle": "Päivittäinen kirjautumispalkkioaikataulu", + "enabled": "Ominaisuuden tila", + "yes": "Käytössä", + "no": "Ei käytössä", + "scheduleDays": "Aikataulun päivät", + "claimsToday": "Nostot tänään", + "claimsTotal": "Nostot yhteensä", + "status": "Ominaisuuden tila", + "statusHint": "Kun pois käytöstä, palkkio kortti piilotetaan ja uudet nostot hylätään.", + "disable": "Poista käytöstä", + "enable": "Ota käyttöön", + "schedule": "Palkkioaikataulu", + "day": "Päivä {day}", + "reward": "Palkkio", + "amount": "Summa", + "actions": "Toiminnot", + "addDay": "Päivä", + "add": "Lisää päivä", + "save": "Tallenna", + "saving": "Tallennetaan…", + "saved": "Palkkioaikataulu tallennettu.", + "cancel": "Peruuta", + "edit": "Muokkaa", + "delete": "Poista", + "created": "Palkkiopäivä lisätty.", + "updated": "Palkkiopäivä päivitetty.", + "deleted": "Palkkiopäivä poistettu.", + "saveError": "Palkkiopäivää ei voitu tallentaa.", + "deleteError": "Palkkiopäivää ei voitu poistaa.", + "confirmDeleteTitle": "Poista palkkiopäivä", + "confirmDeleteBody": "Tätä palkkiopäivää ei enää myönnetä. Aikaisemmat nostot säilyvät kirjattuina." } }, "myDashboard": { @@ -5049,8 +5112,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Päivittäinen palkkiosi on valmis nostettavaksi" + }, + "dailyClaimed": "Päivittäinen palkkio nostettu — nähdään huomenna!", + "dailyErrors": { + "already_claimed": "Olet jo nostanut tämän päivän palkkion.", + "disabled": "Päivittäiset palkinnot ovat pois käytöstä tällä hetkellä.", + "bad_config": "Päivittäinen palkkioaikataulu ei ole määritetty oikein. Ota yhteyttä henkilökuntaan.", + "ratelimit": "Liian monta yritystä. Odota hetki ja yritä uudelleen.", + "error": "Päivittäistä palkkio ei voitu nostaa. Yritä uudelleen." + }, + "dailyRewardTitle": "Päivittäiset palkinnot", + "dailyRewardHint": "Kirjaudu sisään joka päivä ja nosta palkkiosi — putket kasvavat isoihin päiviin asti.", + "dailyRewardDay": "Päivä {day}", + "dailyRewardStreak": "{count, plural, one {Putki: # päivä} other {Putki: # päivää}}", + "dailyRewardNextClaim": "Seuraava nosto: {amount} {currency}", + "dailyRewardTomorrow": "Huomenna: {amount} {currency}", + "dailyRewardClaim": "Nosta päivittäinen palkkio", + "dailyRewardClaimedToday": "Nostettu tänään — tule huomenna seuraavaa palkkiota varten.", + "dailyRewardDisabled": "Päivittäiset palkinnot ovat pois käytöstä tällä hetkellä. Voit tutkia hotellia.", + "dailyRewardUnavailable": "Päivittäistä palkkioaikataulua ei voitu ladata. Yritä uudelleen." }, "error": { "code": "Error", @@ -6045,7 +6127,9 @@ "emailRequired": "Email is required.", "passwordRequired": "Password is required.", "passwordsDontMatch": "Passwords do not match.", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Olen 18+ ja hyväksyn ikävaatimuksen.", + "invitedBy": "Kutsuja: {username}" }, "forgot": { "title": "Reset password", @@ -6479,7 +6563,11 @@ "sprite": "· sprite", "Git": "Git:" } - } + }, + "title": "Linkitetyt tilit", + "subtitle": "Linkitä sosiaalinen tili kirjautumiseen yhdellä napsautuksella", + "connected": "Linkitetty", + "unavailable": "Ei saatavilla" }, "toolbar": { "home": "Koti", @@ -6497,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Skannaus on jo käynnissä — liitetty siihen.", + "ageUnknown": "ikä tuntematon", + "ageBelow": "< 1pv", + "scanButton": "Skannaa huonekaluvarat", + "scanningAssets": "Skannataan varoja…", + "cancelButton": "Peruuta", + "deleteSelected": "Poista valitut ({count})", + "deleting": "Poistetaan…", + "redownloadBroken": "Lataa vahingoittuneet uudelleen", + "redownloading": "Ladataan uudelleen…", + "autoClean": "Puhdista vanhat väärat automaattisesti", + "cleaning": "Puhdistetaan…", + "exportManifest": "Vie manifesti", + "exporting": "Viedään…", + "phaseStems": "Ladataan huonekalujen varsia…", + "phaseReaddir": "Luetaan varakansioita…", + "phaseValidate": "Vahvistetaan .nitro-paketteja…", + "phaseScanning": "Skannataan…", + "scanProgressFiles": "{count} tiedostoa", + "repairProgress": "ok {ok}, epäonnistui {failed}", + "attachedNotice": "Skannaus jatkaa taustalla — tulokset näkyvät, kun se valmistuu.", + "sessionCancelled": "Skannaus peruttu.", + "onlyOldLabel": "Näytä vain tiedostot, jotka ovat vanhempia kuin", + "onlyOldAgeLabel": "Vähimmäisikä päivinä näyttöä varten", + "onlyOldToggle": "Piilota viimeaikaiset tiedostot", + "daysLabel": "päivää", + "autoAgeLabel": "Vähimmäisikä päivinä automaattiseen puhdistukseen", + "loadingResult": "Ladataan skannaustulosta…", + "scannedStat": "skannattuja varatiedostoja", + "cachedNotice": "(välimuistissa — hakemistot eivät muuttuneet)", + "fakeStat": "Väärät nitro (ei vastaavaa kohdetta)", + "brokenStat": "Vahingoittuneet nitro ( ei luettavissa)", + "groupEmpty": "Ei löytynyt mitään", + "selectedCount": "{count} valittu", + "copiesBadge": "{count} kopiota", + "groupFakeLabel": "Väärät nitro", + "groupFakeDescription": "Nämä tiedostot eivät vastaa mitään kohdetta items_base:ssa — jäännöksiä poistetuista tai uudelleennimetyistä huonekaluista.", + "groupBrokenLabel": "Vahingoittuneet nitro", + "groupBrokenDescription": "Nämä tiedostot kuuluvat kohteeseen, mutta niitä ei voi lukea kelvollisena Nitro-pakkauksena.", + "groupSwfLabel": "Orvot SWF-tiedostot", + "groupSwfDescription": ".swf-tiedostot, jotka eivät vastaa mitään kohdetta items_base:ssa.", + "groupIconLabel": "Orvot kuvakkeet", + "groupIconDescription": "Kuvaketiedostot, jotka eivät vastaa mitään kohdetta items_base:ssa.", + "warningText": "Vahingoittuneen .nitro poistaminen jättää kohteen tietokantaan pakkauksetta — lataa se mieluummin uudelleen tai anna luettelon tarkistuksen hankkia se myöhemmin. Tietokannan rivejä ei koskaan poisteta tällä työkalulla.", + "onlyAssetsTouched": "Vain varatiedostot muuttuvat — FurnitureData.json ja tietokannan rivit pysyät koskemattomina.", + "emptyHint": "Skannaa jokainen huonekaluvorakenemisto löytääksesi väärät ja vahingoittuneet nitro-paketit sekä orvot SWF-tiedostot ja kuvakkeet. Poista ne, lataa vahingoittuneet uudelleen tai puhdista vanhat jäännökset automaattisesti.", + "noResult": "Ei vielä skannaustulosta — suorita ensin huonekaluvarojen skannaus.", + "scanFailed": "Skannaus epäonnistui.", + "confirmDeleteTitle": "Poistetaanko {count} tiedostoa?", + "confirmDeleteDescription": "Tiedostot poistetaan kaikista hakemistoista (public + peilatut gamedata). Tietokannan rivejä ei koskaan kosketa.", + "confirmDeleteLabel": "Poista", + "confirmRepairTitle": "Ladataanko {count} vahingoittunutta .nitro-pakettia uudelleen?", + "confirmRepairDescription": "Paketit noudetaan uudelleen määritetyistä nitro-lähteistä ja kirjoitetaan kaikkien hakemistojen yli (public + peilatut gamedata).", + "confirmRepairLabel": "Lataa uudelleen", + "confirmAutoCleanTitle": "Puhdistetaanko väärät nitro vanhempia kuin {days} päivää automaattisesti?", + "confirmAutoCleanDescription": "Vain väärät .nitro-tiedostot (ei vastaavaa kohdetta) vanhempia kuin kynnysarvo poistetaan. Vahingoittuneet paketit ja viimeaikaiset tiedostot eivät koskaan muutu.", + "confirmAutoCleanLabel": "Puhdista automaattisesti", + "toastDeletePartial": "Poistettiin {copies} kopiota, mutta joitakin tiedostoja ei voitu poistaa", + "toastDeleteDone": "Poistettiin {copies} tiedostokopiota ({deleted} tiedostoa)", + "toastRepairDone": "Korjattiin {count} .nitro-pakettia", + "toastRepairFailed": "Mitään pakettia ei saatu haettua ({failed} epäonnistui)", + "toastRepairCancelled": "Korjaus peruttu", + "toastAutoCleanDone": "Puhdistettiin {deleted} vanhaa väärää .nitro-tiedostoa ({copies} kopiota). Ohitettiin {recent} viimeaikaista + {broken} vahingoittunutta.", + "toastAutoCleanNothing": "Ei mitään tarpeeksi vanhaa poistettavaksi (ohitettiin {recent} viimeaikaista, {broken} vahingoittunutta)", + "toastManifestDownload": "Skannausmanifesti ladattu", + "gamedataTitle": "Puhdista pelin tiedot", + "gamedataHint": "Esikatsele ensin: tämä kirjoittaa uudelleen FurnitureData.jsonin, FigureMap.jsonin ja FigureData.jsonin. Toisin kuin edellä olevat varatyökalut, se poistaa rivejä, jotka eivät viittaa mihinkään — tarkista luvut ennen suorittamista.", + "gamedataScan": "Esikatsele pelin tietoja", + "gamedataScanning": "Skannataan…", + "gamedataRun": "Suorita valitut", + "gamedataRunning": "Puhdistetaan…", + "gamedataNoResult": "Ei vielä esikatselua — skannaa ensin pelin tiedot JSON-tiedostot.", + "gamedataCount_duplicates": "FurnitureData-kaksoiskappaleet", + "gamedataCount_orphans": "FurnitureData-orvot", + "gamedataCount_figureMap": "FigureMap-ongelmat", + "gamedataCount_figureData": "Käyttämätön FigureData", + "gamedataPass_dedupeFurnitureData": "Poista FurnitureData-kaksoiskappaleet", + "gamedataPassDesc_dedupeFurnitureData": "Poistaa toistuvat classnames yhden osion sisällä säilyttäen korkeimman version kirjauksen.", + "gamedataPass_cleanFurnitureData": "Puhdista FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Poistaa kirjaukset, joiden .nitro-paketti puuttuu kaikista hakemistoista.", + "gamedataPass_cleanFigureMap": "Puhdista FigureMap", + "gamedataPassDesc_cleanFigureMap": "Poistaa osat, jotka viittaavat puuttuvaan joukkoon FigureData:ssa, sekä täsmälliset kaksoiskappaleet.", + "gamedataPass_cleanFigureData": "Puhdista FigureData", + "gamedataPassDesc_cleanFigureData": "Poistaa joukot, joihin mikään FigureMap-osa ei viittaa,itten palettille, joita mikään joukkotyyppi ei käytä. Suoritettava Puhdista FigureMap -vaiheen jälkeen.", + "gamedataNothingSelected": "Valitse vähintään yksi puhdistusvaihe", + "gamedataConfirmTitle": "Kirjoitetaanko pelin tiedot JSON-tiedostot uudelleen?", + "gamedataConfirmDescription": "{passes} vaihetta suoritetaan vastaan {duplicates} kaksoiskappaleryhmää, {orphans} orporiviä, {figureMap} FigureMap-ongelmaa ja {figureData} käyttämätöntä FigureData-kirjausta. Rivit poistetaan ilman varmuuskopiota — tätä ei voi perua.", + "gamedataConfirmLabel": "Kirjoita tiedostot uudelleen", + "gamedataDifferingWarning": "Vähintään yksi kaksoiskappale ei ole täsmällinen kopio säilytettävästä kirjauksesta, joten poistettu rivi sisälti tietoja, joita selviytyjällä ei ole.", + "gamedataCrossSectionNote": "{count} classname(a) on olemassa sekä roomitemtypes- että wallitemtypes-osioissa. Nämä ilmoitetaan vain — yhden poistaminen muuttaisi kohteen tyypin.", + "gamedataToastDone": "Pelihin tiedon puhdistus poisti {removed} riviä", + "gamedataToastNothing": "Pelin tiedot olivat jo puhtaat", + "gamedataMaxRemovalsLabel": "Maks. rivejä vaihetta kohti", + "gamedataMaxRemovalsHint": "0 käyttää oletusarvoa 500. Vaihe, joka poisti enemmän, pysähtyy ja kysyy kirjoittamisen sijaan.", + "gamedataLimitTitle": "{pass} poistaisi {wouldRemove} riviä, yli rajan {maxRemovals}.", + "gamedataLimitDescription": "Tämä vaihe ei kirjoittanut mitään, joten tiedostot ovat muuttumattomia. Tarkista ensin varojen polut — väärä hakemisto saa jokaisen rivin näyttämään orpolta. Rajan korottaminen on erillinen, tahallinen suoritus.", + "gamedataLimitOverride": "Poista {wouldRemove} riviä silti", + "historyTitle": "Automaattisen puhdistuksen historia", + "historyScheduled": "aikataulutettu", + "historyManual": "manuaalinen", + "historyEntry": "Poistettu {deleted} ({copies} kopiota); ohitettu {recent} viimeaikaista ja {broken} vahingoittunutta", + "historyErrors": "{count} virhettä" + }, "importDiagnostics": { "attempts": "Tiedostojen diagnostiikka", "preliminary": "Osoitteiden alustava tarkistus; sisältö tarkistetaan tuonnissa.", diff --git a/src/messages/fr.json b/src/messages/fr.json index 365393e7..753611d9 100644 --- a/src/messages/fr.json +++ b/src/messages/fr.json @@ -787,9 +787,9 @@ "enable": "Activer l'A2F", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Comptes connectés", + "title": "Comptes liés", "subtitle": "Associez un compte social pour vous connecter en un clic", - "connected": "Connecté", + "connected": "Lié", "unavailable": "Indisponible", "login": { "title": "Connexion", @@ -852,7 +852,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "J'ai 18+ et j'accepte la condition d'âge.", + "invitedBy": "Invité par {username}" }, "forgot": { "title": "Réinitialiser le mot de passe", @@ -1018,7 +1020,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Parrainages", + "dailyRewards": "Récompenses quotidiennes" }, "dashboard": { "title": "Tableau de bord", @@ -4306,7 +4310,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Parrainages", + "dailyRewards": "Récompenses quotidiennes" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5813,6 +5819,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Parrainages", + "subtitle": "Système d'invitation", + "referralsToday": "Parrainages aujourd'hui", + "referralsTotal": "Parrainages au total", + "invitedTotal": "Invitations comptées", + "claims": "Récompenses réclamées", + "settings": "Paramètres de récompense", + "needed": "Parrainages requis", + "rewardAmount": "Montant de la récompense", + "rewardCurrency": "Devise de la récompense", + "blockSameIp": "Refuser les parrainages partageant l'IP actuelle de l'inviteur", + "save": "Enregistrer les paramètres", + "saving": "Enregistrement…", + "saved": "Paramètres de parrainage enregistrés.", + "saveError": "Les paramètres de parrainage n'ont pas pu être enregistrés.", + "recent": "Parrainages récents", + "unavailable": "Les données de parrainage sont temporairement indisponibles.", + "empty": "Aucun parrainage pour le moment.", + "inviter": "Parrain", + "invitee": "Utilisateur invité", + "ip": "IP", + "date": "Date" + }, + "dailyRewards": { + "title": "Récompenses de connexion quotidiennes", + "subtitle": "Programme de récompenses de connexion quotidiennes", + "enabled": "Statut de la fonctionnalité", + "yes": "Activé", + "no": "Désactivé", + "scheduleDays": "Jours du programme", + "claimsToday": "Réclamations aujourd'hui", + "claimsTotal": "Réclamations au total", + "status": "Statut de la fonctionnalité", + "statusHint": "Lorsque désactivé, la carte de récompense est masquée et les nouvelles réclamations sont refusées.", + "disable": "Désactiver", + "enable": "Activer", + "schedule": "Programme de récompenses", + "day": "Jour {day}", + "reward": "Récompense", + "amount": "Montant", + "actions": "Actions", + "addDay": "Jour", + "add": "Ajouter un jour", + "save": "Enregistrer", + "saving": "Enregistrement…", + "saved": "Programme de récompenses enregistré.", + "cancel": "Annuler", + "edit": "Modifier", + "delete": "Supprimer", + "created": "Jour de récompense ajouté.", + "updated": "Jour de récompense mis à jour.", + "deleted": "Jour de récompense supprimé.", + "saveError": "Le jour de récompense n'a pas pu être enregistré.", + "deleteError": "Le jour de récompense n'a pas pu être supprimé.", + "confirmDeleteTitle": "Supprimer le jour de récompense", + "confirmDeleteBody": "Ce jour de récompense ne sera plus accordé. Les réclamations passées restent enregistrées." } }, "radioRequests": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Votre récompense quotidienne est prête à être réclamée" + }, + "dailyClaimed": "Récompense quotidienne réclamée — à demain !", + "dailyErrors": { + "already_claimed": "Vous avez déjà réclamé la récompense quotidienne d'aujourd'hui.", + "disabled": "Les récompenses quotidiennes sont actuellement désactivées.", + "bad_config": "Le programme de récompenses quotidiennes n'est pas configuré correctement. Contactez le personnel.", + "ratelimit": "Trop de tentatives. Attendez un instant et réessayez.", + "error": "La récompense quotidienne n'a pas pu être réclamée. Veuillez réessayer." + }, + "dailyRewardTitle": "Récompenses quotidiennes", + "dailyRewardHint": "Connectez-vous chaque jour et réclamez votre récompense — les séries grandissent jusqu'aux grands jours.", + "dailyRewardDay": "Jour {day}", + "dailyRewardStreak": "{count, plural, one {Série : # jour} other {Série : # jours}}", + "dailyRewardNextClaim": "Prochaine réclamation : {amount} {currency}", + "dailyRewardTomorrow": "Demain : {amount} {currency}", + "dailyRewardClaim": "Réclamer la récompense quotidienne", + "dailyRewardClaimedToday": "Réclamé aujourd'hui — revenez demain pour la prochaine récompense.", + "dailyRewardDisabled": "Les récompenses quotidiennes sont actuellement désactivées. Vous pouvez explorer l'hôtel.", + "dailyRewardUnavailable": "Le programme de récompenses quotidiennes n'a pas pu être chargé. Veuillez réessayer." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Un scan est déjà en cours — connexion à celui-ci.", + "ageUnknown": "âge inconnu", + "ageBelow": "< 1j", + "scanButton": "Scanner les ressources de meubles", + "scanningAssets": "Analyse des ressources…", + "cancelButton": "Annuler", + "deleteSelected": "Supprimer la sélection ({count})", + "deleting": "Suppression…", + "redownloadBroken": "Re-télécharger les corrompus", + "redownloading": "Re-téléchargement…", + "autoClean": "Nettoyage automatique des anciens faux", + "cleaning": "Nettoyage…", + "exportManifest": "Exporter le manifeste", + "exporting": "Exportation…", + "phaseStems": "Chargement des tiges de meubles…", + "phaseReaddir": "Lecture des répertoires de ressources…", + "phaseValidate": "Validation des paquets .nitro…", + "phaseScanning": "Analyse…", + "scanProgressFiles": "{count} fichiers", + "repairProgress": "ok {ok}, échec {failed}", + "attachedNotice": "Le scan continue en arrière-plan — les résultats apparaîtront à la fin.", + "sessionCancelled": "Scan annulé.", + "onlyOldLabel": "Afficher uniquement les fichiers plus anciens que", + "onlyOldAgeLabel": "Âge minimum en jours pour affichage", + "onlyOldToggle": "Masquer les fichiers récents", + "daysLabel": "jours", + "autoAgeLabel": "Âge minimum en jours pour le nettoyage automatique", + "loadingResult": "Chargement du résultat du scan…", + "scannedStat": "fichiers de ressources analysés", + "cachedNotice": "(en cache — les répertoires sont inchangés)", + "fakeStat": "Faux nitro (aucun élément correspondant)", + "brokenStat": "Nitro corrompus (illisibles)", + "groupEmpty": "Aucun résultat", + "selectedCount": "{count} sélectionnés", + "copiesBadge": "{count} copies", + "groupFakeLabel": "Faux nitro", + "groupFakeDescription": "Ces fichiers ne correspondent à aucun élément de items_base — restes de meubles supprimés ou renommés.", + "groupBrokenLabel": "Nitro corrompus", + "groupBrokenDescription": "Ces fichiers appartiennent à un élément mais ne peuvent pas être lus comme un paquet Nitro valide.", + "groupSwfLabel": "SWF orphelins", + "groupSwfDescription": "Fichiers .swf qui ne correspondent à aucun élément de items_base.", + "groupIconLabel": "Icônes orphelines", + "groupIconDescription": "Fichiers d'icônes qui ne correspondent à aucun élément de items_base.", + "warningText": "Supprimer un .nitro corrompu laisse son élément dans la base sans paquet — préférez le re-télécharger, ou laissez l'audit du catalogue l'obtenir plus tard. Les lignes de base ne sont jamais supprimées par cet outil.", + "onlyAssetsTouched": "Seuls les fichiers de ressources sont modifiés — FurnitureData.json et les lignes de base restent intacts.", + "emptyHint": "Scannez chaque répertoire de meubles pour trouver les paquets nitro faux et corrompus ainsi que les SWF et icônes orphelins. Supprimez-les, re-téléchargez les corrompus ou nettoyez automatiquement les anciens restes.", + "noResult": "Aucun résultat de scan pour le moment — lancez d'abord un scan des ressources de meubles.", + "scanFailed": "Le scan a échoué.", + "confirmDeleteTitle": "Supprimer {count} fichier(s) ?", + "confirmDeleteDescription": "Les fichiers seront retirés de chaque répertoire (public + gamedata en miroir). Les lignes de base ne sont jamais modifiées.", + "confirmDeleteLabel": "Supprimer", + "confirmRepairTitle": "Re-télécharger {count} paquet(s) .nitro corrompu(s) ?", + "confirmRepairDescription": "Les paquets seront récupérés depuis les sources nitro configurées et écrits sur chaque répertoire (public + gamedata en miroir).", + "confirmRepairLabel": "Re-télécharger", + "confirmAutoCleanTitle": "Nettoyer automatiquement les faux nitro plus anciens que {days} jour(s) ?", + "confirmAutoCleanDescription": "Seuls les fichiers .nitro faux (aucun élément correspondant) plus anciens que le seuil sont retirés. Les paquets corrompus et les fichiers récents ne sont jamais modifiés.", + "confirmAutoCleanLabel": "Nettoyer automatiquement", + "toastDeletePartial": "{copies} copie(s) supprimées, mais certains fichiers n'ont pas pu être retirés", + "toastDeleteDone": "{copies} copie(s) de fichier supprimées ({deleted} fichier(s))", + "toastRepairDone": "{count} paquet(s) .nitro réparé(s)", + "toastRepairFailed": "Impossible d'obtenir un paquet ({failed} échec(s))", + "toastRepairCancelled": "Réparation annulée", + "toastAutoCleanDone": "{deleted} ancien(s) fichier(s) .nitro faux nettoyé(s) ({copies} copies). {recent} récents + {broken} corrompus ignorés.", + "toastAutoCleanNothing": "Rien d'assez ancien pour être retiré ({recent} récents, {broken} corrompus ignorés)", + "toastManifestDownload": "Manifeste de scan téléchargé", + "gamedataTitle": "Nettoyage des données de jeu", + "gamedataHint": "Aperçu d'abord : ceci réécrit FurnitureData.json, FigureMap.json et FigureData.json. Contrairement aux outils de ressources ci-dessus, cela supprime des lignes qui ne référencent rien — examinez les comptes avant de l'exécuter.", + "gamedataScan": "Aperçu des données de jeu", + "gamedataScanning": "Analyse…", + "gamedataRun": "Exécuter la sélection", + "gamedataRunning": "Nettoyage…", + "gamedataNoResult": "Aucun aperçu pour le moment — scannez d'abord les fichiers JSON des données de jeu.", + "gamedataCount_duplicates": "Doublons de FurnitureData", + "gamedataCount_orphans": "Pupilles de FurnitureData", + "gamedataCount_figureMap": "Problèmes de FigureMap", + "gamedataCount_figureData": "FigureData inutilisé", + "gamedataPass_dedupeFurnitureData": "Dédupliquer FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Supprime les classnames répétés dans une section, en conservant l'entrée avec la révision la plus élevée.", + "gamedataPass_cleanFurnitureData": "Nettoyer FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Supprime les entrées dont le paquet .nitro est absent de chaque répertoire.", + "gamedataPass_cleanFigureMap": "Nettoyer FigureMap", + "gamedataPassDesc_cleanFigureMap": "Supprime les parties pointant vers un ensemble manquant dans FigureData, ainsi que les doublons exacts.", + "gamedataPass_cleanFigureData": "Nettoyer FigureData", + "gamedataPassDesc_cleanFigureData": "Supprime les ensembles qu'aucune partie de FigureMap ne référence, puis les palettes qu'aucun type d'ensemble n'utilise. Doit s'exécuter après Nettoyer FigureMap.", + "gamedataNothingSelected": "Sélectionnez au moins une étape de nettoyage", + "gamedataConfirmTitle": "Réécrire les fichiers JSON des données de jeu ?", + "gamedataConfirmDescription": "{passes} étape(s) s'exécuteront contre {duplicates} groupe(s) en double, {orphans} ligne(s) pupille(s), {figureMap} problème(s) de FigureMap et {figureData} entrée(s) FigureData inutilisée(s). Les lignes sont supprimées sans sauvegarde — ceci est irréversible.", + "gamedataConfirmLabel": "Réécrire les fichiers", + "gamedataDifferingWarning": "Au moins un double n'est pas une copie exacte de l'entrée conservée, donc la ligne supprimée contenait des données que le survivant n'a pas.", + "gamedataCrossSectionNote": "{count} classname(s) existent à la fois dans roomitemtypes et wallitemtypes. Ceux-ci sont seulement signalés — en supprimer un changerait le type d'un élément.", + "gamedataToastDone": "Le nettoyage des données de jeu a supprimé {removed} ligne(s)", + "gamedataToastNothing": "Les données de jeu étaient déjà propres", + "gamedataMaxRemovalsLabel": "Max. lignes par étape", + "gamedataMaxRemovalsHint": "0 utilise la valeur par défaut 500. Une étape qui en supprimerait plus s'arrête et demande au lieu d'écrire.", + "gamedataLimitTitle": "{pass} supprimerait {wouldRemove} ligne(s), au-dessus de la limite de {maxRemovals}.", + "gamedataLimitDescription": "Cette étape n'a rien écrit, donc les fichiers sont inchangés. Vérifiez d'abord les chemins de ressources — un mauvais répertoire rend chaque ligne pupille. Augmenter la limite est une exécution séparée et délibérée.", + "gamedataLimitOverride": "Supprimer quand même {wouldRemove} ligne(s)", + "historyTitle": "Historique du nettoyage automatique", + "historyScheduled": "planifié", + "historyManual": "manuel", + "historyEntry": "{deleted} supprimé(s) ({copies} copies); {recent} récents et {broken} corrompus ignorés", + "historyErrors": "{count} erreurs" + }, "importDiagnostics": { "attempts": "Diagnostic des fichiers", "preliminary": "Vérification préliminaire des adresses ; le contenu sera validé à l’importation.", diff --git a/src/messages/hr.json b/src/messages/hr.json index c603df05..21f4d6f0 100644 --- a/src/messages/hr.json +++ b/src/messages/hr.json @@ -818,9 +818,9 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Povezani računi", - "subtitle": "Povežite društveni račun kako biste se mogli prijaviti jednim klikom", - "connected": "Povezan", - "unavailable": "Nedostupan", + "subtitle": "Povežite društveni račun za prijavu jednim klikom", + "connected": "Povezano", + "unavailable": "Nedostupno", "login": { "title": "Prijavite se", "subtitle": "Dobrodošli nazad — prijavite se za ulazak u hotel.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Imam 18+ i prihvaćam uvjet dobi.", + "invitedBy": "Pozvao {username}" }, "forgot": { "title": "Resetiraj lozinku", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Preporuke", + "dailyRewards": "Dnevne nagrade" }, "dashboard": { "title": "Nadzorna ploča", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Preporuke", + "dailyRewards": "Dnevne nagrade" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Preporuke", + "subtitle": "Sustav pozivnica", + "referralsToday": "Preporuke danas", + "referralsTotal": "Ukupno preporuka", + "invitedTotal": "Izbrojane pozivnice", + "claims": "Isplaćene nagrade", + "settings": "Postavke nagrade", + "needed": "Potrebne preporuke", + "rewardAmount": "Iznos nagrade", + "rewardCurrency": "Valuta nagrade", + "blockSameIp": "Odbij preporuke koje dijele trenutnu IP adresu pozivatelja", + "save": "Spremi postavke", + "saving": "Spremanje…", + "saved": "Postavke preporuka spremljene.", + "saveError": "Postavke preporuka nisu se mogle spremiti.", + "recent": "Nedavne preporuke", + "unavailable": "Podaci o preporukama su privremeno nedostupni.", + "empty": "Još nema preporuka.", + "inviter": "Pozivatelj", + "invitee": "Pozvani korisnik", + "ip": "IP", + "date": "Datum" + }, + "dailyRewards": { + "title": "Dnevne nagrade za prijavu", + "subtitle": "Raspored dnevnih nagrada za prijavu", + "enabled": "Status značajke", + "yes": "Omogućeno", + "no": "Onemogućeno", + "scheduleDays": "Dani rasporeda", + "claimsToday": "Isplate danas", + "claimsTotal": "Ukupno isplata", + "status": "Status značajke", + "statusHint": "Kada je onemogućeno, kartica nagrade se skriva i nove se odbijaju.", + "disable": "Onemogući", + "enable": "Omogući", + "schedule": "Raspored nagrada", + "day": "Dan {day}", + "reward": "Nagrada", + "amount": "Iznos", + "actions": "Radnje", + "addDay": "Dan", + "add": "Dodaj dan", + "save": "Spremi", + "saving": "Spremanje…", + "saved": "Raspored nagrada spremljen.", + "cancel": "Odustani", + "edit": "Uredi", + "delete": "Izbriši", + "created": "Dan nagrade dodan.", + "updated": "Dan nagrade ažuriran.", + "deleted": "Dan nagrade uklonjen.", + "saveError": "Dan nagrade nije se mogao spremiti.", + "deleteError": "Dan nagrade nije se mogao ukloniti.", + "confirmDeleteTitle": "Ukloni dan nagrade", + "confirmDeleteBody": "Ovaj dan nagrade više se neće dodjeljivati. Prošle isplate ostaju zabilježene." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Vaša dnevna nagrada je spremna za isplatu" + }, + "dailyClaimed": "Dnevna nagrada isplaćena — vidimo se sutra!", + "dailyErrors": { + "already_claimed": "Već ste isplatili današnju dnevnu nagradu.", + "disabled": "Dnevne nagrade su trenutno onemogućene.", + "bad_config": "Raspored dnevnih nagrada nije ispravno konfiguriran. Kontaktirajte osoblje.", + "ratelimit": "Previše pokušaja. Pričekajte trenutak i pokušajte ponovno.", + "error": "Dnevna nagrada nije se mogla isplatiti. Pokušajte ponovno." + }, + "dailyRewardTitle": "Dnevne nagrade", + "dailyRewardHint": "Prijavite se svaki dan i isplatite svoju nagradu — nizovi rastu do velikih dana.", + "dailyRewardDay": "Dan {day}", + "dailyRewardStreak": "{count, plural, one {Niz: # dan} few {Niz: # dana} other {Niz: # dana}}", + "dailyRewardNextClaim": "Sljedeća isplata: {amount} {currency}", + "dailyRewardTomorrow": "Sutra: {amount} {currency}", + "dailyRewardClaim": "Isplati dnevnu nagradu", + "dailyRewardClaimedToday": "Isplaćeno danas — vratite se sutra za sljedeću nagradu.", + "dailyRewardDisabled": "Dnevne nagrade su trenutno onemogućene. Možete istražiti hotel.", + "dailyRewardUnavailable": "Raspored dnevnih nagrada nije se mogao učitati. Pokušajte ponovno." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Skeniranje je već u tijeku — povezano s njim.", + "ageUnknown": "dob nepoznata", + "ageBelow": "< 1d", + "scanButton": "Skeniraj nameštaj", + "scanningAssets": "Skeniranje sredstava…", + "cancelButton": "Odustani", + "deleteSelected": "Izbriši odabrano ({count})", + "deleting": "Brisanje…", + "redownloadBroken": "Ponovno preuzmi oštećene", + "redownloading": "Ponovno preuzimanje…", + "autoClean": "Automatski očisti stare lažne", + "cleaning": "Čišćenje…", + "exportManifest": "Izvezi manifest", + "exporting": "Izvoz…", + "phaseStems": "Učitavanje stabljika nameštaja…", + "phaseReaddir": "Čitanje direktorija sredstava…", + "phaseValidate": "Provjera .nitro paketa…", + "phaseScanning": "Skeniranje…", + "scanProgressFiles": "{count} datoteka", + "repairProgress": "ok {ok}, neuspjelo {failed}", + "attachedNotice": "Skeniranje nastavlja u pozadini — rezultat će se pojaviti kada završi.", + "sessionCancelled": "Skeniranje otkazano.", + "onlyOldLabel": "Prikaži samo datoteke starije od", + "onlyOldAgeLabel": "Minimalna dob u danima za prikaz", + "onlyOldToggle": "Sakrij nedavne datoteke", + "daysLabel": "dana", + "autoAgeLabel": "Minimalna dob u danima za automatsko čišćenje", + "loadingResult": "Učitavanje rezultata skeniranja…", + "scannedStat": "datoteka sredstava skenirano", + "cachedNotice": "(u predmemoriji — direktoriji se nisu promijenili)", + "fakeStat": "Lažni nitro (nema odgovarajuće stavke)", + "brokenStat": "Oštećeni nitro (nečitljivi)", + "groupEmpty": "Ništa nije pronađeno", + "selectedCount": "odabrano {count}", + "copiesBadge": "{count} kopija", + "groupFakeLabel": "Lažni nitro", + "groupFakeDescription": "Ove datoteke ne odgovaraju nijednoj stavki u items_base — ostaci izbrisanih ili preimenovanih komada nameštaja.", + "groupBrokenLabel": "Oštećeni nitro", + "groupBrokenDescription": "Ove datoteke pripadaju stavci, ali se ne mogu pročitati kao valjani Nitro paket.", + "groupSwfLabel": "SWF-ovi bez roditelja", + "groupSwfDescription": ".swf datoteke koje ne odgovaraju nijednoj stavci u items_base.", + "groupIconLabel": "Ikone bez roditelja", + "groupIconDescription": "Datoteke ikona koje ne odgovaraju nijednoj stavci u items_base.", + "warningText": "Brisanje oštećenog .nitro ostavlja stavku u bazi bez paketa — radije je ponovno preuzmite ili neka je katalog provjeri kasnije. Redovi baze nikada se ne brišu ovim alatom.", + "onlyAssetsTouched": "Diraju se samo datoteke sredstava — FurnitureData.json i redovi baze ostaju netaknuti.", + "emptyHint": "Skenirajte svaki direktorij nameštaja kako biste pronašli lažne i oštećene nitro pakete, kao i SWF-ove i ikone bez roditelja. Izbrišite ih, ponovno preuzmite oštećene ili automatsko očisti stare ostatke.", + "noResult": "Još nema rezultata skeniranja — prvo pokrenite skeniranje nameštaja.", + "scanFailed": "Skeniranje nije uspjelo.", + "confirmDeleteTitle": "Izbrisati {count} datoteku(e)?", + "confirmDeleteDescription": "Datoteke će biti uklonjene iz svakog direktorija (public + zrcalna gamedata). Redovi baze se nikada ne diraju.", + "confirmDeleteLabel": "Izbriši", + "confirmRepairTitle": "Ponovno preuzeti {count} oštećen(i) .nitro paket(a)?", + "confirmRepairDescription": "Paketi će biti ponovno dohvaćeni iz konfiguriranih nitro izvora i zapisani preko svakog direktorija (public + zrcalna gamedata).", + "confirmRepairLabel": "Ponovno preuzmi", + "confirmAutoCleanTitle": "Automatski očisti lažne nitro starije od {days} dan(a)?", + "confirmAutoCleanDescription": "Uklanjaju se samo lažne .nitro datoteke (nema odgovarajuće stavke) starije od praga. Oštećeni paketi i nedavne datoteke se nikada ne diraju.", + "confirmAutoCleanLabel": "Automatski očisti", + "toastDeletePartial": "Izbrisano {copies} kopija, ali se neke datoteke nisu mogle ukloniti", + "toastDeleteDone": "Izbrisano {copies} kopija datoteka ({deleted} datoteka)", + "toastRepairDone": "Popravljeno {count} .nitro paketa", + "toastRepairFailed": "Nije bilo moguće dohvatiti nijedan paket ({failed} neuspjelo)", + "toastRepairCancelled": "Popravak otkazan", + "toastAutoCleanDone": "Očišćeno {deleted} starih lažnih .nitro datoteka ({copies} kopija). Preskočeno {recent} nedavnih + {broken} oštećenih.", + "toastAutoCleanNothing": "Ništa dovoljno staro za uklanjanje (preskočeno {recent} nedavnih, {broken} oštećenih)", + "toastManifestDownload": "Manifest skeniranja preuzet", + "gamedataTitle": "Čišćenje podataka igre", + "gamedataHint": "Prvo pregled: ovo prepisuje FurnitureData.json, FigureMap.json i FigureData.json. Za razliku od gornjih alata za sredstva, uklanja redove koji ništa ne referenciraju — provjerite brojeve prije pokretanja.", + "gamedataScan": "Pregled podataka igre", + "gamedataScanning": "Skeniranje…", + "gamedataRun": "Pokreni odabrano", + "gamedataRunning": "Čišćenje…", + "gamedataNoResult": "Još nema pregleda — prvo skenirajte JSON datoteke podataka igre.", + "gamedataCount_duplicates": "Duplikati FurnitureData", + "gamedataCount_orphans": "FurnitureData bez roditelja", + "gamedataCount_figureMap": "Problemi s FigureMap", + "gamedataCount_figureData": "Neiskorišteni FigureData", + "gamedataPass_dedupeFurnitureData": "Dedupliciraj FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Uklanja ponovljene classnames unutar jednog odjeljka, zadržavajući unos s najvišom revizijom.", + "gamedataPass_cleanFurnitureData": "Očisti FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Uklanja unose čiji .nitro paket nije prisutan u niti jednom direktoriju.", + "gamedataPass_cleanFigureMap": "Očisti FigureMap", + "gamedataPassDesc_cleanFigureMap": "Uklanja dijelove koji upućuju na skup koji nedostaje u FigureData, plus točne duplikate.", + "gamedataPass_cleanFigureData": "Očisti FigureData", + "gamedataPassDesc_cleanFigureData": "Uklanja skupove na koje nijedan FigureMap dio ne upućuje, zatim palete koje nijedan tip skupa ne koristi. Mora se pokrenuti nakon Očisti FigureMap.", + "gamedataNothingSelected": "Odaberite barem jedan korak čišćenja", + "gamedataConfirmTitle": "Prepisati JSON datoteke podataka igre?", + "gamedataConfirmDescription": "{passes} korak(a) izvršit će se na {duplicates} duplih grupa, {orphans} redova bez roditelja, {figureMap} problema s FigureMap i {figureData} neiskorištenih unosa FigureData. Redovi se uklanjaju bez sigurnosne kopije — ovo se ne može poništiti.", + "gamedataConfirmLabel": "Prepiši datoteke", + "gamedataDifferingWarning": "Barem jedan duplikat nije točna kopija unosa koji se zadržava, pa je izbrisani red sadržavao podatke koje preživjeli nema.", + "gamedataCrossSectionNote": "{count} classname(a) postoji i u roomitemtypes i u wallitemtypes. Oni se samo prijavljuju — uklanjanje jednog promijenilo bi tip stavke.", + "gamedataToastDone": "Čišćenje podataka igre uklonilo je {removed} redova", + "gamedataToastNothing": "Podaci igre su već bili čisti", + "gamedataMaxRemovalsLabel": "Maks. redova po koraku", + "gamedataMaxRemovalsHint": "0 koristi zadanu vrijednost 500. Korak koji bi uklonio više zaustavlja se i pitaje umjesto da piše.", + "gamedataLimitTitle": "{pass} bi uklonio {wouldRemove} redova, iznad limita od {maxRemovals}.", + "gamedataLimitDescription": "Taj korak nije ništa zapisao, pa su datoteke nepromijenjene. Prvo provjerite putanje sredstava — pogrešan direktorij čini svaki red bez roditelja. Povećanje limita je zasebna, namjerna izvedba.", + "gamedataLimitOverride": "Svejedno ukloni {wouldRemove} redova", + "historyTitle": "Povijest automatskog čišćenja", + "historyScheduled": "planirano", + "historyManual": "ručno", + "historyEntry": "Uklonjeno {deleted} ({copies} kopija); preskočeno {recent} nedavnih i {broken} oštećenih", + "historyErrors": "{count} grešaka" + }, "importDiagnostics": { "attempts": "Dijagnostika datoteka", "preliminary": "Preliminarna provjera adresa; sadržaj se provjerava pri uvozu.", diff --git a/src/messages/hu.json b/src/messages/hu.json index c1724b29..33bf906f 100644 --- a/src/messages/hu.json +++ b/src/messages/hu.json @@ -818,9 +818,9 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Kapcsolt fiókok", - "subtitle": "Kapcsoljon össze egy közösségi fiókot, hogy egyetlen kattintással bejelentkezhessen", - "connected": "Csatlakozva", - "unavailable": "Nem elérhető", + "subtitle": "Kösszön közösségi fiókot egy kattintásos bejelentkezéshez", + "connected": "Kapcsolt", + "unavailable": "Nem érhető el", "login": { "title": "Jelentkezzen be", "subtitle": "Üdvözöljük újra – jelentkezzen be a szállodába való belépéshez.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "18+ vagyok és elfogadom a korhatárra vonatkozó követelményt.", + "invitedBy": "Meghívta: {username}" }, "forgot": { "title": "Jelszó visszaállítása", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Ajánlások", + "dailyRewards": "Napi jutalmak" }, "dashboard": { "title": "Irányítópult", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Ajánlások", + "dailyRewards": "Napi jutalmak" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Ajánlások", + "subtitle": "Meghívórendszer", + "referralsToday": "Mai ajánlások", + "referralsTotal": "Összes ajánlás", + "invitedTotal": "Számolt meghívók", + "claims": "Kifizetett jutalmak", + "settings": "Jutalombeállítások", + "needed": "Szükséges ajánlások", + "rewardAmount": "Jutalom összege", + "rewardCurrency": "Jutalom pénzneme", + "blockSameIp": "Az ajánló aktuális IP-címét megosztó ajánlások elutasítása", + "save": "Beállítások mentése", + "saving": "Mentés…", + "saved": "Ajánlási beállítások mentve.", + "saveError": "Az ajánlási beállításokat nem sikerült menteni.", + "recent": "Legutóbbi ajánlások", + "unavailable": "Az ajánlási adatok ideiglenesen nem érhetők el.", + "empty": "Még nincsenek ajánlások.", + "inviter": "Meghívó", + "invitee": "Meghívott felhasználó", + "ip": "IP", + "date": "Dátum" + }, + "dailyRewards": { + "title": "Napi bejelentkezési jutalmak", + "subtitle": "Napi bejelentkezési jutalom ütemterv", + "enabled": "Funkció állapota", + "yes": "Engedélyezve", + "no": "Letiltva", + "scheduleDays": "Ütemterv napjai", + "claimsToday": "Mai kifizetések", + "claimsTotal": "Összes kifizetés", + "status": "Funkció állapota", + "statusHint": "Letiltáskor a jutalomkártya elrejtésre kerül, és az új kifizetések elutasításra kerülnek.", + "disable": "Letiltás", + "enable": "Engedélyezés", + "schedule": "Jutalomütemterv", + "day": "Nap {day}", + "reward": "Jutalom", + "amount": "Összeg", + "actions": "Műveletek", + "addDay": "Nap", + "add": "Nap hozzáadása", + "save": "Mentés", + "saving": "Mentés…", + "saved": "Jutalomütemterv mentve.", + "cancel": "Mégse", + "edit": "Szerkesztés", + "delete": "Törlés", + "created": "Jutalomnap hozzáadva.", + "updated": "Jutalomnap frissítve.", + "deleted": "Jutalomnap eltávolítva.", + "saveError": "A jutalomnapot nem sikerült menteni.", + "deleteError": "A jutalomnapot nem sikerült eltávolítani.", + "confirmDeleteTitle": "Jutalomnap eltávolítása", + "confirmDeleteBody": "Ez a jutalomnap már nem lesz megadva. A korábbi kifizetések rögzítve maradnak." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Napi jutalma készen áll a kifizetésre" + }, + "dailyClaimed": "Napi jutalom kifizetve — holnap találkozunk!", + "dailyErrors": { + "already_claimed": "Már kifizette a mai napi jutalmat.", + "disabled": "A napi jutalmak jelenleg le vannak tiltva.", + "bad_config": "A napi jutalomütemterv nincs megfelelően konfigurálva. Lépjen kapcsolatba a személyzettel.", + "ratelimit": "Túl sok próbálkozás. Várjon egy pillanatot, és próbálja újra.", + "error": "A napi jutalmat nem sikerült kifizetni. Próbálja újra." + }, + "dailyRewardTitle": "Napi jutalmak", + "dailyRewardHint": "Jelentkezzen be minden nap, és fizesse ki jutalmát — a sorozatok a nagy napokig nőnek.", + "dailyRewardDay": "Nap {day}", + "dailyRewardStreak": "{count, plural, one {Sorozat: # nap} other {Sorozat: # nap}}", + "dailyRewardNextClaim": "Következő kifizetés: {amount} {currency}", + "dailyRewardTomorrow": "Holnap: {amount} {currency}", + "dailyRewardClaim": "Napi jutalom kifizetése", + "dailyRewardClaimedToday": "Kifizetve ma — jöjjön vissza holnap a következő jutalomért.", + "dailyRewardDisabled": "A napi jutalmak jelenleg le vannak tiltva. Felfedezheti a szállodát.", + "dailyRewardUnavailable": "A napi jutalomütemterv nem tölthető be. Próbálja újra." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Egy vizsgálat már fut — csatlakoztatva.", + "ageUnknown": "kor ismeretlen", + "ageBelow": "< 1n", + "scanButton": "Bútor eszközök vizsgálata", + "scanningAssets": "Eszközök vizsgálata…", + "cancelButton": "Mégse", + "deleteSelected": "Kijelöltek törlése ({count})", + "deleting": "Törlés…", + "redownloadBroken": "Sérültek letöltése újra", + "redownloading": "Újratöltés…", + "autoClean": "Régi hamisak automatikus tisztítása", + "cleaning": "Tisztítás…", + "exportManifest": "Jegyzék exportálása", + "exporting": "Exportálás…", + "phaseStems": "Bútor körök betöltése…", + "phaseReaddir": "Eszköz könyvtárak olvasása…", + "phaseValidate": ".nitro csomagok ellenőrzése…", + "phaseScanning": "Vizsgálat…", + "scanProgressFiles": "{count} fájl", + "repairProgress": "ok {ok}, sikertelen {failed}", + "attachedNotice": "A vizsgálat a háttérben folytatódik — az eredmények akkor jelennek meg, amikor befejeződik.", + "sessionCancelled": "Vizsgálat megszakítva.", + "onlyOldLabel": "Csak aznál régebbi fájlok megjelenítése", + "onlyOldAgeLabel": "Minimális kor napokban a megjelenítéshez", + "onlyOldToggle": "Friss fájlok elrejtése", + "daysLabel": "nap", + "autoAgeLabel": "Minimális kor napokban az automatikus tisztításhoz", + "loadingResult": "Vizsgálati eredmény betöltése…", + "scannedStat": "vizsgált eszköz fájl", + "cachedNotice": "(gyorsítótárban — a könyvtárak nem változtak)", + "fakeStat": "Hamis nitro (nincs megfelelő elem)", + "brokenStat": "Sérült nitro (olvashatatlan)", + "groupEmpty": "Nem található semmi", + "selectedCount": "{count} kijelölve", + "copiesBadge": "{count} másolat", + "groupFakeLabel": "Hamis nitro", + "groupFakeDescription": "Ezek a fájlok nem felelnek meg egyetlen elemnek sem az items_base-ben — törölt vagy átnevezett bútorok maradványai.", + "groupBrokenLabel": "Sérült nitro", + "groupBrokenDescription": "Ezek a fájlok egy elemhez tartoznak, de nem olvashatók fel érvényes Nitro csomagként.", + "groupSwfLabel": "Árva SWF fájlok", + "groupSwfDescription": ".swf fájlok, amelyek nem felelnek meg egyetlen elemnek sem az items_base-ben.", + "groupIconLabel": "Árva ikonok", + "groupIconDescription": "Ikon fájlok, amelyek nem felelnek meg egyetlen elemnek sem az items_base-ben.", + "warningText": "Egy sérült .nitro törlése a bázisban csomag nélkül hagyja az elemet — inkább töltse le újra, vagy hagyja, hogy a katalógus ellenőrzés később megszerezze. Az adatbázis sorait ezzel az eszközzel soha nem törli el.", + "onlyAssetsTouched": "Csak az eszköz fájlok változnak — a FurnitureData.json és az adatbázis sorai érintetlenek maradnak.", + "emptyHint": "Vizsgálja meg minden bútor eszköz könyvtárat, hogy megtalálja a hamis és sérült nitro csomagokat, valamint az árva SWF fájlokat és ikonokat. Törölje őket, töltse le újra a sérülteket, vagy tisztítsa automatikusan a régi maradékot.", + "noResult": "Még nincs vizsgálati eredmény — futtassa el először a bútor eszközök vizsgálatát.", + "scanFailed": "A vizsgálat sikertelen volt.", + "confirmDeleteTitle": "{count} eszköz fájl törlése?", + "confirmDeleteDescription": "A fájlok minden könyvtárból el lesznek távolítva (public + tükör gamedata). Az adatbázis sorai soha nem változnak.", + "confirmDeleteLabel": "Törlés", + "confirmRepairTitle": "{count} sérült .nitro csomag letöltése újra?", + "confirmRepairDescription": "A csomagokat újra lekérik a konfigurált nitro forrásokból, és minden könyvtárba felülírják (public + tükör gamedata).", + "confirmRepairLabel": "Letöltés újra", + "confirmAutoCleanTitle": "{days} napnál régebbi hamis nitro automatikus tisztítása?", + "confirmAutoCleanDescription": "Csak a küszöbértéknél régebbi hamis .nitro fájlok (nincs megfelelő elem) lesznek eltávolítva. A sérült csomagok és a friss fájlok soha nem változnak.", + "confirmAutoCleanLabel": "Automatikus tisztítás", + "toastDeletePartial": "{copies} másolat törölve, de egyes fájlokat nem lehetett eltávolítani", + "toastDeleteDone": "{copies} másolat törölve ({deleted} fájl)", + "toastRepairDone": "{count} .nitro csomag javítva", + "toastRepairFailed": "Egyetlen csomag sem szerezhető be ({failed} sikertelen)", + "toastRepairCancelled": "Javítás megszakítva", + "toastAutoCleanDone": "{deleted} régi hamis .nitro fájl tisztítva ({copies} másolat). Kihagyva {recent} friss + {broken} sérült.", + "toastAutoCleanNothing": "Nem elég régi az eltávolításhoz (kihagyva {recent} friss, {broken} sérült)", + "toastManifestDownload": "Vizsgálati jegyzék letöltve", + "gamedataTitle": "Játék adatok tisztítása", + "gamedataHint": "Előnézet először: ez felülírja a FurnitureData.json, FigureMap.json és FigureData.json fájlokat. Az eszköz eszközeitől eltérően sorokat töröl, amelyek nem hivatkoznak semmire — vizsgálja meg a számokat, mielőtt futtatná.", + "gamedataScan": "Játék adatok előnézete", + "gamedataScanning": "Vizsgálat…", + "gamedataRun": "Kijelöltek futtatása", + "gamedataRunning": "Tisztítás…", + "gamedataNoResult": "Még nincs előnézet — vizsgálja meg először a játék adatok JSON fájljait.", + "gamedataCount_duplicates": "FurnitureData ismétlődések", + "gamedataCount_orphans": "FurnitureData árva", + "gamedataCount_figureMap": "FigureMap problémák", + "gamedataCount_figureData": "Nem használt FigureData", + "gamedataPass_dedupeFurnitureData": "FurnitureData ismétlődéseinek eltávolítása", + "gamedataPassDesc_dedupeFurnitureData": "Egy szekción belüli ismétlődő classnames-eket távolít el, megtartva a legmagasabb revíziójú bejegyzést.", + "gamedataPass_cleanFurnitureData": "FurnitureData tisztítása", + "gamedataPassDesc_cleanFurnitureData": "Elszámolja azokat a bejegyzéseket, amelyek .nitro csomagja minden könyvtárban hiányzik.", + "gamedataPass_cleanFigureMap": "FigureMap tisztítása", + "gamedataPassDesc_cleanFigureMap": "Elszámolja azokat a részeket, amelyek egy hiányzó halmazra mutatnak a FigureData-ban, valamint a pontos ismétlődéseket.", + "gamedataPass_cleanFigureData": "FigureData tisztítása", + "gamedataPassDesc_cleanFigureData": "Elszámolja azokat a halmazokat, amelyekre egyetlen FigureMap rész sem hivatkozik, majd azokat a palettákat, amelyeket egyetlen halmaztípus sem használ. A FigureMap tisztítása után kell futtatni.", + "gamedataNothingSelected": "Válasszon legalább egy tisztítási lépést", + "gamedataConfirmTitle": "A játék adatok JSON fájljainak felülírása?", + "gamedataConfirmDescription": "{passes} lépés fut le {duplicates} ismétlődő csoporttal, {orphans} árva sorral, {figureMap} FigureMap problémával és {figureData} nem használt FigureData bejegyzéssel. A sorok biztonsági másolat nélkül törlődnek — ez nem vonható vissza.", + "gamedataConfirmLabel": "Fájlok felülírása", + "gamedataDifferingWarning": "Legalább egy ismétlődés nem pontos másolata a megtartott bejegyzésnek, így a törölt sor olyan adatokat tartalmazott, amelyekkel a túlélő nem rendelkezik.", + "gamedataCrossSectionNote": "{count} classname(ek) léteznek mind a roomitemtypes, mind a wallitemtypes szekcióban. Ezek csak jelentésre kerülnek — egyik törlése megváltoztatna egy elem típusát.", + "gamedataToastDone": "A játék adatok tisztítása {removed} sort törölt", + "gamedataToastNothing": "A játék adatok már tiszták voltak", + "gamedataMaxRemovalsLabel": "Max. sor lépésenként", + "gamedataMaxRemovalsHint": "A 0 az alapértelmezett 500-at használja. Egy lépés, amely többet törölne, megáll és kérdez a helyett, hogy írna.", + "gamedataLimitTitle": "{pass} {wouldRemove} sort törölne, a {maxRemovals} limit felett.", + "gamedataLimitDescription": "Ez a lépés nem írt semmit, így a fájlok változatlanok. Ellenőrizze először az eszköz útvonalakat — egy rossz könyvtár minden sort árvává teszi. A limit emelése külön, szándékos futtatás.", + "gamedataLimitOverride": "{wouldRemove} sor törlése mindenképpen", + "historyTitle": "Automatikus tisztítás előzményei", + "historyScheduled": "ütemezve", + "historyManual": "kézi", + "historyEntry": "{deleted} eltávolítva ({copies} másolat); kihagyva {recent} friss és {broken} sérült", + "historyErrors": "{count} hiba" + }, "importDiagnostics": { "attempts": "Fájldiagnosztika", "preliminary": "A címek előzetes ellenőrzése; a tartalmat az importálás ellenőrzi.", diff --git a/src/messages/it.json b/src/messages/it.json index 1fbdc823..9a4fab3c 100644 --- a/src/messages/it.json +++ b/src/messages/it.json @@ -960,7 +960,7 @@ "rateLimit": "Troppi tentativi. Attendi prima di riprovare." }, "title": "Account collegati", - "subtitle": "Collega un account social per poter accedere con un clic", + "subtitle": "Collega un account sociale per accedere con un clic", "connected": "Collegato", "unavailable": "Non disponibile", "login": { @@ -1024,7 +1024,9 @@ "showPassword": "Mostra", "hidePassword": "Nascondi", "accountDetails": "Dettagli dell’account", - "credentials": "Credenziali e sicurezza" + "credentials": "Credenziali e sicurezza", + "ageVerified": "Ho 18+ e accetto il requisito di età.", + "invitedBy": "Invitato da {username}" }, "forgot": { "title": "Reimposta password", @@ -1107,7 +1109,7 @@ "transactions": "Transazioni", "vouchers": "Buoni", "subscriptions": "Abbonamenti", - "referrals": "Inviti", + "referrals": "Referral", "dailyRewards": "Ricompense giornaliere", "rareValues": "Valori rari", "badges": "Distintivi", @@ -4390,7 +4392,7 @@ "vouchers": "Voucher", "subscriptions": "Abbonamenti", "calendar": "Calendario", - "referrals": "Inviti", + "referrals": "Referral", "dailyRewards": "Ricompense giornaliere", "history": "Cronologia", "moderationTab": "Moderazione", @@ -5989,6 +5991,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Referral", + "subtitle": "Sistema di invito", + "referralsToday": "Referral oggi", + "referralsTotal": "Referral totali", + "invitedTotal": "Inviti conteggiati", + "claims": "Ricompense riscattate", + "settings": "Impostazioni ricompensa", + "needed": "Referral necessari", + "rewardAmount": "Importo ricompensa", + "rewardCurrency": "Valuta ricompensa", + "blockSameIp": "Rifiuta i referral che condividono l'IP attuale dell'invitante", + "save": "Salva impostazioni", + "saving": "Salvataggio…", + "saved": "Impostazioni referral salvate.", + "saveError": "Le impostazioni referral non sono state salvate.", + "recent": "Referral recenti", + "unavailable": "I dati dei referral sono temporaneamente non disponibili.", + "empty": "Nessun referral ancora.", + "inviter": "Invitante", + "invitee": "Utente invitato", + "ip": "IP", + "date": "Data" + }, + "dailyRewards": { + "title": "Ricompense di accesso giornaliere", + "subtitle": "Programma ricompense di accesso giornaliere", + "enabled": "Stato funzionalità", + "yes": "Attivato", + "no": "Disattivato", + "scheduleDays": "Giorni del programma", + "claimsToday": "Riscatti oggi", + "claimsTotal": "Riscatti totali", + "status": "Stato funzionalità", + "statusHint": "Quando disattivato, la carta ricompense viene nascosta e i nuovi riscatti vengono rifiutati.", + "disable": "Disattiva", + "enable": "Attiva", + "schedule": "Programma ricompense", + "day": "Giorno {day}", + "reward": "Ricompensa", + "amount": "Importo", + "actions": "Azioni", + "addDay": "Giorno", + "add": "Aggiungi giorno", + "save": "Salva", + "saving": "Salvataggio…", + "saved": "Programma ricompense salvato.", + "cancel": "Annulla", + "edit": "Modifica", + "delete": "Elimina", + "created": "Giorno ricompensa aggiunto.", + "updated": "Giorno ricompensa aggiornato.", + "deleted": "Giorno ricompensa rimosso.", + "saveError": "Il giorno ricompensa non è stato salvato.", + "deleteError": "Il giorno ricompensa non è stato rimosso.", + "confirmDeleteTitle": "Rimuovi giorno ricompensa", + "confirmDeleteBody": "Questo giorno ricompensa non verrà più concesso. I riscatti passati restano registrati." } }, "radioRequests": { @@ -6286,7 +6346,7 @@ "login": "Accedi", "never": "Mai", "claimed": "Premio riscattato!", - "dailyClaimed": "Ricompensa giornaliera riscattata — torna domani!", + "dailyClaimed": "Ricompensa giornaliera riscattata — a domani!", "welcome": "Il tuo spazio su {hotel}", "noMotto": "Nessun motto", "registered": "Iscritto dal {date}", @@ -6342,9 +6402,9 @@ "dailyErrors": { "already_claimed": "Hai già riscattato la ricompensa giornaliera di oggi.", "disabled": "Le ricompense giornaliere sono attualmente disattivate.", - "bad_config": "Il programma delle ricompense giornaliere non è configurato correttamente. Contatta lo staff.", - "ratelimit": "Troppi tentativi. Attendi un momento e riprova.", - "error": "Non è stato possibile riscattare la ricompensa giornaliera. Riprova." + "bad_config": "Il programma ricompense giornaliere non è configurato correttamente. Contatta il personale.", + "ratelimit": "Troppi tentativi. Aspetta un momento e riprova.", + "error": "La ricompensa giornaliera non è stata riscattata. Riprova." }, "messagesCaughtUp": "Nessun messaggio da leggere", "messagesUnavailable": "Apri la posta per controllare", @@ -6357,22 +6417,22 @@ "noUpcomingEvents": "Non sono ancora stati annunciati nuovi eventi.", "roomsUnavailable": "Le stanze non sono al momento disponibili. Apri la community per riprovare.", "dailyRewardTitle": "Ricompense giornaliere", - "dailyRewardHint": "Accedi ogni giorno e riscatta la ricompensa: la serie cresce fino ai giorni speciali.", + "dailyRewardHint": "Accedi ogni giorno e riscatta la tua ricompensa — le serie crescono fino ai grandi giorni.", "dailyRewardDay": "Giorno {day}", "dailyRewardStreak": "{count, plural, one {Serie: # giorno} other {Serie: # giorni}}", - "dailyRewardNextClaim": "Prossimo ritiro: {amount} {currency}", + "dailyRewardNextClaim": "Prossimo riscatto: {amount} {currency}", "dailyRewardTomorrow": "Domani: {amount} {currency}", - "dailyRewardClaim": "Riscuoti la ricompensa giornaliera", - "dailyRewardClaimedToday": "Riscattata oggi — torna domani per la prossima ricompensa.", - "dailyRewardDisabled": "Le ricompense giornaliere sono attualmente disattivate. Puoi comunque esplorare l’hotel.", - "dailyRewardUnavailable": "Non è stato possibile caricare il programma delle ricompense giornaliere. Riprova.", + "dailyRewardClaim": "Riscatta ricompensa giornaliera", + "dailyRewardClaimedToday": "Riscattato oggi — torna domani per la prossima ricompensa.", + "dailyRewardDisabled": "Le ricompense giornaliere sono attualmente disattivate. Puoi esplorare l'hotel.", + "dailyRewardUnavailable": "Il programma ricompense giornaliere non è stato caricato. Riprova.", "tasks": { "title": "Da fare", "support": "{count, plural, one {# ticket con risposta del supporto} other {# ticket con risposte del supporto}}", "friends": "{count, plural, one {# richiesta di amicizia da controllare} other {# richieste di amicizia da controllare}}", "event": "Il prossimo evento a cui sei iscritto: {title} · {date}", "reward": "Il premio per gli inviti è pronto da ritirare", - "dailyReward": "La tua ricompensa giornaliera è pronta da ritirare", + "dailyReward": "La tua ricompensa giornaliera è pronta per il riscatto", "empty": "Tutto a posto. Nessuna azione in attesa.", "unavailable": "Non è stato possibile verificare alcune azioni. Quelle disponibili sono mostrate sopra.", "retry": "Riprova", @@ -6525,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Una scansione è già in corso — connessa ad essa.", + "ageUnknown": "età sconosciuta", + "ageBelow": "< 1g", + "scanButton": "Scansiona risorse arredamento", + "scanningAssets": "Scansione delle risorse…", + "cancelButton": "Annulla", + "deleteSelected": "Elimina selezionati ({count})", + "deleting": "Eliminazione…", + "redownloadBroken": "Riscarica danneggiate", + "redownloading": "Riscaricamento…", + "autoClean": "Pulisci automaticamente i falsi vecchi", + "cleaning": "Pulizia…", + "exportManifest": "Esporta manifesto", + "exporting": "Esportazione…", + "phaseStems": "Caricamento steli di arredamento…", + "phaseReaddir": "Lettura delle directory delle risorse…", + "phaseValidate": "Convalida dei pacchetti .nitro…", + "phaseScanning": "Scansione…", + "scanProgressFiles": "{count} file", + "repairProgress": "ok {ok}, falliti {failed}", + "attachedNotice": "La scansione continua in background — i risultati appariranno al termine.", + "sessionCancelled": "Scansione annullata.", + "onlyOldLabel": "Mostra solo file più vecchi di", + "onlyOldAgeLabel": "Età minima in giorni per la visualizzazione", + "onlyOldToggle": "Nascondi file recenti", + "daysLabel": "giorni", + "autoAgeLabel": "Età minima in giorni per la pulizia automatica", + "loadingResult": "Caricamento del risultato della scansione…", + "scannedStat": "file di risorse scansionati", + "cachedNotice": "(in cache — le directory sono invariate)", + "fakeStat": "Nitro falsi (nessun elemento corrispondente)", + "brokenStat": "Nitro danneggiati (illeggibili)", + "groupEmpty": "Nessun risultato", + "selectedCount": "{count} selezionati", + "copiesBadge": "{count} copie", + "groupFakeLabel": "Nitro falsi", + "groupFakeDescription": "Questi file non corrispondono a nessun elemento in items_base — resti di arredamento eliminato o rinominato.", + "groupBrokenLabel": "Nitro danneggiati", + "groupBrokenDescription": "Questi file appartengono a un elemento ma non possono essere letti come un pacchetto Nitro valido.", + "groupSwfLabel": "SWF orfani", + "groupSwfDescription": "File .swf che non corrispondono a nessun elemento in items_base.", + "groupIconLabel": "Icone orfane", + "groupIconDescription": "File di icone che non corrispondono a nessun elemento in items_base.", + "warningText": "Eliminare un .nitro danneggiato lascia il suo elemento nel database senza pacchetto — preferisci di riscaricarlo, o lascia che l'audit del cataloglo lo ottenga in seguito. Le righe del database non vengono mai rimosse da questo strumento.", + "onlyAssetsTouched": "Solo i file delle risorse vengono toccati — FurnitureData.json e le righe del database restano intatte.", + "emptyHint": "Scansiona ogni directory di risorse di arredamento per trovare pacchetti nitro falsi e danneggiati oltre a SWF e icone orfani. Eliminali, riscarica i danneggiati o pulisci automaticamente i resti vecchi.", + "noResult": "Nessun risultato di scansione ancora — esegui prima una scansione delle risorse di arredamento.", + "scanFailed": "La scansione è fallita.", + "confirmDeleteTitle": "Eliminare {count} file di risorse?", + "confirmDeleteDescription": "I file verranno rimossi da ogni directory (public + gamedata specchiata). Le righe del database non vengono mai toccate.", + "confirmDeleteLabel": "Elimina", + "confirmRepairTitle": "Riscaricare {count} pacchetto/i .nitro danneggiato/i?", + "confirmRepairDescription": "I pacchetti verranno recuperati dalle sorgenti nitro configurate e sovrascritti su ogni directory (public + gamedata specchiata).", + "confirmRepairLabel": "Riscarica", + "confirmAutoCleanTitle": "Pulire automaticamente i nitro falsi più vecchi di {days} giorno/i?", + "confirmAutoCleanDescription": "Vengono rimossi solo i file .nitro falsi (nessun elemento corrispondente) più vecchi della soglia. I pacchetti danneggiati e i file recenti non vengono mai toccati.", + "confirmAutoCleanLabel": "Pulisci automaticamente", + "toastDeletePartial": "Eliminate {copies} copie, ma alcuni file non hanno potuto essere rimossi", + "toastDeleteDone": "Eliminate {copies} copie di file ({deleted} file)", + "toastRepairDone": "Riparati {count} pacchetti .nitro", + "toastRepairFailed": "Impossibile ottenere alcun pacchetto ({failed} falliti)", + "toastRepairCancelled": "Riparazione annullata", + "toastAutoCleanDone": "Puliti {deleted} vecchi file .nitro falsi ({copies} copie). Saltati {recent} recenti + {broken} danneggiati.", + "toastAutoCleanNothing": "Niente di abbastanza vecchio da rimuovere (saltati {recent} recenti, {broken} danneggiati)", + "toastManifestDownload": "Manifesto della scansione scaricato", + "gamedataTitle": "Pulizia dei dati di gioco", + "gamedataHint": "Anteprima prima: questo riscrive FurnitureData.json, FigureMap.json e FigureData.json. A differenza degli strumenti delle risorse sopra, rimuove le righe che non fanno riferimento a nulla — esamina i conteggi prima di eseguirlo.", + "gamedataScan": "Anteprima dei dati di gioco", + "gamedataScanning": "Scansione…", + "gamedataRun": "Esegui selezionati", + "gamedataRunning": "Pulizia…", + "gamedataNoResult": "Nessuna anteprima ancora — scansiona prima i file JSON dei dati di gioco.", + "gamedataCount_duplicates": "Duplicati di FurnitureData", + "gamedataCount_orphans": "FurnitureData orfani", + "gamedataCount_figureMap": "Problemi di FigureMap", + "gamedataCount_figureData": "FigureData inutilizzato", + "gamedataPass_dedupeFurnitureData": "Dedicuplica FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Rimuove i classnames ripetuti all'interno di una sezione, conservando la voce con la revisione più alta.", + "gamedataPass_cleanFurnitureData": "Pulisci FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Rimuove le voci il cui pacchetto .nitro è assente da ogni directory.", + "gamedataPass_cleanFigureMap": "Pulisci FigureMap", + "gamedataPassDesc_cleanFigureMap": "Rimuove le parti che puntano a un set mancante in FigureData, oltre ai duplicati esatti.", + "gamedataPass_cleanFigureData": "Pulisci FigureData", + "gamedataPassDesc_cleanFigureData": "Rimuove i set a cui nessuna parte di FigureMap fa riferimento, poi le palette che nessun tipo di set utilizza. Deve essere eseguito dopo Pulisci FigureMap.", + "gamedataNothingSelected": "Seleziona almeno un passaggio di pulizia", + "gamedataConfirmTitle": "Riscrivere i file JSON dei dati di gioco?", + "gamedataConfirmDescription": "{passes} passaggio/i verranno eseguiti su {duplicates} gruppi duplicati, {orphans} righe orfane, {figureMap} problemi di FigureMap e {figureData} voci FigureData inutilizzate. Le righe vengono rimosse senza backup — questo non può essere annullato.", + "gamedataConfirmLabel": "Riscrivi file", + "gamedataDifferingWarning": "Almeno un duplicato non è una copia esatta della voce conservata, quindi la riga eliminata conteneva dati che il sopravvissuto non ha.", + "gamedataCrossSectionNote": "{count} classname/i esistono sia in roomitemtypes che in wallitemtypes. Questi vengono solo segnalati — rimuoverne uno cambiherebbe il tipo di un elemento.", + "gamedataToastDone": "La pulizia dei dati di gioco ha rimosso {removed} righe", + "gamedataToastNothing": "I dati di gioco erano già puliti", + "gamedataMaxRemovalsLabel": "Max righe per passaggio", + "gamedataMaxRemovalsHint": "0 usa il valore predefinito 500. Un passaggio che ne rimuoverebbe più si ferma e chiede invece di scrivere.", + "gamedataLimitTitle": "{pass} rimuoverebbe {wouldRemove} righe, oltre il limite di {maxRemovals}.", + "gamedataLimitDescription": "Quel passaggio non ha scritto nulla, quindi i file sono invariati. Controlla prima i percorsi delle risorse — una directory sbagliata rende ogni riga orfana. Aumentare il limite è un'esecuzione separata e deliberata.", + "gamedataLimitOverride": "Rimuovi comunque {wouldRemove} righe", + "historyTitle": "Cronologia della pulizia automatica", + "historyScheduled": "programmato", + "historyManual": "manuale", + "historyEntry": "Rimossi {deleted} ({copies} copie); saltati {recent} recenti e {broken} danneggiati", + "historyErrors": "{count} errori" + }, "importDiagnostics": { "attempts": "Diagnostica file sorgente", "preliminary": "Controllo preliminare: questi indirizzi sono stati verificati senza scaricare i file. L'importazione validerà i file originali.", diff --git a/src/messages/ja.json b/src/messages/ja.json index dd9224c3..e67d97f1 100644 --- a/src/messages/ja.json +++ b/src/messages/ja.json @@ -175,7 +175,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "紹介", + "dailyRewards": "デイリー報酬" }, "logs": { "audit": { @@ -1806,7 +1808,8 @@ "saving": "Saving…", "deleteAd": "Delete ad", "cancel": "Cancel" - } + }, + "colId": "ID" }, "writeableBoxes": { "title": "Writeable Boxes", @@ -3361,7 +3364,9 @@ "errors": "Errors", "alerts": "Alerts", "toolsGroup": "Tools", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "紹介", + "dailyRewards": "デイリー報酬" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -4969,6 +4974,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "紹介", + "subtitle": "招待システム", + "referralsToday": "今日の紹介", + "referralsTotal": "紹介総数", + "invitedTotal": "招待数", + "claims": "受け取った報酬", + "settings": "報酬設定", + "needed": "必要な紹介数", + "rewardAmount": "報酬額", + "rewardCurrency": "報酬通貨", + "blockSameIp": "招待者の現在IPと共有する紹介を拒否", + "save": "設定を保存", + "saving": "保存中…", + "saved": "紹介設定を保存しました。", + "saveError": "紹介設定を保存できませんでした。", + "recent": "最近の紹介", + "unavailable": "紹介データは一時的に利用できません。", + "empty": "まだ紹介はありません。", + "inviter": "招待者", + "invitee": "招待されたユーザー", + "ip": "IP", + "date": "日付" + }, + "dailyRewards": { + "title": "デイリーログイン報酬", + "subtitle": "デイリーログイン報酬スケジュール", + "enabled": "機能ステータス", + "yes": "有効", + "no": "無効", + "scheduleDays": "スケジュール日", + "claimsToday": "今日の受け取り", + "claimsTotal": "総受け取り数", + "status": "機能ステータス", + "statusHint": "無効にすると、報酬カードが非表示になり、新しい受け取りは拒否されます。", + "disable": "無効にする", + "enable": "有効にする", + "schedule": "報酬スケジュール", + "day": "日 {day}", + "reward": "報酬", + "amount": "金額", + "actions": "操作", + "addDay": "日", + "add": "日を追加", + "save": "保存", + "saving": "保存中…", + "saved": "報酬スケジュールを保存しました。", + "cancel": "キャンセル", + "edit": "編集", + "delete": "削除", + "created": "報酬日を追加しました。", + "updated": "報酬日を更新しました。", + "deleted": "報酬日を削除しました。", + "saveError": "報酬日を保存できませんでした。", + "deleteError": "報酬日を削除できませんでした。", + "confirmDeleteTitle": "報酬日を削除", + "confirmDeleteBody": "この報酬日は今後付与されません。過去の受け取りは記録されたまま残ります。" } }, "myDashboard": { @@ -5049,8 +5112,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "デイリー報酬の受け取り準備ができました" + }, + "dailyClaimed": "デイリー報酬を受け取りました — また明日!", + "dailyErrors": { + "already_claimed": "今日のデイリー報酬はすでに受け取っています。", + "disabled": "デイリー報酬は現在無効です。", + "bad_config": "デイリー報酬スケジュールが正しく設定されていません。スタッフに連絡してください。", + "ratelimit": "試行回数が多すぎます。少し待ってから再試行してください。", + "error": "デイリー報酬を受け取れませんでした。もう一度お試しください。" + }, + "dailyRewardTitle": "デイリー報酬", + "dailyRewardHint": "毎日ログインして報酬を受け取ろう — 連続記録は大きな日まで伸びていきます。", + "dailyRewardDay": "日 {day}", + "dailyRewardStreak": "{count, plural, one {連続: # 日} other {連続: # 日}}", + "dailyRewardNextClaim": "次の受け取り: {amount} {currency}", + "dailyRewardTomorrow": "明日: {amount} {currency}", + "dailyRewardClaim": "デイリー報酬を受け取る", + "dailyRewardClaimedToday": "今日受け取りました — 次の報酬はまた明日。", + "dailyRewardDisabled": "デイリー報酬は現在無効です。ホテルを探索できます。", + "dailyRewardUnavailable": "デイリー報酬スケジュールを読み込めませんでした。もう一度お試しください。" }, "error": { "code": "Error", @@ -6045,7 +6127,9 @@ "emailRequired": "Email is required.", "passwordRequired": "Password is required.", "passwordsDontMatch": "Passwords do not match.", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "18歳以上です。年齢要件に同意します。", + "invitedBy": "{username} さんに招待されました" }, "forgot": { "title": "Reset password", @@ -6479,7 +6563,11 @@ "sprite": "· sprite", "Git": "Git:" } - } + }, + "title": "リンクされたアカウント", + "subtitle": "ソーシャルアカウントをリンクしてワンクリックでログイン", + "connected": "リンク済み", + "unavailable": "利用不可" }, "toolbar": { "home": "ホーム", @@ -6497,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "スキャンは既に実行中です — それに接続しました。", + "ageUnknown": "年齢不明", + "ageBelow": "< 1日", + "scanButton": "家具アセットをスキャン", + "scanningAssets": "アセットをスキャン中…", + "cancelButton": "キャンセル", + "deleteSelected": "選択したものを削除 ({count})", + "deleting": "削除中…", + "redownloadBroken": "破損したものを再ダウンロード", + "redownloading": "再ダウンロード中…", + "autoClean": "古い偽物を自動クリーン", + "cleaning": "クリーン中…", + "exportManifest": "マニフェストをエクスポート", + "exporting": "エクスポート中…", + "phaseStems": "家具のステムを読み込み中…", + "phaseReaddir": "アセットディレクトリを読み取り中…", + "phaseValidate": ".nitroバンドルを検証中…", + "phaseScanning": "スキャン中…", + "scanProgressFiles": "{count} ファイル", + "repairProgress": "ok {ok}, 失敗 {failed}", + "attachedNotice": "スキャンはバックグラウンドで継続します — 完了すると結果が表示されます。", + "sessionCancelled": "スキャンがキャンセルされました。", + "onlyOldLabel": "これより古いファイルのみ表示", + "onlyOldAgeLabel": "表示する最小日数", + "onlyOldToggle": "最近のファイルを非表示", + "daysLabel": "日", + "autoAgeLabel": "自動クリーンの最小日数", + "loadingResult": "スキャン結果を読み込み中…", + "scannedStat": "スキャンされたアセットファイル", + "cachedNotice": "(キャッシュ済み — ディレクトリは変更なし)", + "fakeStat": "偽の nitro (一致するアイテムなし)", + "brokenStat": "破損した nitro (読み取り不可)", + "groupEmpty": "見つかりませんでした", + "selectedCount": "{count} 件選択", + "copiesBadge": "{count} コピー", + "groupFakeLabel": "偽の nitro", + "groupFakeDescription": "これらのファイルは items_base のどのアイテムとも一致しません — 削除または改名された家具の残骸です。", + "groupBrokenLabel": "破損した nitro", + "groupBrokenDescription": "これらのファイルはアイテムに属していますが、有効な Nitro バンドルとして読み取れません。", + "groupSwfLabel": "孤立した SWF", + "groupSwfDescription": "items_base のどのアイテムとも一致しない .swf ファイル。", + "groupIconLabel": "孤立したアイコン", + "groupIconDescription": "items_base のどのアイテムとも一致しないアイコンファイル。", + "warningText": "破損した .nitro を削除すると、データベース内のアイテムはバンドルなしのままになります — 再ダウンロードするか、カタログ監査で後で取得してください。このツールでデータベースの行が削除されることはありません。", + "onlyAssetsTouched": "アセットファイルのみ変更されます — FurnitureData.json とデータベースの行はそのまま残ります。", + "emptyHint": "各家具アセットディレクトリをスキャンして、偽物と破損した nitro バンドル、孤立した SWF とアイコンを削除、再ダウンロード、または古い残骸の自動クリーンを行います。", + "noResult": "スキャン結果はまだありません — まず家具アセットのスキャンを実行してください。", + "scanFailed": "スキャンに失敗しました。", + "confirmDeleteTitle": "{count} 個のアセットファイルを削除しますか?", + "confirmDeleteDescription": "ファイルはすべてのディレクトリから削除されます (public + ミラーリングされた gamedata)。データベースの行は変更されません。", + "confirmDeleteLabel": "削除", + "confirmRepairTitle": "{count} 個の破損した .nitro バンドルを再ダウンロードしますか?", + "confirmRepairDescription": "バンドルは設定された nitro ソースから再取得され、すべてのディレクトリに上書きされます (public + ミラーリングされた gamedata)。", + "confirmRepairLabel": "再ダウンロード", + "confirmAutoCleanTitle": "{days} 日より古い偽の nitro を自動クリーンしますか?", + "confirmAutoCleanDescription": "閾値より古い偽の .nitro ファイル (一致するアイテムなし) のみ削除されます。破損したバンドルと最近のファイルは変更されません。", + "confirmAutoCleanLabel": "自動クリーン", + "toastDeletePartial": "{copies} コピーを削除しましたが、一部のファイルは削除できませんでした", + "toastDeleteDone": "{copies} ファイルコピーを削除 ({deleted} ファイル)", + "toastRepairDone": "{count} 個の .nitro バンドルを修復", + "toastRepairFailed": "バンドルを取得できませんでした ({failed} 件失敗)", + "toastRepairCancelled": "修復がキャンセルされました", + "toastAutoCleanDone": "{deleted} 個の古い偽の .nitro ファイルをクリーン ({copies} コピー)。{recent} 件の最新 + {broken} 件の破損をスキップ。", + "toastAutoCleanNothing": "削除するほど古いものはありません ({recent} 件の最新、{broken} 件の破損をスキップ)", + "toastManifestDownload": "スキャンマニフェストをダウンロードしました", + "gamedataTitle": "ゲームデータのクリーン", + "gamedataHint": "先にプレビュー: これは FurnitureData.json、FigureMap.json、FigureData.json を上書きします。上のアセットツールとは異なり、参照しない行を削除します — 実行する前にカウントを確認してください。", + "gamedataScan": "ゲームデータのプレビュー", + "gamedataScanning": "スキャン中…", + "gamedataRun": "選択を実行", + "gamedataRunning": "クリーン中…", + "gamedataNoResult": "プレビューはまだありません — まずゲームデータの JSON ファイルをスキャンしてください。", + "gamedataCount_duplicates": "FurnitureData の重複", + "gamedataCount_orphans": "FurnitureData の孤立", + "gamedataCount_figureMap": "FigureMap の問題", + "gamedataCount_figureData": "未使用の FigureData", + "gamedataPass_dedupeFurnitureData": "FurnitureData の重複排除", + "gamedataPassDesc_dedupeFurnitureData": "1つのセクション内で繰り返される classnames を削除し、最高リビジョンのエントリを保持します。", + "gamedataPass_cleanFurnitureData": "FurnitureData をクリーン", + "gamedataPassDesc_cleanFurnitureData": "すべてのディレクトリで .nitro バンドルが欠落しているエントリを削除します。", + "gamedataPass_cleanFigureMap": "FigureMap をクリーン", + "gamedataPassDesc_cleanFigureMap": "FigureData で不足しているセットを指す部分と、完全に重複する部分を削除します。", + "gamedataPass_cleanFigureData": "FigureData をクリーン", + "gamedataPassDesc_cleanFigureData": "FigureMap の部分が参照しないセットを削除し、どのセットタイプも使用しないパレットを削除します。FigureMap のクリーンの後に実行する必要があります。", + "gamedataNothingSelected": "少なくとも1つのクリーン手順を選択してください", + "gamedataConfirmTitle": "ゲームデータの JSON ファイルを上書きしますか?", + "gamedataConfirmDescription": "{passes} 手順が {duplicates} 重複グループ、{orphans} 孤立行、{figureMap} FigureMap の問題、{figureData} 未使用の FigureData エントリに対して実行されます。行はバックアップなしで削除されます — これは元に戻せません。", + "gamedataConfirmLabel": "ファイルを上書き", + "gamedataDifferingWarning": "少なくとも1つの重複は保持されるエントリの正確なコピーではないため、削除された行は保持されるエントリにないデータを含んでいました。", + "gamedataCrossSectionNote": "{count} 個の classname が roomitemtypes と wallitemtypes の両方に存在します。これらは報告のみ — 1つを削除するとアイテムのタイプが変わります。", + "gamedataToastDone": "ゲームデータのクリーンが {removed} 行を削除しました", + "gamedataToastNothing": "ゲームデータはすでにクリーンでした", + "gamedataMaxRemovalsLabel": "手順ごとの最大行数", + "gamedataMaxRemovalsHint": "0 はデフォルトの 500 を使用します。より多くの削除が必要な手順は、書く前に停止して確認します。", + "gamedataLimitTitle": "{pass} は {maxRemovals} の制限を超えて {wouldRemove} 行を削除します。", + "gamedataLimitDescription": "その手順は何も書き込まなかったため、ファイルは変更されていません。まずアセットパスを確認してください — 間違ったディレクトリはすべての行を孤立させます。制限を引き上げることは、別の意図的な実行です。", + "gamedataLimitOverride": "{wouldRemove} 行を強制的に削除", + "historyTitle": "自動クリーンの履歴", + "historyScheduled": "スケジュール済み", + "historyManual": "手動", + "historyEntry": "{deleted} 件を削除 ({copies} コピー)、{recent} 件の最新と {broken} 件の破損をスキップ", + "historyErrors": "{count} エラー" + }, "importDiagnostics": { "attempts": "ファイル診断", "preliminary": "アドレスの事前確認です。内容はインポート時に検証します。", diff --git a/src/messages/no.json b/src/messages/no.json index 3e0135da..bb420809 100644 --- a/src/messages/no.json +++ b/src/messages/no.json @@ -818,8 +818,8 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Tilknyttede kontoer", - "subtitle": "Koble til en sosial konto slik at du kan logge på med ett klikk", - "connected": "Tilkoblet", + "subtitle": "Knytt en sosial konto for å logge inn med ett klikk", + "connected": "Tilknyttet", "unavailable": "Utilgjengelig", "login": { "title": "Logg på", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Jeg er 18+ og godtar alderskravet.", + "invitedBy": "Invitert av {username}" }, "forgot": { "title": "Tilbakestill passord", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Henvisninger", + "dailyRewards": "Daglige belønninger" }, "dashboard": { "title": "Dashbord", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Henvisninger", + "dailyRewards": "Daglige belønninger" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Henvisninger", + "subtitle": "Invitasjonssystem", + "referralsToday": "Henvisninger i dag", + "referralsTotal": "Totalt antall henvisninger", + "invitedTotal": "Invitasjoner tellt", + "claims": "Belønninger hevet", + "settings": "Belønningsinnstillinger", + "needed": "Nødvendige henvisninger", + "rewardAmount": "Belønningsbeløp", + "rewardCurrency": "Belønningsvaluta", + "blockSameIp": "Avslå henvisninger som deler invitererens nåværende IP", + "save": "Lagre innstillinger", + "saving": "Lagrer…", + "saved": "Henvisningsinnstillinger lagret.", + "saveError": "Henvisningsinnstillinger kunne ikke lagres.", + "recent": "Nylige henvisninger", + "unavailable": "Henvisningsdata er midlertidig utilgjengelig.", + "empty": "Ingen henvisninger ennå.", + "inviter": "Inviterer", + "invitee": "Invitert bruker", + "ip": "IP", + "date": "Dato" + }, + "dailyRewards": { + "title": "Daglige innloggingsbelønninger", + "subtitle": "Daglig innloggingsbelønningsplan", + "enabled": "Funksjonsstatus", + "yes": "Aktivert", + "no": "Deaktivert", + "scheduleDays": "Planens dager", + "claimsToday": "Uttak i dag", + "claimsTotal": "Totalt antall uttak", + "status": "Funksjonsstatus", + "statusHint": "Når deaktivert, skjules belønningskortet og nye uttak avslås.", + "disable": "Deaktiver", + "enable": "Aktiver", + "schedule": "Belønningsplan", + "day": "Dag {day}", + "reward": "Belønning", + "amount": "Beløp", + "actions": "Handlinger", + "addDay": "Dag", + "add": "Legg til dag", + "save": "Lagre", + "saving": "Lagrer…", + "saved": "Belønningsplan lagret.", + "cancel": "Avbryt", + "edit": "Rediger", + "delete": "Slett", + "created": "Belønningsdag lagt til.", + "updated": "Belønningsdag oppdatert.", + "deleted": "Belønningsdag fjernet.", + "saveError": "Belønningsdag kunne ikke lagres.", + "deleteError": "Belønningsdag kunne ikke fjernes.", + "confirmDeleteTitle": "Fjern belønningsdag", + "confirmDeleteBody": "Denne belønningsdagen vil ikke lengere bli gitt. Tidligere uttak forblir registrert." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Den daglige belønningen din er klar til å heves" + }, + "dailyClaimed": "Daglig belønning hevet — sees i morgen!", + "dailyErrors": { + "already_claimed": "Du har allerede hevet dagens daglige belønning.", + "disabled": "Daglige belønninger er deaktivert for øyeblikket.", + "bad_config": "Den daglige belønningsplanen er ikke konfigurert riktig. Kontakt personalet.", + "ratelimit": "For mange forsøk. Vent et øyeblikk og prøv igjen.", + "error": "Den daglige belønningen kunne ikke heves. Prøv igjen." + }, + "dailyRewardTitle": "Daglige belønninger", + "dailyRewardHint": "Logg inn hver dag og hev belønningen din — serier vokser inn til de store dagene.", + "dailyRewardDay": "Dag {day}", + "dailyRewardStreak": "{count, plural, one {Serie: # dag} other {Serie: # dager}}", + "dailyRewardNextClaim": "Neste uttak: {amount} {currency}", + "dailyRewardTomorrow": "I morgen: {amount} {currency}", + "dailyRewardClaim": "Hev daglig belønning", + "dailyRewardClaimedToday": "Hevet i dag — kom tilbake i morgen for neste belønning.", + "dailyRewardDisabled": "Daglige belønninger er deaktivert for øyeblikket. Du kan utforske hotellet.", + "dailyRewardUnavailable": "Den daglige belønningsplanen kunne ikke lastes. Prøv igjen." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "En scan kjører allerede — tilkoblet den.", + "ageUnknown": "alder ukjent", + "ageBelow": "< 1d", + "scanButton": "Skann møbelressurser", + "scanningAssets": "Skanner ressurser…", + "cancelButton": "Avbryt", + "deleteSelected": "Slett valgte ({count})", + "deleting": "Sletter…", + "redownloadBroken": "Last ned skadede på nytt", + "redownloading": "Laster ned på nytt…", + "autoClean": "Rensk gamle falske automatisk", + "cleaning": "Renser…", + "exportManifest": "Eksporter manifest", + "exporting": "Eksporterer…", + "phaseStems": "Laster møbelstilker…", + "phaseReaddir": "Leser ressurskataloger…", + "phaseValidate": "Validerer .nitro-pakker…", + "phaseScanning": "Skanner…", + "scanProgressFiles": "{count} filer", + "repairProgress": "ok {ok}, mislyktes {failed}", + "attachedNotice": "Scanen fortsetter i bakgrunnen — resultatene vises når den er ferdig.", + "sessionCancelled": "Scanen avbrutt.", + "onlyOldLabel": "Vis kun filer eldre enn", + "onlyOldAgeLabel": "Minimumsalder i dager for visning", + "onlyOldToggle": "Skjul nylige filer", + "daysLabel": "dager", + "autoAgeLabel": "Minimumsalder i dager for automatisk rengjøring", + "loadingResult": "Laster skannerresultat…", + "scannedStat": "ressursfiler skannet", + "cachedNotice": "(mellomlagret — katalogene er uendret)", + "fakeStat": "Falske nitro (ingen matchende gjenstand)", + "brokenStat": "Skadede nitro (kan ikke parses)", + "groupEmpty": "Ingenting funnet", + "selectedCount": "{count} valgt", + "copiesBadge": "{count} kopier", + "groupFakeLabel": "Falske nitro", + "groupFakeDescription": "Disse filene matcher ingen gjenstand i items_base — rester fra slettede eller omdøpte møbler.", + "groupBrokenLabel": "Skadede nitro", + "groupBrokenDescription": "Disse filene tilhører en gjenstand, men kan ikke parses som en gyldig Nitro-pakke.", + "groupSwfLabel": "Foreldreløse SWF-filer", + "groupSwfDescription": ".swf-filer som matcher ingen gjenstand i items_base.", + "groupIconLabel": "Foreldreløse ikoner", + "groupIconDescription": "Ikonfiler som matcher ingen gjenstand i items_base.", + "warningText": "Hvis du sletter en skadet .nitro, forblir gjenstanden i databasen uten pakke — foretrekker å laste den ned på nytt, eller la kataloggjennomgangen skaffe den senere. Databaserader fjernes aldri av dette verktøyet.", + "onlyAssetsTouched": "Kun ressursfiler berøres — FurnitureData.json og databaserader forblir intakte.", + "emptyHint": "Skann hver møbelressurskatalog for å finne falske og skadede nitro-pakker samt foreldreløse SWF-filer og ikoner. Slett dem, last ned de skadede på nytt eller rens gamle rester automatisk.", + "noResult": "Ingen skannerresultat ennå — kjør en møbelressursskanning først.", + "scanFailed": "Skanningen mislyktes.", + "confirmDeleteTitle": "Slett {count} ressursfil(er)?", + "confirmDeleteDescription": "Filene fjernes fra alle kataloger (public + speilede gamedata). Databaserader berøres aldri.", + "confirmDeleteLabel": "Slett", + "confirmRepairTitle": "Last ned {count} skadet(e) .nitro-pakke(r) på nytt?", + "confirmRepairDescription": "Pakkene hentes på nytt fra de konfigurerte nitro-kildene og skrives over alle kataloger (public + speilede gamedata).", + "confirmRepairLabel": "Last ned på nytt", + "confirmAutoCleanTitle": "Rens falske nitro eldre enn {days} dag(er) automatisk?", + "confirmAutoCleanDescription": "Kun falske .nitro-filer (ingen matchende gjenstand) eldre enn terskelen fjernes. Skadede pakker og nylige filer berøres aldri.", + "confirmAutoCleanLabel": "Rens automatisk", + "toastDeletePartial": "Slettet {copies} kopier, men noen filer kunne ikke fjernes", + "toastDeleteDone": "Slettet {copies} filkopier ({deleted} filer)", + "toastRepairDone": "Reparerte {count} .nitro-pakker", + "toastRepairFailed": "Kunne ikke skaffe noen pakker ({failed} mislyktes)", + "toastRepairCancelled": "Reparasjon avbrutt", + "toastAutoCleanDone": "Renset {deleted} gamle falske .nitro-filer ({copies} kopier). Hoppet over {recent} nylige + {broken} skadede.", + "toastAutoCleanNothing": "Ingenting gammelt nok til å fjerne (hoppet over {recent} nylige, {broken} skadede)", + "toastManifestDownload": "Skannemanifest lastet ned", + "gamedataTitle": "Rens spilldata", + "gamedataHint": "Forhåndsvis først: dette skriver på nytt FurnitureData.json, FigureMap.json og FigureData.json. I motsetning til ressursverktøyene ovenfor fjerner det rader som ikke refererer til noe — sjekk tallene før du kjører det.", + "gamedataScan": "Forhåndsvis spilldata", + "gamedataScanning": "Skanner…", + "gamedataRun": "Kjør valgte", + "gamedataRunning": "Renser…", + "gamedataNoResult": "Ingen forhåndsvisning ennå — skann spilldata-JSON-filene først.", + "gamedataCount_duplicates": "FurnitureData-duplikater", + "gamedataCount_orphans": "FurnitureData-foreldreløse", + "gamedataCount_figureMap": "FigureMap-problemer", + "gamedataCount_figureData": "Ubrukt FigureData", + "gamedataPass_dedupeFurnitureData": "Fjern duplikater i FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Fjerner gjentatte classnames innen én seksjon og beholder oppføringen med høyest revisjon.", + "gamedataPass_cleanFurnitureData": "Rens FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Fjerner oppføringer hvor .nitro-pakken mangler i alle kataloger.", + "gamedataPass_cleanFigureMap": "Rens FigureMap", + "gamedataPassDesc_cleanFigureMap": "Fjerner deler som peker på et sett som mangler i FigureData, pluss nøyaktige duplikater.", + "gamedataPass_cleanFigureData": "Rens FigureData", + "gamedataPassDesc_cleanFigureData": "Fjerner sett som ingen FigureMap-del refererer til, deretter paletter som ingen sett-type bruker. Må kjøres etter Rens FigureMap.", + "gamedataNothingSelected": "Velg minst ett rengjøringssteg", + "gamedataConfirmTitle": "Skriv på nytt spilldata-JSON-filer?", + "gamedataConfirmDescription": "{passes} steg kjøres mot {duplicates} duplikatgrupper, {orphans} foreldreløse rader, {figureMap} FigureMap-problemer og {figureData} ubrukte FigureData-oppføringer. Rader fjernes uten sikkerhetskopi — dette kan ikke angres.", + "gamedataConfirmLabel": "Skriv på nytt filer", + "gamedataDifferingWarning": "Minst én duplikat er ikke en nøyaktig kopi av oppføringen som beholdes, så den slettede raden inneholdt data som den overlevende ikke har.", + "gamedataCrossSectionNote": "{count} classnames finnes i både roomitemtypes og wallitemtypes. Disse rapporteres kun — å fjerne én ville endre en gjenstands type.", + "gamedataToastDone": "Rensing av spilldata fjernet {removed} rader", + "gamedataToastNothing": "Spilldata var allerede rent", + "gamedataMaxRemovalsLabel": "Maks. rader per steg", + "gamedataMaxRemovalsHint": "0 bruker standardverdien 500. Et steg som ville fjernet mer stopper og spør i stedet for å skrive.", + "gamedataLimitTitle": "{pass} ville fjernet {wouldRemove} rader, over grensen på {maxRemovals}.", + "gamedataLimitDescription": "Dette steget skrev ingenting, så filene er uendret. Sjekk ressursstiene først — en feil katalog får hver rad til å se foreldreløs ut. Å heve grensen er en separat, bevisst kjøring.", + "gamedataLimitOverride": "Fjern {wouldRemove} rader likevel", + "historyTitle": "Historikk for automatisk rengjøring", + "historyScheduled": "planlagt", + "historyManual": "manuelt", + "historyEntry": "Fjernet {deleted} ({copies} kopier); hoppet over {recent} nylige og {broken} skadede", + "historyErrors": "{count} feil" + }, "importDiagnostics": { "attempts": "Fildiagnostikk", "preliminary": "Foreløpig kontroll av adresser; innholdet valideres ved import.", diff --git a/src/messages/pl.json b/src/messages/pl.json index d15d7c38..3d861ef6 100644 --- a/src/messages/pl.json +++ b/src/messages/pl.json @@ -818,8 +818,8 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Połączone konta", - "subtitle": "Połącz konto społecznościowe, aby móc zalogować się jednym kliknięciem", - "connected": "Połączono", + "subtitle": "Połącz konto społecznościowe, aby zalogować się jednym kliknięciem", + "connected": "Połączone", "unavailable": "Niedostępne", "login": { "title": "Zaloguj się", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Mam 18+ i akceptuję wymóg wieku.", + "invitedBy": "Zaproszony przez {username}" }, "forgot": { "title": "Zresetuj hasło", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Polecenia", + "dailyRewards": "Codzienne nagrody" }, "dashboard": { "title": "Pulpit nawigacyjny", @@ -1255,7 +1259,7 @@ "delete": "Usuń", "noAds": "Nie ma jeszcze reklam", "confirmDelete": "Usunąć tę reklamę?", - "colId": "Identyfikator", + "colId": "ID", "colName": "Imię", "colImage": "Obraz", "colUrl": "Adres URL", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Polecenia", + "dailyRewards": "Codzienne nagrody" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Polecenia", + "subtitle": "System zaproszeń", + "referralsToday": "Polecenia dzisiaj", + "referralsTotal": "Wszystkie polecenia", + "invitedTotal": "Zliczone zaproszenia", + "claims": "Odebrane nagrody", + "settings": "Ustawienia nagrody", + "needed": "Potrzebne polecenia", + "rewardAmount": "Kwota nagrody", + "rewardCurrency": "Waluta nagrody", + "blockSameIp": "Odrzuć polecenia współdzielące aktualny IP zapraszającego", + "save": "Zapisz ustawienia", + "saving": "Zapisywanie…", + "saved": "Ustawienia poleceń zapisane.", + "saveError": "Ustawienia poleceń nie mogły zostać zapisane.", + "recent": "Ostatnie polecenia", + "unavailable": "Dane o poleceniach są tymczasowo niedostępne.", + "empty": "Brak poleceń.", + "inviter": "Zapraszający", + "invitee": "Zaproszony użytkownik", + "ip": "IP", + "date": "Data" + }, + "dailyRewards": { + "title": "Codzienne nagrody za logowanie", + "subtitle": "Harmonogram codziennych nagród za logowanie", + "enabled": "Status funkcji", + "yes": "Włączone", + "no": "Wyłączone", + "scheduleDays": "Dni harmonogramu", + "claimsToday": "Odbiory dzisiaj", + "claimsTotal": "Wszystkie odbiory", + "status": "Status funkcji", + "statusHint": "Po wyłączeniu karta nagrody jest ukrywana, a nowe odbiory są odrzucane.", + "disable": "Wyłącz", + "enable": "Włącz", + "schedule": "Harmonogram nagród", + "day": "Dzień {day}", + "reward": "Nagroda", + "amount": "Kwota", + "actions": "Akcje", + "addDay": "Dzień", + "add": "Dodaj dzień", + "save": "Zapisz", + "saving": "Zapisywanie…", + "saved": "Harmonogram nagród zapisany.", + "cancel": "Anuluj", + "edit": "Edytuj", + "delete": "Usuń", + "created": "Dzień nagrody dodany.", + "updated": "Dzień nagrody zaktualizowany.", + "deleted": "Dzień nagrody usunięty.", + "saveError": "Dzień nagrody nie mógł zostać zapisany.", + "deleteError": "Dzień nagrody nie mógł zostać usunięty.", + "confirmDeleteTitle": "Usuń dzień nagrody", + "confirmDeleteBody": "Ten dzień nagrody nie będzie już przyznawany. Wcześniejsze odbiory pozostają zapisane." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Twoja codzienna nagrada jest gotowa do odebrania" + }, + "dailyClaimed": "Codzienna nagrada odebrana — do jutra!", + "dailyErrors": { + "already_claimed": "Odebrałeś już dzisiejszą codzienną nagrodę.", + "disabled": "Codzienne nagrody są obecnie wyłączone.", + "bad_config": "Harmonogram codziennych nagród nie jest poprawnie skonfigurowany. Skontaktuj się z personelem.", + "ratelimit": "Zbyt wiele prób. Poczekaj chwilę i spróbuj ponownie.", + "error": "Codzienna nagrada nie mogła zostać odebrana. Spróbuj ponownie." + }, + "dailyRewardTitle": "Codzienne nagrody", + "dailyRewardHint": "Loguj się każdego dnia i odbieraj nagrodę — serie rosną do wielkich dni.", + "dailyRewardDay": "Dzień {day}", + "dailyRewardStreak": "{count, plural, one {Seria: # dzień} few {Seria: # dni} many {Seria: # dni} other {Seria: # dnia}}", + "dailyRewardNextClaim": "Następny odbiór: {amount} {currency}", + "dailyRewardTomorrow": "Jutro: {amount} {currency}", + "dailyRewardClaim": "Odbierz codzienną nagrodę", + "dailyRewardClaimedToday": "Odebrano dzisiaj — wróć jutro po następną nagrodę.", + "dailyRewardDisabled": "Codzienne nagrody są obecnie wyłączone. Możesz zwiedzać hotel.", + "dailyRewardUnavailable": "Harmonogram codziennych nagród nie mógł zostać załadowany. Spróbuj ponownie." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Skanowanie już trwa — połączono z nim.", + "ageUnknown": "wiek nieznany", + "ageBelow": "< 1d", + "scanButton": "Skanuj zasoby mebli", + "scanningAssets": "Skanowanie zasobów…", + "cancelButton": "Anuluj", + "deleteSelected": "Usuń wybrane ({count})", + "deleting": "Usuwanie…", + "redownloadBroken": "Pobierz ponownie uszkodzone", + "redownloading": "Pobieranie ponowne…", + "autoClean": "Automatycznie czyści stare fałszywe", + "cleaning": "Czyszczenie…", + "exportManifest": "Eksportuj manifest", + "exporting": "Eksportowanie…", + "phaseStems": "Ładowanie łodyg mebli…", + "phaseReaddir": "Odczyt katalogów zasobów…", + "phaseValidate": "Walidacja paczek .nitro…", + "phaseScanning": "Skanowanie…", + "scanProgressFiles": "{count} plików", + "repairProgress": "ok {ok}, nieudane {failed}", + "attachedNotice": "Skanowanie trwa w tle — wyniki pojawią się po zakończeniu.", + "sessionCancelled": "Skanowanie anulowane.", + "onlyOldLabel": "Pokaż tylko pliki starsze niż", + "onlyOldAgeLabel": "Minimalny wiek w dniach do wyświetlenia", + "onlyOldToggle": "Ukryj ostatnie pliki", + "daysLabel": "dni", + "autoAgeLabel": "Minimalny wiek w dniach do automatycznego czyszczenia", + "loadingResult": "Ładowanie wyniku skanowania…", + "scannedStat": "zeskanowane pliki zasobów", + "cachedNotice": "(w pamięci podręcznej — katalogi się nie zmieniły)", + "fakeStat": "Fałszywe nitro (brak pasującego elementu)", + "brokenStat": "Uszkodzone nitro (nie do odczytu)", + "groupEmpty": "Nic nie znaleziono", + "selectedCount": "wybrano {count}", + "copiesBadge": "{count} kopii", + "groupFakeLabel": "Fałszywe nitro", + "groupFakeDescription": "Te pliki nie pasują do żadnego elementu w items_base — resztki usuniętych lub zmienionych mebli.", + "groupBrokenLabel": "Uszkodzone nitro", + "groupBrokenDescription": "Te pliki należą do elementu, ale nie można ich odczytać jako prawidłowej paczki Nitro.", + "groupSwfLabel": "Osierocone pliki SWF", + "groupSwfDescription": "Pliki .swf, które nie pasują do żadnego elementu w items_base.", + "groupIconLabel": "Osierocone ikony", + "groupIconDescription": "Pliki ikon, które nie pasują do żadnego elementu w items_base.", + "warningText": "Usunięcie uszkodzonego .nitro zostawia element w bazie bez paczki — wolej pobrać ponownie, niech audyt katalogu go uzyska później. Wiersze bazy nigdy nie są usuwane przez to narzędzie.", + "onlyAssetsTouched": "Tylko pliki zasobów są zmieniane — FurnitureData.json i wiersze bazy pozostają nietknięte.", + "emptyHint": "Przeskanuj każdy katalog zasobów mebli, aby znaleźć fałszywe i uszkodzone paczki nitro oraz osierocone pliki SWF i ikony. Usuń je, pobierz ponownie uszkodzone lub automatycznie wyczyść stare resztki.", + "noResult": "Brak wyniku skanowania — uruchom najpierw skanowanie zasobów mebli.", + "scanFailed": "Skanowanie nie powiodło się.", + "confirmDeleteTitle": "Usunąć {count} plik(ów) zasobów?", + "confirmDeleteDescription": "Pliki zostaną usunięte z każdego katalogu (public + lustrzane gamedata). Wiersze bazy nigdy nie są zmieniane.", + "confirmDeleteLabel": "Usuń", + "confirmRepairTitle": "Pobrać ponownie {count} uszkodzoną(e) paczkę(i) .nitro?", + "confirmRepairDescription": "Paczki zostaną pobrane ponownie ze skonfigurowanych źródeł nitro i nadpisane w każdym katalogu (public + lustrzane gamedata).", + "confirmRepairLabel": "Pobierz ponownie", + "confirmAutoCleanTitle": "Automatycznie wyczyścić fałszywe nitro starsze niż {days} dni?", + "confirmAutoCleanDescription": "Usuwane są tylko fałszywe pliki .nitro (brak pasującego elementu) starsze niż próg. Uszkodzone paczki i ostatnie pliki nigdy nie są zmieniane.", + "confirmAutoCleanLabel": "Wyczyść automatycznie", + "toastDeletePartial": "Usunięto {copies} kopii, ale niektórych plików nie można usunąć", + "toastDeleteDone": "Usunięto {copies} kopii plików ({deleted} plików)", + "toastRepairDone": "Naprawiono {count} paczek .nitro", + "toastRepairFailed": "Nie można uzyskać żadnej paczki ({failed} nieudanych)", + "toastRepairCancelled": "Naprawa anulowana", + "toastAutoCleanDone": "Wyczyszczono {deleted} starych fałszywych plików .nitro ({copies} kopii). Pominięto {recent} ostatnich + {broken} uszkodzonych.", + "toastAutoCleanNothing": "Nic na tyle starego do usunięcia (pominięto {recent} ostatnich, {broken} uszkodzonych)", + "toastManifestDownload": "Manifest skanowania pobrany", + "gamedataTitle": "Czyszczenie danych gry", + "gamedataHint": "Najpierw podgląd: to nadpisuje FurnitureData.json, FigureMap.json i FigureData.json. W przeciwieństwie do narzędzi zasobów powyżej usuwa wiersze, które nic nie odwołują — sprawdź liczby przed uruchomieniem.", + "gamedataScan": "Podgląd danych gry", + "gamedataScanning": "Skanowanie…", + "gamedataRun": "Uruchom wybrane", + "gamedataRunning": "Czyszczenie…", + "gamedataNoResult": "Brak podglądu — najpierw zeskanuj pliki JSON danych gry.", + "gamedataCount_duplicates": "Duplikaty FurnitureData", + "gamedataCount_orphans": "Osierocone FurnitureData", + "gamedataCount_figureMap": "Problemy z FigureMap", + "gamedataCount_figureData": "Nie używany FigureData", + "gamedataPass_dedupeFurnitureData": "Dedyplikuj FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Usuwa powtarzające się classnames wewnątrz jednej sekcji, zachowując wpis z najwyższą rewizją.", + "gamedataPass_cleanFurnitureData": "Wyczyść FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Usuwa wpisy, których paczka .nitro nie istnieje w żadnym katalogu.", + "gamedataPass_cleanFigureMap": "Wyczyść FigureMap", + "gamedataPassDesc_cleanFigureMap": "Usuwa części wskazujące na brakujący zestaw w FigureData, a także dokładne duplikaty.", + "gamedataPass_cleanFigureData": "Wyczyść FigureData", + "gamedataPassDesc_cleanFigureData": "Usuwa zestawy, do których nie odwołuje się żadna część FigureMap, potem palety, których nie używa żadny typ zestawu. Musi działać po Wyczyść FigureMap.", + "gamedataNothingSelected": "Wybierz co najmniej jeden krok czyszczenia", + "gamedataConfirmTitle": "Nadpisać pliki JSON danych gry?", + "gamedataConfirmDescription": "{passes} krok(i) uruchomi się wobec {duplicates} zduplikowanych grup, {orphans} osieroconych wierszy, {figureMap} problemów z FigureMap i {figureData} nieużywanych wpisów FigureData. Wiersze są usywane bez kopii zapasowej — tego nie można cofnąć.", + "gamedataConfirmLabel": "Nadpisz pliki", + "gamedataDifferingWarning": "Co najmniej jeden duplikat nie jest dokładną kopią zachowanego wpisu, więc usunięty wiersz zawierał dane, których ocalały nie ma.", + "gamedataCrossSectionNote": "{count} classname(y) istnieją zarówno w roomitemtypes, jak i wallitemtypes. Są tylko zgłaszane — usunięcie jednego zmieniłoby typ elementu.", + "gamedataToastDone": "Czyszczenie danych gry usunęło {removed} wierszy", + "gamedataToastNothing": "Dane gry były już czyste", + "gamedataMaxRemovalsLabel": "Maks. wiersze na krok", + "gamedataMaxRemovalsHint": "0 używa domyślnej wartości 500. Krok, który usunąłby więcej, zatrzymuje się i pyta zamiast zapisywać.", + "gamedataLimitTitle": "{pass} usunąłby {wouldRemove} wierszy, powyżej limitu {maxRemovals}.", + "gamedataLimitDescription": "Ten krok nic nie zapisał, więc pliki są niezmienione. Najpierw sprawdź ścieżki zasobów — zły katalog sprawia, że każdy wiersz wydaje się osierocony. Podniesienie limitu to osobne, świadome uruchomienie.", + "gamedataLimitOverride": "Usuń mimo to {wouldRemove} wierszy", + "historyTitle": "Historia automatycznego czyszczenia", + "historyScheduled": "zaplanowane", + "historyManual": "ręczne", + "historyEntry": "Usunięto {deleted} ({copies} kopii); pominięto {recent} ostatnich i {broken} uszkodzonych", + "historyErrors": "{count} błędów" + }, "importDiagnostics": { "attempts": "Diagnostyka plików", "preliminary": "Wstępna kontrola adresów; zawartość zostanie sprawdzona podczas importu.", diff --git a/src/messages/pt.json b/src/messages/pt.json index 5a799e84..2864508e 100644 --- a/src/messages/pt.json +++ b/src/messages/pt.json @@ -817,9 +817,9 @@ "enable": "Habilitar 2FA", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Contas conectadas", - "subtitle": "Vincule uma conta social para poder fazer login com um clique", - "connected": "Conectado", + "title": "Contas vinculadas", + "subtitle": "Vincule uma conta social para iniciar sessão com um clique", + "connected": "Vinculado", "unavailable": "Indisponível", "login": { "title": "Faça login", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Tenho 18+ e aceito o requisito de idade.", + "invitedBy": "Convidado por {username}" }, "forgot": { "title": "Redefinir senha", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Indicações", + "dailyRewards": "Recompensas diárias" }, "dashboard": { "title": "Painel", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Indicações", + "dailyRewards": "Recompensas diárias" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Indicações", + "subtitle": "Sistema de convites", + "referralsToday": "Indicações hoje", + "referralsTotal": "Indicações totais", + "invitedTotal": "Convites contados", + "claims": "Recompensas resgatadas", + "settings": "Configurações de recompensa", + "needed": "Indicações necessárias", + "rewardAmount": "Valor da recompensa", + "rewardCurrency": "Moeda da recompensa", + "blockSameIp": "Rejeitar indicações que compartilham o IP atual do convidador", + "save": "Salvar configurações", + "saving": "Salvando…", + "saved": "Configurações de indicação salvas.", + "saveError": "As configurações de indicação não puderam ser salvas.", + "recent": "Indicações recentes", + "unavailable": "Os dados de indicação estão temporariamente indisponíveis.", + "empty": "Nenhuma indicação ainda.", + "inviter": "Convidador", + "invitee": "Usuário convidado", + "ip": "IP", + "date": "Data" + }, + "dailyRewards": { + "title": "Recompensas diárias de login", + "subtitle": "Programa de recompensas diárias de login", + "enabled": "Status da funcionalidade", + "yes": "Ativado", + "no": "Desativado", + "scheduleDays": "Dias do programa", + "claimsToday": "Resgates hoje", + "claimsTotal": "Resgates totais", + "status": "Status da funcionalidade", + "statusHint": "Quando desativado, o cartão de recompensa é ocultado e novos resgates são rejeitados.", + "disable": "Desativar", + "enable": "Ativar", + "schedule": "Programa de recompensas", + "day": "Dia {day}", + "reward": "Recompensa", + "amount": "Valor", + "actions": "Ações", + "addDay": "Dia", + "add": "Adicionar dia", + "save": "Salvar", + "saving": "Salvando…", + "saved": "Programa de recompensas salvo.", + "cancel": "Cancelar", + "edit": "Editar", + "delete": "Excluir", + "created": "Dia de recompensa adicionado.", + "updated": "Dia de recompensa atualizado.", + "deleted": "Dia de recompensa removido.", + "saveError": "O dia de recompensa não pôde ser salvo.", + "deleteError": "O dia de recompensa não pôde ser removido.", + "confirmDeleteTitle": "Remover dia de recompensa", + "confirmDeleteBody": "Este dia de recompensa não será mais concedido. Resgates passados permanecem registrados." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Sua recompensa diária está pronta para resgate" + }, + "dailyClaimed": "Recompensa diária resgatada — até amanhã!", + "dailyErrors": { + "already_claimed": "Você já resgatou a recompensa diária de hoje.", + "disabled": "As recompensas diárias estão desativadas atualmente.", + "bad_config": "O programa de recompensas diárias não está configurado corretamente. Contate a equipe.", + "ratelimit": "Muitas tentativas. Aguarde um momento e tente novamente.", + "error": "A recompensa diária não pôde ser resgatada. Tente novamente." + }, + "dailyRewardTitle": "Recompensas diárias", + "dailyRewardHint": "Faça login todos os dias e resgate sua recompensa — as sequências crescem até os grandes dias.", + "dailyRewardDay": "Dia {day}", + "dailyRewardStreak": "{count, plural, one {Sequência: # dia} other {Sequência: # dias}}", + "dailyRewardNextClaim": "Próximo resgate: {amount} {currency}", + "dailyRewardTomorrow": "Amanhã: {amount} {currency}", + "dailyRewardClaim": "Resgatar recompensa diária", + "dailyRewardClaimedToday": "Resgatado hoje — volte amanhã para a próxima recompensa.", + "dailyRewardDisabled": "As recompensas diárias estão desativadas atualmente. Você pode explorar o hotel.", + "dailyRewardUnavailable": "O programa de recompensas diárias não pôde ser carregado. Tente novamente." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Uma verificação já está em andamento — conectada a ela.", + "ageUnknown": "idade desconhecida", + "ageBelow": "< 1d", + "scanButton": "Verificar recursos de móveis", + "scanningAssets": "Verificando recursos…", + "cancelButton": "Cancelar", + "deleteSelected": "Excluir selecionados ({count})", + "deleting": "Excluindo…", + "redownloadBroken": "Baixar novamente os danificados", + "redownloading": "Baixando novamente…", + "autoClean": "Limpar automaticamente os falsos antigos", + "cleaning": "Limpando…", + "exportManifest": "Exportar manifesto", + "exporting": "Exportando…", + "phaseStems": "Carregando caules de móveis…", + "phaseReaddir": "Lendo diretórios de recursos…", + "phaseValidate": "Validando pacotes .nitro…", + "phaseScanning": "Verificando…", + "scanProgressFiles": "{count} arquivos", + "repairProgress": "ok {ok}, falharam {failed}", + "attachedNotice": "A verificação continua em segundo plano — os resultados aparecerão quando terminar.", + "sessionCancelled": "Verificação cancelada.", + "onlyOldLabel": "Mostrar apenas arquivos mais antigos que", + "onlyOldAgeLabel": "Idade mínima em dias para exibição", + "onlyOldToggle": "Ocultar arquivos recentes", + "daysLabel": "dias", + "autoAgeLabel": "Idade mínima em dias para limpeza automática", + "loadingResult": "Carregando resultado da verificação…", + "scannedStat": "arquivos de recursos verificados", + "cachedNotice": "(em cache — os diretórios não mudaram)", + "fakeStat": "Nitros falsos (sem item correspondente)", + "brokenStat": "Nitros danificados (ilegíveis)", + "groupEmpty": "Nada encontrado", + "selectedCount": "{count} selecionados", + "copiesBadge": "{count} cópias", + "groupFakeLabel": "Nitros falsos", + "groupFakeDescription": "Estes arquivos não correspondem a nenhum item em items_base — restos de móveis excluídos ou renomeados.", + "groupBrokenLabel": "Nitros danificados", + "groupBrokenDescription": "Estes arquivos pertencem a um item, mas não podem ser lidos como um pacote Nitro válido.", + "groupSwfLabel": "SWFs órfãos", + "groupSwfDescription": "Arquivos .swf que não correspondem a nenhum item em items_base.", + "groupIconLabel": "Ícones órfãos", + "groupIconDescription": "Arquivos de ícones que não correspondem a nenhum item em items_base.", + "warningText": "Excluir um .nitro danificado deixa seu item no banco de dados sem pacote — prefira baixá-lo novamente, ou deixe a auditoria do catálogo obtê-lo mais tarde. As linhas do banco de dados nunca são removidas por esta ferramenta.", + "onlyAssetsTouched": "Apenas os arquivos de recursos são alterados — FurnitureData.json e as linhas do banco de dados permanecem intactas.", + "emptyHint": "Verifique cada diretório de recursos de móveis para encontrar pacotes nitro falsos e danificados, além de SWFs e ícones órfãos. Exclua-os, baixe novamente os danificados ou limpe automaticamente os restos antigos.", + "noResult": "Nenhum resultado de verificação ainda — execute primeiro uma verificação de recursos de móveis.", + "scanFailed": "A verificação falhou.", + "confirmDeleteTitle": "Excluir {count} arquivo(s) de recursos?", + "confirmDeleteDescription": "Os arquivos serão removidos de todos os diretórios (public + gamedata espelhada). As linhas do banco de dados nunca são alteradas.", + "confirmDeleteLabel": "Excluir", + "confirmRepairTitle": "Baixar novamente {count} pacote(s) .nitro danificado(s)?", + "confirmRepairDescription": "Os pacotes serão obtidos novamente das fontes nitro configuradas e gravados sobre todos os diretórios (public + gamedata espelhada).", + "confirmRepairLabel": "Baixar novamente", + "confirmAutoCleanTitle": "Limpar automaticamente nitros falsos mais antigos que {days} dia(s)?", + "confirmAutoCleanDescription": "Apenas arquivos .nitro falsos (sem item correspondente) mais antigos que o limite são removidos. Pacotes danificados e arquivos recentes nunca são alterados.", + "confirmAutoCleanLabel": "Limpar automaticamente", + "toastDeletePartial": "Excluídas {copies} cópias, mas alguns arquivos não puderam ser removidos", + "toastDeleteDone": "Excluídas {copies} cópias de arquivos ({deleted} arquivos)", + "toastRepairDone": "Reparados {count} pacotes .nitro", + "toastRepairFailed": "Não foi possível obter nenhum pacote ({failed} falharam)", + "toastRepairCancelled": "Reparo cancelado", + "toastAutoCleanDone": "Limpados {deleted} arquivos .nitro falsos antigos ({copies} cópias). Ignorados {recent} recentes + {broken} danificados.", + "toastAutoCleanNothing": "Nada velho o suficiente para remover (ignorados {recent} recentes, {broken} danificados)", + "toastManifestDownload": "Manifesto da verificação baixado", + "gamedataTitle": "Limpeza de dados do jogo", + "gamedataHint": "Visualize primeiro: isso reescreve FurnitureData.json, FigureMap.json e FigureData.json. Ao contrário das ferramentas de recursos acima, remove linhas que não referenciam nada — revise as contagens antes de executá-lo.", + "gamedataScan": "Visualizar dados do jogo", + "gamedataScanning": "Verificando…", + "gamedataRun": "Executar selecionados", + "gamedataRunning": "Limpando…", + "gamedataNoResult": "Nenhuma visualização ainda — verifique primeiro os arquivos JSON dos dados do jogo.", + "gamedataCount_duplicates": "Duplicatas de FurnitureData", + "gamedataCount_orphans": "FurnitureData órfãos", + "gamedataCount_figureMap": "Problemas de FigureMap", + "gamedataCount_figureData": "FigureData não utilizado", + "gamedataPass_dedupeFurnitureData": "Desduplicar FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Remove classnames repetidos dentro de uma seção, mantendo a entrada com a revisão mais alta.", + "gamedataPass_cleanFurnitureData": "Limpar FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Remove as entradas cujo pacote .nitro está ausente em todos os diretórios.", + "gamedataPass_cleanFigureMap": "Limpar FigureMap", + "gamedataPassDesc_cleanFigureMap": "Remove as partes que apontam para um conjunto ausente em FigureData, além de duplicatas exatas.", + "gamedataPass_cleanFigureData": "Limpar FigureData", + "gamedataPassDesc_cleanFigureData": "Remove os conjuntos que nenhuma parte de FigureMap referencia, depois as paletas que nenhum tipo de conjunto usa. Deve ser executado após Limpar FigureMap.", + "gamedataNothingSelected": "Selecione pelo menos uma etapa de limpeza", + "gamedataConfirmTitle": "Reescrever os arquivos JSON dos dados do jogo?", + "gamedataConfirmDescription": "{passes} etapa(s) serão executadas em {duplicates} grupo(s) duplicado(s), {orphans} linha(s) órfã(s), {figureMap} problema(s) de FigureMap e {figureData} entrada(s) FigureData não utilizada(s). As linhas são removidas sem backup — isso não pode ser desfeito.", + "gamedataConfirmLabel": "Reescrever arquivos", + "gamedataDifferingWarning": "Pelo menos uma duplicata não é uma cópia exata da entrada que é mantida, então a linha excluída continha dados que o sobrevivente não tem.", + "gamedataCrossSectionNote": "{count} classname(s) existem tanto em roomitemtypes quanto em wallitemtypes. Estes são apenas relatados — remover um mudaria o tipo de um item.", + "gamedataToastDone": "A limpeza de dados do jogo removeu {removed} linha(s)", + "gamedataToastNothing": "Os dados do jogo já estavam limpos", + "gamedataMaxRemovalsLabel": "Máx. linhas por etapa", + "gamedataMaxRemovalsHint": "0 usa o padrão 500. Uma etapa que removeria mais para e pergunta em vez de gravar.", + "gamedataLimitTitle": "{pass} removeria {wouldRemove} linha(s), acima do limite de {maxRemovals}.", + "gamedataLimitDescription": "Essa etapa não gravou nada, então os arquivos estão inalterados. Verifique primeiro os caminhos dos recursos — um diretório errado faz cada linha parecer órfã. Aumentar o limite é uma execução separada e deliberada.", + "gamedataLimitOverride": "Remover {wouldRemove} linha(s) mesmo assim", + "historyTitle": "Histórico de limpeza automática", + "historyScheduled": "agendado", + "historyManual": "manual", + "historyEntry": "Removidos {deleted} ({copies} cópias); ignorados {recent} recentes e {broken} danificados", + "historyErrors": "{count} erros" + }, "importDiagnostics": { "attempts": "Diagnóstico dos ficheiros", "preliminary": "Verificação preliminar dos endereços; o conteúdo será validado na importação.", diff --git a/src/messages/ro.json b/src/messages/ro.json index 6639f235..339b3cd8 100644 --- a/src/messages/ro.json +++ b/src/messages/ro.json @@ -818,7 +818,7 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Conturi conectate", - "subtitle": "Conectați un cont social pentru a vă putea conecta cu un singur clic", + "subtitle": "Conectați un cont social pentru autentificare cu un clic", "connected": "Conectat", "unavailable": "Indisponibil", "login": { @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Am 18+ și accept cerința de vârstă.", + "invitedBy": "Invitat de {username}" }, "forgot": { "title": "Resetează parola", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Recomandări", + "dailyRewards": "Recompense zilnice" }, "dashboard": { "title": "Tabloul de bord", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Recomandări", + "dailyRewards": "Recompense zilnice" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Recomandări", + "subtitle": "Sistem de invitații", + "referralsToday": "Recomandări astăzi", + "referralsTotal": "Recomandări totale", + "invitedTotal": "Invitații numărate", + "claims": "Recompense revendicate", + "settings": "Setări recompensă", + "needed": "Recomandări necesare", + "rewardAmount": "Suma recompensei", + "rewardCurrency": "Moneda recompensei", + "blockSameIp": "Respinge recomandările care partajează IP-ul actual al invitantului", + "save": "Salvează setările", + "saving": "Salvare…", + "saved": "Setările de recomandare au fost salvate.", + "saveError": "Setările de recomandare nu au putut fi salvate.", + "recent": "Recomandări recente", + "unavailable": "Datele de recomandare sunt temporar indisponibile.", + "empty": "Nicio recomandare încă.", + "inviter": "Invitant", + "invitee": "Utilizator invitat", + "ip": "IP", + "date": "Data" + }, + "dailyRewards": { + "title": "Recompense zilnice de autentificare", + "subtitle": "Programul de recompense zilnice de autentificare", + "enabled": "Starea funcției", + "yes": "Activat", + "no": "Dezactivat", + "scheduleDays": "Zilele programului", + "claimsToday": "Revendicări astăzi", + "claimsTotal": "Revendicări totale", + "status": "Starea funcției", + "statusHint": "Când este dezactivată, cardul de recompensă este ascuns și noile revendicări sunt respinse.", + "disable": "Dezactivează", + "enable": "Activează", + "schedule": "Programul de recompense", + "day": "Ziua {day}", + "reward": "Recompensă", + "amount": "Suma", + "actions": "Acțiuni", + "addDay": "Ziua", + "add": "Adaugă zi", + "save": "Salvează", + "saving": "Salvare…", + "saved": "Programul de recompense a fost salvat.", + "cancel": "Anulează", + "edit": "Editează", + "delete": "Șterge", + "created": "Ziua de recompensă a fost adăugată.", + "updated": "Ziua de recompensă a fost actualizată.", + "deleted": "Ziua de recompensă a fost eliminată.", + "saveError": "Ziua de recompensă nu a putut fi salvată.", + "deleteError": "Ziua de recompensă nu a putut fi eliminată.", + "confirmDeleteTitle": "Elimină ziua de recompensă", + "confirmDeleteBody": "Această zi de recompensă nu va mai fi acordată. Revendicările anterioare rămân înregistrate." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Recompensa ta zilnică este gata de revendicat" + }, + "dailyClaimed": "Recompensa zilnică revendicată — ne vedem mâine!", + "dailyErrors": { + "already_claimed": "Ai revendicat deja recompensa zilnică de azi.", + "disabled": "Recompensele zilnice sunt dezactivate în prezent.", + "bad_config": "Programul de recompense zilnice nu este configurat corect. Contactează personalul.", + "ratelimit": "Prea multe încercări. Așteaptă un moment și încearcă din nou.", + "error": "Recompensa zilnică nu a putut fi revendicată. Încearcă din nou." + }, + "dailyRewardTitle": "Recompense zilnice", + "dailyRewardHint": "Autentifică-te în fiecare zi și revendică recompensa ta — seriile cresc până la zilele mari.", + "dailyRewardDay": "Ziua {day}", + "dailyRewardStreak": "{count, plural, one {Serie: # zi} few {Serie: # zile} other {Serie: # zile}}", + "dailyRewardNextClaim": "Următoarea revendicare: {amount} {currency}", + "dailyRewardTomorrow": "Mâine: {amount} {currency}", + "dailyRewardClaim": "Revendică recompensa zilnică", + "dailyRewardClaimedToday": "Revendicat azi — revino mâine pentru următoarea recompensă.", + "dailyRewardDisabled": "Recompensele zilnice sunt dezactivate în prezent. Poți explora hotelul.", + "dailyRewardUnavailable": "Programul de recompense zilnice nu a putut fi încărcat. Încearcă din nou." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "O scanare rulează deja — conectată la ea.", + "ageUnknown": "vârstă necunoscută", + "ageBelow": "< 1z", + "scanButton": "Scanează activele mobilei", + "scanningAssets": "Scanarea activelor…", + "cancelButton": "Anulează", + "deleteSelected": "Șterge selecționatele ({count})", + "deleting": "Ștergere…", + "redownloadBroken": "Descarcă din nou deteriorate", + "redownloading": "Descărcare din nou…", + "autoClean": "Curăță automat vechile false", + "cleaning": "Curățare…", + "exportManifest": "Exportă manifestul", + "exporting": "Exportare…", + "phaseStems": "Încărcarea tulpinilor mobilei…", + "phaseReaddir": "Citirea directoarelor de active…", + "phaseValidate": "Validarea pachetelor .nitro…", + "phaseScanning": "Scanare…", + "scanProgressFiles": "{count} fișiere", + "repairProgress": "ok {ok}, eșuate {failed}", + "attachedNotice": "Scanarea continuă în fundal — rezultatele vor apărea la finalizare.", + "sessionCancelled": "Scanare anulată.", + "onlyOldLabel": "Afișează doar fișierele mai vechi decât", + "onlyOldAgeLabel": "Vârsta minimă în zile pentru afișare", + "onlyOldToggle": "Ascunde fișierele recente", + "daysLabel": "zile", + "autoAgeLabel": "Vârsta minimă în zile pentru curățare automată", + "loadingResult": "Încărcarea rezultatului scanării…", + "scannedStat": "fișiere de active scanate", + "cachedNotice": "(în cache — directoarele nu s-au schimbat)", + "fakeStat": "Nitro false (niciun element corespunzător)", + "brokenStat": "Nitro deteriorate (necitibile)", + "groupEmpty": "Nimic găsit", + "selectedCount": "{count} selectate", + "copiesBadge": "{count} copii", + "groupFakeLabel": "Nitro false", + "groupFakeDescription": "Aceste fișiere nu corespund niciunui element din items_base — rămășițe de mobilă ștearsă sau redenumită.", + "groupBrokenLabel": "Nitro deteriorate", + "groupBrokenDescription": "Aceste fișiere aparțin unui element, dar nu pot fi citite ca un pachet Nitro valid.", + "groupSwfLabel": "SWF-uri orfane", + "groupSwfDescription": "Fișiere .swf care nu corespund niciunui element din items_base.", + "groupIconLabel": "Pictograme orfane", + "groupIconDescription": "Fișiere de pictograme care nu corespund niciunui element din items_base.", + "warningText": "Ștergerea unui .nitro deteriorat îl lasă pe element în baza de date fără pachet — preferați descărcarea din nou, sau lăsați auditul catalogului să-l obțină mai târziu. Rândurile bazei de date nu sunt niciodată eliminate de acest instrument.", + "onlyAssetsTouched": "Sunt modificate doar fișierele de active — FurnitureData.json și rândurile bazei de date rămân intacte.", + "emptyHint": "Scanați fiecare director de active mobilei pentru a găsi pachete nitro false și deteriorate, precum și SWF-uri și pictograme orfane. Ștergeți-le, descărcați din nou deterioratele sau curățați automat vechile rămășițe.", + "noResult": "Niciun rezultat de scanare încă — rulați mai întâi o scanare a activelor mobilei.", + "scanFailed": "Scanarea a eșuat.", + "confirmDeleteTitle": "Ștergeți {count} fișier(e) de active?", + "confirmDeleteDescription": "Fișierele vor fi eliminate din fiecare director (public + gamedata oglindită). Rândurile bazei de date nu sunt niciodată modificate.", + "confirmDeleteLabel": "Șterge", + "confirmRepairTitle": "Descărcați din nou {count} pachet(e) .nitro deteriorat(e)?", + "confirmRepairDescription": "Pachetele vor fi obținute din nou din sursele nitro configurate și scrise peste fiecare director (public + gamedata oglindită).", + "confirmRepairLabel": "Descarcă din nou", + "confirmAutoCleanTitle": "Curățați automat nitro false mai vechi de {days} zi(zile)?", + "confirmAutoCleanDescription": "Sunt eliminate doar fișierele .nitro false (niciun element corespunzător) mai vechi decât pragul. Pachetele deteriorate și fișierele recente nu sunt niciodată modificate.", + "confirmAutoCleanLabel": "Curățare automată", + "toastDeletePartial": "Șterse {copies} copii, dar unele fișiere nu au putut fi eliminate", + "toastDeleteDone": "Șterse {copies} copii de fișiere ({deleted} fișiere)", + "toastRepairDone": "Reparate {count} pachete .nitro", + "toastRepairFailed": "Nu s-a putut obține niciun pachet ({failed} eșuate)", + "toastRepairCancelled": "Reparare anulată", + "toastAutoCleanDone": "Curățate {deleted} fișiere .nitro false vechi ({copies} copii). Sărite {recent} recente + {broken} deteriorate.", + "toastAutoCleanNothing": "Nimic suficient de veche pentru eliminare (sărite {recent} recente, {broken} deteriorate)", + "toastManifestDownload": "Manifestul scanării descărcat", + "gamedataTitle": "Curățarea datelor de joc", + "gamedataHint": "Previzualizați mai întâi: aceasta rescrie FurnitureData.json, FigureMap.json și FigureData.json. Spre deosebire de instrumentele de active de mai sus, elimină rândurile care nu referențiază nimic — verificați numerele înainte de a rula.", + "gamedataScan": "Previzualizare date de joc", + "gamedataScanning": "Scanare…", + "gamedataRun": "Rulați selecționate", + "gamedataRunning": "Curățare…", + "gamedataNoResult": "Nicio previzualizare încă — scanați mai întâi fișierele JSON ale datelor de joc.", + "gamedataCount_duplicates": "Duplicate FurnitureData", + "gamedataCount_orphans": "FurnitureData orfane", + "gamedataCount_figureMap": "Probleme FigureMap", + "gamedataCount_figureData": "FigureData neutilizat", + "gamedataPass_dedupeFurnitureData": "Deduplicare FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Elimină classnames repetate în interiorul unei secțiuni, păstrând intrarea cu cea mai mare revizie.", + "gamedataPass_cleanFurnitureData": "Curățare FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Elimină intrările al căror pachet .nitro lipsește din fiecare director.", + "gamedataPass_cleanFigureMap": "Curățare FigureMap", + "gamedataPassDesc_cleanFigureMap": "Elimină părțile care indică spre un set lipsă din FigureData, plus duplicate exacte.", + "gamedataPass_cleanFigureData": "Curățare FigureData", + "gamedataPassDesc_cleanFigureData": "Elimină seturile pe care nicio parte FigureMap nu le referențiază, apoi paletele pe care niciun tip de set nu le folosește. Trebuie rulat după Curățare FigureMap.", + "gamedataNothingSelected": "Selectați cel puțin un pas de curățare", + "gamedataConfirmTitle": "Rescrieți fișierele JSON ale datelor de joc?", + "gamedataConfirmDescription": "{passes} pas(e) vor rula împotriva {duplicates} grupuri duplicate, {orphans} rânduri orfane, {figureMap} probleme FigureMap și {figureData} intrări FigureData neutilizate. Rândurile sunt eliminate fără copie de rezervă — acest lucru nu poate fi anulat.", + "gamedataConfirmLabel": "Rescrieți fișierele", + "gamedataDifferingWarning": "Cel puțin un duplicat nu este o copie exactă a intrării care este păstrată, deci rândul eliminat conținea date pe care supraviețuitorul nu le are.", + "gamedataCrossSectionNote": "{count} classname(uri) există atât în roomitemtypes cât și în wallitemtypes. Acestea sunt doar raportate — eliminarea unuia ar schimba tipul unui element.", + "gamedataToastDone": "Curățarea datelor de joc a eliminat {removed} rânduri", + "gamedataToastNothing": "Datele de joc erau deja curate", + "gamedataMaxRemovalsLabel": "Max. rânduri pe pas", + "gamedataMaxRemovalsHint": "0 folosește valoarea implicită 500. Un pas care ar elimina mai mult se oprește și întreabă în loc să scrie.", + "gamedataLimitTitle": "{pass} ar elimina {wouldRemove} rânduri, peste limita de {maxRemovals}.", + "gamedataLimitDescription": "Acel pas nu a scris nimic, deci fișierele sunt neschimbate. Verificați mai întâi căile activelor — un director greșit face fiecare rând să pară orfan. Creșterea limitei este o execuție separată și deliberată.", + "gamedataLimitOverride": "Eliminați totuși {wouldRemove} rânduri", + "historyTitle": "Istoricul curățării automate", + "historyScheduled": "programat", + "historyManual": "manual", + "historyEntry": "Eliminate {deleted} ({copies} copii); sărite {recent} recente și {broken} deteriorate", + "historyErrors": "{count} erori" + }, "importDiagnostics": { "attempts": "Diagnosticarea fișierelor", "preliminary": "Verificare preliminară a adreselor; conținutul se validează la import.", diff --git a/src/messages/ru.json b/src/messages/ru.json index 18daae0b..cded341e 100644 --- a/src/messages/ru.json +++ b/src/messages/ru.json @@ -818,7 +818,7 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Связанные аккаунты", - "subtitle": "Привяжите аккаунт в соцсетях, чтобы войти в систему одним щелчком мыши", + "subtitle": "Свяжите социальный аккаунт для входа одним нажатием", "login": { "title": "Sign in", "subtitle": "С возвращением! Войдите в систему, чтобы войти в отель.", @@ -880,7 +880,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Мне 18+ и я согласен с возрастным требованием.", + "invitedBy": "Приглашён пользователем {username}" }, "forgot": { "title": "Сбросить пароль", @@ -1046,7 +1048,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Рефералы", + "dailyRewards": "Ежедневные награды" }, "dashboard": { "title": "Панель управления", @@ -4334,7 +4338,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Рефералы", + "dailyRewards": "Ежедневные награды" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5841,6 +5847,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Рефералы", + "subtitle": "Система приглашений", + "referralsToday": "Рефералы сегодня", + "referralsTotal": "Всего рефералов", + "invitedTotal": "Приглашений насчитано", + "claims": "Награды получены", + "settings": "Настройки награды", + "needed": "Необходимые рефералы", + "rewardAmount": "Сумма награды", + "rewardCurrency": "Валюта награды", + "blockSameIp": "Отклонять рефералов с текущим IP пригласившего", + "save": "Сохранить настройки", + "saving": "Сохранение…", + "saved": "Настройки рефералов сохранены.", + "saveError": "Настройки рефералов не удалось сохранить.", + "recent": "Недавние рефералы", + "unavailable": "Данные о рефералах временно недоступны.", + "empty": "Рефералов пока нет.", + "inviter": "Пригласивший", + "invitee": "Приглашённый пользователь", + "ip": "IP", + "date": "Дата" + }, + "dailyRewards": { + "title": "Ежедневные награды за вход", + "subtitle": "Расписание ежедневных наград за вход", + "enabled": "Статус функции", + "yes": "Включено", + "no": "Выключено", + "scheduleDays": "Дни расписания", + "claimsToday": "Получений сегодня", + "claimsTotal": "Всего получений", + "status": "Статус функции", + "statusHint": "При выключении карта награды скрывается, а новые получения отклоняются.", + "disable": "Выключить", + "enable": "Включить", + "schedule": "Расписание наград", + "day": "День {day}", + "reward": "Награда", + "amount": "Сумма", + "actions": "Действия", + "addDay": "День", + "add": "Добавить день", + "save": "Сохранить", + "saving": "Сохранение…", + "saved": "Расписание наград сохранено.", + "cancel": "Отмена", + "edit": "Редактировать", + "delete": "Удалить", + "created": "День награды добавлен.", + "updated": "День награды обновлён.", + "deleted": "День награды удалён.", + "saveError": "День награды не удалось сохранить.", + "deleteError": "День награды не удалось удалить.", + "confirmDeleteTitle": "Удалить день награды", + "confirmDeleteBody": "Этот день награды больше не будет выдаваться. Прошлые получения остаются записанными." } }, "error": { @@ -6221,8 +6285,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Ваша ежедневная награда готова к получению" + }, + "dailyClaimed": "Ежедневная награда получена — до завтра!", + "dailyErrors": { + "already_claimed": "Вы уже получили сегодняшнюю ежедневную награду.", + "disabled": "Ежедневные награды сейчас выключены.", + "bad_config": "Расписание ежедневных наград настроено неправильно. Свяжитесь с персоналом.", + "ratelimit": "Слишком много попыток. Подождите немного и попробуйте снова.", + "error": "Ежедневную награду не удалось получить. Попробуйте ещё раз." + }, + "dailyRewardTitle": "Ежедневные награды", + "dailyRewardHint": "Входите каждый день и получайте награду — серии растут до больших дней.", + "dailyRewardDay": "День {day}", + "dailyRewardStreak": "{count, plural, one {Серия: # день} few {Серия: # дня} many {Серия: # дней} other {Серия: # дня}}", + "dailyRewardNextClaim": "Следующее получение: {amount} {currency}", + "dailyRewardTomorrow": "Завтра: {amount} {currency}", + "dailyRewardClaim": "Получить ежедневную награду", + "dailyRewardClaimedToday": "Получено сегодня — возвращайтесь завтра за следующей наградой.", + "dailyRewardDisabled": "Ежедневные награды сейчас выключены. Вы можете исследовать отель.", + "dailyRewardUnavailable": "Расписание ежедневных наград не удалось загрузить. Попробуйте ещё раз." }, "housekeeping": { "preview": { @@ -6473,7 +6556,9 @@ "sprite": "· sprite", "Git": "Git:" } - } + }, + "connected": "Связано", + "unavailable": "Недоступно" }, "emails": { "verify": { @@ -6500,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Сканирование уже выполняется — подключено к нему.", + "ageUnknown": "возраст неизвестен", + "ageBelow": "< 1д", + "scanButton": "Сканировать ресурсы мебели", + "scanningAssets": "Сканирование ресурсов…", + "cancelButton": "Отмена", + "deleteSelected": "Удалить выбранные ({count})", + "deleting": "Удаление…", + "redownloadBroken": "Скачать повреждённые заново", + "redownloading": "Повторное скачивание…", + "autoClean": "Автоматически чистить старые поддельные", + "cleaning": "Очистка…", + "exportManifest": "Экспортировать манифест", + "exporting": "Экспорт…", + "phaseStems": "Загрузка стеблей мебели…", + "phaseReaddir": "Чтение каталогов ресурсов…", + "phaseValidate": "Проверка пакетов .nitro…", + "phaseScanning": "Сканирование…", + "scanProgressFiles": "{count} файлов", + "repairProgress": "ok {ok}, не удалось {failed}", + "attachedNotice": "Сканирование продолжается в фоне — результаты появятся по завершении.", + "sessionCancelled": "Сканирование отменено.", + "onlyOldLabel": "Показывать только файлы старше", + "onlyOldAgeLabel": "Минимальный возраст в днях для отображения", + "onlyOldToggle": "Скрыть недавние файлы", + "daysLabel": "дней", + "autoAgeLabel": "Минимальный возраст в днях для автоочистки", + "loadingResult": "Загрузка результата сканирования…", + "scannedStat": "файлов ресурсов просканировано", + "cachedNotice": "(в кэше — каталоги не изменились)", + "fakeStat": "Поддельные nitro (нет соответствующего элемента)", + "brokenStat": "Повреждённые nitro (нечитаемые)", + "groupEmpty": "Ничего не найдено", + "selectedCount": "выбрано {count}", + "copiesBadge": "{count} копий", + "groupFakeLabel": "Поддельные nitro", + "groupFakeDescription": "Эти файлы не соответствуют ни одному элементу в items_base — остатки удалённой или переименованной мебели.", + "groupBrokenLabel": "Повреждённые nitro", + "groupBrokenDescription": "Эти файлы принадлежат элементу, но не могут быть прочитаны как допустимый пакет Nitro.", + "groupSwfLabel": "Осиротевшие SWF", + "groupSwfDescription": "Файлы .swf, не соответствующие ни одному элементу в items_base.", + "groupIconLabel": "Осиротевшие иконки", + "groupIconDescription": "Файлы иконок, не соответствующие ни одному элементу в items_base.", + "warningText": "Удаление повреждённого .nitro оставляет элемент в базе без пакета — лучше скачать его заново или позволить аудиту каталога получить его позже. Строки базы никогда не удаляются этим инструментом.", + "onlyAssetsTouched": "Изменяются только файлы ресурсов — FurnitureData.json и строки базы остаются нетронутыми.", + "emptyHint": "Просканируйте каждый каталог ресурсов мебели, чтобы найти поддельные и повреждённые пакеты nitro, а также осиротевшие SWF и иконки. Удалите их, скачайте повреждённые заново или автоматически очистите старые остатки.", + "noResult": "Пока нет результата сканирования — сначала запустите сканирование ресурсов мебели.", + "scanFailed": "Сканирование не удалось.", + "confirmDeleteTitle": "Удалить {count} файл(ов) ресурсов?", + "confirmDeleteDescription": "Файлы будут удалены из каждого каталога (public + зеркальные gamedata). Строки базы никогда не изменяются.", + "confirmDeleteLabel": "Удалить", + "confirmRepairTitle": "Скачать заново {count} повреждённый(ых) пакет(ов) .nitro?", + "confirmRepairDescription": "Пакеты будут получены заново из настроенных источников nitro и записаны поверх каждого каталога (public + зеркальные gamedata).", + "confirmRepairLabel": "Скачать заново", + "confirmAutoCleanTitle": "Автоматически очистить поддельные nitro старше {days} дней?", + "confirmAutoCleanDescription": "Удаляются только поддельные файлы .nitro (нет соответствующего элемента) старше порога. Повреждённые пакеты и недавние файлы никогда не изменяются.", + "confirmAutoCleanLabel": "Автоочистка", + "toastDeletePartial": "Удалено {copies} копий, но некоторые файлы не удалось удалить", + "toastDeleteDone": "Удалено {copies} копий файлов ({deleted} файлов)", + "toastRepairDone": "Отремонтировано {count} пакетов .nitro", + "toastRepairFailed": "Не удалось получить ни одного пакета ({failed} не удалось)", + "toastRepairCancelled": "Ремонт отменён", + "toastAutoCleanDone": "Очищено {deleted} старых поддельных файлов .nitro ({copies} копий). Пропущено {recent} недавних + {broken} повреждённых.", + "toastAutoCleanNothing": "Нечего достаточно старого для удаления (пропущено {recent} недавних, {broken} повреждённых)", + "toastManifestDownload": "Манифест сканирования скачан", + "gamedataTitle": "Очистка игровых данных", + "gamedataHint": "Сначала предпросмотр: это перезаписывает FurnitureData.json, FigureMap.json и FigureData.json. В отличие от инструментов ресурсов выше, удаляет строки, которые ни на что не ссылаются — проверьте количество перед запуском.", + "gamedataScan": "Предпросмотр игровых данных", + "gamedataScanning": "Сканирование…", + "gamedataRun": "Запустить выбранные", + "gamedataRunning": "Очистка…", + "gamedataNoResult": "Пока нет предпросмотра — сначала просканируйте файлы JSON игровых данных.", + "gamedataCount_duplicates": "Дубликаты FurnitureData", + "gamedataCount_orphans": "Осиротевшие FurnitureData", + "gamedataCount_figureMap": "Проблемы FigureMap", + "gamedataCount_figureData": "Неиспользуемый FigureData", + "gamedataPass_dedupeFurnitureData": "Дедупликация FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Удаляет повторяющиеся classnames внутри одного раздела, сохраняя запись с наивысшей ревизией.", + "gamedataPass_cleanFurnitureData": "Очистить FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Удаляет записи, у которых пакет .nitro отсутствует в каждом каталоге.", + "gamedataPass_cleanFigureMap": "Очистить FigureMap", + "gamedataPassDesc_cleanFigureMap": "Удаляет части, указывающие на отсутствующий набор в FigureData, а также точные дубликаты.", + "gamedataPass_cleanFigureData": "Очистить FigureData", + "gamedataPassDesc_cleanFigureData": "Удаляет наборы, на которые не ссылается ни одна часть FigureMap, затем палитры, которые не использует ни один тип набора. Должно запускаться после Очистить FigureMap.", + "gamedataNothingSelected": "Выберите хотя бы один шаг очистки", + "gamedataConfirmTitle": "Перезаписать файлы JSON игровых данных?", + "gamedataConfirmDescription": "{passes} шаг(ов) будут запущены против {duplicates} дублированных групп, {orphans} осиротевших строк, {figureMap} проблем FigureMap и {figureData} неиспользуемых записей FigureData. Строки удаляются без резервной копии — это нельзя отменить.", + "gamedataConfirmLabel": "Перезаписать файлы", + "gamedataDifferingWarning": "По крайней мере один дубликат не является точной копией сохраняемой записи, поэтому удалённая строка содержала данные, которых нет у выжившего.", + "gamedataCrossSectionNote": "{count} classname(ов) существуют как в roomitemtypes, так и в wallitemtypes. Они только сообщаются — удаление одного изменит тип элемента.", + "gamedataToastDone": "Очистка игровых данных удалила {removed} строк", + "gamedataToastNothing": "Игровые данные уже были чистыми", + "gamedataMaxRemovalsLabel": "Макс. строк на шаг", + "gamedataMaxRemovalsHint": "0 использует значение по умолчанию 500. Шаг, который удалил бы больше, останавливается и спрашивает вместо записи.", + "gamedataLimitTitle": "{pass} удалил бы {wouldRemove} строк, выше лимита {maxRemovals}.", + "gamedataLimitDescription": "Этот шаг ничего не записал, поэтому файлы не изменены. Сначала проверьте пути к ресурсам — неправильный каталог делает каждую строку осиротевшей. Повышение лимита — отдельный, преднамеренный запуск.", + "gamedataLimitOverride": "Всё равно удалить {wouldRemove} строк", + "historyTitle": "История автоочистки", + "historyScheduled": "по расписанию", + "historyManual": "вручную", + "historyEntry": "Удалено {deleted} ({copies} копий); пропущено {recent} недавних и {broken} повреждённых", + "historyErrors": "{count} ошибок" + }, "importDiagnostics": { "attempts": "Диагностика файлов", "preliminary": "Предварительная проверка адресов; содержимое проверяется при импорте.", diff --git a/src/messages/sk.json b/src/messages/sk.json index 4789d815..a84fb7cf 100644 --- a/src/messages/sk.json +++ b/src/messages/sk.json @@ -818,9 +818,9 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Prepojené účty", - "subtitle": "Prepojte sociálny účet, aby ste sa mohli prihlásiť jedným kliknutím", - "connected": "Pripojené", - "unavailable": "nedostupné", + "subtitle": "Prepojte sociálny účet a prihláste sa jedným kliknutím", + "connected": "Prepojené", + "unavailable": "Nedostupné", "login": { "title": "Prihláste sa", "subtitle": "Vitajte späť — prihláste sa pre vstup do hotela.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Mám 18+ a súhlasím s vekovým požiadavkou.", + "invitedBy": "Pozvaný používateľom {username}" }, "forgot": { "title": "Obnoviť heslo", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Odporúčania", + "dailyRewards": "Denné odmeny" }, "dashboard": { "title": "Dashboard", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Odporúčania", + "dailyRewards": "Denné odmeny" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Odporúčania", + "subtitle": "Systém pozývania", + "referralsToday": "Odporúčania dnes", + "referralsTotal": "Celkom odporúčaní", + "invitedTotal": "Spočítané pozvánky", + "claims": "Odmeny vyzdvihnuté", + "settings": "Nastavenia odmeny", + "needed": "Potrebné odporúčania", + "rewardAmount": "Výška odmeny", + "rewardCurrency": "Mena odmeny", + "blockSameIp": "Odmietnuť odporúčania zdieľajúce aktuálnu IP pozývajúceho", + "save": "Uložiť nastavenia", + "saving": "Ukladanie…", + "saved": "Nastavenia odporúčaní uložené.", + "saveError": "Nastavenia odporúčaní sa nepodarilo uložiť.", + "recent": "Nedávne odporúčania", + "unavailable": "Údaje o odporúčaniach sú dočasne nedostupné.", + "empty": "Zatiaľ žiadne odporúčania.", + "inviter": "Pozývajúci", + "invitee": "Pozvaný používateľ", + "ip": "IP", + "date": "Dátum" + }, + "dailyRewards": { + "title": "Denné odmeny za prihlásenie", + "subtitle": "Plán denných odmien za prihlásenie", + "enabled": "Stav funkcie", + "yes": "Povolené", + "no": "Zakázané", + "scheduleDays": "Dni plánu", + "claimsToday": "Vyzdvihnutia dnes", + "claimsTotal": "Celkom vyzdvihnutí", + "status": "Stav funkcie", + "statusHint": "Pri zakázaní sa karta odmeny skryje a nové vyzdvihnutia budú odmietnuté.", + "disable": "Zakázať", + "enable": "Povoliť", + "schedule": "Plán odmien", + "day": "Deň {day}", + "reward": "Odmena", + "amount": "Suma", + "actions": "Akcie", + "addDay": "Deň", + "add": "Pridať deň", + "save": "Uložiť", + "saving": "Ukladanie…", + "saved": "Plán odmien uložený.", + "cancel": "Zrušiť", + "edit": "Upraviť", + "delete": "Zmazať", + "created": "Deň odmeny pridaný.", + "updated": "Deň odmeny aktualizovaný.", + "deleted": "Deň odmeny odstránený.", + "saveError": "Deň odmeny sa nepodarilo uložiť.", + "deleteError": "Deň odmeny sa nepodarilo odstrániť.", + "confirmDeleteTitle": "Odstrániť deň odmeny", + "confirmDeleteBody": "Tento deň odmeny sa už nebude udeľovať. Minulé vyzdvihnutia zostávajú zaznamenané." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Vaša denná odmena je pripravená na vyzdvihnutie" + }, + "dailyClaimed": "Denná odmena vyzdvihnutá — do zajtra!", + "dailyErrors": { + "already_claimed": "Dnešnú dennú odmenu ste už vyzdvihli.", + "disabled": "Denné odmeny sú momentálne zakázané.", + "bad_config": "Plán denných odmien nie je správne nakonfigurovaný. Kontaktujte personál.", + "ratelimit": "Príliš mnoho pokusov. Počkajte chvíľu a skúste to znova.", + "error": "Dennú odmenu sa nepodarilo vyzdvihnúť. Skúste to prosím znova." + }, + "dailyRewardTitle": "Denné odmeny", + "dailyRewardHint": "Prihlasujte sa každý deň a vyzdvihnite si odmenu — série rastú do veľkých dní.", + "dailyRewardDay": "Deň {day}", + "dailyRewardStreak": "{count, plural, one {Séria: # deň} few {Séria: # dni} other {Séria: # dní}}", + "dailyRewardNextClaim": "Ďalšie vyzdvihnutie: {amount} {currency}", + "dailyRewardTomorrow": "Zajtra: {amount} {currency}", + "dailyRewardClaim": "Vyzdvihnúť dennú odmenu", + "dailyRewardClaimedToday": "Vyzdvihnuté dnes — vráťte sa zajtra pre ďalšiu odmenu.", + "dailyRewardDisabled": "Denné odmeny sú momentálne zakázané. Môžete preskúmať hotel.", + "dailyRewardUnavailable": "Plán denných odmien sa nepodarilo načítať. Skúste to prosím znova." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Skenovanie už beží — pripojené k nemu.", + "ageUnknown": "vek neznámy", + "ageBelow": "< 1d", + "scanButton": "Skenovať nábytok", + "scanningAssets": "Skenovanie aktív…", + "cancelButton": "Zrušiť", + "deleteSelected": "Zmazať vybrané ({count})", + "deleting": "Mazanie…", + "redownloadBroken": "Stiahnuť poškodené znova", + "redownloading": "Opätovné sťahovanie…", + "autoClean": "Automaticky čistiť staré falošné", + "cleaning": "Čistenie…", + "exportManifest": "Exportovať manifest", + "exporting": "Exportovanie…", + "phaseStems": "Načítanie stonkov nábytku…", + "phaseReaddir": "Čítanie adresárov aktív…", + "phaseValidate": "Overovanie balíčkov .nitro…", + "phaseScanning": "Skenovanie…", + "scanProgressFiles": "{count} súborov", + "repairProgress": "ok {ok}, zlyhalo {failed}", + "attachedNotice": "Skenovanie pokračuje na pozadí — výsledky sa zobrazia po dokončení.", + "sessionCancelled": "Skenovanie zrušené.", + "onlyOldLabel": "Zobraziť len súbory staršie ako", + "onlyOldAgeLabel": "Minimálny vek v dňoch na zobrazenie", + "onlyOldToggle": "Skryť nedávne súbory", + "daysLabel": "dni", + "autoAgeLabel": "Minimálny vek v dňoch na automatické čistenie", + "loadingResult": "Načítanie výsledku skenovania…", + "scannedStat": "súborov aktív skenovaných", + "cachedNotice": "(v vyrovnávacej pamäti — adresáre sa nezmenili)", + "fakeStat": "Falošné nitro (bez zodpovedajúcej položky)", + "brokenStat": "Poškodené nitro (nečitateľné)", + "groupEmpty": "Nič sa nenašlo", + "selectedCount": "vybraných {count}", + "copiesBadge": "{count} kópií", + "groupFakeLabel": "Falošné nitro", + "groupFakeDescription": "Tieto súbory nezodpovedajú žiadnej položke v items_base — zvyšky zmazaných alebo premenovaných nábytkov.", + "groupBrokenLabel": "Poškodené nitro", + "groupBrokenDescription": "Tieto súbory patria položke, ale nemožno ich rozpoznať ako platný Nitro balíček.", + "groupSwfLabel": "Osiroty SWF súbory", + "groupSwfDescription": ".swf súbory, ktoré nezodpovedajú žiadnej položke v items_base.", + "groupIconLabel": "Osiroty ikony", + "groupIconDescription": "Súbory ikon, ktoré nezodpovedajú žiadnej položke v items_base.", + "warningText": "Zmazanie poškodeného .nitro zanechá položku v databáze bez balíčka — radšej si ho stiahnite znova, alebo nechajte audit katalogu získať ho neskôr. Riadky databázy nikdy neodstráni tento nástroj.", + "onlyAssetsTouched": "Menia sa len súbory aktív — FurnitureData.json a riadky databázy zostávajú nedotknuté.", + "emptyHint": "Skenujte každý adresár nábytkových aktív, aby ste našli falošné a poškodené nitro balíčky ako aj osiroty SWF súbory a ikony. Zmažte ich, stiahnite poškodené znova alebo automaticky upracite staré zvyšky.", + "noResult": "Zatiaľ žiadny výsledok skenovania — najprv spustite skenovanie nábytkových aktív.", + "scanFailed": "Skenovanie zlyhalo.", + "confirmDeleteTitle": "Zmazať {count} súbor(ov) aktív?", + "confirmDeleteDescription": "Súbory sa odstránia z každého adresára (public + zrkadlená gamedata). Riadky databázy sa nikdy nemenia.", + "confirmDeleteLabel": "Zmazať", + "confirmRepairTitle": "Stiahnuť znova {count} poškodený(ch) .nitro balíčok(ov)?", + "confirmRepairDescription": "Balíčky sa znova stiahnu z nakonfigurovaných nitro zdrojov a prepíšu do každého adresára (public + zrkadlená gamedata).", + "confirmRepairLabel": "Stiahnuť znova", + "confirmAutoCleanTitle": "Automaticky čistiť falošné nitro staršie ako {days} dní?", + "confirmAutoCleanDescription": "Odstránia sa len falošné .nitro súbory (bez zodpovedajúcej položky) staršie ako prahová hodnota. Poškodené balíčky a nedávne súbory sa nikdy nedotknú.", + "confirmAutoCleanLabel": "Automaticky čistiť", + "toastDeletePartial": "Zmazaných {copies} kópií, ale niektoré súbory sa nedali odstrániť", + "toastDeleteDone": "Zmazaných {copies} kópií súborov ({deleted} súborov)", + "toastRepairDone": "Opravených {count} .nitro balíčkov", + "toastRepairFailed": "Nepodarilo sa získať žiadny balíček ({failed} zlyhalo)", + "toastRepairCancelled": "Oprava zrušená", + "toastAutoCleanDone": "Upratých {deleted} starých falošných .nitro súborov ({copies} kópií). Preskočených {recent} nedávnych + {broken} poškodených.", + "toastAutoCleanNothing": "Nič nie je dostatočne staré na odstránenie (preskočených {recent} nedávnych, {broken} poškodených)", + "toastManifestDownload": "Manifest skenovania stiahnutý", + "gamedataTitle": "Čistenie hierných dát", + "gamedataHint": "Najprv náhľad: to prepíše FurnitureData.json, FigureMap.json a FigureData.json. Na rozdiel od nástrojov aktív vyššie odstraňuje riadky, ktoré na nič neukazujú — skontrolujte počty pred spustením.", + "gamedataScan": "Náhľad hierných dát", + "gamedataScanning": "Skenovanie…", + "gamedataRun": "Spustiť vybrané", + "gamedataRunning": "Čistenie…", + "gamedataNoResult": "Zatiaľ žiadny náhľad — najprv naskenujte súbory JSON hierných dát.", + "gamedataCount_duplicates": "Duplicity FurnitureData", + "gamedataCount_orphans": "Osiroty FurnitureData", + "gamedataCount_figureMap": "Problémy FigureMap", + "gamedataCount_figureData": "Nepoužitý FigureData", + "gamedataPass_dedupeFurnitureData": "Odstrániť duplicity FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Odstráni opakujúce sa classnames v jednej sekcii a zachová záznam s najvyššou revíziou.", + "gamedataPass_cleanFurnitureData": "Upratať FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Odstráni záznamy, ktorých .nitro balíčok chýba v každom adresári.", + "gamedataPass_cleanFigureMap": "Upratať FigureMap", + "gamedataPassDesc_cleanFigureMap": "Odstráni časti odkazujúce na chýbajúcu množinu v FigureData plus presné duplicity.", + "gamedataPass_cleanFigureData": "Upratať FigureData", + "gamedataPassDesc_cleanFigureData": "Odstráni množiny, na ktoré neodkazuje žiadna časť FigureMap, potom palety, ktoré nepoužíva žiadny typ množiny. Musí bežať po Upratať FigureMap.", + "gamedataNothingSelected": "Vyberte aspoň jeden krok čistenia", + "gamedataConfirmTitle": "Prepísať súbory JSON hierných dát?", + "gamedataConfirmDescription": "{passes} krok(ov) pobezí proti {duplicates} duplicitným skupinám, {orphans} osirotým riadkom, {figureMap} problémom FigureMap a {figureData} nepoužitým záznamom FigureData. Riadky sa odstraňujú bez zálohy — to nemožno vrátiť späť.", + "gamedataConfirmLabel": "Prepísať súbory", + "gamedataDifferingWarning": "Najmenej jedna duplicita nie je presná kópia záznamu, ktorý sa zachová, takže odstránený riadok obsahoval dáta, ktoré zachovaný nemá.", + "gamedataCrossSectionNote": "{count} classname(ov) existuje aj v roomitemtypes aj v wallitemtypes. Tieto sa len hlásia — odstránenie jednej zmení typ položky.", + "gamedataToastDone": "Čistenie hierných dát odstránilo {removed} riadkov", + "gamedataToastNothing": "Herné dáta už boli čisté", + "gamedataMaxRemovalsLabel": "Max. riadkov na krok", + "gamedataMaxRemovalsHint": "0 používa predvolenú hodnotu 500. Krok, ktorý by odstránil viac, sa zastaví a opýta sa namiesto zápisu.", + "gamedataLimitTitle": "{pass} by odstránil {wouldRemove} riadkov, nad limitom {maxRemovals}.", + "gamedataLimitDescription": "Tento krok nič nezapísal, takže súbory sú nezmenené. Najprv skontrolujte cesty k aktívom — chybný adresár vytvorí z každého riadka osirotu. Zvýšenie limitu je samostatné, zámerné spustenie.", + "gamedataLimitOverride": "Aj tak odstrániť {wouldRemove} riadkov", + "historyTitle": "História automatického čistenia", + "historyScheduled": "naplánované", + "historyManual": "ručne", + "historyEntry": "Odstránených {deleted} ({copies} kópií); preskočených {recent} nedávnych a {broken} poškodených", + "historyErrors": "{count} chýb" + }, "importDiagnostics": { "attempts": "Diagnostika súborov", "preliminary": "Predbežná kontrola adries; obsah sa overí pri importe.", diff --git a/src/messages/sr.json b/src/messages/sr.json index bad5d599..56c2c5dc 100644 --- a/src/messages/sr.json +++ b/src/messages/sr.json @@ -817,10 +817,10 @@ "enable": "Омогући 2ФА", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Повезани налози", - "subtitle": "Повежите друштвени налог да бисте се могли пријавити једним кликом", - "connected": "Повезано", - "unavailable": "Недоступно", + "title": "Povezani nalozi", + "subtitle": "Povežite društveni nalog za prijavu jednim klikom", + "connected": "Povezano", + "unavailable": "Nedostupno", "login": { "title": "Пријавите се", "subtitle": "Добродошли назад — пријавите се да бисте ушли у хотел.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Imam 18+ i prihvatam uslov starosti.", + "invitedBy": "Pozvao {username}" }, "forgot": { "title": "Ресетујте лозинку", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Preporuke", + "dailyRewards": "Dnevne nagrade" }, "dashboard": { "title": "Дасхбоард", @@ -1255,7 +1259,7 @@ "delete": "Избриши", "noAds": "Још нема огласа", "confirmDelete": "Избрисати овај оглас?", - "colId": "ИД", + "colId": "ID", "colName": "Име", "colImage": "Слика", "colUrl": "УРЛ", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Preporuke", + "dailyRewards": "Dnevne nagrade" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Preporuke", + "subtitle": "Sistem pozivnica", + "referralsToday": "Preporuke danas", + "referralsTotal": "Ukupno preporuka", + "invitedTotal": "Izbrojane pozivnice", + "claims": "Nagrade preuzete", + "settings": "Podešavanja nagrade", + "needed": "Potrebne preporuke", + "rewardAmount": "Iznos nagrade", + "rewardCurrency": "Valuta nagrade", + "blockSameIp": "Odbij preporuke koje dele trenutnu IP pozivaoca", + "save": "Sačuvaj podešavanja", + "saving": "Čuvanje…", + "saved": "Podešavanja preporuka sačuvana.", + "saveError": "Podešavanja preporuka nisu se mogla sačuvati.", + "recent": "Nedavne preporuke", + "unavailable": "Podaci o preporukama su privremeno nedostupni.", + "empty": "Još nema preporuka.", + "inviter": "Pozivalac", + "invitee": "Pozvani korisnik", + "ip": "IP", + "date": "Datum" + }, + "dailyRewards": { + "title": "Dnevne nagrade za prijavu", + "subtitle": "Raspored dnevnih nagrada za prijavu", + "enabled": "Status funkcije", + "yes": "Omogućeno", + "no": "Onemogućeno", + "scheduleDays": "Dani rasporeda", + "claimsToday": "Preuzimanja danas", + "claimsTotal": "Ukupno preuzimanja", + "status": "Status funkcije", + "statusHint": "Kada je onemogućeno, kartica nagrade se skriva i nova preuzimanja se odbijaju.", + "disable": "Onemogući", + "enable": "Omogući", + "schedule": "Raspored nagrada", + "day": "Dan {day}", + "reward": "Nagrada", + "amount": "Iznos", + "actions": "Radnje", + "addDay": "Dan", + "add": "Dodaj dan", + "save": "Sačuvaj", + "saving": "Čuvanje…", + "saved": "Raspored nagrada sačuvan.", + "cancel": "Otkaži", + "edit": "Uredi", + "delete": "Obriši", + "created": "Dan nagrade dodat.", + "updated": "Dan nagrade ažuriran.", + "deleted": "Dan nagrade uklonjen.", + "saveError": "Dan nagrade nije se mogao sačuvati.", + "deleteError": "Dan nagrade nije se mogao ukloniti.", + "confirmDeleteTitle": "Ukloni dan nagrade", + "confirmDeleteBody": "Ovaj dan nagrade više se neće dodeljivati. Prošla preuzimanja ostaju zabeležena." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Vaša dnevna nagrada je spremna za preuzimanje" + }, + "dailyClaimed": "Dnevna nagrada preuzeta — vidimo se sutra!", + "dailyErrors": { + "already_claimed": "Već ste preuzeli današnju dnevnu nagradu.", + "disabled": "Dnevne nagrade su trenutno onemogućene.", + "bad_config": "Raspored dnevnih nagrada nije ispravno konfigurisan. Kontaktirajte osoblje.", + "ratelimit": "Previše pokušaja. Sačekajte trenutak i pokušajte ponovo.", + "error": "Dnevna nagrada nije se mogla preuzeti. Pokušajte ponovo." + }, + "dailyRewardTitle": "Dnevne nagrade", + "dailyRewardHint": "Prijavljujte se svaki dan i preuzmite svoju nagradu — nizovi rastu do velikih dana.", + "dailyRewardDay": "Dan {day}", + "dailyRewardStreak": "{count, plural, one {Niz: # dan} few {Niz: # dana} other {Niz: # dana}}", + "dailyRewardNextClaim": "Sledeće preuzimanje: {amount} {currency}", + "dailyRewardTomorrow": "Sutra: {amount} {currency}", + "dailyRewardClaim": "Preuzmi dnevnu nagradu", + "dailyRewardClaimedToday": "Preuzeto danas — vratite se sutra za sledeću nagradu.", + "dailyRewardDisabled": "Dnevne nagrade su trenutno onemogućene. Možete istražiti hotel.", + "dailyRewardUnavailable": "Raspored dnevnih nagrada nije se mogao učitati. Pokušajte ponovo." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Skeniranje je već u toku — povezano sa njim.", + "ageUnknown": "starost nepoznata", + "ageBelow": "< 1d", + "scanButton": "Skeniraj nameštaj", + "scanningAssets": "Skeniranje sredstava…", + "cancelButton": "Otkaži", + "deleteSelected": "Obriši odabrano ({count})", + "deleting": "Brisanje…", + "redownloadBroken": "Ponovo preuzmi oštećene", + "redownloading": "Ponovno preuzimanje…", + "autoClean": "Automatsko čišćenje starih lažnih", + "cleaning": "Čišćenje…", + "exportManifest": "Izvezi manifest", + "exporting": "Izvoz…", + "phaseStems": "Učitavanje stabljika nameštaja…", + "phaseReaddir": "Čitanje direktorijuma sredstava…", + "phaseValidate": "Provera .nitro paketa…", + "phaseScanning": "Skeniranje…", + "scanProgressFiles": "{count} datoteka", + "repairProgress": "ok {ok}, neuspelo {failed}", + "attachedNotice": "Skeniranje nastavlja u pozadini — rezultat će se pojaviti kada se završi.", + "sessionCancelled": "Skeniranje otkazano.", + "onlyOldLabel": "Prikaži samo datoteke starije od", + "onlyOldAgeLabel": "Minimalne starosti u danima za prikaz", + "onlyOldToggle": "Sakrij nedavne datoteke", + "daysLabel": "dana", + "autoAgeLabel": "Minimalne starosti u danima za automatsko čišćenje", + "loadingResult": "Učitavanje rezultata skeniranja…", + "scannedStat": "datoteka sredstava skenirano", + "cachedNotice": "(u privremenoj memoriji — direktorijumi se nisu promenili)", + "fakeStat": "Lažni nitro (nema odgovarajuće stavke)", + "brokenStat": "Oštećeni nitro (nečitljivi)", + "groupEmpty": "Ništa nije pronađeno", + "selectedCount": "odabrano {count}", + "copiesBadge": "{count} kopija", + "groupFakeLabel": "Lažni nitro", + "groupFakeDescription": "Ove datoteke ne odgovaraju nijednoj stavci u items_base — ostaci izbrisanih ili preimenovanih komada nameštaja.", + "groupBrokenLabel": "Oštećeni nitro", + "groupBrokenDescription": "Ove datoteke pripadaju stavci, ali se ne mogu pročitati kao važeći Nitro paket.", + "groupSwfLabel": "SWF-ovi bez roditelja", + "groupSwfDescription": ".swf datoteke koje ne odgovaraju nijednoj stavci u items_base.", + "groupIconLabel": "Ikone bez roditelja", + "groupIconDescription": "Datoteka ikona koje ne odgovaraju nijednoj stavci u items_base.", + "warningText": "Brisanje oštećenog .nitro ostavlja stavku u bazi bez paketa — radije ga ponovo preuzmite ili neka provera kataloga nabavi kasnije. Redovi baze se nikada ne brišu ovim alatom.", + "onlyAssetsTouched": "Diraju se samo datoteke sredstava — FurnitureData.json i redovi baze ostaju netaknuti.", + "emptyHint": "Skenirajte svaki direktorijum nameštaja da biste pronašli lažne i oštećene nitro pakete, kao i SWF-ove i ikone bez roditelja. Obrišite ih, ponovo preuzmite oštećene ili automatski očistite stare ostatke.", + "noResult": "Još nema rezultata skeniranja — prvo pokrenite skeniranje nameštaja.", + "scanFailed": "Skeniranje nije uspelo.", + "confirmDeleteTitle": "Obrisati {count} datoteku(e)?", + "confirmDeleteDescription": "Datoteke će biti uklonjene iz svakog direktorijuma (public + odrazna gamedata). Redovi baze se nikada ne diraju.", + "confirmDeleteLabel": "Obriši", + "confirmRepairTitle": "Ponovo preuzeti {count} oštećen(i) .nitro paket(a)?", + "confirmRepairDescription": "Paketi će biti ponovo preuzeti iz podešenih nitro izvora i zapisani preko svakog direktorijuma (public + odrazna gamedata).", + "confirmRepairLabel": "Ponovo preuzmi", + "confirmAutoCleanTitle": "Automatski očistiti lažne nitro starije od {days} dan(a)?", + "confirmAutoCleanDescription": "Uklanjaju se samo lažne .nitro datoteke (nema odgovarajuće stavke) starije od praga. Oštećeni paketi i nedavne datoteke se nikada ne diraju.", + "confirmAutoCleanLabel": "Automatski očisti", + "toastDeletePartial": "Obrisano {copies} kopija, ali se neke datoteke nisu mogle ukloniti", + "toastDeleteDone": "Obrisano {copies} kopija datoteka ({deleted} datoteka)", + "toastRepairDone": "Popravljeno {count} .nitro paketa", + "toastRepairFailed": "Nije bilo moguće nabaviti nijedan paket ({failed} neuspelo)", + "toastRepairCancelled": "Popravka otkazana", + "toastAutoCleanDone": "Očišćeno {deleted} starih lažnih .nitro datoteka ({copies} kopija). Preskočeno {recent} nedavnih + {broken} oštećenih.", + "toastAutoCleanNothing": "Ništa dovoljno staro za uklanjanje (preskočeno {recent} nedavnih, {broken} oštećenih)", + "toastManifestDownload": "Manifest skeniranja preuzet", + "gamedataTitle": "Čišćenje podataka igre", + "gamedataHint": "Prvo pregled: ovo prepisuje FurnitureData.json, FigureMap.json i FigureData.json. Za razliku od gornjih alata za sredstva, uklanja redove koji ništa ne referenciraju — proverite brojeve pre pokretanja.", + "gamedataScan": "Pregled podataka igre", + "gamedataScanning": "Skeniranje…", + "gamedataRun": "Pokreni odabrano", + "gamedataRunning": "Čišćenje…", + "gamedataNoResult": "Još nema pregleda — prvo skenirajte JSON datoteke podataka igre.", + "gamedataCount_duplicates": "Duplikati FurnitureData", + "gamedataCount_orphans": "FurnitureData bez roditelja", + "gamedataCount_figureMap": "Problemi sa FigureMap", + "gamedataCount_figureData": "Neiskorišćeni FigureData", + "gamedataPass_dedupeFurnitureData": "Deduplikuj FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Uklanja ponovljene classnames unutar jednog odeljka, zadržavajući unos sa najvišom revizijom.", + "gamedataPass_cleanFurnitureData": "Očisti FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Uklanja unose čiji .nitro paket nije prisutan u nijednom direktorijumu.", + "gamedataPass_cleanFigureMap": "Očisti FigureMap", + "gamedataPassDesc_cleanFigureMap": "Uklanja delove koji upućuju na skup koji nedostaje u FigureData, plus tačne duplikate.", + "gamedataPass_cleanFigureData": "Očisti FigureData", + "gamedataPassDesc_cleanFigureData": "Uklanja skupove na koje nijedan FigureMap deo ne upućuje, zatim palete koje nijedan tip skupa ne koristi. Mora se pokrenuti nakon Očisti FigureMap.", + "gamedataNothingSelected": "Odaberite bar jedan korak čišćenja", + "gamedataConfirmTitle": "Prepisati JSON datoteke podataka igre?", + "gamedataConfirmDescription": "{passes} korak(a) izvršiće se na {duplicates} duplih grupa, {orphans} redova bez roditelja, {figureMap} problema sa FigureMap i {figureData} neiskorišćenih unosa FigureData. Redovi se uklanjaju bez rezervne kopije — ovo se ne može poništiti.", + "gamedataConfirmLabel": "Prepiši datoteke", + "gamedataDifferingWarning": "Bar jedan duplikat nije tačna kopija unosa koji se zadržava, pa je obrisani red sadržao podatke koje preživeli nema.", + "gamedataCrossSectionNote": "{count} classname(a) postoji i u roomitemtypes i u wallitemtypes. Oni se samo prijavljuju — uklanjanje jednog promenilo bi tip stavke.", + "gamedataToastDone": "Čišćenje podataka igre uklonilo je {removed} redova", + "gamedataToastNothing": "Podaci igre su već bili čisti", + "gamedataMaxRemovalsLabel": "Maks. redova po koraku", + "gamedataMaxRemovalsHint": "0 koristi podrazumevanu vrednost 500. Korak koji bi uklonio više zaustavlja se i pitaje umesto da piše.", + "gamedataLimitTitle": "{pass} bi uklonio {wouldRemove} redova, iznad limita od {maxRemovals}.", + "gamedataLimitDescription": "Taj korak nije ništa zapisao, pa su datoteke nepromenjene. Prvo proverite putanje sredstava — pogrešan direktorijum čini svaki red bez roditelja. Podizanje limita je zasebna, namerna izvršenja.", + "gamedataLimitOverride": "Svejedno ukloni {wouldRemove} redova", + "historyTitle": "Istorija automatskog čišćenja", + "historyScheduled": "planirano", + "historyManual": "ručno", + "historyEntry": "Uklonjeno {deleted} ({copies} kopija); preskočeno {recent} nedavnih i {broken} oštećenih", + "historyErrors": "{count} grešaka" + }, "importDiagnostics": { "attempts": "Дијагностика датотека", "preliminary": "Прелиминарна провера адреса; садржај се проверава при увозу.", diff --git a/src/messages/sv.json b/src/messages/sv.json index f6e2e37d..a2fe85bc 100644 --- a/src/messages/sv.json +++ b/src/messages/sv.json @@ -817,10 +817,10 @@ "enable": "Aktivera 2FA", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Anslutna konton", - "subtitle": "Länka ett socialt konto så att du kan logga in med ett klick", - "connected": "Ansluten", - "unavailable": "Ej tillgänglig", + "title": "Länkade konton", + "subtitle": "Länka ett socialt konto för att logga in med ett klick", + "connected": "Länkad", + "unavailable": "Otillgänglig", "login": { "title": "Logga in", "subtitle": "Välkommen tillbaka — logga in för att komma in på hotellet.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Jag är 18+ och godkänner ålderskravet.", + "invitedBy": "Inbjuden av {username}" }, "forgot": { "title": "Återställ lösenord", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Rekommendationer", + "dailyRewards": "Dagliga belöningar" }, "dashboard": { "title": "Instrumentbräda", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Rekommendationer", + "dailyRewards": "Dagliga belöningar" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Rekommendationer", + "subtitle": "Inbjudningssystem", + "referralsToday": "Rekommendationer idag", + "referralsTotal": "Rekommendationer totalt", + "invitedTotal": "Inbjudningar räknade", + "claims": "Belöningar hämtade", + "settings": "Belönningsinställningar", + "needed": "Nödvändiga rekommendationer", + "rewardAmount": "Belöningsbelopp", + "rewardCurrency": "Belöningsvaluta", + "blockSameIp": "Avslå rekommendationer som delar inbjudarens nuvarande IP", + "save": "Spara inställningar", + "saving": "Sparar…", + "saved": "Rekommendationsinställningar sparade.", + "saveError": "Rekommendationsinställningar kunde inte sparas.", + "recent": "Senaste rekommendationer", + "unavailable": "Rekommendationsdata är tillfälligt otillgänglig.", + "empty": "Inga rekommendationer ännu.", + "inviter": "Inbjudare", + "invitee": "Inbjuden användare", + "ip": "IP", + "date": "Datum" + }, + "dailyRewards": { + "title": "Dagliga inloggningsbelöningar", + "subtitle": "Daglig inloggningsbelöningsschema", + "enabled": "Funktionsstatus", + "yes": "Aktiverad", + "no": "Inaktiverad", + "scheduleDays": "Schemats dagar", + "claimsToday": "Hämtningar idag", + "claimsTotal": "Hämtningar totalt", + "status": "Funktionsstatus", + "statusHint": "När inaktiverad döljs belöningskortet och nya hämtningar avslås.", + "disable": "Inaktivera", + "enable": "Aktivera", + "schedule": "Belöningsschema", + "day": "Dag {day}", + "reward": "Belöning", + "amount": "Belopp", + "actions": "Åtgärder", + "addDay": "Dag", + "add": "Lägg till dag", + "save": "Spara", + "saving": "Sparar…", + "saved": "Belöningsschema sparat.", + "cancel": "Avbryt", + "edit": "Redigera", + "delete": "Ta bort", + "created": "Belöningsdag tillagd.", + "updated": "Belöningsdag uppdaterad.", + "deleted": "Belöningsdag borttagen.", + "saveError": "Belöningsdag kunde inte sparas.", + "deleteError": "Belöningsdag kunde inte tas bort.", + "confirmDeleteTitle": "Ta bort belöningsdag", + "confirmDeleteBody": "Denna belöningsdag kommer inte längre att ges. Tidigare hämtningar förblir registrerade." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Din dagliga belöning är redo att hämtas" + }, + "dailyClaimed": "Daglig belöning hämtad — ses imorgon!", + "dailyErrors": { + "already_claimed": "Du har redan hämtat dagens dagliga belöning.", + "disabled": "Dagliga belöningar är inaktiverade just nu.", + "bad_config": "Det dagliga belöningsschemat är inte korrekt konfigurerat. Kontakta personalen.", + "ratelimit": "För många försök. Vänta en stund och försök igen.", + "error": "Den dagliga belöningen kunde inte hämtas. Försök igen." + }, + "dailyRewardTitle": "Dagliga belöningar", + "dailyRewardHint": "Logga in varje dag och hämta din belöning — serier växer in till de stora dagarna.", + "dailyRewardDay": "Dag {day}", + "dailyRewardStreak": "{count, plural, one {Serie: # dag} other {Serie: # dagar}}", + "dailyRewardNextClaim": "Nästa hämtning: {amount} {currency}", + "dailyRewardTomorrow": "Imorgon: {amount} {currency}", + "dailyRewardClaim": "Hämta daglig belöning", + "dailyRewardClaimedToday": "Hämtad idag — kom tillbaka imorgon för nästa belöning.", + "dailyRewardDisabled": "Dagliga belöningar är inaktiverade just nu. Du kan utforska hotellet.", + "dailyRewardUnavailable": "Det dagliga belöningsschemat kunde inte laddas. Försök igen." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "En skanning pågår redan — ansluten till den.", + "ageUnknown": "ålder okänd", + "ageBelow": "< 1d", + "scanButton": "Skanna möbelresurser", + "scanningAssets": "Skannar resurser…", + "cancelButton": "Avbryt", + "deleteSelected": "Ta bort valda ({count})", + "deleting": "Tar bort…", + "redownloadBroken": "Ladda ner skadade igen", + "redownloading": "Laddar ner igen…", + "autoClean": "Rensa gamla falska automatiskt", + "cleaning": "Rensar…", + "exportManifest": "Exportera manifest", + "exporting": "Exporterar…", + "phaseStems": "Laddar möbelstammar…", + "phaseReaddir": "Läser resurskataloger…", + "phaseValidate": "Validerar .nitro-paket…", + "phaseScanning": "Skannar…", + "scanProgressFiles": "{count} filer", + "repairProgress": "ok {ok}, misslyckades {failed}", + "attachedNotice": "Skanningen fortsätter i bakgrunden — resultaten visas när den är klar.", + "sessionCancelled": "Skanningen avbruten.", + "onlyOldLabel": "Visa endast filer äldre än", + "onlyOldAgeLabel": "Minimiålder i dagar för visning", + "onlyOldToggle": "Dölj nyliga filer", + "daysLabel": "dagar", + "autoAgeLabel": "Minimiålder i dagar för automatisk rengöring", + "loadingResult": "Laddar skanningsresultat…", + "scannedStat": "resursfiler skannade", + "cachedNotice": "(cachad — katalogerna är oförändrade)", + "fakeStat": "Falska nitro (ingen matchande artikel)", + "brokenStat": "Skadade nitro (oläsbara)", + "groupEmpty": "Inget hittades", + "selectedCount": "{count} valda", + "copiesBadge": "{count} kopior", + "groupFakeLabel": "Falska nitro", + "groupFakeDescription": "Dessa filer matchar ingen artikel i items_base — kvarlevor från borttagna eller omdöpta möbler.", + "groupBrokenLabel": "Skadade nitro", + "groupBrokenDescription": "Dessa filer tillhör en artikel men kan inte läsas som ett giltigt Nitro-paket.", + "groupSwfLabel": "Föräldralösa SWF-filer", + "groupSwfDescription": ".swf-filer som matchar ingen artikel i items_base.", + "groupIconLabel": "Föräldralösa ikoner", + "groupIconDescription": "Ikonfiler som matchar ingen artikel i items_base.", + "warningText": "Att ta bort en skadad .nitro lämnar artikeln i databasen utan paket — föredra att ladda ner den igen, eller låt kataloggranskningen skaffa den senare. Databasrader tas aldrig bort av detta verktyg.", + "onlyAssetsTouched": "Endast resursfiler påverkas — FurnitureData.json och databasrader förblir intakta.", + "emptyHint": "Skanna varje möbelresurskatalog för att hitta falska och skadade nitro-paket samt föräldralösa SWF-filer och ikoner. Ta bort dem, ladda ner de skadade igen eller rensa gamla kvarlevor automatiskt.", + "noResult": "Inget skanningsresultat ännu — kör en möbelresursskanning först.", + "scanFailed": "Skanningen misslyckades.", + "confirmDeleteTitle": "Ta bort {count} resursfil(er)?", + "confirmDeleteDescription": "Filerna tas bort från alla kataloger (public + speglade gamedata). Databasrader påverkas aldrig.", + "confirmDeleteLabel": "Ta bort", + "confirmRepairTitle": "Ladda ner {count} skadad(e) .nitro-paket igen?", + "confirmRepairDescription": "Paketen hämtas igen från de konfigurerade nitro-källarna och skrivs över alla kataloger (public + speglade gamedata).", + "confirmRepairLabel": "Ladda ner igen", + "confirmAutoCleanTitle": "Rensa falska nitro äldre än {days} dag(ar) automatiskt?", + "confirmAutoCleanDescription": "Endast falska .nitro-filer (ingen matchande artikel) äldre än tröskeln tas bort. Skadade paket och nyliga filer påverkas aldrig.", + "confirmAutoCleanLabel": "Rensa automatiskt", + "toastDeletePartial": "Tog bort {copies} kopior, men vissa filer kunde inte tas bort", + "toastDeleteDone": "Tog bort {copies} filkopior ({deleted} filer)", + "toastRepairDone": "Reparerade {count} .nitro-paket", + "toastRepairFailed": "Kunde inte skaffa något paket ({failed} misslyckades)", + "toastRepairCancelled": "Reparation avbruten", + "toastAutoCleanDone": "Rensade {deleted} gamla falska .nitro-filer ({copies} kopior). Hoppade över {recent} nyliga + {broken} skadade.", + "toastAutoCleanNothing": "Inenting gammalt nog att ta bort (hoppade över {recent} nyliga, {broken} skadade)", + "toastManifestDownload": "Skanningsmanifest nedladdat", + "gamedataTitle": "Rensning av speldata", + "gamedataHint": "Förhandsvisa först: detta skriver över FurnitureData.json, FigureMap.json och FigureData.json. Till skillnad från resursverktygen ovan tar det bort rader som inte refererar till något — granska siffrorna innan du kör det.", + "gamedataScan": "Förhandsvisa speldata", + "gamedataScanning": "Skannar…", + "gamedataRun": "Kör valda", + "gamedataRunning": "Rensar…", + "gamedataNoResult": "Ingen förhandsvisning ännu — skanna speldata-JSON-filerna först.", + "gamedataCount_duplicates": "FurnitureData-dubletter", + "gamedataCount_orphans": "FurnitureData-föräldralösa", + "gamedataCount_figureMap": "FigureMap-problem", + "gamedataCount_figureData": "Oanvänt FigureData", + "gamedataPass_dedupeFurnitureData": "Avduplicera FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Tar bort upprepade classnames inom en sektion och behåller posten med högsta revision.", + "gamedataPass_cleanFurnitureData": "Rensa FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Tar bort poster där .nitro-paketet saknas i alla kataloger.", + "gamedataPass_cleanFigureMap": "Rensa FigureMap", + "gamedataPassDesc_cleanFigureMap": "Tar bort delar som pekar på en saknad uppsättning i FigureData, plus exakta dubletter.", + "gamedataPass_cleanFigureData": "Rensa FigureData", + "gamedataPassDesc_cleanFigureData": "Tar bort uppsättningar som ingen FigureMap-del refererar till, sedan paletter som ingen uppsättningstyp använder. Måste köras efter Rensa FigureMap.", + "gamedataNothingSelected": "Välj minst ett rengöringssteg", + "gamedataConfirmTitle": "Skriv över speldata-JSON-filer?", + "gamedataConfirmDescription": "{passes} steg körs mot {duplicates} dublettgrupper, {orphans} föräldralösa rader, {figureMap} FigureMap-problem och {figureData} oanvända FigureData-poster. Rader tas bort utan säkerhetskopia — detta kan inte ångras.", + "gamedataConfirmLabel": "Skriv över filer", + "gamedataDifferingWarning": "Minst en dublett är inte en exakt kopia av posten som behålls, så den borttagna raden innehöll data som den överlevande inte har.", + "gamedataCrossSectionNote": "{count} classnames finns i både roomitemtypes och wallitemtypes. Dessa rapporteras endast — att ta bort en skulle ändra en artikels typ.", + "gamedataToastDone": "Rensning av speldata tog bort {removed} rader", + "gamedataToastNothing": "Speldata var redan rent", + "gamedataMaxRemovalsLabel": "Max. rader per steg", + "gamedataMaxRemovalsHint": "0 använder standardvärdet 500. Ett steg som skulle ta bort mer stannar och frågar istället för att skriva.", + "gamedataLimitTitle": "{pass} skulle ta bort {wouldRemove} rader, över gränsen {maxRemovals}.", + "gamedataLimitDescription": "Detta steg skrev ingenting, så filerna är oförändrade. Kontrollera resurssökvägarna först — en felaktig katalog får varje rad att se föräldralös ut. Att höja gränsen är en separat, avsiktlig körning.", + "gamedataLimitOverride": "Ta bort {wouldRemove} rader ändå", + "historyTitle": "Historik för automatisk rengöring", + "historyScheduled": "schemalagt", + "historyManual": "manuellt", + "historyEntry": "Tog bort {deleted} ({copies} kopior); hoppade över {recent} nyliga och {broken} skadade", + "historyErrors": "{count} fel" + }, "importDiagnostics": { "attempts": "Fildiagnostik", "preliminary": "Förhandskontroll av adresser; innehållet valideras vid import.", diff --git a/src/messages/tr.json b/src/messages/tr.json index 579387d4..f3e6500d 100644 --- a/src/messages/tr.json +++ b/src/messages/tr.json @@ -818,7 +818,7 @@ "rateLimit": "Too many attempts. Please wait before trying again." }, "title": "Bağlı hesaplar", - "subtitle": "Tek tıklamayla oturum açabilmek için bir sosyal hesap bağlayın", + "subtitle": "Tek tıklamayla giriş için sosyal hesap bağlayın", "connected": "Bağlı", "unavailable": "Kullanılamıyor", "login": { @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "18+ yaşındayım ve yaş gereksinimini kabul ediyorum.", + "invitedBy": "{username} tarafından davet edildi" }, "forgot": { "title": "Şifreyi sıfırla", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Tavsiyeler", + "dailyRewards": "Günlük Ödüller" }, "dashboard": { "title": "Kontrol Paneli", @@ -1255,7 +1259,7 @@ "delete": "Sil", "noAds": "Henüz reklam yok", "confirmDelete": "Bu reklam silinsin mi?", - "colId": "Kimlik", + "colId": "ID", "colName": "İsim", "colImage": "Resim", "colUrl": "URL'si", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Tavsiyeler", + "dailyRewards": "Günlük Ödüller" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Tavsiyeler", + "subtitle": "Davet Sistemi", + "referralsToday": "Bugünkü tavsiyeler", + "referralsTotal": "Toplam tavsiye", + "invitedTotal": "Sayılan davetler", + "claims": "Alınan ödüller", + "settings": "Ödül Ayarları", + "needed": "Gerekli tavsiyeler", + "rewardAmount": "Ödül Tutarı", + "rewardCurrency": "Ödül Para Birimi", + "blockSameIp": "Davetçinin mevcut IP'sini paylaşan tavsiyeleri reddet", + "save": "Ayarları Kaydet", + "saving": "Kaydediliyor…", + "saved": "Tavsiye ayarları kaydedildi.", + "saveError": "Tavsiye ayarları kaydedilemedi.", + "recent": "Son tavsiyeler", + "unavailable": "Tavsiye verileri geçici olarak kullanılamıyor.", + "empty": "Henüz tavsiye yok.", + "inviter": "Davetçi", + "invitee": "Davet edilen kullanıcı", + "ip": "IP", + "date": "Tarih" + }, + "dailyRewards": { + "title": "Günlük Giriş Ödülleri", + "subtitle": "Günlük Giriş Ödül Programı", + "enabled": "Özellik Durumu", + "yes": "Etkin", + "no": "Devre Dışı", + "scheduleDays": "Program Günleri", + "claimsToday": "Bugünkü alımlar", + "claimsTotal": "Toplam alım", + "status": "Özellik Durumu", + "statusHint": "Devre dışıyken ödül kartı gizlenir ve yeni alımlar reddedilir.", + "disable": "Devre Dışı Bırak", + "enable": "Etkinleştir", + "schedule": "Ödül Programı", + "day": "Gün {day}", + "reward": "Ödül", + "amount": "Tutar", + "actions": "İşlemler", + "addDay": "Gün", + "add": "Gün Ekle", + "save": "Kaydet", + "saving": "Kaydediliyor…", + "saved": "Ödül programı kaydedildi.", + "cancel": "İptal", + "edit": "Düzenle", + "delete": "Sil", + "created": "Ödül günü eklendi.", + "updated": "Ödül günü güncellendi.", + "deleted": "Ödül günü kaldırıldı.", + "saveError": "Ödül günü kaydedilemedi.", + "deleteError": "Ödül günü kaldırılamadı.", + "confirmDeleteTitle": "Ödül gününü kaldır", + "confirmDeleteBody": "Bu ödül günü artık verilmeyecek. Geçmiş alımlar kayıtlı kalacak." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Günlük ödülünüz alınmaya hazır" + }, + "dailyClaimed": "Günlük ödül alındı — yarın görüşürüz!", + "dailyErrors": { + "already_claimed": "Bugünkü günlük ödülü zaten aldınız.", + "disabled": "Günlük ödüller şu anda devre dışı.", + "bad_config": "Günlük ödül programı doğru yapılandırılmamış. Personelle iletişime geçin.", + "ratelimit": "Çok fazla deneme. Biraz bekleyin ve tekrar deneyin.", + "error": "Günlük ödül alınamadı. Lütfen tekrar deneyin." + }, + "dailyRewardTitle": "Günlük Ödüller", + "dailyRewardHint": "Her gün giriş yapın ve ödülünüzü alın — seriler büyük günlere kadar büyür.", + "dailyRewardDay": "Gün {day}", + "dailyRewardStreak": "{count, plural, one {Seri: # gün} other {Seri: # gün}}", + "dailyRewardNextClaim": "Sonraki alım: {amount} {currency}", + "dailyRewardTomorrow": "Yarın: {amount} {currency}", + "dailyRewardClaim": "Günlük ödülü al", + "dailyRewardClaimedToday": "Bugün alındı — sonraki ödül için yarın tekrar gelin.", + "dailyRewardDisabled": "Günlük ödüller şu anda devre dışı. Oteli keşfedebilirsiniz.", + "dailyRewardUnavailable": "Günlük ödül programı yüklenemedi. Lütfen tekrar deneyin." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Bir tarama zaten çalışıyor — ona bağlandı.", + "ageUnknown": "yaş bilinmiyor", + "ageBelow": "< 1g", + "scanButton": "Mobilya varlıklarını tara", + "scanningAssets": "Varlıklar taranıyor…", + "cancelButton": "İptal", + "deleteSelected": "Seçilenleri sil ({count})", + "deleting": "Siliniyor…", + "redownloadBroken": "Hasarlıları yeniden indir", + "redownloading": "Yeniden indiriliyor…", + "autoClean": "Eski sahteleri otomatik temizle", + "cleaning": "Temizleniyor…", + "exportManifest": "Listeyi dışa aktar", + "exporting": "Dışa aktarılıyor…", + "phaseStems": "Mobilya sapları yükleniyor…", + "phaseReaddir": "Varlık dizinleri okunuyor…", + "phaseValidate": ".nitro paketleri doğrulanıyor…", + "phaseScanning": "Taranıyor…", + "scanProgressFiles": "{count} dosya", + "repairProgress": "ok {ok}, başarısız {failed}", + "attachedNotice": "Tarama arka planda devam ediyor — sonuçlar bitince görünecek.", + "sessionCancelled": "Tarama iptal edildi.", + "onlyOldLabel": "Sadece şundan eski dosyaları göster", + "onlyOldAgeLabel": "Görüntüleme için minimum gün yaşı", + "onlyOldToggle": "Son dosyaları gizle", + "daysLabel": "gün", + "autoAgeLabel": "Otomatik temizlik için minimum gün yaşı", + "loadingResult": "Tarama sonucu yükleniyor…", + "scannedStat": "taranan varlık dosyası", + "cachedNotice": "(önbellekte — dizinler değişmedi)", + "fakeStat": "Sahte nitro (eşleşen öğe yok)", + "brokenStat": "Hasarlı nitro (okunamıyor)", + "groupEmpty": "Hiçbir şey bulunamadı", + "selectedCount": "{count} seçildi", + "copiesBadge": "{count} kopya", + "groupFakeLabel": "Sahte nitro", + "groupFakeDescription": "Bu dosyalar items_base'deki hiçbir öğeyle eşleşmiyor — silinmiş veya yeniden adlandırılmış mobilyaların kalıntıları.", + "groupBrokenLabel": "Hasarlı nitro", + "groupBrokenDescription": "Bu dosyalar bir öğeye ait ancak geçerli bir Nitro paketi olarak okunamıyor.", + "groupSwfLabel": "Yetim SWF'ler", + "groupSwfDescription": "items_base'deki hiçbir öğeyle eşleşmeyen .swf dosyaları.", + "groupIconLabel": "Yetim simgeler", + "groupIconDescription": "items_base'deki hiçbir öğeyle eşleşmeyen simge dosyaları.", + "warningText": "Hasarlı bir .nitro'yi silmek öğesini veritabanında paket bırakmaz — yeniden indirmeyi tercih edin veya katalog denetiminin sonradan temin etmesine izin verin. Bu araçla veritabanı satırları asla silinmez.", + "onlyAssetsTouched": "Sadece varlık dosyaları değişir — FurnitureData.json ve veritabanı satırları aynen kalır.", + "emptyHint": "Sahte ve hasarlı nitro paketlerini ve yetim SWF'leri ve simgeleri bulmak için her mobilya varlık dizinini tarayın. Silin, hasarlıları yeniden indirin veya eski kalıntıları otomatik temizleyin.", + "noResult": "Henüz tarama sonucu yok — önce bir mobilya varlık taraması çalıştırın.", + "scanFailed": "Tarama başarısız oldu.", + "confirmDeleteTitle": "{count} varlık dosyası silinsin mi?", + "confirmDeleteDescription": "Dosyalar her dizinden kaldırılacak (public + yansıtılmış gamedata). Veritabanı satırları asla değişmez.", + "confirmDeleteLabel": "Sil", + "confirmRepairTitle": "{count} hasarlı .nitro paketi yeniden indirilsin mi?", + "confirmRepairDescription": "Paketler yapılandırılmış nitro kaynaklarından yeniden alınacak ve her dizinin üzerine yazılacak (public + yansıtılmış gamedata).", + "confirmRepairLabel": "Yeniden indir", + "confirmAutoCleanTitle": "{days} günden eski sahte nitro'lar otomatik temizlensin mi?", + "confirmAutoCleanDescription": "Sadece eşik değerinden eski sahte .nitro dosyaları (eşleşen öğe yok) kaldırılır. Hasarlı paketler ve son dosyalar asla değişmez.", + "confirmAutoCleanLabel": "Otomatik temizle", + "toastDeletePartial": "{copies} kopya silindi ancak bazı dosyalar kaldırılamadı", + "toastDeleteDone": "{copies} dosya kopyası silindi ({deleted} dosya)", + "toastRepairDone": "{count} .nitro paketi onarıldı", + "toastRepairFailed": "Hiçbir paket temin edilemedi ({failed} başarısız)", + "toastRepairCancelled": "Onarım iptal edildi", + "toastAutoCleanDone": "{deleted} eski sahte .nitro dosyası temizlendi ({copies} kopya). {recent} sıradan + {broken} hasarlı atlandı.", + "toastAutoCleanNothing": "Kaldıracak kadar eski bir şey yok ({recent} sıradan, {broken} hasarlı atlandı)", + "toastManifestDownload": "Tarama listesi indirildi", + "gamedataTitle": "Oyun verilerini temizle", + "gamedataHint": "Önce önizleme: Bu, FurnitureData.json, FigureMap.json ve FigureData.json dosyalarının üzerine yazar. Yukarıdaki varlık araçlarının aksine, hiçbir şeye başvurmayan satırları kaldırır — çalıştırmadan önce sayıları inceleyin.", + "gamedataScan": "Oyun verilerini önizle", + "gamedataScanning": "Taranıyor…", + "gamedataRun": "Seçilenleri çalıştır", + "gamedataRunning": "Temizleniyor…", + "gamedataNoResult": "Henüz önizleme yok — önce oyun verileri JSON dosyalarını tarayın.", + "gamedataCount_duplicates": "FurnitureData yinelenenleri", + "gamedataCount_orphans": "FurnitureData yetimleri", + "gamedataCount_figureMap": "FigureMap sorunları", + "gamedataCount_figureData": "Kullanılmayan FigureData", + "gamedataPass_dedupeFurnitureData": "FurnitureData yinelenenlerini kaldır", + "gamedataPassDesc_dedupeFurnitureData": "Bir bölüm içinde tekrarlanan classnames'leri kaldırır ve en yüksek revizyona sahip girişi korur.", + "gamedataPass_cleanFurnitureData": "FurnitureData'yı temizle", + "gamedataPassDesc_cleanFurnitureData": ".nitro paketinin hiçbir dizinde bulunmayan girişleri kaldırır.", + "gamedataPass_cleanFigureMap": "FigureMap'i temizle", + "gamedataPassDesc_cleanFigureMap": "FigureData'da eksik olan bir küme işaret eden parçaları ve tam yinelenenleri kaldırır.", + "gamedataPass_cleanFigureData": "FigureData'yı temizle", + "gamedataPassDesc_cleanFigureData": "Hiçbir FigureMap parçasının başvurmadığı kümeleri, ardından hiçbir küme türünün kullanmadığı paletleri kaldırır. FigureMap'i temizle işleminden sonra çalıştırılmalıdır.", + "gamedataNothingSelected": "En az bir temizleme adımı seçin", + "gamedataConfirmTitle": "Oyun verileri JSON dosyaları üzerine yazılsın mı?", + "gamedataConfirmDescription": "{passes} adım, {duplicates} yinelenen grup, {orphans} yetim satır, {figureMap} FigureMap sorunu ve {figureData} kullanılmayan FigureData girişine karşı çalışacak. Satırlar yedek kopya olmadan kaldırılır — bu geri alınamaz.", + "gamedataConfirmLabel": "Dosyaları üzerine yaz", + "gamedataDifferingWarning": "En az bir yinelenen, korunan girişin tam bir kopyası değil, bu yüzden silinen satır, hayatta kalanın sahip olmadığı verileri barındırıyordu.", + "gamedataCrossSectionNote": "{count} classname(ler) hem roomitemtypes hem de wallitemtypes içinde var. Bunlar sadece rapor edilir — birini kaldırmak bir öğenin türünü değiştirir.", + "gamedataToastDone": "Oyun verileri temizliği {removed} satır kaldırdı", + "gamedataToastNothing": "Oyun verileri zaten temizdi", + "gamedataMaxRemovalsLabel": "Adım başına maks. satır", + "gamedataMaxRemovalsHint": "0, varsayılan 500'ü kullanır. Daha fazlasını kaldıracak bir adım, yazmak yerine durur ve sorar.", + "gamedataLimitTitle": "{pass}, {maxRemovals} sınırının üzerinde {wouldRemove} satır kaldırırdı.", + "gamedataLimitDescription": "Bu adım hiçbir şey yazmadı, bu yüzden dosyalar değişmedi. Önce varlık yollarını kontrol edin — yanlış bir dizin her satırı yetim gibi gösterir. Sınırı yükseltmek ayrı, bilinçli bir çalıştırmadır.", + "gamedataLimitOverride": "Yine de {wouldRemove} satır kaldır", + "historyTitle": "Otomatik temizlik geçmişi", + "historyScheduled": "planlandı", + "historyManual": "manuel", + "historyEntry": "{deleted} kaldırıldı ({copies} kopya); {recent} sıradan ve {broken} hasarlı atlandı", + "historyErrors": "{count} hata" + }, "importDiagnostics": { "attempts": "Dosya tanılaması", "preliminary": "Adreslerin ön kontrolü; içerik içe aktarma sırasında doğrulanır.", diff --git a/src/messages/uk.json b/src/messages/uk.json index 0779d7c5..b5cdc958 100644 --- a/src/messages/uk.json +++ b/src/messages/uk.json @@ -817,10 +817,10 @@ "enable": "Увімкніть 2FA", "rateLimit": "Too many attempts. Please wait before trying again." }, - "title": "Підключені облікові записи", - "subtitle": "Зв’яжіть обліковий запис у соціальній мережі, щоб увійти одним клацанням миші", - "connected": "Підключено", - "unavailable": "Недоступний", + "title": "Пов'язані акаунти", + "subtitle": "Пов'яжіть соціальний акаунт для входу одним натисканням", + "connected": "Пов'язано", + "unavailable": "Недоступно", "login": { "title": "Увійдіть", "subtitle": "Ласкаво просимо назад — увійдіть, щоб увійти в готель.", @@ -882,7 +882,9 @@ "hidePassword": "Hide", "accountDetails": "Account details", "credentials": "Credentials & security", - "newestCitizens": "Newest citizens" + "newestCitizens": "Newest citizens", + "ageVerified": "Мені 18+ і я погоджуюся з віковими вимогами.", + "invitedBy": "Запросив користувач {username}" }, "forgot": { "title": "Скинути пароль", @@ -1048,7 +1050,9 @@ "cmsErrors": "CMS errors", "themeBuilder": "Theme builder", "openSidebar": "Open menu", - "closeSidebar": "Close menu" + "closeSidebar": "Close menu", + "referrals": "Реферали", + "dailyRewards": "Щоденні нагороди" }, "dashboard": { "title": "Приладова панель", @@ -4336,7 +4340,9 @@ "importAudit": "Audit", "themeBuilder": "Theme Builder", "studio": "Studio", - "cmsErrors": "CMS errors" + "cmsErrors": "CMS errors", + "referrals": "Реферали", + "dailyRewards": "Щоденні нагороди" }, "events": "Events", "eventsSubtitle": "Hotel events and event types", @@ -5843,6 +5849,64 @@ "NoscopescreatedyetAddonebelow": "No scopes created yet. Add one below.", "Rename": "Rename" } + }, + "referrals": { + "title": "Реферали", + "subtitle": "Система запрошень", + "referralsToday": "Реферали сьогодні", + "referralsTotal": "Усього рефералів", + "invitedTotal": "Запрошень нараховано", + "claims": "Отримані нагороди", + "settings": "Налаштування нагороди", + "needed": "Необхідні реферали", + "rewardAmount": "Сума нагороди", + "rewardCurrency": "Валюта нагороди", + "blockSameIp": "Відхиляти реферали з поточною IP запрошуючого", + "save": "Зберегти налаштування", + "saving": "Збереження…", + "saved": "Налаштування рефералів збережено.", + "saveError": "Налаштування рефералів не вдалося зберегти.", + "recent": "Останні реферали", + "unavailable": "Дані про реферали тимчасово недоступні.", + "empty": "Рефералів ще немає.", + "inviter": "Запрошуючий", + "invitee": "Запрошений користувач", + "ip": "IP", + "date": "Дата" + }, + "dailyRewards": { + "title": "Щоденні нагороди за вхід", + "subtitle": "Розклад щоденних нагород за вхід", + "enabled": "Статус функції", + "yes": "Увімкнено", + "no": "Вимкнено", + "scheduleDays": "Дні розкладу", + "claimsToday": "Отримань сьогодні", + "claimsTotal": "Усього отримань", + "status": "Статус функції", + "statusHint": "При вимкненні карта нагороди ховається, а нові отримання відхиляються.", + "disable": "Вимкнути", + "enable": "Увімкнути", + "schedule": "Розклад нагород", + "day": "День {day}", + "reward": "Нагорода", + "amount": "Сума", + "actions": "Дії", + "addDay": "День", + "add": "Додати день", + "save": "Зберегти", + "saving": "Збереження…", + "saved": "Розклад нагород збережено.", + "cancel": "Скасувати", + "edit": "Редагувати", + "delete": "Видалити", + "created": "День нагороди додано.", + "updated": "День нагороди оновлено.", + "deleted": "День нагороди видалено.", + "saveError": "День нагороди не вдалося зберегти.", + "deleteError": "День нагороди не вдалося видалити.", + "confirmDeleteTitle": "Видалити день нагороди", + "confirmDeleteBody": "Цей день нагороди більше не видаватиметься. Минулі отримання залишаються записаними." } }, "error": { @@ -6223,8 +6287,27 @@ "empty": "You're all caught up. No actions waiting.", "unavailable": "Some actions could not be checked. Available actions are shown above.", "retry": "Try again", - "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again." - } + "rewardUnavailable": "Referral progress is temporarily unavailable. Please try again.", + "dailyReward": "Ваша щоденна нагорода готова до отримання" + }, + "dailyClaimed": "Щоденну нагороду отримано — до завтра!", + "dailyErrors": { + "already_claimed": "Ви вже отримали сьогоднішню щоденну нагороду.", + "disabled": "Щоденні нагороди зараз вимкнені.", + "bad_config": "Розклад щоденних нагород налаштовано неправильно. Зверніться до персоналу.", + "ratelimit": "Забагато спроб. Зачекайте трохи та спробуйте знову.", + "error": "Щоденну нагороду не вдалося отримати. Спробуйте ще раз." + }, + "dailyRewardTitle": "Щоденні нагороди", + "dailyRewardHint": "Входьте щодня та отримуйте нагороду — серії ростуть до великих днів.", + "dailyRewardDay": "День {day}", + "dailyRewardStreak": "{count, plural, one {Серія: # день} few {Серія: # дня} many {Серія: # днів} other {Серія: # дня}}", + "dailyRewardNextClaim": "Наступне отримання: {amount} {currency}", + "dailyRewardTomorrow": "Завтра: {amount} {currency}", + "dailyRewardClaim": "Отримати щоденну нагороду", + "dailyRewardClaimedToday": "Отримано сьогодні — повертайтеся завтра за наступною нагородою.", + "dailyRewardDisabled": "Щоденні нагороди зараз вимкнені. Ви можете дослідити готель.", + "dailyRewardUnavailable": "Розклад щоденних нагород не вдалося завантажити. Спробуйте ще раз." }, "housekeeping": { "preview": { @@ -6502,6 +6585,110 @@ }, "admin": { "studio": { + "nitroCleanup": { + "alreadyRunning": "Сканування вже виконується — підключено до нього.", + "ageUnknown": "вік невідомий", + "ageBelow": "< 1д", + "scanButton": "Сканувати ресурси меблів", + "scanningAssets": "Сканування ресурсів…", + "cancelButton": "Скасувати", + "deleteSelected": "Видалити вибрані ({count})", + "deleting": "Видалення…", + "redownloadBroken": "Завантажити пошкоджені заново", + "redownloading": "Повне завантаження…", + "autoClean": "Автоматично чистити старі підробки", + "cleaning": "Очищення…", + "exportManifest": "Експортувати манIFEST", + "exporting": "Експорт…", + "phaseStems": "Завантаження стеблів меблів…", + "phaseReaddir": "Читання каталогів ресурсів…", + "phaseValidate": "Перевірка пакетів .nitro…", + "phaseScanning": "Сканування…", + "scanProgressFiles": "{count} файлів", + "repairProgress": "ok {ok}, не вдалося {failed}", + "attachedNotice": "Сканування продовжується у фоні — результати з'являться після завершення.", + "sessionCancelled": "Сканування скасовано.", + "onlyOldLabel": "Показувати лише файли старіші за", + "onlyOldAgeLabel": "Мінімальний вік у днях для показу", + "onlyOldToggle": "Сховати нещодавні файли", + "daysLabel": "днів", + "autoAgeLabel": "Мінімальний вік у днях для автоочищення", + "loadingResult": "Завантаження результату сканування…", + "scannedStat": "файлів ресурсів проскановано", + "cachedNotice": "(у кеші — каталоги не змінилися)", + "fakeStat": "Підробки nitro (немає відповідного елемента)", + "brokenStat": "Пошкоджені nitro (нечитабельні)", + "groupEmpty": "Нічого не знайдено", + "selectedCount": "вибрано {count}", + "copiesBadge": "{count} копій", + "groupFakeLabel": "Підробки nitro", + "groupFakeDescription": "Ці файли не відповідають жодному елементу в items_base — залишки видалених або перейменованих меблів.", + "groupBrokenLabel": "Пошкоджені nitro", + "groupBrokenDescription": "Ці файли належать елементу, але не можуть бути прочитані як допустимий пакет Nitro.", + "groupSwfLabel": "Сироти SWF", + "groupSwfDescription": "Файли .swf, які не відповідають жодному елементу в items_base.", + "groupIconLabel": "Сироти іконки", + "groupIconDescription": "Файли іконок, які не відповідають жодному елементу в items_base.", + "warningText": "Видалення пошкодженого .nitro залишає елемент у базі без пакета — краще завантажте його заново або дозвольте аудиту каталогу отримати його пізніше. Рядки бази ніколи не видаляються цим інструментом.", + "onlyAssetsTouched": "Змінюються лише файли ресурсів — FurnitureData.json та рядки бази залишаються недоторканими.", + "emptyHint": "Проскануйте кожен каталог ресурсів меблів, щоб знайти підробки та пошкоджені пакети nitro, а також сиріт SWF та іконки. Видаліть їх, завантажте пошкоджені заново або автоматично очистіть старі залишки.", + "noResult": "Ще немає результату сканування — спочатку запустіть сканування ресурсів меблів.", + "scanFailed": "Сканування не вдалося.", + "confirmDeleteTitle": "Видалити {count} файл(ів) ресурсів?", + "confirmDeleteDescription": "Файли буде видалено з кожного каталогу (public + дзеркальні gamedata). Рядки бази ніколи не змінюються.", + "confirmDeleteLabel": "Видалити", + "confirmRepairTitle": "Завантажити заново {count} пошкоджений(их) пакет(ів) .nitro?", + "confirmRepairDescription": "Пакети будуть отримані заново з налаштованих джерел nitro та записані поверх кожного каталогу (public + дзеркальні gamedata).", + "confirmRepairLabel": "Завантажити заново", + "confirmAutoCleanTitle": "Автоматично очистити підробки nitro старіші за {days} днів?", + "confirmAutoCleanDescription": "Видаляються лише підробки файлів .nitro (немає відповідного елемента) старіші за поріг. Пошкоджені пакети та нещодавні файли ніколи не змінюються.", + "confirmAutoCleanLabel": "Автоочищення", + "toastDeletePartial": "Видалено {copies} копій, але деякі файли не вдалося видалити", + "toastDeleteDone": "Видалено {copies} копій файлів ({deleted} файлів)", + "toastRepairDone": "Відновлено {count} пакетів .nitro", + "toastRepairFailed": "Не вдалося отримати жодного пакета ({failed} не вдалося)", + "toastRepairCancelled": "Відновлення скасовано", + "toastAutoCleanDone": "Очищено {deleted} старих підробок файлів .nitro ({copies} копій). Пропущено {recent} нещодавніх + {broken} пошкоджених.", + "toastAutoCleanNothing": "Немає достатньо старого для видалення (пропущено {recent} нещодавніх, {broken} пошкоджених)", + "toastManifestDownload": "МанIFEST сканування завантажено", + "gamedataTitle": "Очищення ігрових даних", + "gamedataHint": "Спочатку перегляд: це переписує FurnitureData.json, FigureMap.json та FigureData.json. На відміну від інструментів ресурсів вище, видаляє рядки, які ні на що не посилаються — перевірте кількість перед запуском.", + "gamedataScan": "Перегляд ігрових даних", + "gamedataScanning": "Сканування…", + "gamedataRun": "Запустити вибране", + "gamedataRunning": "Очищення…", + "gamedataNoResult": "Ще немає перегляду — спочатку проскануйте файли JSON ігрових даних.", + "gamedataCount_duplicates": "Дублікати FurnitureData", + "gamedataCount_orphans": "Сироти FurnitureData", + "gamedataCount_figureMap": "Проблеми FigureMap", + "gamedataCount_figureData": "Невикористаний FigureData", + "gamedataPass_dedupeFurnitureData": "Дедуплікація FurnitureData", + "gamedataPassDesc_dedupeFurnitureData": "Видаляє повторювані classnames всередині одного розділу, зберігаючи запис із найвищою ревізією.", + "gamedataPass_cleanFurnitureData": "Очистити FurnitureData", + "gamedataPassDesc_cleanFurnitureData": "Видаляє записи, у яких пакет .nitro відсутній у кожному каталозі.", + "gamedataPass_cleanFigureMap": "Очистити FigureMap", + "gamedataPassDesc_cleanFigureMap": "Видаляє частини, що вказують на відсутній набір у FigureData, а також точні дублікати.", + "gamedataPass_cleanFigureData": "Очистити FigureData", + "gamedataPassDesc_cleanFigureData": "Видаляє набори, на які не посилається жодна частина FigureMap, потім палітри, які не використовує жодин тип набору. Має запускатися після Очистити FigureMap.", + "gamedataNothingSelected": "Виберіть хоча б один крок очищення", + "gamedataConfirmTitle": "Перезаписати файли JSON ігрових даних?", + "gamedataConfirmDescription": "{passes} крок(ів) будуть запущені проти {duplicates} дубльованих груп, {orphans} сирітських рядків, {figureMap} проблем FigureMap та {figureData} невикористаних записів FigureData. Рядки видаляються без резервної копії — це неможливо скасувати.", + "gamedataConfirmLabel": "Перезаписати файли", + "gamedataDifferingWarning": "Принаймні один дублікат не є точною копією збереженого запису, тому видалений рядок містяв дані, яких немає у вижившого.", + "gamedataCrossSectionNote": "{count} classname(ів) існують як у roomitemtypes, так і в wallitemtypes. Вони лише повідомляються — видалення одного змінить тип елемента.", + "gamedataToastDone": "Очищення ігрових даних видалило {removed} рядків", + "gamedataToastNothing": "Ігрові дані вже були чистими", + "gamedataMaxRemovalsLabel": "Макс. рядків на крок", + "gamedataMaxRemovalsHint": "0 використовує значення за замовчуванням 500. Крок, який видалив би більше, зупиняється та питає замість запису.", + "gamedataLimitTitle": "{pass} видалив би {wouldRemove} рядків, вище ліміту {maxRemovals}.", + "gamedataLimitDescription": "Цей крок нічого не записав, тому файли не змінені. Спочатку перевірте шляхи до ресурсів — неправильний каталог робить кожен рядок сирітським. Підвищення ліміту — окремий, навмисний запуск.", + "gamedataLimitOverride": "Все одно видалити {wouldRemove} рядків", + "historyTitle": "Історія автоочищення", + "historyScheduled": "за розкладом", + "historyManual": "вручну", + "historyEntry": "Видалено {deleted} ({copies} копій); пропущено {recent} нещодавніх і {broken} пошкоджених", + "historyErrors": "{count} помилок" + }, "importDiagnostics": { "attempts": "Діагностика файлів", "preliminary": "Попередня перевірка адрес; вміст перевіряється під час імпорту.",