diff --git a/src/controllers/custom/getItemListsController.ts b/src/controllers/custom/getItemListsController.ts index 962b8857..e6284f8d 100644 --- a/src/controllers/custom/getItemListsController.ts +++ b/src/controllers/custom/getItemListsController.ts @@ -1,5 +1,5 @@ import { RequestHandler } from "express"; -import { getEnglishString } from "@/src/services/itemDataService"; +import { getDict, getString } from "@/src/services/itemDataService"; import { ExportArcanes, ExportGear, @@ -16,20 +16,21 @@ interface ListedItem { fusionLimit?: number; } -const getItemListsController: RequestHandler = (_req, res) => { +const getItemListsController: RequestHandler = (req, res) => { const weapons = []; const miscitems = []; + const dict = getDict(req.query.lang?.toString()); for (const [uniqueName, item] of Object.entries(ExportWeapons)) { if (item.productCategory !== "OperatorAmps") { if (item.totalDamage !== 0) { weapons.push({ uniqueName, - name: getEnglishString(item.name) + name: getString(item.name, dict) }); } else if (!item.excludeFromCodex) { miscitems.push({ uniqueName: "MiscItems:" + uniqueName, - name: getEnglishString(item.name) + name: getString(item.name, dict) }); } } @@ -37,13 +38,13 @@ const getItemListsController: RequestHandler = (_req, res) => { for (const [uniqueName, item] of Object.entries(ExportResources)) { miscitems.push({ uniqueName: "MiscItems:" + uniqueName, - name: getEnglishString(item.name) + name: getString(item.name, dict) }); } for (const [uniqueName, item] of Object.entries(ExportGear)) { miscitems.push({ uniqueName: "Consumables:" + uniqueName, - name: getEnglishString(item.name) + name: getString(item.name, dict) }); } @@ -52,7 +53,7 @@ const getItemListsController: RequestHandler = (_req, res) => { for (const [uniqueName, upgrade] of Object.entries(ExportUpgrades)) { mods.push({ uniqueName, - name: getEnglishString(upgrade.name), + name: getString(upgrade.name, dict), fusionLimit: upgrade.fusionLimit }); if (upgrade.isStarter || upgrade.isFrivolous || upgrade.upgradeEntries) { @@ -62,7 +63,7 @@ const getItemListsController: RequestHandler = (_req, res) => { for (const [uniqueName, arcane] of Object.entries(ExportArcanes)) { mods.push({ uniqueName, - name: getEnglishString(arcane.name) + name: getString(arcane.name, dict) }); } @@ -72,7 +73,7 @@ const getItemListsController: RequestHandler = (_req, res) => { .map(([uniqueName, warframe]) => { return { uniqueName, - name: getEnglishString(warframe.name) + name: getString(warframe.name, dict) }; }), weapons, diff --git a/src/services/itemDataService.ts b/src/services/itemDataService.ts index 3bf039dd..e5be76dd 100644 --- a/src/services/itemDataService.ts +++ b/src/services/itemDataService.ts @@ -1,7 +1,21 @@ import { getIndexAfter } from "@/src/helpers/stringHelpers"; import { logger } from "@/src/utils/logger"; import { + dict_de, dict_en, + dict_es, + dict_fr, + dict_it, + dict_ja, + dict_ko, + dict_pl, + dict_pt, + dict_ru, + dict_tc, + dict_th, + dict_tr, + dict_uk, + dict_zh, ExportRecipes, ExportWarframes, ExportWeapons, @@ -75,6 +89,56 @@ export const getSuitByUniqueName = (uniqueName: string): IPowersuit | undefined return ExportWarframes[uniqueName]; }; -export const getEnglishString = (key: string): string => { - return dict_en[key] ?? key; +export const getString = (key: string, dict: Record): string => { + return dict[key] ?? key; +}; + +export const getDict = (lang: string | undefined) => { + switch (lang) { + case "de": + return dict_de; + + case "es": + return dict_es; + + case "fr": + return dict_fr; + + case "it": + return dict_it; + + case "ja": + return dict_ja; + + case "ko": + return dict_ko; + + case "pl": + return dict_pl; + + case "pt": + return dict_pt; + + case "ru": + return dict_ru; + + case "tc": + return dict_tc; + + case "th": + return dict_th; + + case "tr": + return dict_tr; + + case "uk": + return dict_uk; + + case "zh": + return dict_zh; + + case "en": + default: + return dict_en; + } }; diff --git a/static/webui/index.html b/static/webui/index.html index 533b2f20..59ec3bab 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -13,11 +13,17 @@ OpenWF WebUI - diff --git a/static/webui/script.js b/static/webui/script.js index db5b831c..99759335 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -85,7 +85,7 @@ single.on("route_load", function (event) { }); window.itemListPromise = new Promise(resolve => { - const req = $.get("/custom/getItemLists"); + const req = $.get(`/custom/getItemLists?lang=${localStorage.getItem("lang")}`); req.done(data => { window.archonCrystalUpgrades = data.archonCrystalUpgrades; @@ -926,3 +926,66 @@ function doPopArchonCrystalUpgrade(type) { }); }); } + +function handleLangClick(lang) { + const languages = { + de: "German", + en: "English", + es: "Spanish", + fr: "French", + it: "Italian", + ja: "Japanese", + ko: "Korean", + pl: "Polish", + pt: "Portuguese", + ru: "Russian", + tc: "Traditional Chinese", + th: "Thai", + tr: "Turkish", + uk: "Ukrainian", + zh: "Simplified Chinese" + }; + const selectedLangText = languages[lang] || "English"; + + $(".currentLanguage").text(selectedLangText); + + localStorage.setItem("lang", lang); + window.location.reload(); +} + +document.addEventListener("DOMContentLoaded", () => { + const languages = { + de: "German", + en: "English", + es: "Spanish", + fr: "French", + it: "Italian", + ja: "Japanese", + ko: "Korean", + pl: "Polish", + pt: "Portuguese", + ru: "Russian", + tc: "Traditional Chinese", + th: "Thai", + tr: "Turkish", + uk: "Ukrainian", + zh: "Simplified Chinese" + }; + const languageMenu = document.getElementById("languageMenu"); + + Object.keys(languages).forEach(lang => { + const listItem = document.createElement("li"); + const linkItem = document.createElement("a"); + linkItem.className = "dropdown-item"; + linkItem.href = "#"; + linkItem.dataset.lang = lang; + linkItem.textContent = languages[lang]; + linkItem.onclick = () => handleLangClick(lang); + listItem.appendChild(linkItem); + languageMenu.appendChild(listItem); + }); + + const savedLang = localStorage.getItem("lang") || "en"; + const savedLangText = languages[savedLang]; + $(".currentLanguage").text(savedLangText); +});