Separation of language files

- Separated language files to /includes/js/languages and added Arabic font to fix display issues in some elements
This commit is contained in:
ArabPixel
2025-11-09 12:47:30 +01:00
parent cb73653c18
commit d31273f69e
6 changed files with 117 additions and 116 deletions

View File

@@ -1,11 +1,13 @@
CACHE MANIFEST CACHE MANIFEST
# v1 # v1
# Generated on 2025-10-21 13:39:57.682007 # Generated on 2025-11-09 12:33:54.895315
CACHE: CACHE:
index.html index.html
includes/index.css includes/index.css
includes/js/index.js includes/js/index.js
includes/js/languages/ar.js
includes/js/languages/en.js
includes/payloads/Jailbreak.js includes/payloads/Jailbreak.js
includes/payloads/payloads.js includes/payloads/payloads.js
includes/payloads/Bins/Dumper/ps4-app-dumper.bin includes/payloads/Bins/Dumper/ps4-app-dumper.bin

View File

@@ -1,5 +1,6 @@
/* replace rgb colors with hex value for better compatibility */ /* replace rgb colors with hex value for better compatibility */
/* Arabic font fix for some html elements on 7.xx like "button" */
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Arabic:wght@100..900&display=swap');
body { body {
font-family: system-ui, -apple-system, sans-serif, "Inter", sans-serif; font-family: system-ui, -apple-system, sans-serif, "Inter", sans-serif;
overflow: hidden; overflow: hidden;
@@ -446,6 +447,7 @@ section { /* Apply to initial-screen and exploit-main-screen */
} }
/* Manual css */ /* Manual css */
button{ button{
font-family: "Noto Sans Arabic", sans-serif;
background-color: transparent; background-color: transparent;
border: none; border: none;
} }

View File

@@ -1,11 +1,9 @@
// @ts-nocheck // @ts-nocheck
let currentLanguage = localStorage.getItem('language') || 'en'; let currentLanguage = localStorage.getItem('language') || 'en';
let currentJbFlavor = localStorage.getItem('jailbreakFlavor') || 'GoldHEN'; let currentJbFlavor = localStorage.getItem('jailbreakFlavor') || 'GoldHEN';
let isAutoJailbreakEnabled = localStorage.getItem('autoJailbreak');
let selectedSecondaryPayload;
let platform = "Unknown"; let platform = "Unknown";
let lastScrollY = 0; let lastScrollY = 0;
let lastSection = localStorage.getItem('lastSection') || "initial"; let lastSection = "initial";
const ui = { const ui = {
mainContainer: document.querySelector('.mainContainer'), mainContainer: document.querySelector('.mainContainer'),
@@ -43,78 +41,6 @@ const ui = {
// Settings elements // Settings elements
langRadios: document.querySelectorAll('#chooselang input[name="language"]'), langRadios: document.querySelectorAll('#chooselang input[name="language"]'),
}; };
const languages = {
"en": {
"title": "PSFree Enhanced",
"ps4FwCompatible": `PS4 FW: {ps4fw} | Compatible`,
"ps4FwIncompatible": `PS4 FW: {ps4fw} | Incompatible`,
"notPs4": "You are not on a PS4, platform: ",
"clickToStart": "Click to start",
"chooseHEN": "Choose your HEN flavor",
"exploitStatusHeader": "Exploit status",
"payloadsHeader": "Payloads",
"settingsBtnTitle": "Settings",
"aboutMenu": "About",
"payloadsToolsHeader": "Tools",
"payloadsGameHeader": "Game",
"payloadsLinuxHeader": "Linux",
"aboutPsfreeHeader": "About PSFree Enhanced",
"aboutVersion": "Version: 1.5.1",
"aboutDescription": "A web interface to jailbreak your PS4 using PSFree chained with Lapse kernel exploit.",
"closeButton": "Close",
"settingsPsfreeHeader": "Settings",
"ps4FirmwareSupportedHeader": "Supported PS4 firmware",
"languageHeader": "Language",
"englishOption": "English",
"arabicOption": "Arabic",
"warnings": {
"note1": "Make sure to close all apps before running the exploit",
"note2": "Make sure to delete cache data before running the exploit for the first time",
"note3": "It might take you more than one time",
},
"secondHostBtn": "Load payloads using GoldHEN's BinLoader - External link",
"alert": "Important notice",
"waitingUserInput": "Waiting for user action",
"jailbreakNow": "Jailbreak process will start with ",
"cache": "Installing Cache: ",
"httpsHost":"Loading payloads through GoldHEN's BinLoader is not possible at the moment, click the blue button below to use the supported host."
},
"ar": {
"title": "PSFree محسن",
"ps4FwCompatible": `بلايستايشن 4 إصدار {ps4fw} | مدعوم`,
"ps4FwIncompatible": `بلايستايشن 4 إصدار {ps4fw} | غير مدعوم`,
"notPs4": "انت لست على جهاز بلايستايشن 4, المنصة: ",
"clickToStart": "انقر للبدء",
"chooseHEN": "اختر نكهتك",
"exploitStatusHeader": "حالة الثغرة",
"payloadsHeader": "الإضافات",
"settingsBtnTitle": "الإعدادات",
"aboutMenu": "حول",
"payloadsToolsHeader": "الأدوات",
"payloadsGameHeader": "الألعاب",
"payloadsLinuxHeader": "لينكس",
"aboutPsfreeHeader": "حول PSFree المحسن",
"aboutVersion": "الإصدار: 1.5.1",
"aboutDescription": "واجهة ويب لتهكير البلايستايشن 4 بإستخدام ثغرة PSFree المربوطة مع ثغرة النواة Lapse",
"closeButton": "إغلاق",
"settingsPsfreeHeader": "الإعدادات",
"ps4FirmwareSupportedHeader": "إصدارات PS4 المدعومة",
"languageHeader": "اللغة",
"arabicOption": "العربية",
"englishOption": "الإنجليزية",
"warnings": {
"note1": "تأكد من إغلاق كل التطبيقات قبل تنفيذ الثغرة",
"note2": "تأكد من ان تقوم بمسح الملفات المؤقته قبل تنفيذ الثغرة لأول مرة",
"note3": "قم يتطلب الأمر المحاولة اكثر من مرة",
},
"secondHostBtn": "تنفيذ التعديلات بإستخدام خادم GoldHEN - رابط خارجي",
"alert": "ملاحظات هامة",
"waitingUserInput": "في انتظار التنفيذ من المستخدم",
"jailbreakNow": "عملية تحميل الثغرة ستبدأ بإستحدام ",
"cache": "جاري تحميل الموقع في الذاكرة المحلية: ",
"httpsHost":"تنفيذ الإضافات بإستخدام GoldHEN غير مدعوم حاليا, إضغط على الزر الأزرق ادناه للإنتقال الى الهوست المدعوم"
}
}
const payloads = [ const payloads = [
{ {
id: "App2USB", id: "App2USB",
@@ -308,7 +234,7 @@ const payloads = [
{ {
id: "WebRTE", id: "WebRTE",
name: "WebRTE", name: "WebRTE",
author: "Made by golden<br>updated by EchoStrech", author: "Made by golden<br>updated by EchoStretch",
description: "Web Realtime Trainer Engine", description: "Web Realtime Trainer Engine",
specificFW: "5.05, 6.72, 7.00-11.00", specificFW: "5.05, 6.72, 7.00-11.00",
category: "tools", category: "tools",
@@ -609,24 +535,6 @@ async function loadMultipleModules(files) {
} }
} }
async function binloader() {
try {
sessionStorage.setItem('binloader', 1);
const modules = await loadMultipleModules([
'../../src/alert.mjs'
]);
console.log("All modules are loaded!");
const goldhenModule = modules[0];
if (goldhenModule && typeof goldhenModule.runBinLoader === 'function') {
goldhenModule.runBinLoader();
} else {
console.error("GoldHEN function not found in GoldHEN.js module");
}
} catch (e) {
console.error("Failed to jailbreak: " + e);
}
}
function isHttps() { function isHttps() {
return window.location.protocol === 'https:'; return window.location.protocol === 'https:';
} }
@@ -662,14 +570,33 @@ function loadGoldHENVer(){
function loadLanguage() { function loadLanguage() {
var language = localStorage.getItem("language") || 'en'; document.querySelector(`input[name="language"][value="${currentLanguage}"]`).checked = true;
document.querySelector(`input[name="language"][value="${language}"]`).checked = true; const langScript = document.getElementById("langScript");
if(langScript) langScript.remove();
// load language file
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = `./includes/js/languages/${currentLanguage}.js`;
script.onload = () => resolve(window.lang);
script.id = "langScript";
script.onerror = () => reject(new Error(`Failed to load ${currentLanguage}`));
document.head.appendChild(script);
});
}
// Apply lanuage after loading the language file
async function initLanguage() {
try {
await loadLanguage(currentLanguage);
applyLanguage(currentLanguage);
} catch (e) {
console.error(e);
}
} }
// Update UI langauge // Update UI langauge
function applyLanguage(lang) { function applyLanguage(lang) {
currentLanguage = lang; currentLanguage = lang;
const strings = languages[currentLanguage]; const strings = window.lang
if (!strings) { if (!strings) {
console.error(`Language list ${lang} is not available`); console.error(`Language list ${lang} is not available`);
@@ -682,7 +609,7 @@ function applyLanguage(lang) {
// Check if ps4 is supported // Check if ps4 is supported
if (window.ps4Fw === null) { if (window.ps4Fw === undefined) {
ui.ps4FwStatus.textContent = strings.notPs4 + platform; ui.ps4FwStatus.textContent = strings.notPs4 + platform;
ui.ps4FwStatus.style.color = 'red'; ui.ps4FwStatus.style.color = 'red';
} else if (window.ps4Fw <= 9.60) { } else if (window.ps4Fw <= 9.60) {
@@ -707,9 +634,10 @@ function applyLanguage(lang) {
// Settings popup // Settings popup
ui.settingsPopup.querySelector('h2').textContent = strings.settingsPsfreeHeader; ui.settingsPopup.querySelector('h2').textContent = strings.settingsPsfreeHeader;
ui.settingsPopup.querySelector('#chooselang h3').textContent = strings.languageHeader; ui.settingsPopup.querySelector('#chooselang h3').textContent = strings.languageHeader;
ui.settingsPopup.querySelector('#enLang').textContent = strings.englishOption;
ui.settingsPopup.querySelector('#arLang').textContent = strings.arabicOption;
ui.settingsPopup.querySelector('#close-settings').textContent = strings.closeButton; ui.settingsPopup.querySelector('#close-settings').textContent = strings.closeButton;
ui.settingsPopup.querySelector('#ghVer').textContent = strings.ghVer;
ui.settingsPopup.querySelector('#chooseGoldHEN summary').textContent = strings.otherVer;
ui.settingsPopup.querySelector('#latestVer').textContent = strings.latestVer;
// Warning element (Exploit section) // Warning element (Exploit section)
const warningHeader = document.querySelector('#warningBox p'); const warningHeader = document.querySelector('#warningBox p');
@@ -763,7 +691,7 @@ function saveLanguage() {
const language = document.querySelector('input[name="language"]:checked').value; const language = document.querySelector('input[name="language"]:checked').value;
localStorage.setItem('language', language); localStorage.setItem('language', language);
currentLanguage = language; currentLanguage = language;
applyLanguage(language); initLanguage();
}; };
function CheckFW() { function CheckFW() {
@@ -848,8 +776,7 @@ function loadSettings() {
try { try {
CheckFW(); CheckFW();
loadJbFlavor(); loadJbFlavor();
loadLanguage(); initLanguage(currentLanguage);
applyLanguage(currentLanguage);
renderPayloads(); renderPayloads();
loadGoldHENVer(); loadGoldHENVer();
} catch (e) { } catch (e) {
@@ -893,7 +820,7 @@ function renderPayloads() {
</div> </div>
<p class="text-start text-white/70 text-sm leading-relaxed">${payload.description}</p> <p class="text-start text-white/70 text-sm leading-relaxed">${payload.description}</p>
<div class="flex items-center justify-between text-xs text-white/60"> <div class="flex items-center justify-between text-xs text-white/60">
<p style="color: orange;">${payload.specificFW != '' ? payload.specificFW + " only" : ""} </p> <p style="color: orange;">${payload.specificFW != '' ? payload.specificFW : ""} </p>
</div> </div>
</div> </div>
</button> </button>
@@ -919,14 +846,13 @@ function renderPayloads() {
// Handling cache // Handling cache
function DLProgress(e) { function DLProgress(e) {
Percent = (Math.round(e.loaded / e.total * 100)); Percent = (Math.round(e.loaded / e.total * 100));
document.title = languages[currentLanguage].title + " " + Percent + "%"; document.title = window.lang.cache + " " + Percent + "%";
} }
function DisplayCacheProgress() { function DisplayCacheProgress() {
setTimeout(function () { setTimeout(function () {
document.title = "\u2713"; document.title = "\u2713";
}, 1000); }, 1000);
setTimeout(function () { setTimeout(function () {
window.location.href = location.reload();
document.referrer;
}, 3000); }, 3000);
} }

View File

@@ -0,0 +1,35 @@
window.lang = {
"title": "PSFree محسن",
"ps4FwCompatible": `بلايستايشن 4 إصدار {ps4fw} | مدعوم`,
"ps4FwIncompatible": `بلايستايشن 4 إصدار {ps4fw} | غير مدعوم`,
"notPs4": "انت لست على جهاز بلايستايشن 4, المنصة: ",
"clickToStart": "انقر للبدء",
"chooseHEN": "اختر نكهتك",
"exploitStatusHeader": "حالة الثغرة",
"payloadsHeader": "الإضافات",
"settingsBtnTitle": "الإعدادات",
"aboutMenu": "حول",
"payloadsToolsHeader": "الأدوات",
"payloadsGameHeader": "الألعاب",
"payloadsLinuxHeader": "لينكس",
"aboutPsfreeHeader": "حول PSFree المحسن",
"aboutVersion": "الإصدار: 1.5.1",
"aboutDescription": "واجهة ويب لتهكير البلايستايشن 4 بإستخدام ثغرة PSFree المربوطة مع ثغرة النواة Lapse",
"closeButton": "إغلاق",
"settingsPsfreeHeader": "الإعدادات",
"ps4FirmwareSupportedHeader": "إصدارات PS4 المدعومة",
"languageHeader": "اللغة",
"warnings": {
"note1": "تأكد من ان تقوم بمسح الملفات المؤقته قبل تنفيذ الثغرة لأول مرة",
"note2": "إنتظر تحميل ملفات الموقع محليا حتى تصبح الثغرة مستقرة أكثر",
"note3": "قد يتطلب الأمر عدة محاولات لكسر الحماية",
},
"secondHostBtn": "تنفيذ التعديلات بإستخدام خادم GoldHEN - رابط خارجي",
"alert": "ملاحظات هامة",
"waitingUserInput": "في انتظار الأوامر من المستخدم",
"cache": "جاري تحميل الموقع في ذاكرة التخزين المحلية: ",
"httpsHost": "تنفيذ الإضافات بإستخدام GoldHEN غير مدعوم حاليا, إضغط على الزر الأزرق ادناه للإنتقال الى الهوست المدعوم",
"ghVer" : "إصدارات GoldHEN",
"otherVer": "إصدارات اخرى",
"latestVer": "الأحدث"
}

View File

@@ -0,0 +1,35 @@
window.lang = {
"title": "PSFree Enhanced",
"ps4FwCompatible": `PS4 FW: {ps4fw} | Compatible`,
"ps4FwIncompatible": `PS4 FW: {ps4fw} | Incompatible`,
"notPs4": "You are not on a PS4, platform: ",
"clickToStart": "Click to start",
"chooseHEN": "Choose your HEN flavor",
"exploitStatusHeader": "Exploit status",
"payloadsHeader": "Payloads",
"settingsBtnTitle": "Settings",
"aboutMenu": "About",
"payloadsToolsHeader": "Tools",
"payloadsGameHeader": "Game",
"payloadsLinuxHeader": "Linux",
"aboutPsfreeHeader": "About PSFree Enhanced",
"aboutVersion": "Version: 1.5.1",
"aboutDescription": "A web interface to jailbreak your PS4 using PSFree chained with Lapse kernel exploit.",
"closeButton": "Close",
"settingsPsfreeHeader": "Settings",
"ps4FirmwareSupportedHeader": "Supported PS4 firmware",
"languageHeader": "Language",
"warnings": {
"note1": "Make sure to delete cache data before running the exploit for the first time",
"note2": "Allow the caching process to complete for better stability",
"note3": "It might take you multiple tries to achieve the jailbreak",
},
"secondHostBtn": "Load payloads using GoldHEN's BinLoader - External link",
"alert": "Important notice",
"waitingUserInput": "Waiting for user action",
"cache": "Installing Cache: ",
"httpsHost": "Loading payloads through GoldHEN's BinLoader is not possible at the moment, click the blue button below to use the supported host.",
"ghVer" : "GoldHEN Versions",
"otherVer": "Other versions",
"latestVer": "Latest"
}

View File

@@ -38,7 +38,7 @@
</g> </g>
</svg> </svg>
</div> </div>
<p class="text-white/70 text-lg mt-4" id="click-to-start-text">Click to start</p> <h3 class="text-white/70 text-lg mt-4" id="click-to-start-text">Click to start</h3>
</button> </button>
<!-- Compatibility message --> <!-- Compatibility message -->
@@ -217,23 +217,24 @@
<div id="chooselang" class="mb-6"> <div id="chooselang" class="mb-6">
<h3 class="text-lg font-semibold mb-2">Language</h3> <h3 class="text-lg font-semibold mb-2">Language</h3>
<div class="radio-group space-y-2"> <div class="radio-group space-y-2">
<!-- Language options -->
<label class="flex items-center text-white/80"> <label class="flex items-center text-white/80">
<input type="radio" name="language" value="en" class="ml-2" onchange="saveLanguage('en');"> <input type="radio" name="language" value="en" class="ml-2" onchange="saveLanguage(this.value);">
<p id="enLang">English</p> <p>English</p>
</label> </label>
<label class="flex items-center text-white/80"> <label class="flex items-center text-white/80">
<input type="radio" name="language" value="ar" class="ml-2" onchange="saveLanguage('ar'); "> <input type="radio" name="language" value="ar" class="ml-2" onchange="saveLanguage(this.value); ">
<p id="arLang">Arabic</p> <p>العربية</p>
</label> </label>
</div> </div>
</div> </div>
<!-- Choose GoldHEN version --> <!-- Choose GoldHEN version -->
<div id="chooseGoldHEN" class="mb-6"> <div id="chooseGoldHEN" class="mb-6">
<h3 class="text-lg font-semibold mb-2">GoldHEN versions</h3> <h3 class="text-lg font-semibold mb-2" id="ghVer">GoldHEN versions</h3>
<div class="radio-group space-y-2"> <div class="radio-group space-y-2">
<label class="flex items-center text-white/80"> <label class="flex items-center text-white/80">
<input type="radio" name="goldhen" value="GHv2.4b18.6" onchange="setGoldHENVer(this.value);"> <input type="radio" name="goldhen" value="GHv2.4b18.6" onchange="setGoldHENVer(this.value);">
<p>GoldHEN v2.4b18.6 - Latest</p> <p>GoldHEN v2.4b18.6 - </p><pre id="latestVer"> Latest</pre>
</label> </label>
<details> <details>
<summary>Other versions</summary> <summary>Other versions</summary>