XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

SpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 1 Star 0
返回提交历史

XFEstudio/SpaceNinjaServer

feat(webui): flavour Items (#2779)

Re #2361 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2779 Reviewed-by: Sainan <63328889+sainan@users.noreply.github.com> Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>

7e437d75
AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
提交于

代码差异

15 个文件 +167 -22
Modified config-vanilla.json +0 -1
@@ -12,7 +12,6 @@
12 12 "autoCreateAccount": true,
13 13 "skipTutorial": false,
14 14 "unlockAllShipDecorations": false,
15 "unlockAllFlavourItems": false,
16 15 "unlockAllSkins": false,
17 16 "fullyStockedVendors": false,
18 17 "skipClanKeyCrafting": false,
Modified src/controllers/api/inventoryController.ts +2 -7
@@ -10,7 +10,7 @@ import { equipmentKeys } from "../../types/inventoryTypes/inventoryTypes.ts";
10 10 import type { IPolarity } from "../../types/inventoryTypes/commonInventoryTypes.ts";
11 11 import { ArtifactPolarity } from "../../types/inventoryTypes/commonInventoryTypes.ts";
12 12 import type { ICountedItem } from "warframe-public-export-plus";
13 import { ExportCustoms, ExportFlavour, ExportResources } from "warframe-public-export-plus";
13 import { ExportCustoms, ExportResources } from "warframe-public-export-plus";
14 14 import { applyCheatsToInfestedFoundry, handleSubsumeCompletion } from "../../services/infestedFoundryService.ts";
15 15 import {
16 16 addEmailItem,
@@ -330,12 +330,7 @@ export const getInventoryResponse = async (
330 330 }
331 331 }
332 332
333 if (config.unlockAllFlavourItems) {
334 inventoryResponse.FlavourItems = [];
335 for (const uniqueName in ExportFlavour) {
336 inventoryResponse.FlavourItems.push({ ItemType: uniqueName });
337 }
338 } else if (config.worldState?.baroTennoConRelay) {
333 if (config.worldState?.baroTennoConRelay) {
339 334 [
340 335 "/Lotus/Types/Items/Events/TennoConRelay2022EarlyAccess",
341 336 "/Lotus/Types/Items/Events/TennoConRelay2023EarlyAccess",
Modified src/controllers/custom/getItemListsController.ts +11 -1
@@ -10,6 +10,7 @@ import {
10 10 ExportDojoRecipes,
11 11 ExportDrones,
12 12 ExportFactions,
13 ExportFlavour,
13 14 ExportGear,
14 15 ExportKeys,
15 16 ExportRailjackWeapons,
@@ -62,6 +63,7 @@ interface ItemLists {
62 63 Abilities: ListedItem[];
63 64 TechProjects: ListedItem[];
64 65 VaultDecoRecipes: ListedItem[];
66 FlavourItems: ListedItem[];
65 67 //circuitGameModes: ListedItem[];
66 68 }
67 69
@@ -102,7 +104,8 @@ const getItemListsController: RequestHandler = (req, response) => {
102 104 VarziaOffers: [],
103 105 Abilities: [],
104 106 TechProjects: [],
105 VaultDecoRecipes: []
107 VaultDecoRecipes: [],
108 FlavourItems: []
106 109 /*circuitGameModes: [
107 110 {
108 111 uniqueName: "Survival",
@@ -443,6 +446,13 @@ const getItemListsController: RequestHandler = (req, response) => {
443 446 });
444 447 }
445 448
449 for (const [uniqueName, item] of Object.entries(ExportFlavour)) {
450 res.FlavourItems.push({
451 uniqueName: uniqueName,
452 name: getString(item.name, lang)
453 });
454 }
455
446 456 response.json(res);
447 457 };
448 458
Added src/controllers/custom/removeCustomizationController.ts +14 -0
@@ -0,0 +1,14 @@
1 import { getAccountIdForRequest } from "../../services/loginService.ts";
2 import { getInventory } from "../../services/inventoryService.ts";
3 import type { RequestHandler } from "express";
4 import { broadcastInventoryUpdate } from "../../services/wsService.ts";
5
6 export const removeCustomizationController: RequestHandler = async (req, res) => {
7 const accountId = await getAccountIdForRequest(req);
8 const ItemType = req.query.itemType as string;
9 const inventory = await getInventory(accountId, "FlavourItems");
10 inventory.FlavourItems.pull({ ItemType });
11 await inventory.save();
12 res.end();
13 broadcastInventoryUpdate(req);
14 };
Modified src/routes/custom.ts +2 -0
@@ -21,6 +21,7 @@ import { unlockAllSimarisResearchEntriesController } from "../controllers/custom
21 21 import { unlockAllScansController } from "../controllers/custom/unlockAllScansController.ts";
22 22 import { unlockAllShipFeaturesController } from "../controllers/custom/unlockAllShipFeaturesController.ts";
23 23 import { unlockAllCapturaScenesController } from "../controllers/custom/unlockAllCapturaScenesController.ts";
24 import { removeCustomizationController } from "../controllers/custom/removeCustomizationController.ts";
24 25
25 26 import { abilityOverrideController } from "../controllers/custom/abilityOverrideController.ts";
26 27 import { createAccountController } from "../controllers/custom/createAccountController.ts";
@@ -70,6 +71,7 @@ customRouter.get("/unlockAllSimarisResearchEntries", unlockAllSimarisResearchEnt
70 71 customRouter.get("/unlockAllScans", unlockAllScansController);
71 72 customRouter.get("/unlockAllShipFeatures", unlockAllShipFeaturesController);
72 73 customRouter.get("/unlockAllCapturaScenes", unlockAllCapturaScenesController);
74 customRouter.get("/removeCustomization", removeCustomizationController);
73 75
74 76 customRouter.post("/abilityOverride", abilityOverrideController);
75 77 customRouter.post("/createAccount", createAccountController);
Modified src/services/configService.ts +2 -2
@@ -22,7 +22,6 @@ export interface IConfig {
22 22 autoCreateAccount?: boolean;
23 23 skipTutorial?: boolean;
24 24 unlockAllShipDecorations?: boolean;
25 unlockAllFlavourItems?: boolean;
26 25 unlockAllSkins?: boolean;
27 26 fullyStockedVendors?: boolean;
28 27 skipClanKeyCrafting?: boolean;
@@ -128,7 +127,8 @@ export const configRemovedOptionsKeys = [
128 127 "noDojoResearchCosts",
129 128 "noDojoResearchTime",
130 129 "fastClanAscension",
131 "unlockAllDecoRecipes"
130 "unlockAllDecoRecipes",
131 "unlockAllFlavourItems"
132 132 ];
133 133
134 134 export const configPath = path.join(repoDir, args.configPath ?? "config.json");
Modified static/webui/index.html +18 -4
@@ -459,6 +459,22 @@
459 459 </div>
460 460 </div>
461 461 </div>
462 <div class="row g-3 mb-3">
463 <div class="col-lg-6">
464 <div class="card" style="height: 400px;">
465 <h5 class="card-header" data-loc="inventory_flavourItems"></h5>
466 <div class="card-body overflow-auto">
467 <form class="input-group mb-3" onsubmit="doAcquireEquipment('FlavourItems');return false;">
468 <input class="form-control" id="acquire-type-FlavourItems" list="datalist-FlavourItems" />
469 <button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
470 </form>
471 <table class="table table-hover w-100">
472 <tbody id="FlavourItems-list"></tbody>
473 </table>
474 </div>
475 </div>
476 </div>
477 </div>
462 478 <div class="card">
463 479 <h5 class="card-header" data-loc="general_bulkActions"></h5>
464 480 <div class="card-body">
@@ -469,6 +485,7 @@
469 485 <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SpaceGuns', 'SpaceMelee']);" data-loc="inventory_bulkAddSpaceWeapons"></button>
470 486 <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['Sentinels']);" data-loc="inventory_bulkAddSentinels"></button>
471 487 <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['SentinelWeapons']);" data-loc="inventory_bulkAddSentinelWeapons"></button>
488 <button class="btn btn-primary" onclick="debounce(addMissingEquipment, ['FlavourItems']);" data-loc="inventory_bulkAddFlavourItems"></button>
472 489 <button class="btn btn-primary" onclick="debounce(addMissingEvolutionProgress);" data-loc="inventory_bulkAddEvolutionProgress"></button>
473 490 </div>
474 491 <div class="mb-2 d-flex flex-wrap gap-2">
@@ -983,10 +1000,6 @@
983 1000 <input class="form-check-input" type="checkbox" id="unlockAllShipDecorations" />
984 1001 <label class="form-check-label" for="unlockAllShipDecorations" data-loc="cheats_unlockAllShipDecorations"></label>
985 1002 </div>
986 <div class="form-check">
987 <input class="form-check-input" type="checkbox" id="unlockAllFlavourItems" />
988 <label class="form-check-label" for="unlockAllFlavourItems" data-loc="cheats_unlockAllFlavourItems"></label>
989 </div>
990 1003 <div class="form-check">
991 1004 <input class="form-check-input" type="checkbox" id="unlockAllSkins" />
992 1005 <label class="form-check-label" for="unlockAllSkins" data-loc="cheats_unlockAllSkins"></label>
@@ -1387,6 +1400,7 @@
1387 1400 <datalist id="datalist-Abilities"></datalist>
1388 1401 <datalist id="datalist-TechProjects"></datalist>
1389 1402 <datalist id="datalist-VaultDecoRecipes"></datalist>
1403 <datalist id="datalist-FlavourItems"></datalist>
1390 1404 <datalist id="datalist-circuitGameModes">
1391 1405 <option>Survival</option>
1392 1406 <option>VoidFlood</option>
Modified static/webui/script.js +76 -0
@@ -570,6 +570,33 @@ function fetchItemList() {
570 570 option.textContent = item.name;
571 571 document.getElementById("changeSyndicate").appendChild(option);
572 572 });
573 } else if (type == "FlavourItems") {
574 const cursorPrefixes = {
575 Controller: loc("code_controller"),
576 MouseGrey: loc("code_mouse"),
577 MouseLine: loc("code_mouseLine"),
578 Mouse: loc("code_mouse")
579 };
580 items.forEach(item => {
581 if (item.uniqueName.startsWith("/Lotus/Interface/Graphics/CustomUI/Cursors/")) {
582 let base = item.uniqueName.replace("/Lotus/Interface/Graphics/CustomUI/Cursors/", "");
583 for (const key in cursorPrefixes) {
584 if (base.startsWith(key)) {
585 const prefix = cursorPrefixes[key];
586 const suffix = base.slice(key.length);
587 item.name = prefix + " " + suffix;
588 break;
589 }
590 }
591 } else if (item.uniqueName.includes("ColourPicker")) {
592 item.name = loc("code_itemColorPalette").split("|ITEM|").join(item.name);
593 }
594 const option = document.createElement("option");
595 option.setAttribute("data-key", item.uniqueName);
596 option.value = item.name;
597 document.getElementById("datalist-" + type).appendChild(option);
598 itemMap[item.uniqueName] = { ...item, type };
599 });
573 600 } else {
574 601 const nameToItems = {};
575 602 items.forEach(item => {
@@ -960,6 +987,46 @@ function updateInventory() {
960 987 document.getElementById("EvolutionProgress-list").appendChild(tr);
961 988 });
962 989
990 document.getElementById("FlavourItems-list").innerHTML = "";
991 data.FlavourItems.forEach(item => {
992 const datalist = document.getElementById("datalist-FlavourItems");
993 if (!data.FlavourItems.some(x => x.ItemType == item.uniqueName)) {
994 if (!datalist.querySelector(`option[value="${item.uniqueName}"]`)) {
995 reAddToItemList(itemMap, "FlavourItems", item.ItemType);
996 }
997 }
998 const optionToRemove = datalist.querySelector(`option[value="${item.ItemType}"]`);
999 optionToRemove?.remove();
1000
1001 const tr = document.createElement("tr");
1002 tr.setAttribute("data-item-type", item.ItemType);
1003 {
1004 const td = document.createElement("td");
1005 td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
1006 tr.appendChild(td);
1007 }
1008 {
1009 const td = document.createElement("td");
1010 td.classList = "text-end text-nowrap";
1011
1012 {
1013 const a = document.createElement("a");
1014 a.href = "#";
1015 a.onclick = function (event) {
1016 event.preventDefault();
1017 reAddToItemList(itemMap, "FlavourItems", item.ItemType);
1018 removeCustomization(item.ItemType);
1019 };
1020 a.title = loc("code_remove");
1021 a.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M135.2 17.7L128 32H32C14.3 32 0 46.3 0 64S14.3 96 32 96H416c17.7 0 32-14.3 32-32s-14.3-32-32-32H320l-7.2-14.3C307.4 6.8 296.3 0 284.2 0H163.8c-12.1 0-23.2 6.8-28.6 17.7zM416 128H32L53.2 467c1.6 25.3 22.6 45 47.9 45H346.9c25.3 0 46.3-19.7 47.9-45L416 128z"/></svg>`;
1022 td.appendChild(a);
1023 }
1024 tr.appendChild(td);
1025 }
1026
1027 document.getElementById("FlavourItems-list").appendChild(tr);
1028 });
1029
963 1030 const datalistEvolutionProgress = document.querySelectorAll("#datalist-EvolutionProgress option");
964 1031 const formEvolutionProgress = document.querySelector('form[onsubmit*="doAcquireEvolution()"]');
965 1032
@@ -1971,6 +2038,15 @@ function doAcquireEquipment(category) {
1971 2038 });
1972 2039 }
1973 2040
2041 function removeCustomization(uniqueName) {
2042 revalidateAuthz().then(() => {
2043 const req = $.get("/custom/removeCustomization?" + window.authz + "&itemType=" + uniqueName);
2044 req.done(() => {
2045 updateInventory();
2046 });
2047 });
2048 }
2049
1974 2050 function getRequiredParts(category, WeaponType) {
1975 2051 switch (category) {
1976 2052 case "Hoverboards":
Modified static/webui/translations/de.js +6 -1
@@ -64,6 +64,10 @@ dict = {
64 64 code_completed: `Abgeschlossen`,
65 65 code_active: `Aktiv`,
66 66 code_pigment: `Pigment`,
67 code_controller: `[UNTRANSLATED] Controller cursor`,
68 code_mouseLine: `[UNTRANSLATED] Line cursor`,
69 code_mouse: `[UNTRANSLATED] Cursor`,
70 code_itemColorPalette: `|ITEM| Farbpalette`,
67 71 code_mature: `Für den Kampf auswachsen lassen`,
68 72 code_unmature: `Genetisches Altern zurücksetzen`,
69 73 code_fund: `[UNTRANSLATED] Fund`,
@@ -104,12 +108,14 @@ dict = {
104 108 inventory_kubrowPets: `Bestien`,
105 109 inventory_evolutionProgress: `Incarnon-Entwicklungsfortschritte`,
106 110 inventory_Boosters: `Booster`,
111 inventory_flavourItems: `<abbr title="Animationssets, Glyphen, Farbpaletten usw.">Sammlerstücke</abbr>`,
107 112 inventory_bulkAddSuits: `Fehlende Warframes hinzufügen`,
108 113 inventory_bulkAddWeapons: `Fehlende Waffen hinzufügen`,
109 114 inventory_bulkAddSpaceSuits: `Fehlende Archwings hinzufügen`,
110 115 inventory_bulkAddSpaceWeapons: `Fehlende Archwing-Waffen hinzufügen`,
111 116 inventory_bulkAddSentinels: `Fehlende Wächter hinzufügen`,
112 117 inventory_bulkAddSentinelWeapons: `Fehlende Wächter-Waffen hinzufügen`,
118 inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
113 119 inventory_bulkAddEvolutionProgress: `Fehlende Incarnon-Entwicklungsfortschritte hinzufügen`,
114 120 inventory_bulkRankUpSuits: `Alle Warframes auf Max. Rang`,
115 121 inventory_bulkRankUpWeapons: `Alle Waffen auf Max. Rang`,
@@ -200,7 +206,6 @@ dict = {
200 206 cheats_dontSubtractConsumables: `Verbrauchsgegenstände (Ausrüstung) nicht verbrauchen`,
201 207 cheats_unlockAllShipFeatures: `Alle Schiffs-Funktionen freischalten`,
202 208 cheats_unlockAllShipDecorations: `Alle Schiffsdekorationen freischalten`,
203 cheats_unlockAllFlavourItems: `Alle <abbr title="Animationssets, Glyphen, Farbpaletten usw.">Sammlerstücke</abbr> freischalten`,
204 209 cheats_unlockAllSkins: `Alle Skins freischalten`,
205 210 cheats_unlockAllCapturaScenes: `Alle Photora-Szenen freischalten`,
206 211 cheats_universalPolarityEverywhere: `Universelle Polarität überall`,
Modified static/webui/translations/en.js +6 -1
@@ -63,6 +63,10 @@ dict = {
63 63 code_completed: `Completed`,
64 64 code_active: `Active`,
65 65 code_pigment: `Pigment`,
66 code_controller: `Controller cursor`,
67 code_mouseLine: `Line cursor`,
68 code_mouse: `Cursor`,
69 code_itemColorPalette: `|ITEM| Color Palette`,
66 70 code_mature: `Mature for combat`,
67 71 code_unmature: `Regress genetic aging`,
68 72 code_fund: `Fund`,
@@ -103,12 +107,14 @@ dict = {
103 107 inventory_kubrowPets: `Beasts`,
104 108 inventory_evolutionProgress: `Incarnon Evolution Progress`,
105 109 inventory_Boosters: `Boosters`,
110 inventory_flavourItems: `<abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
106 111 inventory_bulkAddSuits: `Add Missing Warframes`,
107 112 inventory_bulkAddWeapons: `Add Missing Weapons`,
108 113 inventory_bulkAddSpaceSuits: `Add Missing Archwings`,
109 114 inventory_bulkAddSpaceWeapons: `Add Missing Archwing Weapons`,
110 115 inventory_bulkAddSentinels: `Add Missing Sentinels`,
111 116 inventory_bulkAddSentinelWeapons: `Add Missing Sentinel Weapons`,
117 inventory_bulkAddFlavourItems: `Add Missing Flavour Items`,
112 118 inventory_bulkAddEvolutionProgress: `Add Missing Incarnon Evolution Progress`,
113 119 inventory_bulkRankUpSuits: `Max Rank All Warframes`,
114 120 inventory_bulkRankUpWeapons: `Max Rank All Weapons`,
@@ -199,7 +205,6 @@ dict = {
199 205 cheats_dontSubtractConsumables: `Don't Subtract Consumables`,
200 206 cheats_unlockAllShipFeatures: `Unlock All Ship Features`,
201 207 cheats_unlockAllShipDecorations: `Unlock All Ship Decorations`,
202 cheats_unlockAllFlavourItems: `Unlock All <abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavor Items</abbr>`,
203 208 cheats_unlockAllSkins: `Unlock All Skins`,
204 209 cheats_unlockAllCapturaScenes: `Unlock All Captura Scenes`,
205 210 cheats_universalPolarityEverywhere: `Universal Polarity Everywhere`,
Modified static/webui/translations/es.js +6 -1
@@ -64,6 +64,10 @@ dict = {
64 64 code_completed: `Completada`,
65 65 code_active: `Activa`,
66 66 code_pigment: `Pigmento`,
67 code_controller: `[UNTRANSLATED] Controller cursor`,
68 code_mouseLine: `[UNTRANSLATED] Line cursor`,
69 code_mouse: `[UNTRANSLATED] Cursor`,
70 code_itemColorPalette: `Paleta de colores |ITEM|`,
67 71 code_mature: `Listo para el combate`,
68 72 code_unmature: `Regresar el envejecimiento genético`,
69 73 code_fund: `[UNTRANSLATED] Fund`,
@@ -104,12 +108,14 @@ dict = {
104 108 inventory_kubrowPets: `Bestias`,
105 109 inventory_evolutionProgress: `Progreso de evolución Incarnon`,
106 110 inventory_Boosters: `Potenciadores`,
111 inventory_flavourItems: `<abbr title="Conjuntos de animaciones, glifos, paletas, etc.">Ítems estéticos</abbr>`,
107 112 inventory_bulkAddSuits: `Agregar Warframes faltantes`,
108 113 inventory_bulkAddWeapons: `Agregar armas faltantes`,
109 114 inventory_bulkAddSpaceSuits: `Agregar Archwings faltantes`,
110 115 inventory_bulkAddSpaceWeapons: `Agregar armas Archwing faltantes`,
111 116 inventory_bulkAddSentinels: `Agregar centinelas faltantes`,
112 117 inventory_bulkAddSentinelWeapons: `Agregar armas de centinela faltantes`,
118 inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
113 119 inventory_bulkAddEvolutionProgress: `Completar el progreso de evolución Incarnon faltante`,
114 120 inventory_bulkRankUpSuits: `Maximizar rango de todos los Warframes`,
115 121 inventory_bulkRankUpWeapons: `Maximizar rango de todas las armas`,
@@ -200,7 +206,6 @@ dict = {
200 206 cheats_dontSubtractConsumables: `No restar consumibles`,
201 207 cheats_unlockAllShipFeatures: `Desbloquear todas las funciones de nave`,
202 208 cheats_unlockAllShipDecorations: `Desbloquear todas las decoraciones de nave`,
203 cheats_unlockAllFlavourItems: `Desbloquear todos los <abbr title="Conjuntos de animaciones, glifos, paletas, etc.">ítems estéticos</abbr>`,
204 209 cheats_unlockAllSkins: `Desbloquear todas las skins`,
205 210 cheats_unlockAllCapturaScenes: `Desbloquear todas las escenas de Captura`,
206 211 cheats_universalPolarityEverywhere: `Polaridad universal en todas partes`,
Modified static/webui/translations/fr.js +6 -1
@@ -64,6 +64,10 @@ dict = {
64 64 code_completed: `Complétée`,
65 65 code_active: `Active`,
66 66 code_pigment: `Pigment`,
67 code_controller: `[UNTRANSLATED] Controller cursor`,
68 code_mouseLine: `[UNTRANSLATED] Line cursor`,
69 code_mouse: `[UNTRANSLATED] Cursor`,
70 code_itemColorPalette: `Palette de couleurs |ITEM|`,
67 71 code_mature: `Maturer pour le combat`,
68 72 code_unmature: `Régrésser l'âge génétique`,
69 73 code_fund: `Financer`,
@@ -104,12 +108,14 @@ dict = {
104 108 inventory_kubrowPets: `Bêtes`,
105 109 inventory_evolutionProgress: `Progrès de l'évolution Incarnon`,
106 110 inventory_Boosters: `Boosters`,
111 inventory_flavourItems: `[UNTRANSLATED] <abbr title="Animation Sets, Glyphs, Palettes, etc.">Flavour Items</abbr>`,
107 112 inventory_bulkAddSuits: `Ajouter les Warframes manquantes`,
108 113 inventory_bulkAddWeapons: `Ajouter les armes manquantes`,
109 114 inventory_bulkAddSpaceSuits: `Ajouter les Archwings manquants`,
110 115 inventory_bulkAddSpaceWeapons: `Ajouter les armes d'Archwing manquantes`,
111 116 inventory_bulkAddSentinels: `Ajouter les Sentinelles manquantes`,
112 117 inventory_bulkAddSentinelWeapons: `Ajouter les armes de Sentinelles manquantes`,
118 inventory_bulkAddFlavourItems: `[UNTRANSLATED] Add Missing Flavour Items`,
113 119 inventory_bulkAddEvolutionProgress: `Ajouter les évolutions Incarnon manquantes`,
114 120 inventory_bulkRankUpSuits: `Toutes les Warframes au rang max`,
115 121 inventory_bulkRankUpWeapons: `Toutes les armes au rang max`,
@@ -200,7 +206,6 @@ dict = {
200 206 cheats_dontSubtractConsumables: `Ne pas retirer de consommables`,
201 207 cheats_unlockAllShipFeatures: `Débloquer tous les segments du vaisseau`,
202 208 cheats_unlockAllShipDecorations: `Débloquer toutes les décorations du vaisseau`,
203 cheats_unlockAllFlavourItems: `Débloquer tous les <abbr title="Animations, Glyphes, Palettes, etc.">Flavor Items</abbr>`,
204 209 cheats_unlockAllSkins: `Débloquer tous les skins`,
205 210 cheats_unlockAllCapturaScenes: `Débloquer toutes les scènes captura`,
206 211 cheats_universalPolarityEverywhere: `Polarités universelles partout`,
Modified static/webui/translations/ru.js +6 -1
Modified static/webui/translations/uk.js +6 -1
Modified static/webui/translations/zh.js +6 -1