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": "Попередня перевірка адрес; вміст перевіряється під час імпорту.",