From 1252f41264d33d33dd2ecc88906d724c9b15d380 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Sat, 11 Oct 2025 14:13:12 +0200 Subject: [PATCH] feat(webui): Vault MiscItems and ShipDecorations Closes #2874 #2875 --- .../custom/addVaultDecoRecipeController.ts | 36 ---- .../custom/addVaultTypeCountController.ts | 43 +++++ .../custom/getItemListsController.ts | 10 +- src/routes/custom.ts | 4 +- static/webui/index.html | 42 +++- static/webui/script.js | 180 +++++++++++------- static/webui/translations/de.js | 5 +- static/webui/translations/en.js | 5 +- static/webui/translations/es.js | 5 +- static/webui/translations/fr.js | 5 +- static/webui/translations/ru.js | 5 +- static/webui/translations/uk.js | 5 +- static/webui/translations/zh.js | 5 +- 13 files changed, 233 insertions(+), 117 deletions(-) delete mode 100644 src/controllers/custom/addVaultDecoRecipeController.ts create mode 100644 src/controllers/custom/addVaultTypeCountController.ts diff --git a/src/controllers/custom/addVaultDecoRecipeController.ts b/src/controllers/custom/addVaultDecoRecipeController.ts deleted file mode 100644 index 0ea06594..00000000 --- a/src/controllers/custom/addVaultDecoRecipeController.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { getAccountIdForRequest } from "../../services/loginService.ts"; -import { getInventory } from "../../services/inventoryService.ts"; -import type { RequestHandler } from "express"; -import { getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts"; -import { GuildPermission } from "../../types/guildTypes.ts"; -import type { ITypeCount } from "../../types/commonTypes.ts"; - -export const addVaultDecoRecipeController: RequestHandler = async (req, res) => { - const accountId = await getAccountIdForRequest(req); - const requests = req.body as ITypeCount[]; - const inventory = await getInventory(accountId, "GuildId"); - const guild = await getGuildForRequestEx(req, inventory); - if (!(await hasGuildPermission(guild, accountId, GuildPermission.Architect))) { - res.status(400).send("-1").end(); - return; - } - guild.VaultDecoRecipes ??= []; - for (const request of requests) { - const index = guild.VaultDecoRecipes.findIndex(x => x.ItemType === request.ItemType); - - if (index == -1) { - guild.VaultDecoRecipes.push({ - ItemType: request.ItemType, - ItemCount: request.ItemCount - }); - } else { - guild.VaultDecoRecipes[index].ItemCount += request.ItemCount; - - if (guild.VaultDecoRecipes[index].ItemCount < 1) { - guild.VaultDecoRecipes.splice(index, 1); - } - } - } - await guild.save(); - res.end(); -}; diff --git a/src/controllers/custom/addVaultTypeCountController.ts b/src/controllers/custom/addVaultTypeCountController.ts new file mode 100644 index 00000000..0d3acfde --- /dev/null +++ b/src/controllers/custom/addVaultTypeCountController.ts @@ -0,0 +1,43 @@ +import { getAccountIdForRequest } from "../../services/loginService.ts"; +import { getInventory } from "../../services/inventoryService.ts"; +import type { RequestHandler } from "express"; +import { getGuildForRequestEx, hasGuildPermission } from "../../services/guildService.ts"; +import { GuildPermission } from "../../types/guildTypes.ts"; +import type { ITypeCount } from "../../types/commonTypes.ts"; + +export const addVaultTypeCountController: RequestHandler = async (req, res) => { + const accountId = await getAccountIdForRequest(req); + const { vaultType, items } = req.body as { + vaultType: keyof typeof vaultConfig; + items: ITypeCount[]; + }; + const inventory = await getInventory(accountId, "GuildId"); + const guild = await getGuildForRequestEx(req, inventory); + if (!(await hasGuildPermission(guild, accountId, vaultConfig[vaultType]))) { + res.status(400).send("-1").end(); + return; + } + guild[vaultType] ??= []; + for (const item of items) { + const index = guild[vaultType].findIndex(x => x.ItemType === item.ItemType); + if (index === -1) { + guild[vaultType].push({ + ItemType: item.ItemType, + ItemCount: item.ItemCount + }); + } else { + guild[vaultType][index].ItemCount += item.ItemCount; + if (guild[vaultType][index].ItemCount < 1) { + guild[vaultType].splice(index, 1); + } + } + } + + await guild.save(); + res.end(); +}; +const vaultConfig = { + VaultShipDecorations: GuildPermission.Treasurer, + VaultMiscItems: GuildPermission.Treasurer, + VaultDecoRecipes: GuildPermission.Architect +} as const; diff --git a/src/controllers/custom/getItemListsController.ts b/src/controllers/custom/getItemListsController.ts index 3c2f9bd7..cea2c38f 100644 --- a/src/controllers/custom/getItemListsController.ts +++ b/src/controllers/custom/getItemListsController.ts @@ -38,6 +38,7 @@ interface ListedItem { parazon?: boolean; alwaysAvailable?: boolean; maxLevelCap?: number; + eligibleForVault?: boolean; } interface ItemLists { @@ -141,6 +142,12 @@ const getItemListsController: RequestHandler = (req, response) => { } ]*/ }; + const eligibleForVault = new Set([ + ...Object.values(ExportDojoRecipes.research).flatMap(r => r.ingredients.map(i => i.ItemType)), + ...Object.values(ExportDojoRecipes.fabrications).flatMap(f => f.ingredients.map(i => i.ItemType)), + ...Object.values(ExportDojoRecipes.rooms).flatMap(r => r.ingredients.map(i => i.ItemType)), + ...Object.values(ExportDojoRecipes.decos).flatMap(d => d.ingredients.map(i => i.ItemType)) + ]); for (const [uniqueName, item] of Object.entries(ExportWarframes)) { res[item.productCategory].push({ uniqueName, @@ -246,7 +253,8 @@ const getItemListsController: RequestHandler = (req, response) => { res.miscitems.push({ uniqueName: uniqueName, name: name, - subtype: "Resource" + subtype: "Resource", + ...(eligibleForVault.has(uniqueName) && { eligibleForVault: true }) }); } } diff --git a/src/routes/custom.ts b/src/routes/custom.ts index 628aff6b..cf1785f0 100644 --- a/src/routes/custom.ts +++ b/src/routes/custom.ts @@ -34,7 +34,7 @@ import { fundTechProjectController, removeTechProjectController } from "../controllers/custom/techProjectController.ts"; -import { addVaultDecoRecipeController } from "../controllers/custom/addVaultDecoRecipeController.ts"; +import { addVaultTypeCountController } from "../controllers/custom/addVaultTypeCountController.ts"; import { addXpController } from "../controllers/custom/addXpController.ts"; import { importController } from "../controllers/custom/importController.ts"; import { manageQuestsController } from "../controllers/custom/manageQuestsController.ts"; @@ -81,7 +81,7 @@ customRouter.post("/addCurrency", addCurrencyController); customRouter.post("/addItems", addItemsController); customRouter.post("/addTechProject", addTechProjectController); customRouter.post("/removeTechProject", removeTechProjectController); -customRouter.post("/addVaultDecoRecipe", addVaultDecoRecipeController); +customRouter.post("/addVaultTypeCount", addVaultTypeCountController); customRouter.post("/fundTechProject", fundTechProjectController); customRouter.post("/completeTechProject", completeTechProjectsController); customRouter.post("/addXp", addXpController); diff --git a/static/webui/index.html b/static/webui/index.html index 7a5c0caf..ec4bdd8f 100644 --- a/static/webui/index.html +++ b/static/webui/index.html @@ -624,7 +624,7 @@
-
+
@@ -637,6 +637,42 @@
+
+
+
+
+
+
+ + + +
+
+ + +
+
+
+
+
+
+
+
+
+
+ + + +
+
+ + +
+
+
+
+
+
@@ -666,7 +702,8 @@
- + +
@@ -1548,6 +1585,7 @@ + diff --git a/static/webui/script.js b/static/webui/script.js index d4ecc107..0b9b0d39 100644 --- a/static/webui/script.js +++ b/static/webui/script.js @@ -711,6 +711,10 @@ function fetchItemList() { option.value += " (" + item.subtype + ")"; } document.getElementById("datalist-" + type).appendChild(option); + if (item.eligibleForVault) { + const vaultOption = option.cloneNode(true); + document.getElementById("datalist-VaultMiscItems").appendChild(vaultOption); + } } else { //console.log(`Not adding ${item.uniqueName} to datalist for ${type} due to duplicate display name: ${item.name}`); } @@ -1802,6 +1806,8 @@ function updateInventory() { document.getElementById("VaultRegularCredits-owned").classList.remove("mb-0"); document.getElementById("vaultPremiumCredits-form").classList.remove("d-none"); document.getElementById("VaultPremiumCredits-owned").classList.remove("mb-0"); + document.getElementById("vaultMiscItems-form").classList.remove("d-none"); + document.getElementById("vaultShipDecorations-form").classList.remove("d-none"); } if (userGuildMember.Rank <= 1) { document.querySelectorAll("#guild-actions button").forEach(btn => { @@ -1892,42 +1898,55 @@ function updateInventory() { document.getElementById("TechProjects-list").appendChild(tr); }); - document.getElementById("VaultDecoRecipes-list").innerHTML = ""; - guildData.VaultDecoRecipes ??= []; - guildData.VaultDecoRecipes.forEach(item => { - const datalist = document.getElementById("datalist-VaultDecoRecipes"); - const optionToRemove = datalist.querySelector(`option[data-key="${item.ItemType}"]`); - if (optionToRemove) { - datalist.removeChild(optionToRemove); - } - const tr = document.createElement("tr"); - tr.setAttribute("data-item-type", item.ItemType); - { - const td = document.createElement("td"); - td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType; - tr.appendChild(td); - } - { - const td = document.createElement("td"); - td.classList = "text-end text-nowrap"; - - if (userGuildMember && userGuildMember.Rank <= 1) { - const a = document.createElement("a"); - a.href = "#"; - a.onclick = function (event) { - event.preventDefault(); - reAddToItemList(itemMap, "VaultDecoRecipes", item.ItemType); - removeVaultDecoRecipe(item.ItemType); - }; - a.title = loc("code_remove"); - a.innerHTML = ``; - td.appendChild(a); + ["VaultDecoRecipes", "VaultMiscItems", "VaultShipDecorations"].forEach(vaultKey => { + document.getElementById(vaultKey + "-list").innerHTML = ""; + (guildData[vaultKey] ??= []).forEach(item => { + if (vaultKey == "VaultDecoRecipes") { + const datalist = document.getElementById("datalist-VaultDecoRecipes"); + const optionToRemove = datalist.querySelector( + `option[data-key="${item.ItemType}"]` + ); + if (optionToRemove) { + datalist.removeChild(optionToRemove); + } } - tr.appendChild(td); - } + const tr = document.createElement("tr"); + tr.setAttribute("data-item-type", item.ItemType); + { + const td = document.createElement("td"); + td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType; + if (item.ItemCount > 1) { + td.innerHTML += ` 🗍 ${parseInt(item.ItemCount)}`; + } + tr.appendChild(td); + } + { + const td = document.createElement("td"); + td.classList = "text-end text-nowrap"; + const canRemove = + vaultKey === "VaultDecoRecipes" + ? userGuildMember && userGuildMember.Rank <= 1 + : userGuildPermissions && userGuildPermissions & 64; + if (canRemove) { + const a = document.createElement("a"); + a.href = "#"; + a.title = loc("code_remove"); + a.onclick = e => { + e.preventDefault(); + if (vaultKey == "VaultDecoRecipes") { + reAddToItemList(itemMap, vaultKey, item.ItemType); + } + removeVaultItem(vaultKey, item.ItemType, item.ItemCount * -1); + }; + a.innerHTML = ``; + td.appendChild(a); + } + tr.appendChild(td); + } - document.getElementById("VaultDecoRecipes-list").appendChild(tr); + document.getElementById(vaultKey + "-list").appendChild(tr); + }); }); document.getElementById("Members-list").innerHTML = ""; @@ -2346,41 +2365,52 @@ function addMissingEquipment(categories) { } } -function addVaultDecoRecipe() { - const uniqueName = getKey(document.getElementById("acquire-type-VaultDecoRecipes")); - if (!uniqueName) { - $("#acquire-type-VaultDecoRecipes").addClass("is-invalid").focus(); +function addVaultItem(vaultType) { + const ItemType = getKey(document.getElementById(`acquire-type-${vaultType}`)); + if (!ItemType) { + $(`#acquire-type-${vaultType}`).addClass("is-invalid").focus(); return; } - revalidateAuthz().then(() => { - const req = $.post({ - url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId, - contentType: "application/json", - data: JSON.stringify([ - { - ItemType: uniqueName, - ItemCount: 1 - } - ]) + const ItemCount = ["VaultMiscItems", "VaultShipDecorations"].includes(vaultType) + ? parseInt($(`#${vaultType}-count`).val()) + : 1; + if (ItemCount != 0) { + revalidateAuthz().then(() => { + const req = $.post({ + url: "/custom/addVaultTypeCount?" + window.authz + "&guildId=" + window.guildId, + contentType: "application/json", + data: JSON.stringify({ + vaultType, + items: [ + { + ItemType, + ItemCount + } + ] + }) + }); + req.done(() => { + document.getElementById(`acquire-type-${vaultType}`).value = ""; + updateInventory(); + }); }); - req.done(() => { - document.getElementById("acquire-type-VaultDecoRecipes").value = ""; - updateInventory(); - }); - }); + } } -function removeVaultDecoRecipe(uniqueName) { +function removeVaultItem(vaultType, ItemType, ItemCount) { revalidateAuthz().then(() => { const req = $.post({ - url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId, + url: "/custom/addVaultTypeCount?" + window.authz + "&guildId=" + window.guildId, contentType: "application/json", - data: JSON.stringify([ - { - ItemType: uniqueName, - ItemCount: -1 - } - ]) + data: JSON.stringify({ + vaultType, + items: [ + { + ItemType, + ItemCount + } + ] + }) }); req.done(() => { updateInventory(); @@ -2462,13 +2492,16 @@ function fundGuildTechProject(uniqueName) { }); } -function dispatchAddVaultDecoRecipesBatch(requests) { +function dispatchAddVaultItemsBatch(requests, vaultType) { return new Promise(resolve => { revalidateAuthz().then(() => { const req = $.post({ - url: "/custom/addVaultDecoRecipe?" + window.authz + "&guildId=" + window.guildId, + url: "/custom/addVaultItems?" + window.authz + "&guildId=" + window.guildId, contentType: "application/json", - data: JSON.stringify(requests) + data: JSON.stringify({ + vaultType, + items: requests + }) }); req.done(() => { updateInventory(); @@ -2478,20 +2511,23 @@ function dispatchAddVaultDecoRecipesBatch(requests) { }); } -function addMissingVaultDecoRecipes() { +function addMissingVaultItems(vaultType) { const requests = []; - document.querySelectorAll("#datalist-VaultDecoRecipes" + " option").forEach(elm => { - if (!document.querySelector("#VaultDecoRecipes-list [data-item-type='" + elm.getAttribute("data-key") + "']")) { - requests.push({ ItemType: elm.getAttribute("data-key"), ItemCount: 1 }); + document.querySelectorAll(`#datalist-${vaultType} option`).forEach(elm => { + const datalist = vaultType === "VaultShipDecorations" ? "ShipDecorations" : vaultType; + if (!document.querySelector(`#${datalist}-list [data-item-type='${elm.getAttribute("data-key")}']`)) { + let ItemCount = 1; + if (category == "VaultShipDecorations") ItemCount = 999999; + requests.push({ ItemType: elm.getAttribute("data-key"), ItemCount }); } }); if ( requests.length != 0 && - window.confirm(loc("code_addDecoRecipesConfirm").split("|COUNT|").join(requests.length)) + window.confirm(loc("code_addVaultItemsRecipesConfirm").split("|COUNT|").join(requests.length)) ) { - return dispatchAddVaultDecoRecipesBatch(requests); + return dispatchAddVaultItemsBatch(requests, vaultType); } } @@ -3445,6 +3481,12 @@ single.getRoute("#guild-route").on("beforeload", function () { document.getElementById("VaultDecoRecipes-list").innerHTML = ""; document.getElementById("vaultDecoRecipes-form").classList.add("d-none"); document.getElementById("acquire-type-VaultDecoRecipes").value = ""; + document.getElementById("VaultMiscItems-list").innerHTML = ""; + document.getElementById("vaultMiscItems-form").classList.add("d-none"); + document.getElementById("acquire-type-VaultMiscItems").value = ""; + document.getElementById("VaultShipDecorations-list").innerHTML = ""; + document.getElementById("vaultShipDecorations-form").classList.add("d-none"); + document.getElementById("acquire-type-VaultShipDecorations").value = ""; document.getElementById("Alliance-list").innerHTML = ""; document.getElementById("guildView-alliance").textContent = ""; document.getElementById("Members-list").innerHTML = ""; diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js index 2f428a50..b137bf54 100644 --- a/static/webui/translations/de.js +++ b/static/webui/translations/de.js @@ -33,7 +33,7 @@ dict = { code_remove: `Entfernen`, code_addItemsConfirm: `Bist du sicher, dass du |COUNT| Gegenstände zu deinem Account hinzufügen möchtest?`, code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`, - code_addDecoRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| deco recipes to your clan?`, + code_addVaultItemsRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`, code_succRankUp: `Erfolgreich aufgestiegen.`, code_noEquipmentToRankUp: `Keine Ausstattung zum Rangaufstieg verfügbar.`, code_succAdded: `Erfolgreich hinzugefügt.`, @@ -419,6 +419,8 @@ dict = { guildView_cheats: `[UNTRANSLATED] Clan Cheats`, guildView_techProjects: `Forschung`, guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`, + guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`, + guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`, guildView_alliance: `Allianz`, guildView_members: `Mitglieder`, guildView_pending: `Ausstehend`, @@ -441,6 +443,7 @@ dict = { guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`, guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`, guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`, + guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`, guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`, guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`, guildView_promote: `Befördern`, diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js index 0c24676c..db79e664 100644 --- a/static/webui/translations/en.js +++ b/static/webui/translations/en.js @@ -32,7 +32,7 @@ dict = { code_remove: `Remove`, code_addItemsConfirm: `Are you sure you want to add |COUNT| items to your account?`, code_addTechProjectsConfirm: `Are you sure you want to add |COUNT| research to your clan?`, - code_addDecoRecipesConfirm: `Are you sure you want to add |COUNT| deco recipes to your clan?`, + code_addVaultItemsRecipesConfirm: `Are you sure you want to add |COUNT| items to your clan vault?`, code_succRankUp: `Successfully ranked up.`, code_noEquipmentToRankUp: `No equipment to rank up.`, code_succAdded: `Successfully added.`, @@ -418,6 +418,8 @@ dict = { guildView_cheats: `Clan Cheats`, guildView_techProjects: `Research`, guildView_vaultDecoRecipes: `Dojo Deco Recipes`, + guildView_vaultMiscItems: `Resources in Vault`, + guildView_vaultShipDecorations: `Decorations in Vault`, guildView_alliance: `Alliance`, guildView_members: `Members`, guildView_pending: `Pending`, @@ -440,6 +442,7 @@ dict = { guildView_currency_owned: `|COUNT| in Vault.`, guildView_bulkAddTechProjects: `Add Missing Research`, guildView_bulkAddVaultDecoRecipes: `Add Missing Dojo Deco Recipes`, + guildView_bulkAddVaultShipDecorations: `Add Missing Decorations in Vault`, guildView_bulkFundTechProjects: `Fund All Research`, guildView_bulkCompleteTechProjects: `Complete All Research`, guildView_promote: `Promote`, diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js index 7c6d2438..8b349c3e 100644 --- a/static/webui/translations/es.js +++ b/static/webui/translations/es.js @@ -33,7 +33,7 @@ dict = { code_remove: `Quitar`, code_addItemsConfirm: `¿Estás seguro de que deseas agregar |COUNT| objetos a tu cuenta?`, code_addTechProjectsConfirm: `¿Estás seguro de que quieres añadir |COUNT| proyectos de investigación a tu clan?`, - code_addDecoRecipesConfirm: `¿Estás seguro de que quieres añadir |COUNT| planos de decoración a tu clan?`, + code_addVaultItemsRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`, code_succRankUp: `Ascenso exitoso.`, code_noEquipmentToRankUp: `No hay equipo para ascender.`, code_succAdded: `Agregado exitosamente.`, @@ -419,6 +419,8 @@ dict = { guildView_cheats: `Trucos de Clan`, guildView_techProjects: `Investigación`, guildView_vaultDecoRecipes: `Planos de Decoración de Dojo`, + guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`, + guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`, guildView_alliance: `Alianza`, guildView_members: `Miembros`, guildView_pending: `Pendiente`, @@ -441,6 +443,7 @@ dict = { guildView_currency_owned: `|COUNT| en la Bóveda.`, guildView_bulkAddTechProjects: `Añadir proyectos de Investigación Faltantes`, guildView_bulkAddVaultDecoRecipes: `Añadir planos de Decoración de Dojo Faltantes`, + guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`, guildView_bulkFundTechProjects: `Financiar toda la Investigación`, guildView_bulkCompleteTechProjects: `Completar toda la Investigación`, guildView_promote: `Promover`, diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js index 087a1afe..794148f8 100644 --- a/static/webui/translations/fr.js +++ b/static/webui/translations/fr.js @@ -33,7 +33,7 @@ dict = { code_remove: `Retirer`, code_addItemsConfirm: `Ajouter |COUNT| items à l'inventaire ?`, code_addTechProjectsConfirm: `Ajouter |COUNT| recherches au clan ?`, - code_addDecoRecipesConfirm: `Ajouter |COUNT| décorations au clan ?`, + code_addVaultItemsRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`, code_succRankUp: `Montée de niveau effectuée.`, code_noEquipmentToRankUp: `Aucun équipement à monter de niveau.`, code_succAdded: `Ajouté.`, @@ -419,6 +419,8 @@ dict = { guildView_cheats: `[UNTRANSLATED] Clan Cheats`, guildView_techProjects: `Recherche`, guildView_vaultDecoRecipes: `Schémas de décorations de dojo`, + guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`, + guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`, guildView_alliance: `Alliance`, guildView_members: `Members`, guildView_pending: `En Attente`, @@ -441,6 +443,7 @@ dict = { guildView_currency_owned: `|COUNT| dans le coffre.`, guildView_bulkAddTechProjects: `Ajouter les recherches manquantes`, guildView_bulkAddVaultDecoRecipes: `Ajouter les schémas de décorations de dojo manquantes`, + guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`, guildView_bulkFundTechProjects: `Financer toutes les recherches`, guildView_bulkCompleteTechProjects: `Compléter toutes les recherches`, guildView_promote: `Promouvoir`, diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js index 0f66fa9b..66e8769c 100644 --- a/static/webui/translations/ru.js +++ b/static/webui/translations/ru.js @@ -33,7 +33,7 @@ dict = { code_remove: `Удалить`, code_addItemsConfirm: `Вы уверены, что хотите добавить |COUNT| предметов на ваш аккаунт?`, code_addTechProjectsConfirm: `Вы уверены, что хотите добавить |COUNT| исследований в свой клан?`, - code_addDecoRecipesConfirm: `Вы уверены, что хотите добавить |COUNT| рецептов декораций в свой клан?`, + code_addVaultItemsRecipesConfirm: `Вы уверены, что хотите добавить |COUNT| предметов в хранилище своего клана?`, code_succRankUp: `Ранг успешно повышен.`, code_noEquipmentToRankUp: `Нет снаряжения для повышения ранга.`, code_succAdded: `Успешно добавлено.`, @@ -419,6 +419,8 @@ dict = { guildView_cheats: `Читы Клана`, guildView_techProjects: `Исследовения`, guildView_vaultDecoRecipes: `Рецепты декораций Додзё`, + guildView_vaultMiscItems: `Ресурсы в Хранилище`, + guildView_vaultShipDecorations: `Укращения в Хранилище`, guildView_alliance: `Альянс`, guildView_members: `Товарищи`, guildView_pending: `Ожидание`, @@ -441,6 +443,7 @@ dict = { guildView_currency_owned: `В хранилище |COUNT|.`, guildView_bulkAddTechProjects: `Добавить отсутствующие исследования`, guildView_bulkAddVaultDecoRecipes: `Добавить отсутствующие рецепты декораций Дoдзё`, + guildView_bulkAddVaultShipDecorations: `Добавить отсутствующие укращения в Хранилище`, guildView_bulkFundTechProjects: `Профинансировать все исследования`, guildView_bulkCompleteTechProjects: `Завершить все исследования`, guildView_promote: `Повысить`, diff --git a/static/webui/translations/uk.js b/static/webui/translations/uk.js index 50680791..33655b1b 100644 --- a/static/webui/translations/uk.js +++ b/static/webui/translations/uk.js @@ -33,7 +33,7 @@ dict = { code_remove: `Видалити`, code_addItemsConfirm: `Ви впевнені, що хочете додати |COUNT| предметів на ваш обліковий запис?`, code_addTechProjectsConfirm: `Ви впевнені, що хочете додати |COUNT| досліджень до свого клану?`, - code_addDecoRecipesConfirm: `Ви впевнені, що хочете додати |COUNT| рецептів оздоблень до свого клану?`, + code_addVaultItemsRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`, code_succRankUp: `Рівень успішно підвищено`, code_noEquipmentToRankUp: `Немає спорядження для підвищення рівня.`, code_succAdded: `Успішно додано.`, @@ -419,6 +419,8 @@ dict = { guildView_cheats: `Кланові чити`, guildView_techProjects: `Дослідження`, guildView_vaultDecoRecipes: `Рецепти оздоблень Доджьо`, + guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`, + guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`, guildView_alliance: `Альянс`, guildView_members: `Учасники`, guildView_pending: `Очікування`, @@ -441,6 +443,7 @@ dict = { guildView_currency_owned: `В сховищі |COUNT|.`, guildView_bulkAddTechProjects: `Додати відсутні дослідження`, guildView_bulkAddVaultDecoRecipes: `Додати відсутні рецепти оздоблень Доджьо`, + guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`, guildView_bulkFundTechProjects: `Фінансувати всі дослідження`, guildView_bulkCompleteTechProjects: `Завершити всі дослідження`, guildView_promote: `Підвищити звання`, diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js index 573f26e2..937a4d37 100644 --- a/static/webui/translations/zh.js +++ b/static/webui/translations/zh.js @@ -33,7 +33,7 @@ dict = { code_remove: `移除`, code_addItemsConfirm: `确定要向您的账户添加 |COUNT| 件物品吗?`, code_addTechProjectsConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| research to your clan?`, - code_addDecoRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| deco recipes to your clan?`, + code_addVaultItemsRecipesConfirm: `[UNTRANSLATED] Are you sure you want to add |COUNT| items to your clan vault?`, code_succRankUp: `等级已提升`, code_noEquipmentToRankUp: `没有可升级的装备`, code_succAdded: `添加成功`, @@ -419,6 +419,8 @@ dict = { guildView_cheats: `[UNTRANSLATED] Clan Cheats`, guildView_techProjects: `研究`, guildView_vaultDecoRecipes: `[UNTRANSLATED] Dojo Deco Recipes`, + guildView_vaultMiscItems: `[UNTRANSLATED] Resources in Vault`, + guildView_vaultShipDecorations: `[UNTRANSLATED] Decorations in Vault`, guildView_alliance: `联盟`, guildView_members: `成员`, guildView_pending: `待处理`, @@ -441,6 +443,7 @@ dict = { guildView_currency_owned: `[UNTRANSLATED] |COUNT| in Vault.`, guildView_bulkAddTechProjects: `[UNTRANSLATED] Add Missing Research`, guildView_bulkAddVaultDecoRecipes: `[UNTRANSLATED] Add Missing Dojo Deco Recipes`, + guildView_bulkAddVaultShipDecorations: `[UNTRANSLATED] Add Missing Decorations in Vault`, guildView_bulkFundTechProjects: `[UNTRANSLATED] Fund All Research`, guildView_bulkCompleteTechProjects: `[UNTRANSLATED] Complete All Research`, guildView_promote: `升级`,