mirror of
https://github.com/alexankitty/Myrient-Search-Engine.git
synced 2026-01-15 16:33:15 -03:00
- i18n localization
- Add PSP support on web emu - properly doing CORS (blame PPSSPP) - added contributors image on about - proxying emulatorjs to avoid internet blocking - initial seeds for multithreading on webemu - added new searchalikes - Added new error page
This commit is contained in:
37
config/i18n.js
Normal file
37
config/i18n.js
Normal file
@@ -0,0 +1,37 @@
|
||||
import i18n from 'i18n';
|
||||
import path from 'path';
|
||||
import { fileURLToPath } from 'url';
|
||||
import fs from 'fs';
|
||||
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
||||
const localesDir = path.join(__dirname, 'locales');
|
||||
|
||||
// Automatically detect available languages from locale files
|
||||
const getAvailableLocales = () => {
|
||||
try {
|
||||
return fs.readdirSync(localesDir)
|
||||
.filter(file => file.endsWith('.json'))
|
||||
.map(file => path.basename(file, '.json'));
|
||||
} catch (error) {
|
||||
console.error('Error reading locale directory:', error);
|
||||
return ['en']; // Fallback to English
|
||||
}
|
||||
};
|
||||
|
||||
const availableLocales = getAvailableLocales();
|
||||
console.log('Available locales:', availableLocales);
|
||||
|
||||
i18n.configure({
|
||||
locales: availableLocales,
|
||||
defaultLocale: 'en',
|
||||
directory: localesDir,
|
||||
objectNotation: true,
|
||||
updateFiles: false,
|
||||
syncFiles: false,
|
||||
cookie: 'lang',
|
||||
queryParameter: 'lang'
|
||||
});
|
||||
|
||||
// Export available locales for use in templates
|
||||
export const locales = availableLocales;
|
||||
export default i18n;
|
||||
149
config/locales/ar.json
Normal file
149
config/locales/ar.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "محرك بحث لـ Myrient - خدمة مقدمة من Erista مخصصة للحفاظ على ألعاب الفيديو.",
|
||||
"tagline": "يقدم Myrient مجموعات منظمة ومتاحة للجميع من ألعاب الفيديو، للحفاظ عليها من الضياع مع مرور الزمن.",
|
||||
"disclaimer": "غير مرتبط بـ Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "الإعدادات",
|
||||
"emulators": "المحاكيات",
|
||||
"about": "حول الموقع",
|
||||
"search": "بحث",
|
||||
"results": "النتائج"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "ابحث...",
|
||||
"button": "بحث",
|
||||
"lucky": "أشعر بالحظ",
|
||||
"found": "تم العثور على نتيجة {{count}}",
|
||||
"found_plural": "تم العثور على {{count}} نتيجة",
|
||||
"in_seconds": "في {{seconds}} ثانية",
|
||||
"indexing": "جارٍ الفهرسة، إذا كان هناك شيء مفقود في القائمة، يرجى المحاولة مرة أخرى بعد بضع دقائق",
|
||||
"non_game_filter": "تم تفعيل فلتر المحتوى غير اللعبي",
|
||||
"displaying_results": "عرض النتائج من {{start}} إلى {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "حول الموقع",
|
||||
"support": "إذا أعجبك هذا المشروع، يرجى التفكير في دعم Myrient:",
|
||||
"donate": "تبرع لـ Myrient",
|
||||
"emulator": {
|
||||
"title": "محاكي مدمج",
|
||||
"description": "يتضمن هذا الموقع محاكياً مدمجاً مشغلاً بواسطة EmulatorJS يجلب الألعاب التقليدية مباشرةً إلى متصفحك.",
|
||||
"compatibility": "الألعاب المتوافقة ستظهر بها زر تشغيل في صفحة نتائج البحث.",
|
||||
"browser_tip": "للحصول على أفضل تجربة ألعاب، استخدم متصفحاً يعتمد على Chromium مع تفعيل تسريع الأجهزة.",
|
||||
"save_states": "يتم تحميل الألعاب مباشرة من أرشيف Myrient العام. يتم تخزين حالات الحفظ محلياً في المتصفح.",
|
||||
"limitations": "تعديلات الـ ROM، والموسيقى التصويرية، والمحتويات الأخرى غير اللعبية غير مدعومة من المحاكي وقد تفشل في التحميل.",
|
||||
"disabled": "تم تعطيل وظيفة المحاكي على الويب من قبل المسؤول.",
|
||||
"contact": "تواصل مع المسؤول أو قم بإنشاء نسختك الخاصة من Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "تم إنشاء محرك البحث بواسطة",
|
||||
"view_github": "عرض المشروع على GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "الإعدادات",
|
||||
"search_columns": {
|
||||
"title": "أعمدة البحث",
|
||||
"tooltip": "يحدد الأعمدة التي سيبحث فيها محرك البحث."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "مضاعف نقاط البحث",
|
||||
"tooltip": "يضاعف نقاط التطابق لكل كلمة تم العثور عليها بناءً على الفئة التي وجدت فيها."
|
||||
},
|
||||
"extras": {
|
||||
"title": "خيارات إضافية",
|
||||
"fuzzy": {
|
||||
"label": "البحث الضبابي",
|
||||
"tooltip": "قيمة بين 0.00 و 1.00 تحدد المسافة الضبابية (مسافة ليفنشتاين) لمدى قرب الكلمة لاعتبارها متطابقة. القيمة الأعلى تسمح بتطابقات أقل صرامة. قيمة 0 تعطلها."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "السماح بالبادئات",
|
||||
"tooltip": "يسمح بتطابقات جزئية للكلمات في بداية الكلمة."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "تطابق جميع الكلمات",
|
||||
"tooltip": "يتطلب تطابق جميع الكلمات في استعلام البحث."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "إخفاء المحتوى غير اللعبي",
|
||||
"tooltip": "يفلتر تعديلات الـ ROM، والتصحيحات، والرسومات، والمحتويات الأخرى غير اللعبية من نتائج البحث."
|
||||
}
|
||||
},
|
||||
"save": "حفظ الإعدادات"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "عدد الاستعلامات:",
|
||||
"files": "الملفات المعروفة:",
|
||||
"terms": "عدد المصطلحات:",
|
||||
"last_crawl": "وقت آخر زحف:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "جارٍ تحميل الـ ROM...",
|
||||
"downloading": "جارٍ تنزيل الـ ROM",
|
||||
"downloading_progress": "التنزيل: {{percent}}%",
|
||||
"decompressing": "جارٍ فك ضغط اللعبة..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "خطأ في تحميل اللعبة",
|
||||
"no_rom": "لم يتم العثور على ملف ROM في الأرشيف",
|
||||
"http_error": "خطأ HTTP! الحالة: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "تحذير: قد لا يكون هذا الملف ROM لعبة وقد لا يعمل بشكل صحيح في المحاكي عبر الويب.",
|
||||
"see_about": "راجع صفحة {{link}} لمزيد من المعلومات.",
|
||||
"no_data": "لا توجد بيانات محاكي متاحة.",
|
||||
"https": "اتصال HTTP غير آمن: تتطلب بعض المحاكيات HTTPS للعمل بشكل صحيح. هذا الموقع غير مُعد بشكل صحيح."
|
||||
},
|
||||
"console": {
|
||||
"about": "هذا محاكي عبر الإنترنت يقوم بتشغيل ملفات ROM للألعاب مباشرة من أرشيف Myrient العام.",
|
||||
"disclaimer": "لا توجد ملفات ROM للألعاب مستضافة على هذا الموقع. يتم تحميل جميع المحتويات مباشرة من خوادم Myrient.",
|
||||
"more_info": "لمزيد من المعلومات حول هذه الخدمة، يرجى زيارة صفحة حول الموقع."
|
||||
},
|
||||
"recommended": "المحاكيات الموصى بها",
|
||||
"download": "تنزيل",
|
||||
"play": "تشغيل",
|
||||
"not_available": "----",
|
||||
"disclaimer": "يقوم هذا المحاكي بتحميل الألعاب مباشرة من {{link}}. تعرف على المزيد في صفحة {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "الاسم",
|
||||
"group": "المجموعة",
|
||||
"category": "الفئة",
|
||||
"region": "المنطقة",
|
||||
"type": "النوع",
|
||||
"size": "الحجم",
|
||||
"date": "التاريخ",
|
||||
"score": "الصلة",
|
||||
"play": "تشغيل"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "خطأ",
|
||||
"message": "حدث خطأ ما",
|
||||
"details": "تفاصيل الخطأ: {{message}}",
|
||||
"back_home": "العودة إلى الصفحة الرئيسية",
|
||||
"go_back": "رجوع"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/bn.json
Normal file
149
config/locales/bn.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrient-এর জন্য একটি সার্চ ইঞ্জিন - Erista দ্বারা পরিচালিত ভিডিও গেম সংরক্ষণের উদ্দেশ্যে নিবেদিত একটি সেবা।",
|
||||
"tagline": "Myrient সুসংগঠিত এবং জনসাধারণের জন্য উপলব্ধ ভিডিও গেম সংগ্রহ প্রদান করে, যাতে সেগুলি সময়ের সাথে হারিয়ে না যায়।",
|
||||
"disclaimer": "Myrient/Erista-এর সাথে সম্পর্কিত নয়!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "সেটিংস",
|
||||
"emulators": "এমুলেটরস",
|
||||
"about": "সম্পর্কে",
|
||||
"search": "অনুসন্ধান",
|
||||
"results": "ফলাফল"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "অনুসন্ধান করুন...",
|
||||
"button": "অনুসন্ধান",
|
||||
"lucky": "আমি ভাগ্যবান",
|
||||
"found": "{{count}}টি ফলাফল পাওয়া গেছে",
|
||||
"found_plural": "{{count}}টি ফলাফল পাওয়া গেছে",
|
||||
"in_seconds": "{{seconds}} সেকেন্ডে",
|
||||
"indexing": "ইনডেক্সিং চলছে, তালিকায় কিছু অনুপস্থিত থাকলে কয়েক মিনিট পরে আবার চেষ্টা করুন",
|
||||
"non_game_filter": "নন-গেম কন্টেন্ট ফিল্টার সক্রিয় আছে",
|
||||
"displaying_results": "{{start}} থেকে {{end}} পর্যন্ত ফলাফল দেখানো হচ্ছে।"
|
||||
},
|
||||
"about": {
|
||||
"title": "সম্পর্কে",
|
||||
"support": "আপনি যদি এই প্রকল্পটি পছন্দ করেন, তাহলে অনুগ্রহ করে Myrient-কে সমর্থন করার কথা বিবেচনা করুন:",
|
||||
"donate": "Myrient-কে দান করুন",
|
||||
"emulator": {
|
||||
"title": "অন্তর্নির্মিত এমুলেটর",
|
||||
"description": "এই ওয়েবসাইটে EmulatorJS দ্বারা পরিচালিত একটি অন্তর্নির্মিত এমুলেটর রয়েছে যা রেট্রো গেমিং সরাসরি আপনার ব্রাউজারে আনে।",
|
||||
"compatibility": "সামঞ্জস্যপূর্ণ গেমগুলিতে তাদের অনুসন্ধান ফলাফল পৃষ্ঠায় একটি প্লে বাটন থাকবে।",
|
||||
"browser_tip": "সেরা গেমিং অভিজ্ঞতার জন্য, হার্ডওয়্যার অ্যাক্সিলারেশন চালু করে Chromium-ভিত্তিক ব্রাউজার ব্যবহার করুন।",
|
||||
"save_states": "গেমগুলি সরাসরি Myrient-এর পাবলিক আর্কাইভ থেকে লোড করা হয়। সেভ স্টেটগুলি স্থানীয়ভাবে ব্রাউজারে সংরক্ষিত থাকে।",
|
||||
"limitations": "ROM হ্যাকস, সাউন্ডট্র্যাক এবং অন্যান্য নন-গেম কন্টেন্ট এমুলেটর দ্বারা সমর্থিত নয় এবং লোড হতে ব্যর্থ হতে পারে।",
|
||||
"disabled": "ওয়েব এমুলেটর কার্যকারিতা অ্যাডমিনিস্ট্রেটর দ্বারা নিষ্ক্রিয় করা হয়েছে।",
|
||||
"contact": "অ্যাডমিনিস্ট্রেটরের সাথে যোগাযোগ করুন অথবা আপনার নিজের Myrient Search ইনস্ট্যান্স সেট আপ করুন।"
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "সার্চ ইঞ্জিন তৈরি করেছেন",
|
||||
"view_github": "GitHub-এ প্রকল্প দেখুন"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "সেটিংস",
|
||||
"search_columns": {
|
||||
"title": "অনুসন্ধান কলাম",
|
||||
"tooltip": "সার্চ ইঞ্জিন কোন কলামগুলিতে অনুসন্ধান করবে তা নির্বাচন করে।"
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "অনুসন্ধান স্কোর মাল্টিপ্লায়ার",
|
||||
"tooltip": "প্রতিটি শব্দের মিল স্কোর গুণ করে যেই বিভাগে তা পাওয়া গেছে তার উপর ভিত্তি করে।"
|
||||
},
|
||||
"extras": {
|
||||
"title": "অতিরিক্ত",
|
||||
"fuzzy": {
|
||||
"label": "ফাজি মান",
|
||||
"tooltip": "0.00 এবং 1.00 এর মধ্যে একটি মান যা নির্ধারণ করে কতটা কাছাকাছি একটি শব্দকে মিল হিসেবে বিবেচনা করা হবে (লেভেনশটেইন দূরত্ব)। উচ্চতর মান কম কঠোর মিলের অনুমতি দেয়। 0 মান এটি নিষ্ক্রিয় করে।"
|
||||
},
|
||||
"prefix": {
|
||||
"label": "প্রিফিক্স অনুমতি দিন",
|
||||
"tooltip": "শব্দের শুরুতে আংশিক মিলের অনুমতি দেয়।"
|
||||
},
|
||||
"match_all": {
|
||||
"label": "সব শব্দ মিলান",
|
||||
"tooltip": "অনুসন্ধান কোয়েরিতে সমস্ত শব্দের মিল প্রয়োজন।"
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "নন-গেম কন্টেন্ট লুকান",
|
||||
"tooltip": "ROM হ্যাকস, প্যাচ, আর্টওয়ার্ক এবং অন্যান্য নন-গেম কন্টেন্ট অনুসন্ধান ফলাফল থেকে ফিল্টার করে।"
|
||||
}
|
||||
},
|
||||
"save": "সেটিংস সংরক্ষণ করুন"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "অনুসন্ধান সংখ্যা:",
|
||||
"files": "পরিচিত ফাইল:",
|
||||
"terms": "শব্দ সংখ্যা:",
|
||||
"last_crawl": "সর্বশেষ আপডেটের সময়:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "ROM লোড হচ্ছে...",
|
||||
"downloading": "ROM ডাউনলোড হচ্ছে",
|
||||
"downloading_progress": "ডাউনলোড: {{percent}}%",
|
||||
"decompressing": "গেম ডিকম্প্রেস করা হচ্ছে..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "গেম লোড করতে সমস্যা",
|
||||
"no_rom": "আর্কাইভে কোন ROM ফাইল পাওয়া যায়নি",
|
||||
"http_error": "HTTP ত্রুটি! অবস্থা: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "সতর্কতা: এই ফাইলটি একটি গেম ROM নাও হতে পারে এবং ওয়েব এমুলেটরে সঠিকভাবে কাজ নাও করতে পারে।",
|
||||
"see_about": "আরও তথ্যের জন্য {{link}} পৃষ্ঠা দেখুন।",
|
||||
"no_data": "কোনো এমুলেটর ডাটা উপলব্ধ নেই।",
|
||||
"https": "অনিরাপদ HTTP সংযোগ: কিছু এমুলেটর সঠিকভাবে কাজ করার জন্য HTTPS প্রয়োজন। এই সাইটটি সঠিকভাবে কনফিগার করা হয়নি।"
|
||||
},
|
||||
"console": {
|
||||
"about": "এটি একটি অনলাইন এমুলেটর যা সরাসরি Myrient-এর পাবলিক আর্কাইভ থেকে গেম ROM চালায়।",
|
||||
"disclaimer": "এই ওয়েবসাইটে কোন গেম ROM হোস্ট করা হয় না। সমস্ত কন্টেন্ট সরাসরি Myrient সার্ভার থেকে লোড করা হয়।",
|
||||
"more_info": "এই সেবা সম্পর্কে আরও তথ্যের জন্য, অনুগ্রহ করে সম্পর্কে পৃষ্ঠা দেখুন।"
|
||||
},
|
||||
"recommended": "প্রস্তাবিত এমুলেটরস",
|
||||
"download": "ডাউনলোড",
|
||||
"play": "প্লে",
|
||||
"not_available": "----",
|
||||
"disclaimer": "এই এমুলেটর {{link}} থেকে সরাসরি গেম লোড করে। {{about}} পৃষ্ঠায় আরও জানুন।"
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "নাম",
|
||||
"group": "গ্রুপ",
|
||||
"category": "ক্যাটাগরি",
|
||||
"region": "অঞ্চল",
|
||||
"type": "টাইপ",
|
||||
"size": "সাইজ",
|
||||
"date": "তারিখ",
|
||||
"score": "প্রাসঙ্গিকতা",
|
||||
"play": "প্লে"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "ত্রুটি",
|
||||
"message": "কিছু ভুল হয়েছে",
|
||||
"details": "ত্রুটি বিবরণ: {{message}}",
|
||||
"back_home": "হোম পেজে ফিরে যান",
|
||||
"go_back": "পেছনে যান"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/de.json
Normal file
149
config/locales/de.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Eine Suchmaschine für Myrient - ein von Erista entwickelter Dienst zur Bewahrung von Videospielen.",
|
||||
"tagline": "Myrient bewahrt Videospielsammlungen in einer organisierten und öffentlich zugänglichen Form, damit sie nicht in Vergessenheit geraten.",
|
||||
"disclaimer": "Nicht mit Myrient/Erista verbunden!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Einstellungen",
|
||||
"emulators": "Emulatoren",
|
||||
"about": "Über uns",
|
||||
"search": "Suche",
|
||||
"results": "Ergebnisse"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Suchen...",
|
||||
"button": "Suchen",
|
||||
"lucky": "Ich habe Glück",
|
||||
"found": "{{count}} Ergebnis gefunden",
|
||||
"found_plural": "{{count}} Ergebnisse gefunden",
|
||||
"in_seconds": "in {{seconds}} Sekunden",
|
||||
"indexing": "Indexierung läuft noch. Falls etwas in der Liste fehlt, versuchen Sie es in ein paar Minuten erneut",
|
||||
"non_game_filter": "Filter für Nicht-Spielinhalte ist aktiv",
|
||||
"displaying_results": "Ergebnisse {{start}} bis {{end}} werden angezeigt."
|
||||
},
|
||||
"about": {
|
||||
"title": "Über uns",
|
||||
"support": "Wenn Ihnen dieses Projekt gefällt, könnten Sie Myrient unterstützen:",
|
||||
"donate": "An Myrient spenden",
|
||||
"emulator": {
|
||||
"title": "Integrierter Emulator",
|
||||
"description": "Diese Website enthält einen integrierten Emulator, der mit EmulatorJS betrieben wird und Retro-Spiele direkt in Ihrem Browser spielbar macht.",
|
||||
"compatibility": "Kompatible Spiele haben einen Play-Button auf ihrer Ergebnisseite.",
|
||||
"browser_tip": "Für die beste Spielerfahrung empfehlen wir einen Chromium-basierten Browser mit aktivierter Hardwarebeschleunigung.",
|
||||
"save_states": "Spiele werden direkt aus dem öffentlichen Archiv von Myrient geladen. Spielstände werden lokal in Ihrem Browser gespeichert.",
|
||||
"limitations": "ROM-Hacks, Soundtracks und andere Nicht-Spielinhalte werden vom Emulator nicht unterstützt und lassen sich möglicherweise nicht laden.",
|
||||
"disabled": "Die Webemulator-Funktion wurde vom Administrator deaktiviert.",
|
||||
"contact": "Kontaktieren Sie den Administrator oder starten Sie Ihre eigene Instanz von Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Suchmaschine entwickelt von",
|
||||
"view_github": "Projekt auf GitHub ansehen"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Einstellungen",
|
||||
"search_columns": {
|
||||
"title": "Suchspalten",
|
||||
"tooltip": "Legt fest, in welchen Spalten die Suchmaschine suchen soll."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Relevanz-Multiplikator",
|
||||
"tooltip": "Passt die Gewichtung für Treffer je nach Kategorie an, in der ein Suchwort gefunden wurde."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Erweiterte Einstellungen",
|
||||
"fuzzy": {
|
||||
"label": "Unscharfe Suche",
|
||||
"tooltip": "Wert zwischen 0,00 und 1,00, der bestimmt, wie ähnlich ein Wort sein muss, um als Treffer zu gelten (Levenshtein-Distanz). Höhere Werte erlauben ungenauere Treffer. Der Wert 0 deaktiviert diese Funktion."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Wortanfänge berücksichtigen",
|
||||
"tooltip": "Erlaubt Treffer, wenn nur der Anfang eines Wortes übereinstimmt."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Alle Wörter abgleichen",
|
||||
"tooltip": "Erfordert, dass jedes Wort der Suchanfrage gefunden wird."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Nur Spiele anzeigen",
|
||||
"tooltip": "Blendet ROM-Hacks, Patches, Artworks und andere Inhalte aus, die keine eigentlichen Spiele sind."
|
||||
}
|
||||
},
|
||||
"save": "Einstellungen speichern"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Anzahl der Suchanfragen:",
|
||||
"files": "Bekannte Dateien:",
|
||||
"terms": "Indexierte Begriffe:",
|
||||
"last_crawl": "Letztes Update:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "ROM wird geladen...",
|
||||
"downloading": "ROM wird heruntergeladen",
|
||||
"downloading_progress": "ROM-Download: {{percent}}%",
|
||||
"decompressing": "Spiel wird entpackt..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Fehler beim Laden des Spiels",
|
||||
"no_rom": "Keine ROM-Datei im Archiv gefunden",
|
||||
"http_error": "HTTP-Fehler! Status: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Warnung: Diese Datei ist möglicherweise keine Spiel-ROM und funktioniert möglicherweise nicht richtig im Web-Emulator.",
|
||||
"see_about": "Weitere Informationen finden Sie auf der {{link}}-Seite.",
|
||||
"no_data": "Keine Emulator-Daten verfügbar.",
|
||||
"https": "Unsichere HTTP-Verbindung: Einige Emulatoren benötigen HTTPS, um richtig zu funktionieren. Diese Seite ist nicht korrekt eingerichtet."
|
||||
},
|
||||
"console": {
|
||||
"about": "Dies ist ein Online-Emulator, der Spiele direkt aus dem öffentlichen Archiv von Myrient lädt.",
|
||||
"disclaimer": "Auf dieser Website werden keine Spiele-ROMs gehostet. Alle Inhalte werden direkt von den Myrient-Servern geladen.",
|
||||
"more_info": "Weitere Informationen zu diesem Dienst finden Sie auf der Über uns-Seite."
|
||||
},
|
||||
"recommended": "Empfohlene Emulatoren",
|
||||
"download": "Herunterladen",
|
||||
"play": "Spielen",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Dieser Emulator lädt Spiele direkt von {{link}}. Mehr dazu auf der {{about}}-Seite."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Name",
|
||||
"group": "Gruppe",
|
||||
"category": "Kategorie",
|
||||
"region": "Region",
|
||||
"type": "Typ",
|
||||
"size": "Größe",
|
||||
"date": "Datum",
|
||||
"score": "Relevanz",
|
||||
"play": "Spielen"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Fehler",
|
||||
"message": "Etwas ist schiefgelaufen",
|
||||
"details": "Fehlerdetails: {{message}}",
|
||||
"back_home": "Zurück zur Startseite",
|
||||
"go_back": "Zurück"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/en.json
Normal file
149
config/locales/en.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "A search engine for Myrient - a service by Erista dedicated to video game preservation.",
|
||||
"tagline": "Myrient offers organized and publicly available video game collections, keeping them from becoming lost to time.",
|
||||
"disclaimer": "Not affiliated with Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Settings",
|
||||
"emulators": "Emulators",
|
||||
"about": "About",
|
||||
"search": "Search",
|
||||
"results": "Results"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Search...",
|
||||
"button": "Search",
|
||||
"lucky": "I'm Feeling Lucky",
|
||||
"found": "Found {{count}} result",
|
||||
"found_plural": "Found {{count}} results",
|
||||
"in_seconds": "in {{seconds}} seconds",
|
||||
"indexing": "Indexing in progress, if the list is missing something please try reloading in a few minutes",
|
||||
"non_game_filter": "Non-game content filter is active",
|
||||
"displaying_results": "Displaying results {{start}} through {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "About",
|
||||
"support": "If you like this project, please consider supporting Myrient:",
|
||||
"donate": "Donate to Myrient",
|
||||
"emulator": {
|
||||
"title": "Built-in Emulator",
|
||||
"description": "This website includes a built-in emulator powered by EmulatorJS that brings retro gaming directly to your browser.",
|
||||
"compatibility": "Compatible games will feature a play button on their search result page.",
|
||||
"browser_tip": "For the best gaming experience, use a Chromium-based browser with hardware acceleration turned on.",
|
||||
"save_states": "Games are loaded directly from Myrient's public archive. Save states are stored locally in the browser.",
|
||||
"limitations": "ROM hacks, soundtracks, and other non-game content are not supported by the emulator and may fail to load.",
|
||||
"disabled": "Web Emulator functionality was disabled by the administrator.",
|
||||
"contact": "Contact the administrator or spin up your own instance of Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Search engine created by",
|
||||
"view_github": "View project on GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settings",
|
||||
"search_columns": {
|
||||
"title": "Search Columns",
|
||||
"tooltip": "Selects which columns the search engine will search on."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Search Score Multiplier",
|
||||
"tooltip": "Multiplies the match score for each word found based on the category it's found in."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Extras",
|
||||
"fuzzy": {
|
||||
"label": "Fuzzy Value",
|
||||
"tooltip": "Value between 0.00 and 1.00 that determines the fuzzy distance (Levenshtein distance) for how closely a word needs to be considered a match. A higher value allows for less stringent matches. A value of 0 disables."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Allow Prefixes",
|
||||
"tooltip": "Allows partial matches of words at the start of the word."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Match All Words",
|
||||
"tooltip": "Requires all words in the search query to match."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Hide Non-Game Content",
|
||||
"tooltip": "Filters out ROM hacks, patches, artwork, and other non-game content from search results."
|
||||
}
|
||||
},
|
||||
"save": "Save Settings"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Number of Queries:",
|
||||
"files": "Known Files:",
|
||||
"terms": "Term Count:",
|
||||
"last_crawl": "Time of Last Crawl:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Loading ROM...",
|
||||
"downloading": "Downloading ROM",
|
||||
"downloading_progress": "Downloading ROM: {{percent}}%",
|
||||
"decompressing": "Decompressing the game..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Error loading game",
|
||||
"no_rom": "No ROM file found in archive",
|
||||
"http_error": "HTTP error! status: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Warning: This file may not be a game ROM and might not work properly in the web emulator.",
|
||||
"see_about": "See the {{link}} page for more information.",
|
||||
"no_data": "No emulator data available.",
|
||||
"https": "Insecure HTTP: Some emulators require HTTPS to function properly. This instance isn't properly configured."
|
||||
},
|
||||
"console": {
|
||||
"about": "This is an online emulator running game ROMs directly from Myrient's public archive.",
|
||||
"disclaimer": "No game ROMs are hosted on this website. All content is loaded directly from Myrient servers.",
|
||||
"more_info": "For more information about this service, please visit the About page."
|
||||
},
|
||||
"recommended": "Recommended Emulators",
|
||||
"download": "Download",
|
||||
"play": "Play",
|
||||
"not_available": "----",
|
||||
"disclaimer": "This emulator loads games directly from {{link}}. Learn more on the {{about}} page."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Name",
|
||||
"group": "Group",
|
||||
"category": "Category",
|
||||
"region": "Region",
|
||||
"type": "Type",
|
||||
"size": "Size",
|
||||
"date": "Date",
|
||||
"score": "Search Score",
|
||||
"play": "Play"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Error",
|
||||
"message": "Something went wrong",
|
||||
"details": "Error details: {{message}}",
|
||||
"back_home": "Back to Home",
|
||||
"go_back": "Go Back"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/es.json
Normal file
149
config/locales/es.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Un buscador para Myrient - un servicio de Erista dedicado a la preservación de videojuegos.",
|
||||
"tagline": "Myrient ofrece colecciones de videojuegos organizadas y accesibles para el público, evitando que se pierdan con el paso del tiempo.",
|
||||
"disclaimer": "¡No afiliado con Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Configuración",
|
||||
"emulators": "Emuladores",
|
||||
"about": "Acerca de",
|
||||
"search": "Buscar",
|
||||
"results": "Resultados"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Buscar...",
|
||||
"button": "Buscar",
|
||||
"lucky": "Voy a tener suerte",
|
||||
"found": "{{count}} resultado encontrado",
|
||||
"found_plural": "{{count}} resultados encontrados",
|
||||
"in_seconds": "en {{seconds}} segundos",
|
||||
"indexing": "Indexación en curso, si falta algo en la lista, inténtelo de nuevo en unos minutos",
|
||||
"non_game_filter": "El filtro de contenido que no es juego está activado",
|
||||
"displaying_results": "Mostrando resultados del {{start}} al {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "Acerca de",
|
||||
"support": "Si te gusta este proyecto, considera apoyar a Myrient:",
|
||||
"donate": "Donar a Myrient",
|
||||
"emulator": {
|
||||
"title": "Emulador Integrado",
|
||||
"description": "Esta web incluye un emulador integrado basado en EmulatorJS que te permite jugar a juegos retro directamente en tu navegador.",
|
||||
"compatibility": "Los juegos compatibles mostrarán un botón de jugar en su página de resultados.",
|
||||
"browser_tip": "Para la mejor experiencia de juego, usa un navegador basado en Chromium con la aceleración por hardware activada.",
|
||||
"save_states": "Los juegos se cargan directamente del archivo público de Myrient. Las partidas guardadas se almacenan localmente en tu navegador.",
|
||||
"limitations": "Los hacks de ROM, bandas sonoras y otros contenidos que no son juegos no son compatibles con el emulador y podrían no cargarse.",
|
||||
"disabled": "La función del emulador web ha sido desactivada por el administrador.",
|
||||
"contact": "Contacta con el administrador o lanza tu propia instancia de Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Buscador creado por",
|
||||
"view_github": "Ver proyecto en GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Configuración",
|
||||
"search_columns": {
|
||||
"title": "Columnas de Búsqueda",
|
||||
"tooltip": "Selecciona en qué columnas buscará el motor de búsqueda."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Multiplicador de Puntuación",
|
||||
"tooltip": "Multiplica la puntuación de coincidencia para cada palabra encontrada según la categoría en la que se encuentra."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Extras",
|
||||
"fuzzy": {
|
||||
"label": "Búsqueda aproximada",
|
||||
"tooltip": "Valor entre 0,00 y 1,00 que determina cuán similar debe ser una palabra para considerarse una coincidencia (distancia Levenshtein). Un valor más alto permite coincidencias menos exactas. Un valor de 0 la desactiva."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Permitir Prefijos",
|
||||
"tooltip": "Permite coincidencias parciales al inicio de las palabras."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Coincidir todas las palabras",
|
||||
"tooltip": "Requiere que todas las palabras de la búsqueda tengan coincidencias."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Ocultar contenido que no son juegos",
|
||||
"tooltip": "Filtra hacks de ROM, parches, imágenes y otros contenidos que no son juegos de los resultados de búsqueda."
|
||||
}
|
||||
},
|
||||
"save": "Guardar Configuración"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Número de Consultas:",
|
||||
"files": "Archivos Conocidos:",
|
||||
"terms": "Cantidad de Términos:",
|
||||
"last_crawl": "Última Actualización:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Cargando ROM...",
|
||||
"downloading": "Descargando ROM",
|
||||
"downloading_progress": "Descargando ROM: {{percent}}%",
|
||||
"decompressing": "Descomprimiendo el juego..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Error al cargar el juego",
|
||||
"no_rom": "No se encontró ningún archivo ROM en el archivo",
|
||||
"http_error": "¡Error HTTP! Estado: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Advertencia: Es posible que este archivo no sea una ROM de juego y no funcione correctamente en el emulador web.",
|
||||
"see_about": "Consulte la página {{link}} para obtener más información.",
|
||||
"no_data": "No hay datos de emulador disponibles.",
|
||||
"https": "Conexión insegura: Algunos emuladores necesitan HTTPS para funcionar correctamente. Esta página no está bien configurada."
|
||||
},
|
||||
"console": {
|
||||
"about": "Este es un emulador online que ejecuta juegos directamente desde el archivo público de Myrient.",
|
||||
"disclaimer": "Esta web no aloja ROMs de juegos. Todo el contenido se carga directamente desde los servidores de Myrient.",
|
||||
"more_info": "Para más información sobre este servicio, visita la página Acerca de."
|
||||
},
|
||||
"recommended": "Emuladores Recomendados",
|
||||
"download": "Descargar",
|
||||
"play": "Jugar",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Este emulador carga juegos directamente desde {{link}}. Más información en la página de {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Nombre",
|
||||
"group": "Grupo",
|
||||
"category": "Categoría",
|
||||
"region": "Región",
|
||||
"type": "Tipo",
|
||||
"size": "Tamaño",
|
||||
"date": "Fecha",
|
||||
"score": "Relevancia",
|
||||
"play": "Jugar"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Error",
|
||||
"message": "Algo ha salido mal",
|
||||
"details": "Detalles del error: {{message}}",
|
||||
"back_home": "Volver al Inicio",
|
||||
"go_back": "Volver atrás"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/fr.json
Normal file
149
config/locales/fr.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Un moteur de recherche pour Myrient - un service d'Erista dédié à la préservation des jeux vidéo.",
|
||||
"tagline": "Myrient propose des collections de jeux vidéo organisées et accessibles au public, les sauvegardant de l'oubli.",
|
||||
"disclaimer": "Sans lien avec Myrient/Erista !"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Paramètres",
|
||||
"emulators": "Émulateurs",
|
||||
"about": "À propos",
|
||||
"search": "Recherche",
|
||||
"results": "Résultats"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Rechercher...",
|
||||
"button": "Rechercher",
|
||||
"lucky": "J'ai de la chance",
|
||||
"found": "{{count}} résultat trouvé",
|
||||
"found_plural": "{{count}} résultats trouvés",
|
||||
"in_seconds": "en {{seconds}} secondes",
|
||||
"indexing": "Indexation en cours, si quelque chose manque dans la liste, réessayez dans quelques minutes",
|
||||
"non_game_filter": "Le filtre de contenu non-jeu est activé",
|
||||
"displaying_results": "Résultats {{start}} à {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "À propos",
|
||||
"support": "Si vous appréciez ce projet, n'hésitez pas à soutenir Myrient :",
|
||||
"donate": "Faire un don à Myrient",
|
||||
"emulator": {
|
||||
"title": "Émulateur intégré",
|
||||
"description": "Ce site intègre un émulateur propulsé par EmulatorJS qui vous permet de jouer à des jeux rétro directement dans votre navigateur.",
|
||||
"compatibility": "Les jeux compatibles disposent d'un bouton de lecture sur leur page de résultats.",
|
||||
"browser_tip": "Pour une expérience optimale, utilisez un navigateur basé sur Chromium avec l'accélération matérielle activée.",
|
||||
"save_states": "Les jeux sont chargés directement depuis l'archive publique de Myrient. Les sauvegardes sont stockées localement dans votre navigateur.",
|
||||
"limitations": "Les ROM hackées, les bandes sonores et autres contenus non-jeu ne sont pas pris en charge par l'émulateur et risquent de ne pas se charger.",
|
||||
"disabled": "La fonctionnalité d'émulation web a été désactivée par l'administrateur.",
|
||||
"contact": "Contactez l'administrateur ou lancez votre propre instance de Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Moteur de recherche créé par",
|
||||
"view_github": "Voir le projet sur GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Paramètres",
|
||||
"search_columns": {
|
||||
"title": "Colonnes de recherche",
|
||||
"tooltip": "Définit les colonnes dans lesquelles le moteur de recherche effectuera ses recherches."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Multiplicateur de score",
|
||||
"tooltip": "Multiplie le score de correspondance pour chaque mot trouvé selon la catégorie dans laquelle il se trouve."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Options avancées",
|
||||
"fuzzy": {
|
||||
"label": "Recherche approximative",
|
||||
"tooltip": "Valeur entre 0,00 et 1,00 qui détermine la distance de Levenshtein pour qu'un mot soit considéré comme une correspondance. Une valeur plus élevée permet des correspondances moins strictes. Une valeur de 0 désactive cette fonction."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Autoriser les préfixes",
|
||||
"tooltip": "Permet les correspondances partielles au début des mots."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Correspondre à tous les mots",
|
||||
"tooltip": "Exige que tous les mots de la recherche soient trouvés."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Masquer le contenu non-jeu",
|
||||
"tooltip": "Filtre les ROM hackées, les patches, les illustrations et autres contenus qui ne sont pas des jeux dans les résultats de recherche."
|
||||
}
|
||||
},
|
||||
"save": "Enregistrer les paramètres"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Nombre de requêtes :",
|
||||
"files": "Fichiers connus :",
|
||||
"terms": "Nombre de termes :",
|
||||
"last_crawl": "Dernière mise à jour :"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Chargement de la ROM...",
|
||||
"downloading": "Téléchargement de la ROM",
|
||||
"downloading_progress": "Téléchargement : {{percent}}%",
|
||||
"decompressing": "Décompression du jeu..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Erreur lors du chargement du jeu",
|
||||
"no_rom": "Aucun fichier ROM trouvé dans l'archive",
|
||||
"http_error": "Erreur HTTP ! Statut : {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Attention : Ce fichier n'est peut-être pas une ROM de jeu et pourrait ne pas fonctionner correctement dans l'émulateur web.",
|
||||
"see_about": "Consultez la page {{link}} pour plus d'informations.",
|
||||
"no_data": "Aucune donnée d'émulateur disponible.",
|
||||
"https": "Connexion HTTP non sécurisée : Certains émulateurs nécessitent HTTPS pour fonctionner correctement. Ce site n'est pas configuré correctement."
|
||||
},
|
||||
"console": {
|
||||
"about": "Cet émulateur en ligne exécute des jeux directement depuis l'archive publique de Myrient.",
|
||||
"disclaimer": "Aucun jeu n'est hébergé sur ce site. Tout le contenu est chargé directement depuis les serveurs de Myrient.",
|
||||
"more_info": "Pour plus d'informations sur ce service, consultez la page À propos."
|
||||
},
|
||||
"recommended": "Émulateurs recommandés",
|
||||
"download": "Télécharger",
|
||||
"play": "Jouer",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Cet émulateur charge les jeux directement depuis {{link}}. En savoir plus sur la page {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Nom",
|
||||
"group": "Groupe",
|
||||
"category": "Catégorie",
|
||||
"region": "Région",
|
||||
"type": "Type",
|
||||
"size": "Taille",
|
||||
"date": "Date",
|
||||
"score": "Pertinence",
|
||||
"play": "Jouer"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Erreur",
|
||||
"message": "Un problème est survenu",
|
||||
"details": "Détails de l'erreur : {{message}}",
|
||||
"back_home": "Retour à l'accueil",
|
||||
"go_back": "Retour"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/hi.json
Normal file
149
config/locales/hi.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrient के लिए एक खोज इंजन - Erista द्वारा विकसित वीडियो गेम संरक्षण के लिए समर्पित सेवा।",
|
||||
"tagline": "Myrient व्यवस्थित और सार्वजनिक रूप से उपलब्ध वीडियो गेम संग्रह प्रदान करता है, जिससे वे समय के साथ लुप्त होने से बच सकें।",
|
||||
"disclaimer": "Myrient/Erista से संबद्ध नहीं है!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "सेटिंग्स",
|
||||
"emulators": "एमुलेटर्स",
|
||||
"about": "परिचय",
|
||||
"search": "खोज",
|
||||
"results": "परिणाम"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "खोजें...",
|
||||
"button": "खोजें",
|
||||
"lucky": "आज मेरा लकी दिन है",
|
||||
"found": "{{count}} परिणाम मिला",
|
||||
"found_plural": "{{count}} परिणाम मिले",
|
||||
"in_seconds": "{{seconds}} सेकंड में",
|
||||
"indexing": "इंडेक्सिंग प्रगति पर है, अगर सूची में कुछ गायब है तो कृपया कुछ मिनटों में पुनः प्रयास करें",
|
||||
"non_game_filter": "गैर-गेम सामग्री फ़िल्टर सक्रिय है",
|
||||
"displaying_results": "{{start}} से {{end}} तक के परिणाम दिखा रहे हैं।"
|
||||
},
|
||||
"about": {
|
||||
"title": "परिचय",
|
||||
"support": "अगर आपको यह प्रोजेक्ट पसंद आया, तो कृपया Myrient का समर्थन करने पर विचार करें:",
|
||||
"donate": "Myrient को दान करें",
|
||||
"emulator": {
|
||||
"title": "बिल्ट-इन एमुलेटर",
|
||||
"description": "इस वेबसाइट में EmulatorJS द्वारा संचालित एक अंतर्निहित एमुलेटर शामिल है जो रेट्रो गेमिंग को सीधे आपके ब्राउज़र में लाता है।",
|
||||
"compatibility": "संगत गेम अपने खोज परिणाम पृष्ठ पर एक प्ले बटन दिखाएंगे।",
|
||||
"browser_tip": "सर्वोत्तम गेमिंग अनुभव के लिए, हार्डवेयर एक्सेलेरेशन चालू किए हुए Chromium-आधारित ब्राउज़र का उपयोग करें।",
|
||||
"save_states": "गेम सीधे Myrient के सार्वजनिक आर्काइव से लोड होते हैं। सेव स्टेट्स ब्राउज़र में स्थानीय रूप से संग्रहीत होते हैं।",
|
||||
"limitations": "ROM हैक्स, साउंडट्रैक, और अन्य गैर-गेम सामग्री एमुलेटर द्वारा समर्थित नहीं हैं और लोड होने में विफल हो सकती हैं।",
|
||||
"disabled": "वेब एमुलेटर फंक्शनैलिटी एडमिनिस्ट्रेटर द्वारा अक्षम की गई है।",
|
||||
"contact": "एडमिनिस्ट्रेटर से संपर्क करें या अपना खुद का Myrient Search इंस्टेंस स्थापित करें।"
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "खोज इंजन किसके द्वारा बनाया गया:",
|
||||
"view_github": "GitHub पर प्रोजेक्ट देखें"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "सेटिंग्स",
|
||||
"search_columns": {
|
||||
"title": "खोज कॉलम",
|
||||
"tooltip": "चुनें कि खोज इंजन किन कॉलम पर खोज करेगा।"
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "खोज स्कोर मल्टीप्लायर",
|
||||
"tooltip": "पाए गए प्रत्येक शब्द के मैच स्कोर को उस श्रेणी के आधार पर गुणा करता है जिसमें वह पाया जाता है।"
|
||||
},
|
||||
"extras": {
|
||||
"title": "अतिरिक्त विकल्प",
|
||||
"fuzzy": {
|
||||
"label": "फज़ी खोज",
|
||||
"tooltip": "0.00 और 1.00 के बीच का मान जो निर्धारित करता है कि कितना निकट एक शब्द को मैच माना जाए (लेवेनश्टीन दूरी)। उच्च मान कम सटीक मिलान की अनुमति देता है। 0 का मान इसे अक्षम कर देता है।"
|
||||
},
|
||||
"prefix": {
|
||||
"label": "प्रिफिक्स की अनुमति दें",
|
||||
"tooltip": "शब्द की शुरुआत में आंशिक मिलान की अनुमति देता है।"
|
||||
},
|
||||
"match_all": {
|
||||
"label": "सभी शब्दों का मिलान करें",
|
||||
"tooltip": "खोज क्वेरी में सभी शब्दों का मिलान होना आवश्यक है।"
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "गैर-गेम सामग्री छिपाएं",
|
||||
"tooltip": "खोज परिणामों से ROM हैक्स, पैच, आर्टवर्क और अन्य गैर-गेम सामग्री को फ़िल्टर करता है।"
|
||||
}
|
||||
},
|
||||
"save": "सेटिंग्स सहेजें"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "क्वेरी की संख्या:",
|
||||
"files": "ज्ञात फाइलें:",
|
||||
"terms": "शब्दों की संख्या:",
|
||||
"last_crawl": "अंतिम अपडेट का समय:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "ROM लोड हो रहा है...",
|
||||
"downloading": "ROM डाउनलोड हो रहा है",
|
||||
"downloading_progress": "डाउनलोड: {{percent}}%",
|
||||
"decompressing": "गेम डीकंप्रेस हो रहा है..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "गेम लोड करने में त्रुटि",
|
||||
"no_rom": "आर्काइव में कोई ROM फाइल नहीं मिली",
|
||||
"http_error": "HTTP त्रुटि! स्थिति: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "चेतावनी: यह फ़ाइल गेम ROM नहीं हो सकती है और वेब एमुलेटर में ठीक से काम नहीं कर सकती है।",
|
||||
"see_about": "अधिक जानकारी के लिए {{link}} पेज देखें।",
|
||||
"no_data": "कोई एमुलेटर डेटा उपलब्ध नहीं है।",
|
||||
"https": "असुरक्षित HTTP कनेक्शन: कुछ एमुलेटर को सही ढंग से काम करने के लिए HTTPS की आवश्यकता होती है। यह साइट सही तरीके से कॉन्फ़िगर नहीं की गई है।"
|
||||
},
|
||||
"console": {
|
||||
"about": "यह एक ऑनलाइन एमुलेटर है जो Myrient के सार्वजनिक आर्काइव से सीधे गेम ROM चलाता है।",
|
||||
"disclaimer": "इस वेबसाइट पर कोई गेम ROM होस्ट नहीं की गई है। सभी सामग्री Myrient सर्वर से सीधे लोड की जाती है।",
|
||||
"more_info": "इस सेवा के बारे में अधिक जानकारी के लिए, कृपया परिचय पृष्ठ पर जाएं।"
|
||||
},
|
||||
"recommended": "अनुशंसित एमुलेटर्स",
|
||||
"download": "डाउनलोड",
|
||||
"play": "खेलें",
|
||||
"not_available": "----",
|
||||
"disclaimer": "यह एमुलेटर {{link}} से सीधे गेम लोड करता है। {{about}} पृष्ठ पर अधिक जानें।"
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "नाम",
|
||||
"group": "समूह",
|
||||
"category": "श्रेणी",
|
||||
"region": "क्षेत्र",
|
||||
"type": "प्रकार",
|
||||
"size": "आकार",
|
||||
"date": "तारीख",
|
||||
"score": "प्रासंगिकता",
|
||||
"play": "खेलें"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "त्रुटि",
|
||||
"message": "कुछ गलत हो गया",
|
||||
"details": "त्रुटि विवरण: {{message}}",
|
||||
"back_home": "होम पर वापस जाएं",
|
||||
"go_back": "वापस जाएं"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/it.json
Normal file
149
config/locales/it.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Un motore di ricerca per Myrient - un servizio di Erista dedicato alla conservazione dei videogiochi.",
|
||||
"tagline": "Myrient offre collezioni di videogiochi organizzate e accessibili al pubblico, impedendo che vadano perdute nel tempo.",
|
||||
"disclaimer": "Non affiliato con Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Impostazioni",
|
||||
"emulators": "Emulatori",
|
||||
"about": "Informazioni",
|
||||
"search": "Cerca",
|
||||
"results": "Risultati"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Cerca...",
|
||||
"button": "Cerca",
|
||||
"lucky": "Mi sento fortunato",
|
||||
"found": "{{count}} risultato trovato",
|
||||
"found_plural": "{{count}} risultati trovati",
|
||||
"in_seconds": "in {{seconds}} secondi",
|
||||
"indexing": "Indicizzazione in corso, se manca qualcosa nell'elenco riprova tra qualche minuto",
|
||||
"non_game_filter": "Filtro per contenuti non-gioco attivo",
|
||||
"displaying_results": "Risultati da {{start}} a {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "Informazioni",
|
||||
"support": "Se ti piace questo progetto, considera di supportare Myrient:",
|
||||
"donate": "Dona a Myrient",
|
||||
"emulator": {
|
||||
"title": "Emulatore Integrato",
|
||||
"description": "Questo sito include un emulatore integrato basato su EmulatorJS che porta i giochi retro direttamente nel tuo browser.",
|
||||
"compatibility": "I giochi compatibili avranno un pulsante di gioco nella pagina dei risultati.",
|
||||
"browser_tip": "Per la migliore esperienza di gioco, usa un browser basato su Chromium con l'accelerazione hardware attivata.",
|
||||
"save_states": "I giochi vengono caricati direttamente dall'archivio pubblico di Myrient. I salvataggi sono memorizzati localmente nel browser.",
|
||||
"limitations": "Le ROM modificate, le colonne sonore e altri contenuti non di gioco non sono supportati dall'emulatore e potrebbero non caricarsi.",
|
||||
"disabled": "La funzionalità dell'emulatore web è stata disabilitata dall'amministratore.",
|
||||
"contact": "Contatta l'amministratore o avvia la tua istanza di Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Motore di ricerca creato da",
|
||||
"view_github": "Visualizza progetto su GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Impostazioni",
|
||||
"search_columns": {
|
||||
"title": "Colonne di Ricerca",
|
||||
"tooltip": "Seleziona in quali colonne il motore di ricerca cercherà."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Moltiplicatore del Punteggio",
|
||||
"tooltip": "Moltiplica il punteggio di corrispondenza per ogni parola trovata in base alla categoria in cui si trova."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Extra",
|
||||
"fuzzy": {
|
||||
"label": "Ricerca approssimativa",
|
||||
"tooltip": "Valore tra 0.00 e 1.00 che determina la distanza approssimativa (distanza di Levenshtein) per considerare una parola come corrispondente. Un valore più alto consente corrispondenze meno stringenti. Un valore di 0 disattiva questa funzione."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Consenti Prefissi",
|
||||
"tooltip": "Consente corrispondenze parziali all'inizio delle parole."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Trova tutte le parole",
|
||||
"tooltip": "Richiede che tutte le parole nella query di ricerca corrispondano."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Nascondi contenuti non di gioco",
|
||||
"tooltip": "Filtra ROM modificate, patch, grafica e altri contenuti non di gioco dai risultati della ricerca."
|
||||
}
|
||||
},
|
||||
"save": "Salva Impostazioni"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Numero di Ricerche:",
|
||||
"files": "File Conosciuti:",
|
||||
"terms": "Numero di Termini:",
|
||||
"last_crawl": "Ultimo Aggiornamento:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Caricamento ROM...",
|
||||
"downloading": "Download ROM in corso",
|
||||
"downloading_progress": "Download: {{percent}}%",
|
||||
"decompressing": "Decompressione del gioco..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Errore durante il caricamento del gioco",
|
||||
"no_rom": "Nessun file ROM trovato nell'archivio",
|
||||
"http_error": "Errore HTTP! Stato: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Attenzione: Questo file potrebbe non essere una ROM di gioco e potrebbe non funzionare correttamente nell'emulatore web.",
|
||||
"see_about": "Consulta la pagina {{link}} per maggiori informazioni.",
|
||||
"no_data": "Nessun dato dell'emulatore disponibile.",
|
||||
"https": "Connessione HTTP non sicura: Alcuni emulatori richiedono HTTPS per funzionare correttamente. Questo sito non è configurato in modo adeguato."
|
||||
},
|
||||
"console": {
|
||||
"about": "Questo è un emulatore online che esegue ROM di gioco direttamente dall'archivio pubblico di Myrient.",
|
||||
"disclaimer": "Nessuna ROM di gioco è ospitata su questo sito. Tutti i contenuti sono caricati direttamente dai server Myrient.",
|
||||
"more_info": "Per maggiori informazioni su questo servizio, visita la pagina Informazioni."
|
||||
},
|
||||
"recommended": "Emulatori Consigliati",
|
||||
"download": "Scarica",
|
||||
"play": "Gioca",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Questo emulatore carica i giochi direttamente da {{link}}. Maggiori informazioni nella pagina {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Nome",
|
||||
"group": "Gruppo",
|
||||
"category": "Categoria",
|
||||
"region": "Regione",
|
||||
"type": "Tipo",
|
||||
"size": "Dimensione",
|
||||
"date": "Data",
|
||||
"score": "Rilevanza",
|
||||
"play": "Gioca"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Errore",
|
||||
"message": "Qualcosa è andato storto",
|
||||
"details": "Dettagli errore: {{message}}",
|
||||
"back_home": "Torna alla Home",
|
||||
"go_back": "Indietro"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/ja.json
Normal file
149
config/locales/ja.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrientのための検索エンジン - Eristaによるビデオゲーム保存を目的としたサービス。",
|
||||
"tagline": "Myrientは、時間の経過とともに失われないよう、整理された公開ゲームコレクションを提供しています。",
|
||||
"disclaimer": "Myrient/Eristaとは提携していません!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "設定",
|
||||
"emulators": "エミュレータ",
|
||||
"about": "サイトについて",
|
||||
"search": "検索",
|
||||
"results": "検索結果"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "検索...",
|
||||
"button": "検索",
|
||||
"lucky": "ラッキー検索",
|
||||
"found": "{{count}}件の結果",
|
||||
"found_plural": "{{count}}件の結果",
|
||||
"in_seconds": "{{seconds}}秒で検索完了",
|
||||
"indexing": "インデックス作成中です。リストに表示されないものがある場合は、数分後に再度お試しください",
|
||||
"non_game_filter": "非ゲームコンテンツフィルターが有効です",
|
||||
"displaying_results": "{{start}}件目から{{end}}件目を表示中。"
|
||||
},
|
||||
"about": {
|
||||
"title": "サイトについて",
|
||||
"support": "このプロジェクトが気に入ったら、Myrientへのサポートもご検討ください:",
|
||||
"donate": "Myrientに寄付する",
|
||||
"emulator": {
|
||||
"title": "内蔵エミュレータ",
|
||||
"description": "当サイトにはEmulatorJSを利用した内蔵エミュレータがあり、レトロゲームをブラウザ上で直接プレイできます。",
|
||||
"compatibility": "対応ゲームは検索結果ページにプレイボタンが表示されます。",
|
||||
"browser_tip": "最適なゲーム体験を得るには、ハードウェアアクセラレーションを有効にしたChromiumベースのブラウザをご利用ください。",
|
||||
"save_states": "ゲームはMyrientの公開アーカイブから直接読み込まれます。セーブデータはブラウザにローカル保存されます。",
|
||||
"limitations": "ROMハック、サウンドトラック、その他の非ゲームコンテンツはエミュレータでサポートされておらず、読み込みに失敗する可能性があります。",
|
||||
"disabled": "ウェブエミュレータ機能は管理者によって無効化されています。",
|
||||
"contact": "管理者にお問い合わせいただくか、ご自身でMyrient Searchのインスタンスを立ち上げてください。"
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "検索エンジン開発者:",
|
||||
"view_github": "GitHubでプロジェクトを見る"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "設定",
|
||||
"search_columns": {
|
||||
"title": "検索対象の列",
|
||||
"tooltip": "検索エンジンが検索を行う列を選択します。"
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "検索スコア倍率",
|
||||
"tooltip": "見つかった単語のカテゴリに基づいて、マッチスコアを調整します。"
|
||||
},
|
||||
"extras": {
|
||||
"title": "追加設定",
|
||||
"fuzzy": {
|
||||
"label": "あいまい検索",
|
||||
"tooltip": "単語が一致とみなされるためのレーベンシュタイン距離を0.00〜1.00の間で設定します。値が高いほど、より緩やかな一致が許容されます。0で無効になります。"
|
||||
},
|
||||
"prefix": {
|
||||
"label": "前方一致を許可",
|
||||
"tooltip": "単語の先頭部分での一致を許可します。"
|
||||
},
|
||||
"match_all": {
|
||||
"label": "すべての単語に一致",
|
||||
"tooltip": "検索クエリのすべての単語が一致する必要があります。"
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "非ゲームコンテンツを非表示",
|
||||
"tooltip": "ROMハック、パッチ、アートワーク、その他のゲーム以外のコンテンツを検索結果から除外します。"
|
||||
}
|
||||
},
|
||||
"save": "設定を保存"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "検索クエリ数:",
|
||||
"files": "登録ファイル数:",
|
||||
"terms": "インデックス語数:",
|
||||
"last_crawl": "最終更新時刻:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "ROMを読み込み中...",
|
||||
"downloading": "ROMをダウンロード中",
|
||||
"downloading_progress": "ダウンロード中: {{percent}}%",
|
||||
"decompressing": "ゲームを解凍中..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "ゲームの読み込みに失敗しました",
|
||||
"no_rom": "アーカイブ内にROMファイルが見つかりません",
|
||||
"http_error": "HTTPエラー:{{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "警告:このファイルはゲームROMではない可能性があり、Webエミュレーターで正しく動作しない場合があります。",
|
||||
"see_about": "詳細については{{link}}ページをご覧ください。",
|
||||
"no_data": "エミュレーターデータがありません。",
|
||||
"https": "安全でないHTTP接続:一部のエミュレーターは正常に動作するためにHTTPSが必要です。このサイトは正しく設定されていません。"
|
||||
},
|
||||
"console": {
|
||||
"about": "これはMyrientの公開アーカイブから直接ゲームを実行するオンラインエミュレータです。",
|
||||
"disclaimer": "当サイトにゲームROMは保存されていません。すべてのコンテンツはMyrientサーバーから直接読み込まれます。",
|
||||
"more_info": "このサービスの詳細については、サイトについてのページをご覧ください。"
|
||||
},
|
||||
"recommended": "推奨エミュレータ",
|
||||
"download": "ダウンロード",
|
||||
"play": "プレイ",
|
||||
"not_available": "----",
|
||||
"disclaimer": "このエミュレータは{{link}}から直接ゲームを読み込みます。詳細は{{about}}ページをご確認ください。"
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "タイトル",
|
||||
"group": "グループ",
|
||||
"category": "カテゴリ",
|
||||
"region": "地域",
|
||||
"type": "タイプ",
|
||||
"size": "サイズ",
|
||||
"date": "日付",
|
||||
"score": "関連度",
|
||||
"play": "プレイ"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "エラー",
|
||||
"message": "問題が発生しました",
|
||||
"details": "エラー詳細: {{message}}",
|
||||
"back_home": "ホームに戻る",
|
||||
"go_back": "戻る"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/ko.json
Normal file
149
config/locales/ko.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrient를 위한 검색 엔진 - Erista에서 제공하는 비디오 게임 보존 서비스입니다.",
|
||||
"tagline": "Myrient는 시간이 지나도 잊혀지지 않도록 체계적으로 정리된 공개 비디오 게임 컬렉션을 제공합니다.",
|
||||
"disclaimer": "Myrient/Erista와 관련이 없습니다!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "설정",
|
||||
"emulators": "에뮬레이터",
|
||||
"about": "소개",
|
||||
"search": "검색",
|
||||
"results": "결과"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "검색어 입력...",
|
||||
"button": "검색",
|
||||
"lucky": "행운의 검색",
|
||||
"found": "{{count}}개의 결과",
|
||||
"found_plural": "{{count}}개의 결과",
|
||||
"in_seconds": "{{seconds}}초 소요",
|
||||
"indexing": "인덱싱 중입니다. 목록에 누락된 항목이 있다면 잠시 후 다시 시도해 주세요",
|
||||
"non_game_filter": "비게임 콘텐츠 필터가 활성화되었습니다",
|
||||
"displaying_results": "{{start}}번부터 {{end}}번까지의 결과를 표시합니다."
|
||||
},
|
||||
"about": {
|
||||
"title": "소개",
|
||||
"support": "이 프로젝트가 마음에 드신다면 Myrient를 지원해 주세요:",
|
||||
"donate": "Myrient에 기부하기",
|
||||
"emulator": {
|
||||
"title": "내장 에뮬레이터",
|
||||
"description": "이 웹사이트는 EmulatorJS로 구동되는 내장 에뮬레이터를 포함하고 있어 레트로 게임을 브라우저에서 바로 즐길 수 있습니다.",
|
||||
"compatibility": "호환되는 게임은 검색 결과 페이지에 플레이 버튼이 표시됩니다.",
|
||||
"browser_tip": "최상의 게임 경험을 위해 하드웨어 가속이 활성화된 크로미움 기반 브라우저를 사용하세요.",
|
||||
"save_states": "게임은 Myrient의 공개 아카이브에서 직접 불러옵니다. 세이브 데이터는 브라우저에 로컬로 저장됩니다.",
|
||||
"limitations": "ROM 해킹, 사운드트랙 및 기타 비게임 콘텐츠는 에뮬레이터에서 지원되지 않으며 로드에 실패할 수 있습니다.",
|
||||
"disabled": "웹 에뮬레이터 기능이 관리자에 의해 비활성화되었습니다.",
|
||||
"contact": "관리자에게 문의하거나 직접 Myrient Search 인스턴스를 설치해 보세요."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "검색 엔진 개발자:",
|
||||
"view_github": "GitHub에서 프로젝트 보기"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "설정",
|
||||
"search_columns": {
|
||||
"title": "검색 열",
|
||||
"tooltip": "검색 엔진이 검색할 열을 선택합니다."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "검색 점수 배율",
|
||||
"tooltip": "검색된 단어가 포함된 카테고리에 따라 일치 점수를 조정합니다."
|
||||
},
|
||||
"extras": {
|
||||
"title": "추가 설정",
|
||||
"fuzzy": {
|
||||
"label": "유사 검색",
|
||||
"tooltip": "단어가 일치로 간주되기 위한 유사도(레벤슈타인 거리)를 0.00에서 1.00 사이 값으로 설정합니다. 높은 값일수록 더 느슨한 일치를 허용합니다. 0이면 비활성화됩니다."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "접두사 허용",
|
||||
"tooltip": "단어의 시작 부분만 일치하는 것을 허용합니다."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "모든 단어 일치",
|
||||
"tooltip": "검색어의 모든 단어가 일치해야 결과에 포함됩니다."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "비게임 콘텐츠 숨기기",
|
||||
"tooltip": "ROM 해킹, 패치, 아트워크 등 게임이 아닌 콘텐츠를 검색 결과에서 제외합니다."
|
||||
}
|
||||
},
|
||||
"save": "설정 저장"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "검색 횟수:",
|
||||
"files": "등록된 파일:",
|
||||
"terms": "색인된 단어 수:",
|
||||
"last_crawl": "마지막 업데이트:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "롬 로딩 중...",
|
||||
"downloading": "롬 다운로드 중",
|
||||
"downloading_progress": "다운로드 진행률: {{percent}}%",
|
||||
"decompressing": "게임 압축 해제 중..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "게임 로드 실패",
|
||||
"no_rom": "아카이브에서 롬 파일을 찾을 수 없습니다",
|
||||
"http_error": "HTTP 오류! 상태: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "경고: 이 파일은 게임 ROM이 아닐 수 있으며 웹 에뮬레이터에서 제대로 작동하지 않을 수 있습니다.",
|
||||
"see_about": "자세한 내용은 {{link}} 페이지를 참조하세요.",
|
||||
"no_data": "사용 가능한 에뮬레이터 데이터가 없습니다.",
|
||||
"https": "안전하지 않은 HTTP: 일부 에뮬레이터는 제대로 작동하려면 HTTPS가 필요합니다. 이 사이트는 올바르게 설정되지 않았습니다."
|
||||
},
|
||||
"console": {
|
||||
"about": "이 온라인 에뮬레이터는 Myrient의 공개 아카이브에서 직접 게임 롬을 실행합니다.",
|
||||
"disclaimer": "이 웹사이트에는 게임 롬이 저장되어 있지 않습니다. 모든 콘텐츠는 Myrient 서버에서 직접 불러옵니다.",
|
||||
"more_info": "이 서비스에 대한 자세한 정보는 소개 페이지를 확인하세요."
|
||||
},
|
||||
"recommended": "추천 에뮬레이터",
|
||||
"download": "다운로드",
|
||||
"play": "플레이",
|
||||
"not_available": "----",
|
||||
"disclaimer": "이 에뮬레이터는 {{link}}에서 직접 게임을 불러옵니다. {{about}} 페이지에서 더 자세히 알아보세요."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "이름",
|
||||
"group": "그룹",
|
||||
"category": "카테고리",
|
||||
"region": "지역",
|
||||
"type": "유형",
|
||||
"size": "크기",
|
||||
"date": "날짜",
|
||||
"score": "관련도",
|
||||
"play": "플레이"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "오류",
|
||||
"message": "문제가 발생했습니다",
|
||||
"details": "오류 세부 정보: {{message}}",
|
||||
"back_home": "홈으로 돌아가기",
|
||||
"go_back": "뒤로 가기"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/pl.json
Normal file
149
config/locales/pl.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Wyszukiwarka dla Myrient - serwisu Erista poświęconego ochronie gier wideo.",
|
||||
"tagline": "Myrient oferuje uporządkowane i publicznie dostępne kolekcje gier wideo, chroniąc je przed zapomnieniem.",
|
||||
"disclaimer": "Nie jesteśmy powiązani z Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Ustawienia",
|
||||
"emulators": "Emulatory",
|
||||
"about": "O nas",
|
||||
"search": "Szukaj",
|
||||
"results": "Wyniki"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Szukaj...",
|
||||
"button": "Szukaj",
|
||||
"lucky": "Szczęśliwy traf",
|
||||
"found": "Znaleziono {{count}} wynik",
|
||||
"found_plural": "Znaleziono {{count}} wyników",
|
||||
"in_seconds": "w {{seconds}} sekund",
|
||||
"indexing": "Trwa indeksowanie, jeśli brakuje czegoś na liście, spróbuj ponownie za kilka minut",
|
||||
"non_game_filter": "Filtr treści niebędących grami jest aktywny",
|
||||
"displaying_results": "Wyświetlanie wyników od {{start}} do {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "O nas",
|
||||
"support": "Jeśli podoba Ci się ten projekt, rozważ wsparcie Myrient:",
|
||||
"donate": "Wesprzyj Myrient",
|
||||
"emulator": {
|
||||
"title": "Wbudowany emulator",
|
||||
"description": "Ta strona zawiera wbudowany emulator oparty na EmulatorJS, który pozwala grać w klasyczne gry bezpośrednio w przeglądarce.",
|
||||
"compatibility": "Kompatybilne gry będą miały przycisk uruchamiania na stronie wyników wyszukiwania.",
|
||||
"browser_tip": "Dla najlepszych wrażeń z gry, używaj przeglądarki opartej na Chromium z włączonym przyspieszeniem sprzętowym.",
|
||||
"save_states": "Gry są ładowane bezpośrednio z publicznego archiwum Myrient. Zapisy gier są przechowywane lokalnie w przeglądarce.",
|
||||
"limitations": "Hacki ROM-ów, ścieżki dźwiękowe i inne treści niebędące grami nie są obsługiwane przez emulator i mogą nie działać.",
|
||||
"disabled": "Funkcja emulatora internetowego została wyłączona przez administratora.",
|
||||
"contact": "Skontaktuj się z administratorem lub uruchom własną instancję Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Wyszukiwarka stworzona przez",
|
||||
"view_github": "Zobacz projekt na GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Ustawienia",
|
||||
"search_columns": {
|
||||
"title": "Kolumny wyszukiwania",
|
||||
"tooltip": "Wybierz, w których kolumnach wyszukiwarka ma szukać."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Mnożnik wyników wyszukiwania",
|
||||
"tooltip": "Mnoży wynik dopasowania dla każdego znalezionego słowa w zależności od kategorii, w której zostało znalezione."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Dodatkowe opcje",
|
||||
"fuzzy": {
|
||||
"label": "Wyszukiwanie rozmyte",
|
||||
"tooltip": "Wartość między 0,00 a 1,00 określająca odległość (Levenshteina) dla dopasowania słów. Wyższa wartość pozwala na mniej ścisłe dopasowania. Wartość 0 wyłącza tę funkcję."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Zezwalaj na prefiksy",
|
||||
"tooltip": "Pozwala na częściowe dopasowania słów od początku słowa."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Dopasuj wszystkie słowa",
|
||||
"tooltip": "Wymaga, aby wszystkie słowa z zapytania zostały znalezione."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Ukryj treści niebędące grami",
|
||||
"tooltip": "Filtruje hacki ROM-ów, patche, grafiki i inne treści niebędące grami z wyników wyszukiwania."
|
||||
}
|
||||
},
|
||||
"save": "Zapisz ustawienia"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Liczba zapytań:",
|
||||
"files": "Znane pliki:",
|
||||
"terms": "Liczba terminów:",
|
||||
"last_crawl": "Ostatnia aktualizacja:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Ładowanie ROM-u...",
|
||||
"downloading": "Pobieranie ROM-u",
|
||||
"downloading_progress": "Pobieranie: {{percent}}%",
|
||||
"decompressing": "Rozpakowywanie gry..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Błąd ładowania gry",
|
||||
"no_rom": "Nie znaleziono pliku ROM w archiwum",
|
||||
"http_error": "Błąd HTTP! Status: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Ostrzeżenie: Ten plik może nie być ROM-em gry i może nie działać poprawnie w emulatorze internetowym.",
|
||||
"see_about": "Zobacz stronę {{link}}, aby uzyskać więcej informacji.",
|
||||
"no_data": "Brak dostępnych danych emulatora.",
|
||||
"https": "Niezabezpieczone połączenie HTTP: Niektóre emulatory wymagają HTTPS do prawidłowego działania. Ta strona nie jest poprawnie skonfigurowana."
|
||||
},
|
||||
"console": {
|
||||
"about": "To jest emulator online uruchamiający gry bezpośrednio z publicznego archiwum Myrient.",
|
||||
"disclaimer": "Ta strona nie przechowuje żadnych ROM-ów. Cała zawartość jest ładowana bezpośrednio z serwerów Myrient.",
|
||||
"more_info": "Więcej informacji o tej usłudze znajdziesz na stronie O nas."
|
||||
},
|
||||
"recommended": "Polecane emulatory",
|
||||
"download": "Pobierz",
|
||||
"play": "Graj",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Ten emulator ładuje gry bezpośrednio z {{link}}. Dowiedz się więcej na stronie {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Nazwa",
|
||||
"group": "Grupa",
|
||||
"category": "Kategoria",
|
||||
"region": "Region",
|
||||
"type": "Typ",
|
||||
"size": "Rozmiar",
|
||||
"date": "Data",
|
||||
"score": "Trafność",
|
||||
"play": "Graj"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Błąd",
|
||||
"message": "Coś poszło nie tak",
|
||||
"details": "Szczegóły błędu: {{message}}",
|
||||
"back_home": "Powrót do strony głównej",
|
||||
"go_back": "Wróć"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/pt.json
Normal file
149
config/locales/pt.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Um buscador para Myrient - um serviço da Erista dedicado à preservação de videogames.",
|
||||
"tagline": "Myrient oferece coleções de videogames organizadas e disponíveis ao público, evitando que se percam com o tempo.",
|
||||
"disclaimer": "Sem vínculo com Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Configurações",
|
||||
"emulators": "Emuladores",
|
||||
"about": "Sobre",
|
||||
"search": "Busca",
|
||||
"results": "Resultados"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Buscar...",
|
||||
"button": "Buscar",
|
||||
"lucky": "Estou com Sorte",
|
||||
"found": "{{count}} resultado encontrado",
|
||||
"found_plural": "{{count}} resultados encontrados",
|
||||
"in_seconds": "em {{seconds}} segundos",
|
||||
"indexing": "Indexação em andamento, se algo estiver faltando na lista, tente novamente em alguns minutos",
|
||||
"non_game_filter": "Filtro de conteúdo não-jogo está ativo",
|
||||
"displaying_results": "Mostrando resultados de {{start}} até {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "Sobre",
|
||||
"support": "Se você gosta deste projeto, considere apoiar o Myrient:",
|
||||
"donate": "Doar para o Myrient",
|
||||
"emulator": {
|
||||
"title": "Emulador Integrado",
|
||||
"description": "Este site inclui um emulador integrado desenvolvido com EmulatorJS que traz jogos retrô diretamente para o seu navegador.",
|
||||
"compatibility": "Jogos compatíveis terão um botão de jogar na página de resultados.",
|
||||
"browser_tip": "Para a melhor experiência, use um navegador baseado em Chromium com aceleração de hardware ativada.",
|
||||
"save_states": "Os jogos são carregados diretamente do arquivo público do Myrient. Os saves são armazenados localmente no seu navegador.",
|
||||
"limitations": "ROMs hackeadas, trilhas sonoras e outros conteúdos que não são jogos não são suportados pelo emulador e podem falhar ao carregar.",
|
||||
"disabled": "A funcionalidade do emulador web foi desativada pelo administrador.",
|
||||
"contact": "Entre em contato com o administrador ou crie sua própria instância do Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Buscador criado por",
|
||||
"view_github": "Ver projeto no GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Configurações",
|
||||
"search_columns": {
|
||||
"title": "Colunas de Busca",
|
||||
"tooltip": "Seleciona em quais colunas o buscador vai pesquisar."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Multiplicador de Relevância",
|
||||
"tooltip": "Multiplica a pontuação para cada palavra encontrada com base na categoria em que foi encontrada."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Opções avançadas",
|
||||
"fuzzy": {
|
||||
"label": "Busca aproximada",
|
||||
"tooltip": "Valor entre 0,00 e 1,00 que determina o quão similar uma palavra precisa ser para ser considerada uma correspondência (distância Levenshtein). Valor mais alto permite correspondências menos exatas. Valor 0 desativa esta função."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Permitir Prefixos",
|
||||
"tooltip": "Permite correspondências parciais no início das palavras."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Corresponder Todas as Palavras",
|
||||
"tooltip": "Exige que todas as palavras da busca sejam encontradas nos resultados."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Ocultar Conteúdo Não-Jogo",
|
||||
"tooltip": "Filtra ROMs hackeadas, patches, artes e qualquer outro conteúdo que não seja um jogo dos resultados da busca."
|
||||
}
|
||||
},
|
||||
"save": "Salvar Configurações"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Total de buscas:",
|
||||
"files": "Arquivos conhecidos:",
|
||||
"terms": "Total de termos:",
|
||||
"last_crawl": "Última atualização:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Carregando ROM...",
|
||||
"downloading": "Baixando ROM",
|
||||
"downloading_progress": "Download: {{percent}}%",
|
||||
"decompressing": "Descompactando o jogo..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Erro ao carregar o jogo",
|
||||
"no_rom": "Nenhum arquivo ROM encontrado no arquivo",
|
||||
"http_error": "Erro HTTP! Status: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Aviso: Este arquivo pode não ser uma ROM de jogo e pode não funcionar corretamente no emulador web.",
|
||||
"see_about": "Veja a página {{link}} para mais informações.",
|
||||
"no_data": "Não há dados de emulador disponíveis.",
|
||||
"https": "Conexão insegura: Alguns emuladores precisam de HTTPS para funcionar corretamente. Esta página não está configurada corretamente."
|
||||
},
|
||||
"console": {
|
||||
"about": "Este é um emulador online que executa jogos diretamente do arquivo público do Myrient.",
|
||||
"disclaimer": "Nenhum jogo é hospedado neste site. Todo o conteúdo é carregado diretamente dos servidores do Myrient.",
|
||||
"more_info": "Para mais informações sobre este serviço, visite a página Sobre."
|
||||
},
|
||||
"recommended": "Emuladores Recomendados",
|
||||
"download": "Baixar",
|
||||
"play": "Jogar",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Este emulador carrega jogos diretamente de {{link}}. Saiba mais na página {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Nome",
|
||||
"group": "Grupo",
|
||||
"category": "Categoria",
|
||||
"region": "Região",
|
||||
"type": "Tipo",
|
||||
"size": "Tamanho",
|
||||
"date": "Data",
|
||||
"score": "Relevância",
|
||||
"play": "Jogar"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Erro",
|
||||
"message": "Algo deu errado",
|
||||
"details": "Detalhes do erro: {{message}}",
|
||||
"back_home": "Voltar para a Página Inicial",
|
||||
"go_back": "Voltar"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/romaji.json
Normal file
149
config/locales/romaji.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrient no tame no kensaku enjin - Erista ni yoru bideo gēmu hozon wo mokuteki to shita sābisu.",
|
||||
"tagline": "Myrient wa jikan no nagare to tomo ni ushinawarenai you, seiton sareta koukai gēmu korekushon wo teikyou shiteimasu.",
|
||||
"disclaimer": "Myrient/Erista to teikei shite imasen!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Settei",
|
||||
"emulators": "Emyurēta",
|
||||
"about": "Saito ni tsuite",
|
||||
"search": "Kensaku",
|
||||
"results": "Kensaku kekka"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Kensaku...",
|
||||
"button": "Kensaku",
|
||||
"lucky": "Rakkī kensaku",
|
||||
"found": "{{count}}ken no kekka",
|
||||
"found_plural": "{{count}}ken no kekka",
|
||||
"in_seconds": "{{seconds}}byou de kensaku kanryou",
|
||||
"indexing": "Indeksu sakusei chū desu. Risuto ni hyōji sarenai mono ga aru baai wa, sūfun go ni saikenshite kudasai",
|
||||
"non_game_filter": "Hi-gēmu kontentsu fuiruta ga yūkō desu",
|
||||
"displaying_results": "{{start}}ken-me kara {{end}}ken-me wo hyōji chū."
|
||||
},
|
||||
"about": {
|
||||
"title": "Saito ni tsuite",
|
||||
"support": "Kono purojekuto ga ki ni itta nara, Myrient he no sapōto mo go kōryō kudasai:",
|
||||
"donate": "Myrient he kifu suru",
|
||||
"emulator": {
|
||||
"title": "Tōsai Emyurēta",
|
||||
"description": "Kono saito niwa EmulatorJS wo riyō shita tōsai emyurēta ga ari, retoro gēmu wo burazua jō de chokusetsu purei dekimasu.",
|
||||
"compatibility": "Taiō gēmu wa kensaku kekka pēji ni purei botan ga hyōji saremasu.",
|
||||
"browser_tip": "Saiteki na gēmu taiken wo eru tame ni, hādouea akuserarēshon wo yūkō ni shita Chromium bēsu no burazua wo goriyō kudasai.",
|
||||
"save_states": "Gēmu wa Myrient no kōkai ākaibu kara chokusetsu yomikoma remasu. Sēbu dēta wa burazua ni rōkaru hozon saremasu.",
|
||||
"limitations": "ROM hakku, saundotorakku, sono ta no hi-gēmu kontentsu wa emyurēta de sapōto sareteorazu, yomikomi ni shippai suru kanōsei ga arimasu.",
|
||||
"disabled": "Webu emyurēta kinō wa kanrisha ni yotte mukouka sareteimasu.",
|
||||
"contact": "Kanrisha ni otoiawase itadaku ka, go jishin de Myrient Search no insutansu wo tachiagetekudasai."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Kensaku enjin kaihatsusha:",
|
||||
"view_github": "GitHub de purojekuto wo miru"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Settei",
|
||||
"search_columns": {
|
||||
"title": "Kensaku Karamu",
|
||||
"tooltip": "Kensaku enjin ga kensaku wo okonau karamu wo sentaku shimasu."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Kensaku Sukoa Bairitsu",
|
||||
"tooltip": "Mitsukerareta tango no kategorī ni motozuite, matchi sukoa wo chōsei shimasu."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Kakuchō Settei",
|
||||
"fuzzy": {
|
||||
"label": "Aimai Kensaku",
|
||||
"tooltip": "Tango ga icchi to minasareru tame no rubaenshuhtain kyori wo 0.00~1.00 no aida de settei shimasu. Takai chi hodo, yori yuruyaka na icchi ga kyoka saremasu. 0 de mukouka ni narimasu."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Settōji Icchi wo Kyoka",
|
||||
"tooltip": "Tango no sentan bubun deno icchi wo kyoka shimasu."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Subete no Tango wo Icchi",
|
||||
"tooltip": "Kensaku kueri no subete no tango ga icchi suru hitsuyō ga arimasu."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Hi-gēmu Kontentsu wo Hyōji Shinai",
|
||||
"tooltip": "ROM hakku, patchi, ātowāku, sono ta no gēmu igai no kontentsu wo kensaku kekka kara jokyo shimasu."
|
||||
}
|
||||
},
|
||||
"save": "Settei wo Hozon"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Kensaku Kueri Sū:",
|
||||
"files": "Tōroku Fairu Sū:",
|
||||
"terms": "Indeksu Tango Sū:",
|
||||
"last_crawl": "Saishū Kōshin Jikoku:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "ROM wo yomikomi chū...",
|
||||
"downloading": "ROM wo daunrōdo chū",
|
||||
"downloading_progress": "Daunrōdo chū: {{percent}}%",
|
||||
"decompressing": "Gēmu wo kaifuku chū..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Gēmu no yomikomi ni shippai shimashita",
|
||||
"no_rom": "Ākaibu nai ni ROM fairu ga mitsukarimasen",
|
||||
"http_error": "HTTP erā: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Chuui: Kono fairu wa geemu ROM de wa nai kanousei ga ari, web emyureetaa de tadashiku dousa shinai baai ga arimasu.",
|
||||
"see_about": "Kuwashii jouhou wa {{link}} peeji wo goran kudasai.",
|
||||
"no_data": "Emyureetaa deeta ga arimasen.",
|
||||
"https": "Anzen denai HTTP setsuzoku: Ichibu no emyureetaa wa seijou ni dousa suru tame ni HTTPS ga hitsuyou desu. Kono saito wa tadashiku settei sarete imasen."
|
||||
},
|
||||
"console": {
|
||||
"about": "Kore wa Myrient no kōkai ākaibu kara chokusetsu gēmu wo jikkō suru onrain emyurēta desu.",
|
||||
"disclaimer": "Kono saito ni gēmu ROM wa hozon sareteorimasen. Subete no kontentsu wa Myrient sāba kara chokusetsu yomikoma remasu.",
|
||||
"more_info": "Kono sābisu ni tsuite no kuwashii jōhō wa, saito ni tsuite no pēji wo goran kudasai."
|
||||
},
|
||||
"recommended": "Suishou Emyurēta",
|
||||
"download": "Daunrōdo",
|
||||
"play": "Purei",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Kono emyurēta wa {{link}} kara chokusetsu gēmu wo yomikomi masu. Kuwashiku wa {{about}} pēji wo goran kudasai."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Taitoru",
|
||||
"group": "Gurūpu",
|
||||
"category": "Kategorī",
|
||||
"region": "Chiiki",
|
||||
"type": "Taipu",
|
||||
"size": "Saizu",
|
||||
"date": "Hizuke",
|
||||
"score": "Kanrensei",
|
||||
"play": "Purei"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Erā",
|
||||
"message": "Mondai ga hassei shimashita",
|
||||
"details": "Erā shōsai: {{message}}",
|
||||
"back_home": "Hōmu ni modoru",
|
||||
"go_back": "Modoru"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/ru.json
Normal file
149
config/locales/ru.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Поисковая система для Myrient - сервиса от Erista, посвященного сохранению видеоигр.",
|
||||
"tagline": "Myrient предлагает организованные и общедоступные коллекции видеоигр, спасая их от забвения со временем.",
|
||||
"disclaimer": "Не связано с Myrient/Erista!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Настройки",
|
||||
"emulators": "Эмуляторы",
|
||||
"about": "О сайте",
|
||||
"search": "Поиск",
|
||||
"results": "Результаты"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Поиск...",
|
||||
"button": "Найти",
|
||||
"lucky": "Мне повезёт",
|
||||
"found": "Найден {{count}} результат",
|
||||
"found_plural": "Найдено {{count}} результатов",
|
||||
"in_seconds": "за {{seconds}} секунд",
|
||||
"indexing": "Идёт индексация, если в списке чего-то не хватает, попробуйте перезагрузить через несколько минут",
|
||||
"non_game_filter": "Активирован фильтр не-игрового контента",
|
||||
"displaying_results": "Показаны результаты с {{start}} по {{end}}."
|
||||
},
|
||||
"about": {
|
||||
"title": "О сайте",
|
||||
"support": "Если вам нравится этот проект, пожалуйста, поддержите Myrient:",
|
||||
"donate": "Поддержать Myrient",
|
||||
"emulator": {
|
||||
"title": "Встроенный эмулятор",
|
||||
"description": "Этот сайт включает встроенный эмулятор на базе EmulatorJS, который позволяет играть в ретро-игры прямо в вашем браузере.",
|
||||
"compatibility": "Совместимые игры будут иметь кнопку воспроизведения на странице результатов поиска.",
|
||||
"browser_tip": "Для наилучшего игрового опыта используйте браузер на основе Chromium с включенным аппаратным ускорением.",
|
||||
"save_states": "Игры загружаются напрямую из публичного архива Myrient. Сохранения хранятся локально в браузере.",
|
||||
"limitations": "ROM-хаки, саундтреки и другой не-игровой контент не поддерживаются эмулятором и могут не загрузиться.",
|
||||
"disabled": "Функция веб-эмулятора отключена администратором.",
|
||||
"contact": "Свяжитесь с администратором или запустите собственный экземпляр Myrient Search."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Поисковая система создана",
|
||||
"view_github": "Посмотреть проект на GitHub"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Настройки",
|
||||
"search_columns": {
|
||||
"title": "Колонки поиска",
|
||||
"tooltip": "Выбирает, по каким колонкам будет производиться поиск."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Множитель поисковой релевантности",
|
||||
"tooltip": "Умножает оценку соответствия для каждого найденного слова в зависимости от категории, в которой оно найдено."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Дополнительно",
|
||||
"fuzzy": {
|
||||
"label": "Нечёткий поиск",
|
||||
"tooltip": "Значение между 0.00 и 1.00, определяющее расстояние Левенштейна для соответствия слов. Чем выше значение, тем менее строгие совпадения. Значение 0 отключает эту функцию."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Разрешить префиксы",
|
||||
"tooltip": "Позволяет находить частичные совпадения в начале слов."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Соответствие всем словам",
|
||||
"tooltip": "Требует соответствия всех слов в поисковом запросе."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Скрыть не-игровой контент",
|
||||
"tooltip": "Отфильтровывает ROM-хаки, патчи, иллюстрации и другой не-игровой контент из результатов поиска."
|
||||
}
|
||||
},
|
||||
"save": "Сохранить настройки"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Количество запросов:",
|
||||
"files": "Известные файлы:",
|
||||
"terms": "Количество терминов:",
|
||||
"last_crawl": "Время последнего обхода:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "Загрузка ROM...",
|
||||
"downloading": "Скачивание ROM",
|
||||
"downloading_progress": "Загрузка: {{percent}}%",
|
||||
"decompressing": "Распаковка игры..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Ошибка загрузки игры",
|
||||
"no_rom": "ROM-файл не найден в архиве",
|
||||
"http_error": "HTTP-ошибка! Статус: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Предупреждение: Этот файл может не быть игровым ROM-файлом и может работать неправильно в веб-эмуляторе.",
|
||||
"see_about": "Смотрите страницу {{link}} для получения дополнительной информации.",
|
||||
"no_data": "Нет доступных данных эмулятора.",
|
||||
"https": "Небезопасное HTTP-соединение: Некоторым эмуляторам для правильной работы требуется HTTPS. Этот сайт настроен неправильно."
|
||||
},
|
||||
"console": {
|
||||
"about": "Это онлайн-эмулятор, запускающий игровые ROM-файлы напрямую из публичного архива Myrient.",
|
||||
"disclaimer": "На этом сайте не хранятся игровые ROM-файлы. Весь контент загружается напрямую с серверов Myrient.",
|
||||
"more_info": "Для получения дополнительной информации об этом сервисе, пожалуйста, посетите страницу О сайте."
|
||||
},
|
||||
"recommended": "Рекомендуемые эмуляторы",
|
||||
"download": "Скачать",
|
||||
"play": "Играть",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Этот эмулятор загружает игры напрямую из {{link}}. Узнайте больше на странице {{about}}."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "Название",
|
||||
"group": "Группа",
|
||||
"category": "Категория",
|
||||
"region": "Регион",
|
||||
"type": "Тип",
|
||||
"size": "Размер",
|
||||
"date": "Дата",
|
||||
"score": "Релевантность",
|
||||
"play": "Играть"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Ошибка",
|
||||
"message": "Что-то пошло не так",
|
||||
"details": "Детали ошибки: {{message}}",
|
||||
"back_home": "Вернуться на главную",
|
||||
"go_back": "Назад"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/tr.json
Normal file
149
config/locales/tr.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrient için bir arama motoru - Erista tarafından video oyunlarını korumaya adanmış bir hizmet.",
|
||||
"tagline": "Myrient, video oyunlarının zamanla kaybolmasını önlemek için düzenli ve herkese açık koleksiyonlar sunar.",
|
||||
"disclaimer": "Myrient/Erista ile bağlantısı yoktur!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "Ayarlar",
|
||||
"emulators": "Emülatörler",
|
||||
"about": "Hakkında",
|
||||
"search": "Ara",
|
||||
"results": "Sonuçlar"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "Ara...",
|
||||
"button": "Ara",
|
||||
"lucky": "Şansımı Deneyeyim",
|
||||
"found": "{{count}} sonuç bulundu",
|
||||
"found_plural": "{{count}} sonuç bulundu",
|
||||
"in_seconds": "{{seconds}} saniyede",
|
||||
"indexing": "İndeksleme devam ediyor, listede eksik bir şey varsa lütfen birkaç dakika sonra tekrar deneyin",
|
||||
"non_game_filter": "Oyun dışı içerik filtresi etkin",
|
||||
"displaying_results": "{{start}} ile {{end}} arası sonuçlar gösteriliyor."
|
||||
},
|
||||
"about": {
|
||||
"title": "Hakkında",
|
||||
"support": "Bu projeyi beğendiyseniz, lütfen Myrient'i desteklemeyi düşünün:",
|
||||
"donate": "Myrient'e Bağış Yap",
|
||||
"emulator": {
|
||||
"title": "Dahili Emülatör",
|
||||
"description": "Bu web sitesi, retro oyunları doğrudan tarayıcınızda oynamanızı sağlayan EmulatorJS destekli dahili bir emülatör içerir.",
|
||||
"compatibility": "Uyumlu oyunlar, arama sonuç sayfasında bir oyna düğmesine sahip olacaktır.",
|
||||
"browser_tip": "En iyi oyun deneyimi için, donanım hızlandırma özelliği etkinleştirilmiş Chromium tabanlı bir tarayıcı kullanın.",
|
||||
"save_states": "Oyunlar doğrudan Myrient'in herkese açık arşivinden yüklenir. Kayıt durumları yerel olarak tarayıcıda saklanır.",
|
||||
"limitations": "ROM hackler, müzikler ve diğer oyun dışı içerikler emülatör tarafından desteklenmez ve yüklenemeyebilir.",
|
||||
"disabled": "Web Emülatörü işlevi yönetici tarafından devre dışı bırakıldı.",
|
||||
"contact": "Yöneticiyle iletişime geçin veya kendi Myrient Search örneğinizi kurun."
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "Arama motoru şu kişi tarafından oluşturuldu:",
|
||||
"view_github": "Projeyi GitHub'da görüntüle"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "Ayarlar",
|
||||
"search_columns": {
|
||||
"title": "Arama Sütunları",
|
||||
"tooltip": "Arama motorunun hangi sütunlarda arama yapacağını seçer."
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "Arama Puanı Çarpanı",
|
||||
"tooltip": "Bulunan her kelimenin eşleşme puanını, bulunduğu kategoriye göre çarpar."
|
||||
},
|
||||
"extras": {
|
||||
"title": "Ekstralar",
|
||||
"fuzzy": {
|
||||
"label": "Bulanık Arama",
|
||||
"tooltip": "Bir kelimenin eşleşme sayılması için yakınlık derecesini (Levenshtein mesafesi) belirleyen 0.00 ile 1.00 arasında bir değer. Daha yüksek değer, daha az kesin eşleşmelere izin verir. 0 değeri devre dışı bırakır."
|
||||
},
|
||||
"prefix": {
|
||||
"label": "Öneklere İzin Ver",
|
||||
"tooltip": "Kelimenin başlangıcında kısmi eşleşmelere izin verir."
|
||||
},
|
||||
"match_all": {
|
||||
"label": "Tüm Kelimeleri Eşleştir",
|
||||
"tooltip": "Arama sorgusundaki tüm kelimelerin eşleşmesini gerektirir."
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "Oyun Olmayan İçeriği Gizle",
|
||||
"tooltip": "ROM hackleri, yamalar, görseller ve diğer oyun dışı içerikleri arama sonuçlarından filtreler."
|
||||
}
|
||||
},
|
||||
"save": "Ayarları Kaydet"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "Sorgu Sayısı:",
|
||||
"files": "Bilinen Dosyalar:",
|
||||
"terms": "Terim Sayısı:",
|
||||
"last_crawl": "Son Güncellenme Zamanı:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "ROM yükleniyor...",
|
||||
"downloading": "ROM indiriliyor",
|
||||
"downloading_progress": "İndiriliyor: %{{percent}}",
|
||||
"decompressing": "Oyun açılıyor..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "Oyun yüklenirken hata oluştu",
|
||||
"no_rom": "Arşivde ROM dosyası bulunamadı",
|
||||
"http_error": "HTTP hatası! Durum: {{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "Uyarı: Bu dosya bir oyun ROM'u olmayabilir ve web emülatöründe düzgün çalışmayabilir.",
|
||||
"see_about": "Daha fazla bilgi için {{link}} sayfasına bakın.",
|
||||
"no_data": "Emülatör verisi mevcut değil.",
|
||||
"https": "Güvenli olmayan HTTP bağlantısı: Bazı emülatörler düzgün çalışmak için HTTPS gerektirir. Bu site doğru yapılandırılmamış."
|
||||
},
|
||||
"console": {
|
||||
"about": "Bu, Myrient'in halka açık arşivinden doğrudan oyun ROM'larını çalıştıran bir online emülatördür.",
|
||||
"disclaimer": "Bu web sitesinde hiçbir oyun ROM'u barındırılmamaktadır. Tüm içerik doğrudan Myrient sunucularından yüklenir.",
|
||||
"more_info": "Bu hizmet hakkında daha fazla bilgi için lütfen Hakkında sayfasını ziyaret edin."
|
||||
},
|
||||
"recommended": "Önerilen Emülatörler",
|
||||
"download": "İndir",
|
||||
"play": "Oyna",
|
||||
"not_available": "----",
|
||||
"disclaimer": "Bu emülatör oyunları doğrudan {{link}} adresinden yükler. {{about}} sayfasında daha fazla bilgi edinin."
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "İsim",
|
||||
"group": "Grup",
|
||||
"category": "Kategori",
|
||||
"region": "Bölge",
|
||||
"type": "Tür",
|
||||
"size": "Boyut",
|
||||
"date": "Tarih",
|
||||
"score": "Alaka Düzeyi",
|
||||
"play": "Oyna"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "Hata",
|
||||
"message": "Bir şeyler yanlış gitti",
|
||||
"details": "Hata detayları: {{message}}",
|
||||
"back_home": "Ana Sayfaya Dön",
|
||||
"go_back": "Geri Dön"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
149
config/locales/zh.json
Normal file
149
config/locales/zh.json
Normal file
@@ -0,0 +1,149 @@
|
||||
{
|
||||
"app": {
|
||||
"name": "Myrient Search",
|
||||
"description": "Myrient的搜索引擎 - 由Erista提供的视频游戏保存服务。",
|
||||
"tagline": "Myrient提供组织完善的公开视频游戏收藏,防止它们随时间流逝而消失。",
|
||||
"disclaimer": "与Myrient/Erista无关!"
|
||||
},
|
||||
"nav": {
|
||||
"settings": "设置",
|
||||
"emulators": "模拟器",
|
||||
"about": "关于",
|
||||
"search": "搜索",
|
||||
"results": "结果"
|
||||
},
|
||||
"search": {
|
||||
"placeholder": "搜索...",
|
||||
"button": "搜索",
|
||||
"lucky": "手气不错",
|
||||
"found": "找到{{count}}个结果",
|
||||
"found_plural": "找到{{count}}个结果",
|
||||
"in_seconds": "用时{{seconds}}秒",
|
||||
"indexing": "索引正在进行中,如果列表中缺少内容,请稍后再试",
|
||||
"non_game_filter": "非游戏内容过滤已启用",
|
||||
"displaying_results": "显示第{{start}}至{{end}}条结果。"
|
||||
},
|
||||
"about": {
|
||||
"title": "关于",
|
||||
"support": "如果您喜欢这个项目,请考虑支持Myrient:",
|
||||
"donate": "捐赠给Myrient",
|
||||
"emulator": {
|
||||
"title": "内置模拟器",
|
||||
"description": "本网站内置由EmulatorJS提供支持的模拟器,让您可以直接在浏览器中玩复古游戏。",
|
||||
"compatibility": "兼容的游戏在搜索结果页面上会显示播放按钮。",
|
||||
"browser_tip": "为获得最佳游戏体验,请使用开启了硬件加速的Chromium内核浏览器。",
|
||||
"save_states": "游戏直接从Myrient的公共档案加载。存档保存在浏览器本地。",
|
||||
"limitations": "ROM修改、音轨和其他非游戏内容不受模拟器支持,可能无法加载。",
|
||||
"disabled": "网页模拟器功能已被管理员禁用。",
|
||||
"contact": "请联系管理员或自行部署Myrient Search实例。"
|
||||
},
|
||||
"credits": {
|
||||
"created_by": "搜索引擎开发者:",
|
||||
"view_github": "在GitHub上查看项目"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"title": "设置",
|
||||
"search_columns": {
|
||||
"title": "搜索列",
|
||||
"tooltip": "选择搜索引擎将在哪些列中进行搜索。"
|
||||
},
|
||||
"score_multiplier": {
|
||||
"title": "搜索分数倍数",
|
||||
"tooltip": "根据找到单词的类别为每个匹配词调整分数权重。"
|
||||
},
|
||||
"extras": {
|
||||
"title": "高级选项",
|
||||
"fuzzy": {
|
||||
"label": "模糊搜索",
|
||||
"tooltip": "设置0.00到1.00之间的值,决定单词相似度(莱文斯坦距离)的匹配阈值。值越高允许越宽松的匹配。设为0则禁用此功能。"
|
||||
},
|
||||
"prefix": {
|
||||
"label": "允许前缀匹配",
|
||||
"tooltip": "允许匹配单词的开头部分。"
|
||||
},
|
||||
"match_all": {
|
||||
"label": "匹配所有关键词",
|
||||
"tooltip": "要求搜索查询中的所有关键词都必须匹配。"
|
||||
},
|
||||
"hide_non_game": {
|
||||
"label": "隐藏非游戏内容",
|
||||
"tooltip": "从搜索结果中过滤掉ROM修改、补丁、游戏插图等非游戏内容。"
|
||||
}
|
||||
},
|
||||
"save": "保存设置"
|
||||
},
|
||||
"footer": {
|
||||
"queries": "查询次数:",
|
||||
"files": "已知文件:",
|
||||
"terms": "索引词数:",
|
||||
"last_crawl": "最近更新时间:"
|
||||
},
|
||||
"emulator": {
|
||||
"loading": {
|
||||
"rom": "正在加载ROM...",
|
||||
"downloading": "正在下载ROM",
|
||||
"downloading_progress": "下载进度:{{percent}}%",
|
||||
"decompressing": "正在解压游戏..."
|
||||
},
|
||||
"error": {
|
||||
"loading": "加载游戏时出错",
|
||||
"no_rom": "在压缩包中未找到ROM文件",
|
||||
"http_error": "HTTP错误!状态:{{status}}"
|
||||
},
|
||||
"warning": {
|
||||
"non_game": "警告:此文件可能不是游戏ROM,可能无法在网页模拟器中正常运行。",
|
||||
"see_about": "更多信息请参阅{{link}}页面。",
|
||||
"no_data": "没有可用的模拟器数据。",
|
||||
"https": "不安全的HTTP连接:部分模拟器需要HTTPS才能正常运行。当前站点配置不正确。"
|
||||
},
|
||||
"console": {
|
||||
"about": "这是一个在线模拟器,直接从Myrient的公共档案运行游戏ROM。",
|
||||
"disclaimer": "本网站不托管任何游戏ROM。所有内容都直接从Myrient服务器加载。",
|
||||
"more_info": "有关此服务的更多信息,请访问关于页面。"
|
||||
},
|
||||
"recommended": "推荐模拟器",
|
||||
"download": "下载",
|
||||
"play": "开始游戏",
|
||||
"not_available": "----",
|
||||
"disclaimer": "此模拟器直接从{{link}}加载游戏。在{{about}}页面了解更多。"
|
||||
},
|
||||
"results": {
|
||||
"table": {
|
||||
"name": "名称",
|
||||
"group": "分组",
|
||||
"category": "类别",
|
||||
"region": "地区",
|
||||
"type": "类型",
|
||||
"size": "大小",
|
||||
"date": "日期",
|
||||
"score": "相关度",
|
||||
"play": "开始游戏"
|
||||
}
|
||||
},
|
||||
"error": {
|
||||
"title": "错误",
|
||||
"message": "出现了问题",
|
||||
"details": "错误详情: {{message}}",
|
||||
"back_home": "返回首页",
|
||||
"go_back": "返回"
|
||||
},
|
||||
"languages": {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"pt": "Português",
|
||||
"zh": "中文",
|
||||
"ja": "日本語",
|
||||
"fr": "Français",
|
||||
"de": "Deutsch",
|
||||
"ko": "한국어",
|
||||
"pl": "Polski",
|
||||
"tr": "Türkçe",
|
||||
"it": "Italiano",
|
||||
"romaji": "Romaji",
|
||||
"hi": "हिन्दी",
|
||||
"ar": "العربية",
|
||||
"bn": "বাংলা",
|
||||
"ru": "Русский"
|
||||
}
|
||||
}
|
||||
@@ -131,6 +131,10 @@ const systemConfigs = {
|
||||
core: 'pcsx_rearmed',
|
||||
unpackRoms: true
|
||||
},
|
||||
'Sony PlayStation Portable': {
|
||||
core: 'ppsspp',
|
||||
unpackRoms: true
|
||||
},
|
||||
|
||||
// Other Systems
|
||||
// 'Arcade': { // TODO: fix rom loading
|
||||
@@ -195,7 +199,6 @@ export function getEmulatorConfig(category) {
|
||||
core: systemConfig.core,
|
||||
system: category,
|
||||
unpackRoms: systemConfig.unpackRoms,
|
||||
options: {},
|
||||
bios: systemConfig.bios || null
|
||||
};
|
||||
|
||||
|
||||
@@ -34,6 +34,25 @@
|
||||
["mastersystem", "ms", "master system"],
|
||||
["wii", "revolution"],
|
||||
["bros", "brothers", "bros."],
|
||||
["bros.", "brothers", "bros"]
|
||||
["bros.", "brothers", "bros"],
|
||||
["playstation4", "ps4", "playstation 4"],
|
||||
["playstation5", "ps5", "playstation 5"],
|
||||
["playstationportable", "psp", "playstation portable"],
|
||||
["nintendoswitch", "switch", "nx"],
|
||||
["nintendo3ds", "3ds", "three ds"],
|
||||
["nintendods", "ds", "dual screen"],
|
||||
["nintendo64", "n64", "ultra 64"],
|
||||
["wiiu", "wii u"],
|
||||
["atari2600", "vcs", "video computer system"],
|
||||
["segasaturn", "saturn"],
|
||||
["genesis", "mega drive", "sega genesis"],
|
||||
["virtualboy", "vb", "virtual boy"],
|
||||
["playstationvr", "psvr", "playstation vr"],
|
||||
["pcengine", "pc engine", "turbografx"],
|
||||
["neogeo", "neo geo", "mvs"],
|
||||
["xboxone", "xone", "xbox one"],
|
||||
["xboxseriesx", "xsx", "xbox series x"],
|
||||
["xboxseriess", "xss", "xbox series s"],
|
||||
["amiibo", "nfc figure"]
|
||||
]
|
||||
}
|
||||
189
package-lock.json
generated
189
package-lock.json
generated
@@ -7,11 +7,13 @@
|
||||
"dependencies": {
|
||||
"@elastic/elasticsearch": "^8.12.2",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-parser": "^1.4.7",
|
||||
"dotenv": "^16.4.5",
|
||||
"ejs": "^3.1.10",
|
||||
"express": "^4.21.1",
|
||||
"figlet": "^1.7.0",
|
||||
"file-older-than": "^1.0.0",
|
||||
"i18n": "^0.15.1",
|
||||
"innertext": "^1.0.3",
|
||||
"jsdom": "^25.0.1",
|
||||
"jszip": "^3.10.1",
|
||||
@@ -23,7 +25,8 @@
|
||||
"piscina": "^4.7.0",
|
||||
"sanitize": "^2.1.2",
|
||||
"sequelize": "^6.37.1",
|
||||
"sequelize-cli": "^6.6.2"
|
||||
"sequelize-cli": "^6.6.2",
|
||||
"uuid": "^11.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@elastic/elasticsearch": {
|
||||
@@ -98,6 +101,50 @@
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@messageformat/core": {
|
||||
"version": "3.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.4.0.tgz",
|
||||
"integrity": "sha512-NgCFubFFIdMWJGN5WuQhHCNmzk7QgiVfrViFxcS99j7F5dDS5EP6raR54I+2ydhe4+5/XTn/YIEppFaqqVWHsw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@messageformat/date-skeleton": "^1.0.0",
|
||||
"@messageformat/number-skeleton": "^1.0.0",
|
||||
"@messageformat/parser": "^5.1.0",
|
||||
"@messageformat/runtime": "^3.0.1",
|
||||
"make-plural": "^7.0.0",
|
||||
"safe-identifier": "^0.4.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@messageformat/date-skeleton": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.1.0.tgz",
|
||||
"integrity": "sha512-rmGAfB1tIPER+gh3p/RgA+PVeRE/gxuQ2w4snFWPF5xtb5mbWR7Cbw7wCOftcUypbD6HVoxrVdyyghPm3WzP5A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@messageformat/number-skeleton": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.2.0.tgz",
|
||||
"integrity": "sha512-xsgwcL7J7WhlHJ3RNbaVgssaIwcEyFkBqxHdcdaiJzwTZAWEOD8BuUFxnxV9k5S0qHN3v/KzUpq0IUpjH1seRg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@messageformat/parser": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.1.tgz",
|
||||
"integrity": "sha512-3p0YRGCcTUCYvBKLIxtDDyrJ0YijGIwrTRu1DT8gIviIDZru8H23+FkY6MJBzM1n9n20CiM4VeDYuBsrrwnLjg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"moo": "^0.5.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@messageformat/runtime": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz",
|
||||
"integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"make-plural": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@napi-rs/nice": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz",
|
||||
@@ -976,6 +1023,28 @@
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-parser": {
|
||||
"version": "1.4.7",
|
||||
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz",
|
||||
"integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"cookie": "0.7.2",
|
||||
"cookie-signature": "1.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-parser/node_modules/cookie": {
|
||||
"version": "0.7.2",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
|
||||
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
@@ -1489,6 +1558,15 @@
|
||||
"type": "^2.7.2"
|
||||
}
|
||||
},
|
||||
"node_modules/fast-printf": {
|
||||
"version": "1.6.10",
|
||||
"resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.10.tgz",
|
||||
"integrity": "sha512-GwTgG9O4FVIdShhbVF3JxOgSBY2+ePGsu2V/UONgoCPzF9VY6ZdBMKsHKCYQHZwNk3qNouUolRDsgVxcVA5G1w==",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">=10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fetch-blob": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
|
||||
@@ -1954,6 +2032,49 @@
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/i18n": {
|
||||
"version": "0.15.1",
|
||||
"resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.1.tgz",
|
||||
"integrity": "sha512-yue187t8MqUPMHdKjiZGrX+L+xcUsDClGO0Cz4loaKUOK9WrGw5pgan4bv130utOwX7fHE9w2iUeHFalVQWkXA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@messageformat/core": "^3.0.0",
|
||||
"debug": "^4.3.3",
|
||||
"fast-printf": "^1.6.9",
|
||||
"make-plural": "^7.0.0",
|
||||
"math-interval-parser": "^2.0.1",
|
||||
"mustache": "^4.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/mashpie"
|
||||
}
|
||||
},
|
||||
"node_modules/i18n/node_modules/debug": {
|
||||
"version": "4.4.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
|
||||
"integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "^2.1.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"supports-color": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/i18n/node_modules/ms": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/iconv-lite": {
|
||||
"version": "0.4.24",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
|
||||
@@ -2230,6 +2351,21 @@
|
||||
"es5-ext": "~0.10.2"
|
||||
}
|
||||
},
|
||||
"node_modules/make-plural": {
|
||||
"version": "7.4.0",
|
||||
"resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.4.0.tgz",
|
||||
"integrity": "sha512-4/gC9KVNTV6pvYg2gFeQYTW3mWaoJt7WZE5vrp1KnQDgW92JtYZnzmZT81oj/dUTqAIu0ufI2x3dkgu3bB1tYg==",
|
||||
"license": "Unicode-DFS-2016"
|
||||
},
|
||||
"node_modules/math-interval-parser": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
|
||||
"integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
@@ -2351,12 +2487,27 @@
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/moo": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
|
||||
"integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/mustache": {
|
||||
"version": "4.2.0",
|
||||
"resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
|
||||
"integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"mustache": "bin/mustache"
|
||||
}
|
||||
},
|
||||
"node_modules/negotiator": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
|
||||
@@ -2384,6 +2535,15 @@
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-cron/node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/node-domexception": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
|
||||
@@ -2871,6 +3031,12 @@
|
||||
],
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/safe-identifier": {
|
||||
"version": "0.4.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
|
||||
"integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
||||
@@ -3094,6 +3260,15 @@
|
||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/sequelize/node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/serve-static": {
|
||||
"version": "1.16.2",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
|
||||
@@ -3529,12 +3704,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/uuid": {
|
||||
"version": "8.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
|
||||
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
|
||||
"version": "11.1.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
|
||||
"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
|
||||
"funding": [
|
||||
"https://github.com/sponsors/broofa",
|
||||
"https://github.com/sponsors/ctavan"
|
||||
],
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"uuid": "dist/bin/uuid"
|
||||
"uuid": "dist/esm/bin/uuid"
|
||||
}
|
||||
},
|
||||
"node_modules/validator": {
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
"dependencies": {
|
||||
"@elastic/elasticsearch": "^8.12.2",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-parser": "^1.4.7",
|
||||
"dotenv": "^16.4.5",
|
||||
"ejs": "^3.1.10",
|
||||
"express": "^4.21.1",
|
||||
"figlet": "^1.7.0",
|
||||
"file-older-than": "^1.0.0",
|
||||
"i18n": "^0.15.1",
|
||||
"innertext": "^1.0.3",
|
||||
"jsdom": "^25.0.1",
|
||||
"jszip": "^3.10.1",
|
||||
@@ -18,7 +20,8 @@
|
||||
"piscina": "^4.7.0",
|
||||
"sanitize": "^2.1.2",
|
||||
"sequelize": "^6.37.1",
|
||||
"sequelize-cli": "^6.6.2"
|
||||
"sequelize-cli": "^6.6.2",
|
||||
"uuid": "^11.1.0"
|
||||
},
|
||||
"type": "module"
|
||||
}
|
||||
|
||||
200
server.js
200
server.js
@@ -8,11 +8,14 @@ import http from "http";
|
||||
import sanitize from "sanitize";
|
||||
import debugPrint from "./lib/debugprint.js";
|
||||
import compression from "compression";
|
||||
import cookieParser from 'cookie-parser';
|
||||
import { generateAsciiArt } from './lib/asciiart.js';
|
||||
import { getEmulatorConfig, isEmulatorCompatible, isNonGameContent } from './lib/emulatorConfig.js';
|
||||
import fetch from 'node-fetch';
|
||||
import { initDB, File, QueryCount } from './lib/database.js';
|
||||
import { initElasticsearch } from './lib/services/elasticsearch.js';
|
||||
import i18n, { locales } from './config/i18n.js';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
let categoryListPath = "./lib/categories.json"
|
||||
let searchAlikesPath = './lib/searchalikes.json'
|
||||
@@ -93,11 +96,64 @@ function updateDefaults(){
|
||||
|
||||
let app = express();
|
||||
let server = http.createServer(app);
|
||||
|
||||
app.use((req, res, next) => {
|
||||
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
||||
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
|
||||
next();
|
||||
});
|
||||
|
||||
app.use(sanitize.middleware);
|
||||
app.use(compression())
|
||||
app.use(express.json())
|
||||
app.use(cookieParser())
|
||||
app.set("view engine", "ejs");
|
||||
|
||||
app.use((req, res, next) => {
|
||||
req.requestId = uuidv4();
|
||||
next();
|
||||
});
|
||||
|
||||
app.use(i18n.init);
|
||||
|
||||
// Add language detection middleware
|
||||
app.use((req, res, next) => {
|
||||
// check query parameter (dropdown)
|
||||
let lang = null;
|
||||
if (req.query.lang) {
|
||||
lang = locales.includes(req.query.lang) ? req.query.lang : null;
|
||||
}
|
||||
|
||||
// check cookie
|
||||
if (!lang && req.cookies.lang) {
|
||||
// Verify the cookie language is available
|
||||
lang = locales.includes(req.cookies.lang) ? req.cookies.lang : null;
|
||||
}
|
||||
|
||||
// check browser locale
|
||||
if (!lang) {
|
||||
lang = req.acceptsLanguages(locales);
|
||||
}
|
||||
|
||||
// Fallback to English
|
||||
if (!lang) {
|
||||
lang = 'en';
|
||||
}
|
||||
req.setLocale(lang);
|
||||
res.locals.locale = lang;
|
||||
|
||||
res.locals.availableLocales = locales;
|
||||
|
||||
res.cookie('lang', lang, { maxAge: 365 * 24 * 60 * 60 * 1000 }); // 1 year
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
// Add helper function to all templates
|
||||
app.locals.__ = function() {
|
||||
return i18n.__.apply(this, arguments);
|
||||
};
|
||||
|
||||
app.get("/", function (req, res) {
|
||||
let page = "search";
|
||||
res.render(indexPage, buildOptions(page));
|
||||
@@ -231,19 +287,17 @@ app.get("/play/:id", async function (req, res) {
|
||||
res.render(indexPage, options);
|
||||
});
|
||||
|
||||
app.get("/proxy-rom/:id", async function (req, res) {
|
||||
app.get("/proxy-rom/:id", async function (req, res, next) {
|
||||
// Block access if emulator is disabled
|
||||
if (process.env.EMULATOR_ENABLED !== 'true') {
|
||||
res.status(403).send('Emulator feature is disabled');
|
||||
return;
|
||||
return next(new Error('Emulator feature is disabled'));
|
||||
}
|
||||
|
||||
let fileId = parseInt(req.params.id);
|
||||
let romFile = await search.findIndex(fileId);
|
||||
|
||||
if (!romFile) {
|
||||
res.status(404).send('ROM not found');
|
||||
return;
|
||||
return next(new Error('ROM not found'));
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -254,26 +308,29 @@ app.get("/proxy-rom/:id", async function (req, res) {
|
||||
res.setHeader('Content-Length', contentLength);
|
||||
res.setHeader('Content-Disposition', `attachment; filename="${romFile.filename}"`);
|
||||
|
||||
// Add all required cross-origin headers
|
||||
res.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
|
||||
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
|
||||
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
||||
|
||||
response.body.pipe(res);
|
||||
} catch (error) {
|
||||
console.error('Error proxying ROM:', error);
|
||||
res.status(500).send('Error fetching ROM');
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/proxy-bios", async function (req, res) {
|
||||
app.get("/proxy-bios", async function (req, res, next) {
|
||||
// Block access if emulator is disabled
|
||||
if (process.env.EMULATOR_ENABLED !== 'true') {
|
||||
res.status(403).send('Emulator feature is disabled');
|
||||
return;
|
||||
return next(new Error('Emulator feature is disabled'));
|
||||
}
|
||||
|
||||
const biosUrl = req.query.url;
|
||||
|
||||
// Validate that URL is from GitHub
|
||||
if (!biosUrl || !biosUrl.startsWith('https://github.com')) {
|
||||
res.status(403).send('Invalid BIOS URL - only GitHub URLs are allowed');
|
||||
return;
|
||||
return next(new Error('Invalid BIOS URL - only GitHub URLs are allowed'));
|
||||
}
|
||||
|
||||
try {
|
||||
@@ -289,10 +346,66 @@ app.get("/proxy-bios", async function (req, res) {
|
||||
res.setHeader('Content-Type', contentType || 'application/octet-stream');
|
||||
res.setHeader('Content-Length', contentLength);
|
||||
|
||||
// Add all required cross-origin headers
|
||||
res.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
|
||||
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
|
||||
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
||||
|
||||
response.body.pipe(res);
|
||||
} catch (error) {
|
||||
console.error('Error proxying BIOS:', error);
|
||||
res.status(500).send('Error fetching BIOS file');
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
|
||||
// Proxy route for EmulatorJS content
|
||||
app.get('/emulatorjs/*', async function (req, res, next) {
|
||||
try {
|
||||
// Extract the path after /emulatorjs/
|
||||
const filePath = req.path.replace(/^\/emulatorjs\//, '');
|
||||
|
||||
// Support both stable and latest paths
|
||||
const emulatorJsUrl = `https://cdn.emulatorjs.org/stable/${filePath}`;
|
||||
|
||||
const response = await fetch(emulatorJsUrl, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'
|
||||
}
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
// Copy content type and length
|
||||
const contentType = response.headers.get('content-type');
|
||||
if (contentType) {
|
||||
res.setHeader('Content-Type', contentType);
|
||||
}
|
||||
|
||||
const contentLength = response.headers.get('content-length');
|
||||
if (contentLength) {
|
||||
res.setHeader('Content-Length', contentLength);
|
||||
}
|
||||
|
||||
// Set special headers for WASM files
|
||||
if (filePath.endsWith('.wasm')) {
|
||||
res.setHeader('Content-Type', 'application/wasm');
|
||||
}
|
||||
|
||||
// Special handling for JavaScript files
|
||||
if (filePath.endsWith('.js')) {
|
||||
res.setHeader('Content-Type', 'application/javascript');
|
||||
}
|
||||
|
||||
res.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
|
||||
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
|
||||
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
||||
|
||||
response.body.pipe(res);
|
||||
} catch (error) {
|
||||
console.error('Error proxying EmulatorJS content:', error);
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -306,6 +419,69 @@ app.get("/api/emulators", function (req, res) {
|
||||
res.json(emulatorsData);
|
||||
});
|
||||
|
||||
app.get("/proxy-image", async function (req, res, next) {
|
||||
const imageUrl = req.query.url;
|
||||
|
||||
if (!imageUrl) {
|
||||
return next(new Error('No image URL provided'));
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(imageUrl, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36'
|
||||
}
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
// Copy content type
|
||||
const contentType = response.headers.get('content-type');
|
||||
if (contentType) {
|
||||
res.setHeader('Content-Type', contentType);
|
||||
}
|
||||
|
||||
const contentLength = response.headers.get('content-length');
|
||||
if (contentLength) {
|
||||
res.setHeader('Content-Length', contentLength);
|
||||
}
|
||||
|
||||
response.body.pipe(res);
|
||||
} catch (error) {
|
||||
console.error('Error proxying image:', error);
|
||||
next(error);
|
||||
}
|
||||
});
|
||||
|
||||
// 404 handler
|
||||
app.use((req, res, next) => {
|
||||
const err = new Error('Page Not Found');
|
||||
err.status = 404;
|
||||
next(err);
|
||||
});
|
||||
|
||||
// Error handling middleware
|
||||
app.use((err, req, res, next) => {
|
||||
const status = err.status || 500;
|
||||
const message = err.message || 'An unexpected error occurred';
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
res.status(status);
|
||||
|
||||
res.render('pages/error', {
|
||||
status,
|
||||
message,
|
||||
stack: process.env.NODE_ENV !== 'production' ? err.stack : null,
|
||||
req,
|
||||
requestId: req.requestId
|
||||
});
|
||||
});
|
||||
|
||||
server.listen(process.env.PORT, process.env.BIND_ADDRESS);
|
||||
server.on("listening", function () {
|
||||
console.log(
|
||||
|
||||
@@ -2,54 +2,57 @@
|
||||
<div class="col-sm-12 my-auto text-center">
|
||||
<pre style="font: 20px / 19px monospace; color: white; text-align: center; overflow: hidden;">
|
||||
<%= generateAsciiArt() %>
|
||||
About
|
||||
<%= __('about.title') %>
|
||||
</pre>
|
||||
<div class="card w-auto mx-auto text-center d-inline-block p-3">
|
||||
<div class="about-content">
|
||||
<h4>About <%= process.env.INSTANCE_NAME || 'Myrient' %> Search</h4>
|
||||
<p>A search engine for <a href="https://github.com/alexankitty/myrient-global-search">Myrient</a> -
|
||||
a service by Erista dedicated to video game preservation.</p>
|
||||
<p>Myrient offers organized and publicly available video game collections, keeping them from becoming
|
||||
lost to time.</p>
|
||||
<p class="text-secondary mb-4">Not affiliated with Myrient/Erista!</p>
|
||||
<h4><%= __('about.title') %> <%= process.env.INSTANCE_NAME || 'Myrient' %> Search</h4>
|
||||
<p><%= __('app.description') %></p>
|
||||
<p><%= __('app.tagline') %></p>
|
||||
<p class="text-secondary mb-4"><%= __('app.disclaimer') %></p>
|
||||
|
||||
<div class="mb-4">
|
||||
<p>If you like this project, please consider supporting Myrient:</p>
|
||||
<a href="https://myrient.erista.me/donate/" class="btn btn-secondary">Donate to Myrient</a>
|
||||
<p><%= __('about.support') %></p>
|
||||
<a href="https://myrient.erista.me/donate/" class="btn btn-secondary"><%= __('about.donate') %></a>
|
||||
</div>
|
||||
|
||||
<div class="mb-4 border-top pt-3">
|
||||
<h5>Built-in Emulator</h5>
|
||||
<h5><%= __('about.emulator.title') %></h5>
|
||||
<% if (process.env.EMULATOR_ENABLED === 'true') { %>
|
||||
<p>This website includes a built-in emulator powered by <a href="https://emulatorjs.org/">EmulatorJS</a> that brings retro gaming directly to your browser.</p>
|
||||
<p>Compatible games will feature a play button on their search result page.</p>
|
||||
<p><%= __('about.emulator.description') %></p>
|
||||
<p><%= __('about.emulator.compatibility') %></p>
|
||||
|
||||
<p>For the best gaming experience, use a Chromium-based browser with hardware acceleration turned on.</p>
|
||||
<p><%= __('about.emulator.browser_tip') %></p>
|
||||
|
||||
<p class="text-secondary">
|
||||
<small>
|
||||
<i class="fas fa-info-circle"></i>
|
||||
Games are loaded directly from Myrient's public archive. Save states are stored locally in the browser.
|
||||
<%= __('about.emulator.save_states') %>
|
||||
</small>
|
||||
<br>
|
||||
<small>
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
ROM hacks, soundtracks, and other non-game content are not supported by the emulator and may fail to load.
|
||||
<%= __('about.emulator.limitations') %>
|
||||
</small>
|
||||
</p>
|
||||
|
||||
<% } else { %>
|
||||
<p>Web Emulator functionality was disabled by the administrator.</p>
|
||||
<p>Contact the administrator or spin up your own instance of <%= process.env.INSTANCE_NAME || 'Myrient' %> Search.</p>
|
||||
<p><%= __('about.emulator.disabled') %></p>
|
||||
<p><%= __('about.emulator.contact') %></p>
|
||||
<% } %>
|
||||
</div>
|
||||
|
||||
<div class="border-top pt-3">
|
||||
<p>Search engine created by <a href="https://github.com/alexankitty">Alexankitty</a></p>
|
||||
<p><a href="https://github.com/alexankitty/myrient-global-search">View project on GitHub</a></p>
|
||||
<p><%= __('about.credits.created_by') %> <a href="https://github.com/alexankitty">Alexankitty</a></p>
|
||||
<div class="mb-3">
|
||||
<a href="https://github.com/alexankitty/Myrient-Search-Engine/graphs/contributors">
|
||||
<img src="/proxy-image?url=<%= encodeURIComponent('https://contrib.rocks/image?repo=alexankitty/Myrient-Search-Engine') %>" alt="Contributors" />
|
||||
</a>
|
||||
</div>
|
||||
<p><a href="https://github.com/alexankitty/myrient-global-search"><%= __('about.credits.view_github') %></a></p>
|
||||
<a href='https://ko-fi.com/Q5Q4IFNAO' target='_blank'>
|
||||
<img height='36' style='border:0px;height:36px;'
|
||||
src='https://storage.ko-fi.com/cdn/kofi5.png?v=3' alt='Buy Me a Coffee at ko-fi.com' />
|
||||
src='/proxy-image?url=<%= encodeURIComponent("https://storage.ko-fi.com/cdn/kofi5.png?v=3") %>' alt='Buy Me a Coffee at ko-fi.com' />
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,292 +1,410 @@
|
||||
<div class="container-fluid">
|
||||
<!-- Header with game info -->
|
||||
<div class="row mb-4 mt-3">
|
||||
<div class="col-12 text-center">
|
||||
<h2 class="text-white"><%= romFile.filename.replace(/\.[^/.]+$/, '') %></h2>
|
||||
<p class="text-secondary"><%= romFile.category %></p>
|
||||
<div class="container-fluid">
|
||||
<!-- Header with game info -->
|
||||
<div class="row mb-4 mt-3">
|
||||
<div class="col-12 text-center">
|
||||
<h2 class="text-white"><%= romFile.filename.replace(/\.[^/.]+$/, '') %></h2>
|
||||
<p class="text-secondary"><%= romFile.category %></p>
|
||||
|
||||
<% if (isNonGame) { %>
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
Warning: This file may not be a game ROM and might not work properly in the web emulator.
|
||||
See the <a href="/about" class="alert-link">About</a> page for more information.
|
||||
<% if (isNonGame) { %>
|
||||
<div class="alert alert-warning" role="alert">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
<%= __('emulator.warning.non_game') %>
|
||||
<%= __('emulator.warning.see_about', { link: __('nav.about') }) %>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<!-- Security and Compatibility Warnings -->
|
||||
<div id="security-warnings"></div>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main game container with proper padding and height -->
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-lg-10 col-xl-8">
|
||||
<div id="game-wrapper" class="position-relative">
|
||||
<div id="game" class="w-100"></div>
|
||||
<!-- Progress bar inside game container -->
|
||||
<div id="progress-container" class="progress-overlay">
|
||||
<div class="progress" style="height: 25px; background-color: #2a2a2a; width: 80%; max-width: 500px;">
|
||||
<div class="progress-bar progress-bar-striped progress-bar-animated"
|
||||
role="progressbar"
|
||||
style="width: 0%"
|
||||
id="download-progress">
|
||||
<span id="progress-text">Loading ROM...</span>
|
||||
<!-- Main game container with proper padding and height -->
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-12 col-lg-10 col-xl-8">
|
||||
<div id="game-wrapper" class="position-relative">
|
||||
<div id="game" class="w-100"></div>
|
||||
<!-- Progress bar inside game container -->
|
||||
<div id="progress-container" class="progress-overlay">
|
||||
<div class="progress" style="height: 25px; background-color: #2a2a2a; width: 80%; max-width: 500px;">
|
||||
<div class="progress-bar progress-bar-striped progress-bar-animated"
|
||||
role="progressbar"
|
||||
style="width: 0%"
|
||||
id="download-progress">
|
||||
<span id="progress-text"><%= __('emulator.loading.rom') %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Disclaimer footer -->
|
||||
<div class="row mt-4 mb-3">
|
||||
<div class="col-12 text-center">
|
||||
<div class="alert alert-secondary" role="alert">
|
||||
<small>
|
||||
<i class="fas fa-info-circle"></i>
|
||||
This emulator loads ROMs directly from <a href="https://myrient.erista.me/" class="alert-link">Myrient</a> and is not affiliated with them.
|
||||
See the <a href="/about" class="alert-link">About</a> page for more information.
|
||||
</small>
|
||||
<!-- Disclaimer footer -->
|
||||
<div class="row mt-4 mb-3">
|
||||
<div class="col-12 text-center">
|
||||
<div class="alert alert-secondary" role="alert">
|
||||
<small>
|
||||
<i class="fas fa-info-circle"></i>
|
||||
<%= __('emulator.disclaimer', { link: 'Myrient', about: __('nav.about') }) %>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Only keep basic container styling */
|
||||
#game-wrapper {
|
||||
padding-top: 0;
|
||||
background: #222;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 20px;
|
||||
max-width: 1024px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/* Keep only the aspect ratio for the game container */
|
||||
#game {
|
||||
aspect-ratio: 4/3;
|
||||
max-height: 700px;
|
||||
}
|
||||
|
||||
/* Keep alert styling for consistency */
|
||||
.alert-secondary {
|
||||
background-color: #2a2a2a;
|
||||
border-color: #3a3a3a;
|
||||
color: #999;
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
padding: 0.75rem 1.25rem;
|
||||
}
|
||||
|
||||
.alert-secondary a.alert-link {
|
||||
color: #bbb;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.alert-secondary a.alert-link:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.progress-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
display: none; /* Hidden by default */
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.progress {
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
#progress-text {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.alert-warning {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
padding: 0.75rem 1.25rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>
|
||||
<script>
|
||||
// Display important notice immediately
|
||||
console.log('%cAbout this Page', 'font-size: 20px; font-weight: bold; color: #4CAF50;');
|
||||
console.log(
|
||||
'%cThis page contains a game emulator that provides access to games through Myrient\'s public archive.\n' +
|
||||
'We are not affiliated with or endorsed by Myrient.\n' +
|
||||
'Visit the About page for more details on how this integration works and other important information.',
|
||||
'font-size: 14px; color: #90CAF9;'
|
||||
);
|
||||
console.log(`%c${window.location.origin}/about`, 'font-size: 14px; color: #90CAF9;');
|
||||
|
||||
// Configure EmulatorJS
|
||||
console.log('[Emulator] Starting emulator configuration');
|
||||
console.log('[Emulator] System:', '<%= emulatorConfig.system %>');
|
||||
console.log('[Emulator] Core:', '<%= emulatorConfig.core %>');
|
||||
|
||||
window.EJS_player = '#game';
|
||||
window.EJS_core = '<%= emulatorConfig.core %>';
|
||||
window.EJS_gameUrl = '/proxy-rom/<%= romFile.id %>';
|
||||
window.EJS_pathtodata = 'https://cdn.emulatorjs.org/stable/data/';
|
||||
window.EJS_startOnLoaded = true;
|
||||
window.EJS_gameName = '<%= romFile.filename.replace(/\.[^/.]+$/, "") %>';
|
||||
window.EJS_backgroundBlur = true;
|
||||
window.EJS_defaultOptions = {
|
||||
'save-state-slot': 1,
|
||||
'save-state-location': 'local'
|
||||
};
|
||||
|
||||
// BIOS configuration
|
||||
window.EJS_biosUrl = <% if (emulatorConfig.bios) { %>
|
||||
'/proxy-bios?url=' + encodeURIComponent(<%- JSON.stringify(Object.values(emulatorConfig.bios.files)[0].url) %>)
|
||||
<% } else { %>
|
||||
undefined
|
||||
<% } %>;
|
||||
|
||||
console.log('[Emulator] BIOS configuration:', window.EJS_biosUrl);
|
||||
|
||||
// Required for Sega CD ??
|
||||
window.EJS_loadStateURL = window.location.href;
|
||||
window.EJS_saveStateURL = window.location.href;
|
||||
window.EJS_cheats = true;
|
||||
|
||||
// Add error event listener for the emulator
|
||||
window.EJS_onGameStart = () => {
|
||||
console.log('[Emulator] Game started successfully');
|
||||
};
|
||||
|
||||
window.EJS_onLoadState = (state) => {
|
||||
console.log('[Emulator] Load state:', state);
|
||||
};
|
||||
|
||||
window.EJS_onSaveState = (state) => {
|
||||
console.log('[Emulator] Save state:', state);
|
||||
};
|
||||
|
||||
window.EJS_onLoadError = (error) => {
|
||||
console.error('[Emulator] Load error:', error);
|
||||
};
|
||||
|
||||
async function loadRom() {
|
||||
try {
|
||||
console.log('[Emulator] Starting ROM load process');
|
||||
const progressContainer = document.getElementById('progress-container');
|
||||
const progressBar = document.getElementById('download-progress');
|
||||
const progressText = document.getElementById('progress-text');
|
||||
progressContainer.style.display = 'flex';
|
||||
|
||||
const isCompressed = /\.(zip|7z)$/i.test('<%= romFile.filename %>');
|
||||
const shouldUnpack = <%= emulatorConfig.unpackRoms %>;
|
||||
console.log(`[Emulator] ROM compression status: ${isCompressed ? 'compressed' : 'uncompressed'}`);
|
||||
console.log(`[Emulator] Should unpack: ${shouldUnpack}`);
|
||||
|
||||
progressText.textContent = 'Downloading ROM...';
|
||||
console.log('[Emulator] Initiating ROM download');
|
||||
|
||||
const response = await fetch(EJS_gameUrl);
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
<style>
|
||||
/* Only keep basic container styling */
|
||||
#game-wrapper {
|
||||
padding-top: 0;
|
||||
background: #222;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
margin-bottom: 20px;
|
||||
max-width: 1024px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
// If we're not unpacking, still show download progress but return direct URL
|
||||
if (!isCompressed || !shouldUnpack) {
|
||||
const contentLength = response.headers.get('content-length');
|
||||
const total = parseInt(contentLength, 10);
|
||||
let loaded = 0;
|
||||
|
||||
const reader = response.body.getReader();
|
||||
const chunks = [];
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
|
||||
chunks.push(value);
|
||||
loaded += value.length;
|
||||
|
||||
const percent = Math.round((loaded / total) * 100);
|
||||
progressBar.style.width = percent + '%';
|
||||
progressText.textContent = `Downloading ROM: ${percent}%`;
|
||||
}
|
||||
|
||||
console.log('[Emulator] Using direct URL for ROM');
|
||||
progressContainer.style.display = 'none';
|
||||
|
||||
// Create blob from chunks for direct loading
|
||||
const blob = new Blob(chunks);
|
||||
return URL.createObjectURL(blob);
|
||||
/* Keep only the aspect ratio for the game container */
|
||||
#game {
|
||||
aspect-ratio: 4/3;
|
||||
max-height: 700px;
|
||||
}
|
||||
|
||||
// For compressed files that need unpacking, continue with decompression
|
||||
const contentLength = response.headers.get('content-length');
|
||||
const total = parseInt(contentLength, 10);
|
||||
let loaded = 0;
|
||||
|
||||
const reader = response.body.getReader();
|
||||
const chunks = [];
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
|
||||
chunks.push(value);
|
||||
loaded += value.length;
|
||||
|
||||
const percent = Math.round((loaded / total) * 100);
|
||||
progressBar.style.width = percent + '%';
|
||||
progressText.textContent = `Downloading ROM: ${percent}%`;
|
||||
/* Keep alert styling for consistency */
|
||||
.alert-secondary {
|
||||
background-color: #2a2a2a;
|
||||
border-color: #3a3a3a;
|
||||
color: #999;
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
padding: 0.75rem 1.25rem;
|
||||
}
|
||||
|
||||
// Decompression phase
|
||||
progressText.textContent = 'Decompressing the game...';
|
||||
console.log('[Emulator] Starting ZIP extraction');
|
||||
|
||||
const blob = new Blob(chunks);
|
||||
const zip = await JSZip.loadAsync(blob);
|
||||
const files = Object.keys(zip.files);
|
||||
console.log('[Emulator] ZIP contents:', files);
|
||||
|
||||
const romFile = files.find(f => !zip.files[f].dir);
|
||||
if (!romFile) {
|
||||
throw new Error('No ROM file found in ZIP archive');
|
||||
.alert-secondary a.alert-link {
|
||||
color: #bbb;
|
||||
text-decoration: underline;
|
||||
}
|
||||
console.log('[Emulator] Found ROM file in ZIP:', romFile);
|
||||
|
||||
const romData = await zip.files[romFile].async('blob');
|
||||
console.log('[Emulator] ROM extraction complete');
|
||||
progressContainer.style.display = 'none';
|
||||
return URL.createObjectURL(romData);
|
||||
} catch (error) {
|
||||
console.error('[Emulator] Error in loadRom:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
.alert-secondary a.alert-link:hover {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
loadRom()
|
||||
.then(romUrl => {
|
||||
console.log('[Emulator] ROM loaded successfully, initializing EmulatorJS');
|
||||
window.EJS_gameUrl = romUrl;
|
||||
const script = document.createElement('script');
|
||||
script.src = `${window.EJS_pathtodata}loader.js`;
|
||||
script.onerror = (error) => {
|
||||
console.error('[Emulator] Failed to load EmulatorJS:', error);
|
||||
.progress-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
display: none; /* Hidden by default */
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
background-color: rgba(0, 0, 0, 0.8);
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
.progress {
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
#progress-text {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.alert-warning {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
padding: 0.75rem 1.25rem;
|
||||
}
|
||||
|
||||
/* Security Warning Styles */
|
||||
.security-alert {
|
||||
text-align: left;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 1rem;
|
||||
padding: 0.75rem 1rem;
|
||||
box-shadow: 0 2px 10px rgba(220, 53, 69, 0.3);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 0.9rem;
|
||||
display: inline-block;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.security-alert::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 4px;
|
||||
height: 100%;
|
||||
background: currentColor;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.security-alert.alert-danger {
|
||||
background-color: rgba(220, 53, 69, 0.1);
|
||||
color: #dc3545;
|
||||
}
|
||||
|
||||
.security-alert.alert-warning {
|
||||
background-color: rgba(255, 193, 7, 0.1);
|
||||
color: #ffc107;
|
||||
}
|
||||
|
||||
.security-alert i {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.security-alert strong {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.security-alert ul {
|
||||
margin-top: 0.75rem;
|
||||
margin-bottom: 0;
|
||||
padding-left: 2.5rem;
|
||||
color: #e9ecef;
|
||||
}
|
||||
|
||||
.security-alert ul li {
|
||||
margin: 0.5rem 0;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.security-alert small {
|
||||
display: block;
|
||||
margin-top: 1rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
||||
color: #e9ecef;
|
||||
}
|
||||
|
||||
.security-alert pre {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
border-radius: 4px;
|
||||
padding: 0.75rem;
|
||||
margin: 0.75rem 0 0;
|
||||
color: #e9ecef;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/js/all.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>
|
||||
<script>
|
||||
// Check if in a context that supports SharedArrayBuffer
|
||||
const isHttps = window.location.protocol === 'https:';
|
||||
const hasSharedArrayBuffer = typeof SharedArrayBuffer !== 'undefined';
|
||||
const isCrossOriginIsolated = window.crossOriginIsolated === true;
|
||||
const canUseThreads = hasSharedArrayBuffer && isCrossOriginIsolated;
|
||||
|
||||
// Display security warnings
|
||||
const warningsDiv = document.getElementById('security-warnings');
|
||||
|
||||
if (!isHttps) {
|
||||
warningsDiv.innerHTML += `
|
||||
<div class="alert security-alert alert-danger py-2">
|
||||
<i class="fas fa-exclamation-triangle mr-2"></i>
|
||||
<strong><%= __('emulator.warning.https').split(':')[0] %>:</strong>
|
||||
<%- __('emulator.warning.https').split(':')[1] %>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
// Display important notice immediately
|
||||
console.log('%cAbout this Page', 'font-size: 20px; font-weight: bold; color: #4CAF50;');
|
||||
console.log(
|
||||
'%c<%= __("emulator.console.about") %>\n' +
|
||||
'<%= __("emulator.console.disclaimer") %>\n' +
|
||||
'<%= __("emulator.console.more_info") %>',
|
||||
'font-size: 14px; color: #90CAF9;'
|
||||
);
|
||||
console.log(`%c${window.location.origin}/about`, 'font-size: 14px; color: #90CAF9;');
|
||||
|
||||
// Configure EmulatorJS
|
||||
console.log('[Emulator] Starting emulator configuration');
|
||||
console.log('[Emulator] System:', '<%= emulatorConfig.system %>');
|
||||
console.log('[Emulator] Core:', '<%= emulatorConfig.core %>');
|
||||
|
||||
console.log('[Emulator] SharedArrayBuffer available:', hasSharedArrayBuffer);
|
||||
console.log('[Emulator] Cross-Origin-Isolation status:', isCrossOriginIsolated);
|
||||
console.log('[Emulator] Can use threads:', canUseThreads);
|
||||
|
||||
window.EJS_player = '#game';
|
||||
|
||||
window.EJS_core = '<%= emulatorConfig.core %>';
|
||||
window.EJS_gameUrl = '/proxy-rom/<%= romFile.id %>';
|
||||
window.EJS_pathtodata = '/emulatorjs/data/';
|
||||
window.EJS_startOnLoaded = true;
|
||||
window.EJS_gameID = 1
|
||||
|
||||
// Using threads improves performance by a lot
|
||||
// But also creates freezes, crashes and some emulators need to be reconfigured to work
|
||||
// This should be revisited in the future.
|
||||
// We're using threads only on PSP for now
|
||||
window.EJS_threads = '<%= emulatorConfig.system %>' === 'Sony PlayStation Portable' ? (navigator.hardwareConcurrency || 4) : false;
|
||||
window.EJS_gameName = '<%= romFile.filename.replace(/\.[^/.]+$/, "") %>';
|
||||
window.EJS_backgroundBlur = true;
|
||||
window.EJS_defaultOptions = {
|
||||
'save-state-slot': 1,
|
||||
'save-state-location': 'local'
|
||||
};
|
||||
document.body.appendChild(script);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('[Emulator] Fatal error:', error);
|
||||
const gameDiv = document.getElementById('game');
|
||||
gameDiv.innerHTML = `<div class="alert alert-danger">
|
||||
Error loading game: ${error.message}
|
||||
</div>`;
|
||||
});
|
||||
</script>
|
||||
|
||||
// BIOS configuration
|
||||
window.EJS_biosUrl = <% if (emulatorConfig.bios) { %>
|
||||
'/proxy-bios?url=' + encodeURIComponent(<%- JSON.stringify(Object.values(emulatorConfig.bios.files)[0].url) %>)
|
||||
<% } else { %>
|
||||
undefined
|
||||
<% } %>;
|
||||
|
||||
console.log('[Emulator] BIOS configuration:', window.EJS_biosUrl);
|
||||
|
||||
// Required for Sega CD ??
|
||||
window.EJS_loadStateURL = window.location.href;
|
||||
window.EJS_saveStateURL = window.location.href;
|
||||
window.EJS_cheats = true;
|
||||
|
||||
// Add error event listener for the emulator
|
||||
window.EJS_onGameStart = () => {
|
||||
console.log('[Emulator] Game started successfully');
|
||||
};
|
||||
|
||||
window.EJS_onLoadState = (state) => {
|
||||
console.log('[Emulator] Load state:', state);
|
||||
};
|
||||
|
||||
window.EJS_onSaveState = (state) => {
|
||||
console.log('[Emulator] Save state:', state);
|
||||
};
|
||||
|
||||
window.EJS_onLoadError = (error) => {
|
||||
console.error('[Emulator] Load error:', error);
|
||||
};
|
||||
|
||||
async function loadRom() {
|
||||
try {
|
||||
console.log('[Emulator] Starting ROM load process');
|
||||
const progressContainer = document.getElementById('progress-container');
|
||||
const progressBar = document.getElementById('download-progress');
|
||||
const progressText = document.getElementById('progress-text');
|
||||
progressContainer.style.display = 'flex';
|
||||
|
||||
const isCompressed = /\.(zip|7z)$/i.test('<%= romFile.filename %>');
|
||||
const shouldUnpack = <%= emulatorConfig.unpackRoms %>;
|
||||
console.log(`[Emulator] ROM compression status: ${isCompressed ? 'compressed' : 'uncompressed'}`);
|
||||
console.log(`[Emulator] Should unpack: ${shouldUnpack}`);
|
||||
|
||||
progressText.textContent = '<%= __("emulator.loading.downloading") %> (0%)';
|
||||
console.log('[Emulator] Initiating ROM download');
|
||||
|
||||
const response = await fetch(EJS_gameUrl);
|
||||
if (!response.ok) {
|
||||
throw new Error('<%= __("emulator.error.http_error", { status: "response.status" }) %>'.replace('response.status', response.status));
|
||||
}
|
||||
|
||||
// If we're not unpacking, still show download progress but return direct URL
|
||||
if (!isCompressed || !shouldUnpack) {
|
||||
const contentLength = response.headers.get('content-length');
|
||||
const total = parseInt(contentLength, 10);
|
||||
let loaded = 0;
|
||||
|
||||
const reader = response.body.getReader();
|
||||
const chunks = [];
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
|
||||
chunks.push(value);
|
||||
loaded += value.length;
|
||||
|
||||
const percent = Math.round((loaded / total) * 100);
|
||||
progressBar.style.width = percent + '%';
|
||||
progressText.textContent = `<%= __("emulator.loading.downloading") %> (${percent}%)`;
|
||||
}
|
||||
|
||||
console.log('[Emulator] Using direct URL for ROM');
|
||||
progressContainer.style.display = 'none';
|
||||
|
||||
// Create blob from chunks for direct loading
|
||||
const blob = new Blob(chunks);
|
||||
return URL.createObjectURL(blob);
|
||||
}
|
||||
|
||||
// For compressed files that need unpacking, continue with decompression
|
||||
const contentLength = response.headers.get('content-length');
|
||||
const total = parseInt(contentLength, 10);
|
||||
let loaded = 0;
|
||||
|
||||
const reader = response.body.getReader();
|
||||
const chunks = [];
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
|
||||
chunks.push(value);
|
||||
loaded += value.length;
|
||||
|
||||
const percent = Math.round((loaded / total) * 100);
|
||||
progressBar.style.width = percent + '%';
|
||||
progressText.textContent = `<%= __("emulator.loading.downloading") %> (${percent}%)`;
|
||||
}
|
||||
|
||||
// Decompression phase
|
||||
progressText.textContent = '<%= __("emulator.loading.decompressing") %>';
|
||||
console.log('[Emulator] Starting ZIP extraction');
|
||||
|
||||
const blob = new Blob(chunks);
|
||||
const zip = await JSZip.loadAsync(blob);
|
||||
const files = Object.keys(zip.files);
|
||||
console.log('[Emulator] ZIP contents:', files);
|
||||
|
||||
const romFile = files.find(f => !zip.files[f].dir);
|
||||
if (!romFile) {
|
||||
throw new Error('<%= __("emulator.error.no_rom") %>');
|
||||
}
|
||||
console.log('[Emulator] Found ROM file in ZIP:', romFile);
|
||||
|
||||
const romData = await zip.files[romFile].async('blob');
|
||||
console.log('[Emulator] ROM extraction complete');
|
||||
progressContainer.style.display = 'none';
|
||||
return URL.createObjectURL(romData);
|
||||
} catch (error) {
|
||||
console.error('[Emulator] Error in loadRom:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
loadRom()
|
||||
.then(romUrl => {
|
||||
console.log('[Emulator] ROM loaded successfully, initializing EmulatorJS');
|
||||
window.EJS_gameUrl = romUrl;
|
||||
|
||||
// We need to wait a moment to ensure cross-origin isolation is properly applied
|
||||
setTimeout(() => {
|
||||
const script = document.createElement('script');
|
||||
script.src = `${window.EJS_pathtodata}loader.js`;
|
||||
script.onerror = (error) => {
|
||||
const gameDiv = document.getElementById('game');
|
||||
gameDiv.innerHTML = `<div class="alert alert-danger">
|
||||
Failed to load EmulatorJS. Please refresh the page or try again later.
|
||||
</div>`;
|
||||
};
|
||||
document.body.appendChild(script);
|
||||
}, 500);
|
||||
})
|
||||
.catch(error => {
|
||||
const gameDiv = document.getElementById('game');
|
||||
gameDiv.innerHTML = `<div class="alert alert-danger">
|
||||
<%= __("emulator.error.loading") %>: ${error.message}
|
||||
</div>`;
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -6,7 +6,7 @@
|
||||
<div class="emulators-container">
|
||||
<pre style="font: 20px / 19px monospace; color: white; text-align: center; overflow: hidden;">
|
||||
<%= generateAsciiArt() %>
|
||||
Emulators
|
||||
<%= __('nav.emulators') %>
|
||||
</pre>
|
||||
|
||||
<div class="container mt-4">
|
||||
@@ -16,7 +16,7 @@
|
||||
<div class="col-md-4 col-sm-6 mb-4">
|
||||
<div class="card console-card h-100" data-console="<%= consoleName %>">
|
||||
<div class="text-center pt-3">
|
||||
<img src="<%= consoleData.icon %>" alt="<%= consoleName %>" class="console-icon mb-2">
|
||||
<img src="/proxy-image?url=<%= encodeURIComponent(consoleData.icon) %>" alt="<%= consoleName %>" class="console-icon mb-2">
|
||||
<div class="console-card-title"><%= consoleName %></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -25,7 +25,7 @@
|
||||
<% } else { %>
|
||||
<div class="col-12 text-center">
|
||||
<div class="alert alert-warning">
|
||||
No emulator data available. Please check your configuration.
|
||||
<%= __('emulator.warning.no_data') %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
@@ -39,7 +39,7 @@
|
||||
<div class="modal-content bg-dark text-white">
|
||||
<div class="modal-header border-bottom border-secondary">
|
||||
<h5 class="modal-title" id="emulatorModalLabel">
|
||||
<i class="fas fa-gamepad mr-2 text-warning"></i>Recommended Emulators
|
||||
<i class="fas fa-gamepad mr-2 text-warning"></i><%= __('emulator.recommended') %>
|
||||
</h5>
|
||||
<button type="button" class="close text-white" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
@@ -241,14 +241,14 @@
|
||||
const modalTitle = document.getElementById('emulatorModalLabel');
|
||||
const emulatorList = document.getElementById('emulatorList');
|
||||
|
||||
modalTitle.innerHTML = `<i class="fas fa-gamepad mr-2 text-warning"></i>Recommended Emulators | ${consoleName}`;
|
||||
modalTitle.innerHTML = `<i class="fas fa-gamepad mr-2 text-warning"></i><%= __('emulator.recommended') %> | ${consoleName}`;
|
||||
emulatorList.innerHTML = '';
|
||||
|
||||
// Create console icon at the top of the modal
|
||||
const consoleIconContainer = document.createElement('div');
|
||||
consoleIconContainer.className = 'text-center mb-4';
|
||||
consoleIconContainer.innerHTML = `
|
||||
<img src="${consoleData.icon}" alt="${consoleName}" style="max-height: 80px;">
|
||||
<img src="/proxy-image?url=${encodeURIComponent(consoleData.icon)}" alt="${consoleName}" style="max-height: 80px;">
|
||||
<h4 class="mt-3 text-warning">${consoleName}</h4>
|
||||
<div class="separator my-3"><span></span></div>
|
||||
`;
|
||||
@@ -280,7 +280,7 @@
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<div class="emulator-logo-container">
|
||||
<img src="${emulatorData.logo}" alt="${emulatorName}" class="emulator-logo">
|
||||
<img src="/proxy-image?url=${encodeURIComponent(emulatorData.logo)}" alt="${emulatorName}" class="emulator-logo">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
@@ -289,7 +289,7 @@
|
||||
${platformsHtml}
|
||||
</div>
|
||||
<a href="${emulatorData.url}" target="_blank" class="btn download-btn">
|
||||
<i class="fas fa-download mr-2"></i>Download
|
||||
<i class="fas fa-download mr-2"></i><%= __('emulator.download') %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
149
views/pages/error.ejs
Normal file
149
views/pages/error.ejs
Normal file
@@ -0,0 +1,149 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><%= __('error.title') %> - <%= process.env.INSTANCE_NAME || 'Myrient' %></title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.7.2/font/bootstrap-icons.css">
|
||||
<style>
|
||||
body {
|
||||
background-color: #1a1a1a;
|
||||
color: white;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
}
|
||||
.error-container {
|
||||
text-align: center;
|
||||
padding: 2rem;
|
||||
max-width: 800px;
|
||||
width: 100%;
|
||||
background-color: #262626;
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.error-code {
|
||||
font-size: 8rem;
|
||||
font-weight: bold;
|
||||
color: #dc3545;
|
||||
margin-bottom: 0.5rem;
|
||||
text-shadow: 0 0 10px rgba(220, 53, 69, 0.5);
|
||||
}
|
||||
.error-message {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 1.5rem;
|
||||
color: #f8f9fa;
|
||||
}
|
||||
.error-details {
|
||||
color: #adb5bd;
|
||||
margin-bottom: 2rem;
|
||||
padding: 1rem;
|
||||
background-color: #333;
|
||||
border-radius: 8px;
|
||||
text-align: left;
|
||||
max-height: 200px;
|
||||
overflow-y: auto;
|
||||
word-break: break-word;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.error-info {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 2rem;
|
||||
font-size: 0.9rem;
|
||||
color: #6c757d;
|
||||
border-top: 1px solid #444;
|
||||
padding-top: 1rem;
|
||||
}
|
||||
.error-info div {
|
||||
margin: 0.5rem 1rem;
|
||||
}
|
||||
.btn {
|
||||
padding: 0.6rem 1.5rem;
|
||||
border-radius: 50px;
|
||||
font-weight: 600;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
.btn-primary {
|
||||
background-color: #007bff;
|
||||
border-color: #007bff;
|
||||
}
|
||||
.btn-primary:hover {
|
||||
background-color: #0069d9;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.btn-outline-secondary {
|
||||
color: #f8f9fa;
|
||||
border-color: #6c757d;
|
||||
}
|
||||
.btn-outline-secondary:hover {
|
||||
background-color: #6c757d;
|
||||
color: #f8f9fa;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.icon-large {
|
||||
font-size: 1.5rem;
|
||||
vertical-align: middle;
|
||||
}
|
||||
@media (max-width: 576px) {
|
||||
.error-code {
|
||||
font-size: 5rem;
|
||||
}
|
||||
.error-message {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="error-container">
|
||||
<div class="error-code"><%= status %></div>
|
||||
<div class="error-message">
|
||||
<%= __('error.message') %>
|
||||
</div>
|
||||
<% if (message) { %>
|
||||
<div class="error-details">
|
||||
<code><%= __('error.details', { message: message }) %></code>
|
||||
<% if (stack && process.env.NODE_ENV !== 'production') { %>
|
||||
<pre class="mt-2"><%= stack %></pre>
|
||||
<% } %>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<div class="actions">
|
||||
<a href="/" class="btn btn-primary">
|
||||
<i class="bi bi-house-fill mr-2"></i> <%= __('error.back_home') %>
|
||||
</a>
|
||||
<button onclick="window.history.back()" class="btn btn-outline-secondary">
|
||||
<i class="bi bi-arrow-left mr-2"></i> <%= __('error.go_back') %>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="error-info">
|
||||
<div>
|
||||
<i class="bi bi-clock icon-large"></i>
|
||||
<span id="timestamp"><%= new Date().toISOString() %></span>
|
||||
</div>
|
||||
<div>
|
||||
<i class="bi bi-bookmark icon-large"></i>
|
||||
<span><%= req.originalUrl || 'Unknown URL' %></span>
|
||||
</div>
|
||||
<div>
|
||||
<i class="bi bi-shield-exclamation icon-large"></i>
|
||||
<span>Request ID: <%= requestId %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,12 +8,12 @@
|
||||
let entryEnd = entryStart + 100
|
||||
entryEnd = entryEnd > results.items.length ? results.items.length : entryEnd
|
||||
%>
|
||||
<script src='https://code.jquery.com/jquery-3.7.1.js'></script>
|
||||
<script src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js'></script>
|
||||
<script src='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js'></script>
|
||||
<script src='https://cdn.datatables.net/2.1.8/js/dataTables.js'></script>
|
||||
<script src='https://cdn.datatables.net/2.1.8/js/dataTables.bootstrap4.js'></script>
|
||||
<link rel="stylesheet" href="https://cdn.datatables.net/2.1.8/css/dataTables.bootstrap4.css">
|
||||
<script src='https://code.jquery.com/jquery-3.7.1.js' crossorigin="anonymous"></script>
|
||||
<script src='https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js' crossorigin="anonymous"></script>
|
||||
<script src='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js' crossorigin="anonymous"></script>
|
||||
<script src='https://cdn.datatables.net/2.1.8/js/dataTables.js' crossorigin="anonymous"></script>
|
||||
<script src='https://cdn.datatables.net/2.1.8/js/dataTables.bootstrap4.js' crossorigin="anonymous"></script>
|
||||
<link rel="stylesheet" href="https://cdn.datatables.net/2.1.8/css/dataTables.bootstrap4.css" crossorigin="anonymous">
|
||||
<div class="row w-100 m-0">
|
||||
<form class="ml-2 form-inline w-100" action="/search">
|
||||
<div class="w-100 align-items-center">
|
||||
@@ -24,16 +24,18 @@
|
||||
</pre>
|
||||
</a>
|
||||
<input type="hidden" name="s" id="searchSettings">
|
||||
<input id="search" type="text" class="w-50 form-control bg-dark text-white ml-2" name="q" value="<%= query %>" autocomplete="off">
|
||||
<button type="submit" class="btn btn-secondary ml-2">Search</button>
|
||||
<input id="search" type="text" class="w-50 form-control bg-dark text-white ml-2" name="q" value="<%= query %>" autocomplete="off" placeholder="<%= __('search.placeholder') %>">
|
||||
<button type="submit" class="btn btn-secondary ml-2"><%= __('search.button') %></button>
|
||||
|
||||
</div>
|
||||
<ul class="SuggestionList col-sm-12" id="suggestionList" style="width: 50%;left: 195px;"></ul>
|
||||
</div>
|
||||
<p class="m-2">Found <%= results.items.length %> result<%= results.items.length != 1 ? 's': '' %> in <%= results.elapsed %> seconds. <%= indexing ? "Indexing in progress, if the list is missing something please try reloading in a few minutes" : "" %>
|
||||
<p class="m-2">
|
||||
<%= __('search.found_plural', { count: results.items.length }) %> <%= __('search.in_seconds', { seconds: results.elapsed }) %>.
|
||||
<%= indexing ? __('search.indexing') : "" %>
|
||||
<% if (settings.hideNonGame) { %>
|
||||
<span class="badge badge-info" data-toggle="tooltip" data-placement="top" title="Hiding ROM hacks, patches, and other non-game content. Disable this in Settings.">
|
||||
Non-game content filter is active
|
||||
<span class="badge badge-info" data-toggle="tooltip" data-placement="top" title="<%= __('settings.extras.hide_non_game.tooltip') %>">
|
||||
<%= __('search.non_game_filter') %>
|
||||
<a href="/settings" class="text-white ml-1"><i class="bi bi-gear-fill"></i></a>
|
||||
</span>
|
||||
<% } %>
|
||||
@@ -41,20 +43,20 @@
|
||||
</form>
|
||||
|
||||
<div class="col-sm-12 w-100 mt-3">
|
||||
<p>Displaying results <%= entryStart %> through <%= entryEnd %>. </p>
|
||||
<p><%= __('search.displaying_results', { start: entryStart, end: entryEnd }) %></p>
|
||||
<table class="table text-white table-bordered" id="results">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Group</th>
|
||||
<th>Category</th>
|
||||
<th>Region</th>
|
||||
<th>Type</th>
|
||||
<th>Size</th>
|
||||
<th>Date</th>
|
||||
<th>Search Score</th>
|
||||
<th><%= __('results.table.name') %></th>
|
||||
<th><%= __('results.table.group') %></th>
|
||||
<th><%= __('results.table.category') %></th>
|
||||
<th><%= __('results.table.region') %></th>
|
||||
<th><%= __('results.table.type') %></th>
|
||||
<th><%= __('results.table.size') %></th>
|
||||
<th><%= __('results.table.date') %></th>
|
||||
<th><%= __('results.table.score') %></th>
|
||||
<% if (process.env.EMULATOR_ENABLED === 'true') { %>
|
||||
<th>Play</th>
|
||||
<th><%= __('results.table.play') %></th>
|
||||
<% } %>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -89,9 +91,9 @@
|
||||
<% if (process.env.EMULATOR_ENABLED === 'true') { %>
|
||||
<td>
|
||||
<% if (isEmulatorCompatible(results.items[x].category)) { %>
|
||||
<a href="/play/<%= results.items[x].id %>" class="btn btn-sm btn-secondary">Play</a>
|
||||
<a href="/play/<%= results.items[x].id %>" class="btn btn-sm btn-secondary"><%= __('emulator.play') %></a>
|
||||
<% } else { %>
|
||||
<button class="btn btn-sm btn-secondary" disabled>----</button>
|
||||
<button class="btn btn-sm btn-secondary" disabled><%= __('emulator.not_available') %></button>
|
||||
<% } %>
|
||||
</td>
|
||||
<% } %>
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
<div class="col-sm-12 my-auto">
|
||||
<pre style="font: 20px / 19px monospace; color: white; text-align: center; overflow: hidden;">
|
||||
<%= generateAsciiArt() %>
|
||||
Search!
|
||||
<%= __('nav.search') %>!
|
||||
</pre>
|
||||
<div class="text-center text-white">
|
||||
<form>
|
||||
<input type="hidden" name="s" id="searchSettings">
|
||||
<input id="search" type="text" style="width: 80%;display: inline;" class="form-control bg-dark text-white mb-2"
|
||||
name="q" autocomplete="off">
|
||||
name="q" autocomplete="off" placeholder="<%= __('search.placeholder') %>">
|
||||
<ul class="SuggestionList col-sm-12" id="suggestionList" style="width: 78%;left: 11%;"></ul>
|
||||
<div>
|
||||
<button type="submit" formaction="/search" class="btn btn-secondary">Myrient Search</button>
|
||||
<button type="submit" formaction="/lucky" class="btn btn-secondary">I'm Feeling Lucky</button>
|
||||
<button type="submit" formaction="/search" class="btn btn-secondary"><%= __('search.button') %></button>
|
||||
<button type="submit" formaction="/lucky" class="btn btn-secondary"><%= __('search.lucky') %></button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
<div class="col-sm-12 my-auto text-center">
|
||||
<pre style="font: 20px / 19px monospace; color: white; text-align: center; overflow: hidden;">
|
||||
<%= generateAsciiArt() %>
|
||||
Settings
|
||||
<%= __('settings.title') %>
|
||||
</pre>
|
||||
<div class="card w-auto mx-auto text-center d-inline-block p-3">
|
||||
<form>
|
||||
<div class="form-group">
|
||||
<h4 class="d-inline mr-2">Search Columns</h4><i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="Selects which columns the search engine will search on."></i>
|
||||
<h4 class="d-inline mr-2"><%= __('settings.search_columns.title') %></h4><i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="<%= __('settings.search_columns.tooltip') %>"></i>
|
||||
<div class="">
|
||||
<% for(let field in defaultSettings.fields) { %>
|
||||
<label class="checkbox-inline p-1" for="<%= defaultSettings.fields[field] %>">
|
||||
@@ -21,7 +21,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<h4 class="d-inline mr-2">Search Score Multiplier</h4><i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="Multiplies the match score for each word found based on the category it's found in."></i>
|
||||
<h4 class="d-inline mr-2"><%= __('settings.score_multiplier.title') %></h4><i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="<%= __('settings.score_multiplier.tooltip') %>"></i>
|
||||
<div class="">
|
||||
<% for(let field in defaultSettings.boost) { %>
|
||||
<div class="d-inline-block">
|
||||
@@ -32,10 +32,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<h4>Extras</h4>
|
||||
<h4><%= __('settings.extras.title') %></h4>
|
||||
<div class="form-group">
|
||||
<div class="d-inline-block">
|
||||
<label for="fuzzy">Fuzzy Value <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="Value between 0.00 and 1.00 that determines the fuzzy distance (Levenshtein distance) for how closely a word needs to be considered a match. A higher value allows for less stringent matches. A value of 0 disables. "></i></label>
|
||||
<label for="fuzzy"><%= __('settings.extras.fuzzy.label') %> <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="<%= __('settings.extras.fuzzy.tooltip') %>"></i></label>
|
||||
<input type="number" class="form-control bg-dark text-white" id="fuzzy" name="fuzzy" step="0.01" min="0" max="1">
|
||||
</div>
|
||||
</div>
|
||||
@@ -43,131 +43,131 @@
|
||||
<div class="">
|
||||
<label class="checkbox-inline p-1">
|
||||
<input type="checkbox" id="prefix" value="true">
|
||||
Allow Prefixes <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="Allows partial matches of words at the start of the word."></i>
|
||||
<%= __('settings.extras.prefix.label') %> <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="<%= __('settings.extras.prefix.tooltip') %>"></i>
|
||||
</label>
|
||||
<label class="checkbox-inline p-1">
|
||||
<input type="checkbox" id="combineWith" value="AND">
|
||||
Match All Words <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="Requires all words in the search query to match."></i>
|
||||
<%= __('settings.extras.match_all.label') %> <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="<%= __('settings.extras.match_all.tooltip') %>"></i>
|
||||
</label>
|
||||
<label class="checkbox-inline p-1">
|
||||
<input type="checkbox" id="hideNonGame" value="true">
|
||||
Hide Non-Game Content <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="Filters out ROM hacks, patches, artwork, and other non-game content from search results."></i>
|
||||
<%= __('settings.extras.hide_non_game.label') %> <i class="bi bi-question-circle" data-toggle="tooltip" data-placement="top" title="<%= __('settings.extras.hide_non_game.tooltip') %>"></i>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="btn btn-secondary mb-2" action="#" id="saveSettings">Save Settings</button>
|
||||
<button type="button" class="btn btn-secondary mb-2" action="#" id="saveSettings"><%= __('settings.save') %></button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script defer>
|
||||
defaults = <%-JSON.stringify(defaultSettings)%>
|
||||
settingStore = localStorage.getItem('settings')
|
||||
settings = undefined
|
||||
<script defer>
|
||||
defaults = <%-JSON.stringify(defaultSettings)%>
|
||||
settingStore = localStorage.getItem('settings')
|
||||
settings = undefined
|
||||
|
||||
function setBoosts(){
|
||||
for(let boost in defaults.boost){
|
||||
if(typeof settings.boost[boost] == 'undefined') {settings.boost[boost] == defaults.boost[boost]}
|
||||
document.getElementById(boost + 'boost').value = settings.boost[boost]
|
||||
document.getElementById(boost + 'boost').addEventListener('keyup', () => {
|
||||
validate(document.getElementById(boost + 'boost'))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function setColumns(){
|
||||
for(let field in settings.fields){
|
||||
let element = document.getElementById(settings.fields[field])
|
||||
if(!element){settings.fields.splice(field, 1)}
|
||||
else{element.checked = true}
|
||||
}
|
||||
for(let field in defaults.fields){
|
||||
document.getElementById(defaults.fields[field]).addEventListener('change', () => {
|
||||
toggleLinkedTextBox(document.getElementById(defaults.fields[field]), document.getElementById(defaults.fields[field] + 'boost'))
|
||||
})
|
||||
let elem = document.getElementById(defaults.fields[field])
|
||||
if(!elem.checked){
|
||||
let boostField = document.getElementById(defaults.fields[field] + 'boost')
|
||||
boostField.classList.add('text-secondary')
|
||||
boostField.disabled = true
|
||||
}
|
||||
}
|
||||
}
|
||||
//combinewith fuzzy prefix
|
||||
function setOthers(){
|
||||
if(typeof settings.combineWith == 'undefined') {settings.combineWith = defaults.combineWith}
|
||||
if(typeof settings.fuzzy == 'undefined') {settings.fuzzy = defaults.fuzzy}
|
||||
if(typeof settings.prefix == 'undefined') {settings.prefix = defaults.prefix}
|
||||
if(typeof settings.hideNonGame == 'undefined') {settings.hideNonGame = defaults.hideNonGame}
|
||||
document.getElementById('combineWith').checked = settings.combineWith ? true : false
|
||||
document.getElementById('fuzzy').value = settings.fuzzy
|
||||
document.getElementById('prefix').checked = settings.prefix
|
||||
document.getElementById('hideNonGame').checked = settings.hideNonGame
|
||||
}
|
||||
|
||||
function saveSettings(){
|
||||
for(let boost in defaults.boost){settings.boost[boost] = parseInt(document.getElementById(boost + 'boost').value)}
|
||||
settings.fields = []
|
||||
for(let field in defaults.fields){
|
||||
if(document.getElementById(defaults.fields[field]).checked){
|
||||
settings.fields.push(defaults.fields[field])
|
||||
}
|
||||
}
|
||||
settings.combineWith = document.getElementById('combineWith').checked ? 'AND' : ''
|
||||
settings.fuzzy = parseFloat (document.getElementById('fuzzy').value)
|
||||
settings.prefix = document.getElementById('prefix').checked
|
||||
settings.hideNonGame = document.getElementById('hideNonGame').checked
|
||||
localStorage.setItem('settings', JSON.stringify(settings))
|
||||
window.location.href = '/'
|
||||
}
|
||||
|
||||
function loadSettings(){
|
||||
$(function () {
|
||||
$('[data-toggle="tooltip"]').tooltip()
|
||||
})
|
||||
if(!settingStore) {
|
||||
settings = structuredClone(defaults)
|
||||
settingStore = JSON.stringify(settings)
|
||||
localStorage.setItem('settings', settingStore)
|
||||
}
|
||||
else{
|
||||
try{
|
||||
settings = JSON.parse(settingStore)
|
||||
}
|
||||
catch{
|
||||
//load defaults if not exist
|
||||
settings = defaults
|
||||
}
|
||||
}
|
||||
setBoosts()
|
||||
setColumns()
|
||||
setOthers()
|
||||
}
|
||||
document.body.onload = loadSettings
|
||||
document.getElementById('saveSettings').onclick = saveSettings
|
||||
|
||||
function validate(element){
|
||||
let max = parseInt(element.max)
|
||||
let min = parseInt(element.min)
|
||||
let value = parseInt(element.value)
|
||||
if(value > max) {element.value = max}
|
||||
if(value < min) {element.value = min}
|
||||
console.log(max, min, value)
|
||||
}
|
||||
fuzzyElem = document.getElementById('fuzzy')
|
||||
fuzzyElem.addEventListener('keyup', () => {
|
||||
validate(fuzzyElem)
|
||||
function setBoosts(){
|
||||
for(let boost in defaults.boost){
|
||||
if(typeof settings.boost[boost] == 'undefined') {settings.boost[boost] == defaults.boost[boost]}
|
||||
document.getElementById(boost + 'boost').value = settings.boost[boost]
|
||||
document.getElementById(boost + 'boost').addEventListener('keyup', () => {
|
||||
validate(document.getElementById(boost + 'boost'))
|
||||
})
|
||||
function toggleLinkedTextBox(checkBox, textBox){
|
||||
if(! checkBox.checked) {
|
||||
textBox.classList.add('text-secondary')
|
||||
textBox.disabled = true
|
||||
}
|
||||
else {
|
||||
textBox.classList.remove('text-secondary')
|
||||
textBox.disabled = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setColumns(){
|
||||
for(let field in settings.fields){
|
||||
let element = document.getElementById(settings.fields[field])
|
||||
if(!element){settings.fields.splice(field, 1)}
|
||||
else{element.checked = true}
|
||||
}
|
||||
for(let field in defaults.fields){
|
||||
document.getElementById(defaults.fields[field]).addEventListener('change', () => {
|
||||
toggleLinkedTextBox(document.getElementById(defaults.fields[field]), document.getElementById(defaults.fields[field] + 'boost'))
|
||||
})
|
||||
let elem = document.getElementById(defaults.fields[field])
|
||||
if(!elem.checked){
|
||||
let boostField = document.getElementById(defaults.fields[field] + 'boost')
|
||||
boostField.classList.add('text-secondary')
|
||||
boostField.disabled = true
|
||||
}
|
||||
</script>
|
||||
}
|
||||
}
|
||||
|
||||
function setOthers(){
|
||||
if(typeof settings.combineWith == 'undefined') {settings.combineWith = defaults.combineWith}
|
||||
if(typeof settings.fuzzy == 'undefined') {settings.fuzzy = defaults.fuzzy}
|
||||
if(typeof settings.prefix == 'undefined') {settings.prefix = defaults.prefix}
|
||||
if(typeof settings.hideNonGame == 'undefined') {settings.hideNonGame = defaults.hideNonGame}
|
||||
document.getElementById('combineWith').checked = settings.combineWith ? true : false
|
||||
document.getElementById('fuzzy').value = settings.fuzzy
|
||||
document.getElementById('prefix').checked = settings.prefix
|
||||
document.getElementById('hideNonGame').checked = settings.hideNonGame
|
||||
}
|
||||
|
||||
function saveSettings(){
|
||||
for(let boost in defaults.boost){settings.boost[boost] = parseInt(document.getElementById(boost + 'boost').value)}
|
||||
settings.fields = []
|
||||
for(let field in defaults.fields){
|
||||
if(document.getElementById(defaults.fields[field]).checked){
|
||||
settings.fields.push(defaults.fields[field])
|
||||
}
|
||||
}
|
||||
settings.combineWith = document.getElementById('combineWith').checked ? 'AND' : ''
|
||||
settings.fuzzy = parseFloat (document.getElementById('fuzzy').value)
|
||||
settings.prefix = document.getElementById('prefix').checked
|
||||
settings.hideNonGame = document.getElementById('hideNonGame').checked
|
||||
localStorage.setItem('settings', JSON.stringify(settings))
|
||||
window.location.href = '/'
|
||||
}
|
||||
|
||||
function loadSettings(){
|
||||
$(function () {
|
||||
$('[data-toggle="tooltip"]').tooltip()
|
||||
})
|
||||
if(!settingStore) {
|
||||
settings = structuredClone(defaults)
|
||||
settingStore = JSON.stringify(settings)
|
||||
localStorage.setItem('settings', settingStore)
|
||||
}
|
||||
else{
|
||||
try{
|
||||
settings = JSON.parse(settingStore)
|
||||
}
|
||||
catch{
|
||||
//load defaults if not exist
|
||||
settings = defaults
|
||||
}
|
||||
}
|
||||
setBoosts()
|
||||
setColumns()
|
||||
setOthers()
|
||||
}
|
||||
document.body.onload = loadSettings
|
||||
document.getElementById('saveSettings').onclick = saveSettings
|
||||
|
||||
function validate(element){
|
||||
let max = parseInt(element.max)
|
||||
let min = parseInt(element.min)
|
||||
let value = parseInt(element.value)
|
||||
if(value > max) {element.value = max}
|
||||
if(value < min) {element.value = min}
|
||||
console.log(max, min, value)
|
||||
}
|
||||
fuzzyElem = document.getElementById('fuzzy')
|
||||
fuzzyElem.addEventListener('keyup', () => {
|
||||
validate(fuzzyElem)
|
||||
})
|
||||
function toggleLinkedTextBox(checkBox, textBox){
|
||||
if(!checkBox.checked) {
|
||||
textBox.classList.add('text-secondary')
|
||||
textBox.disabled = true
|
||||
}
|
||||
else {
|
||||
textBox.classList.remove('text-secondary')
|
||||
textBox.disabled = false
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<div class="mb-2">
|
||||
<div class="text-center text-secondary footer-text">
|
||||
<div id="query-count" class="stats">Number of Queries:</div>
|
||||
<div id="query-count" class="stats"><%= __('footer.queries') %></div>
|
||||
<div class="stats"> | </div>
|
||||
<div id="file-count" class="stats">Known Files:</div>
|
||||
<div id="file-count" class="stats"><%= __('footer.files') %></div>
|
||||
<div class="stats"> | </div>
|
||||
<div id="term-count" class="stats">Term Count:</div>
|
||||
<div id="term-count" class="stats"><%= __('footer.terms') %></div>
|
||||
<div class="stats"> | </div>
|
||||
<div id="crawl-time" class="stats">Time of Last Crawl:</div>
|
||||
<div id="crawl-time" class="stats"><%= __('footer.last_crawl') %></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
<title><%= process.env.INSTANCE_NAME || 'Myrient' %> Search</title>
|
||||
|
||||
<!-- CSS (load bootstrap from a CDN) -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" crossorigin="anonymous">
|
||||
<style>
|
||||
|
||||
html, body {
|
||||
|
||||
@@ -1,20 +1,44 @@
|
||||
<script src="https://code.jquery.com/jquery-3.7.1.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/js/bootstrap.min.js" crossorigin="anonymous"></script>
|
||||
|
||||
<nav class="navbar navbar-expand-sm navbar-light text-white">
|
||||
<a id="brand-name" class="navbar-brand text-white" href="/"><%= process.env.INSTANCE_NAME || 'Myrient' %> Search</a>
|
||||
<a id="brand-name" class="navbar-brand text-white hidden" href="/search">Results</a>
|
||||
<a id="brand-name" class="navbar-brand text-white hidden" href="/search"><%= __('nav.results') %></a>
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-white" href="/settings">Settings</a>
|
||||
<a class="nav-link text-white" href="/settings"><%= __('nav.settings') %></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-white" href="/emulators">Emulators</a>
|
||||
<a class="nav-link text-white" href="/emulators"><%= __('nav.emulators') %></a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-white" href="/about">About</a>
|
||||
<a class="nav-link text-white" href="/about"><%= __('nav.about') %></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Language Selector Dropdown -->
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-dark dropdown-toggle" type="button" id="languageDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="bi bi-globe"></i>
|
||||
<%= __('languages.' + locale) %>
|
||||
</button>
|
||||
<div class="dropdown-menu dropdown-menu-right bg-dark" aria-labelledby="languageDropdown">
|
||||
<% availableLocales.forEach(lang => { %>
|
||||
<a class="dropdown-item text-white <%= locale === lang ? 'active' : '' %>" href="javascript:void(0)" onclick="changeLanguage('<%= lang %>')">
|
||||
<%= __('languages.' + lang) %>
|
||||
</a>
|
||||
<% }); %>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<script defer>
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// Make sure Bootstrap dropdown is properly initialized
|
||||
$('.dropdown-toggle').dropdown();
|
||||
});
|
||||
|
||||
const aTags = document.querySelectorAll('a')
|
||||
aTags.forEach(aTag => {
|
||||
if(aTag.getAttribute('href') == window.location.pathname){
|
||||
@@ -22,4 +46,35 @@
|
||||
aTag.classList.remove('hidden')
|
||||
}
|
||||
})
|
||||
|
||||
function changeLanguage(lang) {
|
||||
// Create URL with new language parameter
|
||||
const url = new URL(window.location.href);
|
||||
url.searchParams.set('lang', lang);
|
||||
window.location.href = url.toString();
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.dropdown-item:hover {
|
||||
background-color: #3D4351 !important;
|
||||
}
|
||||
.dropdown-item.active {
|
||||
background-color: #576075 !important;
|
||||
}
|
||||
.btn-dark {
|
||||
border-color: #576075;
|
||||
}
|
||||
.btn-dark:focus, .btn-dark:hover {
|
||||
border-color: rgb(255, 189, 51) !important;
|
||||
box-shadow: 0 0 0 .2rem rgba(240, 164, 0, .25) !important;
|
||||
}
|
||||
/* Ensure dropdown menu appears on top of everything */
|
||||
.dropdown-menu.show {
|
||||
z-index: 9999 !important;
|
||||
}
|
||||
.dropdown {
|
||||
position: relative;
|
||||
z-index: 9999 !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user