Language selector for items in webui #407

Closed
AMelonInsideLemon wants to merge 5 commits from webui-lang into main
4 changed files with 151 additions and 17 deletions

View File

@ -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,

View File

@ -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, string>): 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;
}
};

View File

@ -13,6 +13,11 @@
<span class="navbar-toggler-icon"></span>
</button>
<a class="navbar-brand">OpenWF WebUI</a>
<div class="btn-group dropdown">
<div class="nav-item dropdown">
<button class="nav-link dropdown-toggle currentLanguage" data-bs-toggle="dropdown" aria-expanded="false"></button>
<ul class="dropdown-menu" id="languageMenu"></ul>
</div>
<div class="nav-item dropdown">
<button class="nav-link dropdown-toggle displayname" data-bs-toggle="dropdown" aria-expanded="false"></button>
<ul class="dropdown-menu dropdown-menu-end">
@ -20,6 +25,7 @@
</ul>
</div>
</div>
</div>
</nav>
<div class="container pt-3 pb-3" id="main-view">
<div class="offcanvas-lg offcanvas-start" tabindex="-1" id="sidebar" aria-labelledby="sidebarLabel">

View File

@ -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;
Review

Is this not an issue when the localStorage does not have a "lang" field?

Is this not an issue when the localStorage does not have a "lang" field?
AMelonInsideLemon commented 2024-06-25 22:31:21 -07:00 (Migrated from github.com)
Review

Nope, getString by default returns strings for en

Nope, getString by default returns strings for en
@ -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);
});