From da0183a101d21411f744e631bbafec8e4089fb38 Mon Sep 17 00:00:00 2001
From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com>
Date: Wed, 5 Feb 2025 14:49:30 +0100
Subject: [PATCH] add update-translations script
---
package.json | 3 +-
src/routes/webui.ts | 7 +
static/webui/translations/de.json | 129 ++++++++++++++++++
static/webui/translations/es.json | 129 ++++++++++++++++++
static/webui/translations/fr.json | 129 ++++++++++++++++++
static/webui/translations/it.json | 129 ++++++++++++++++++
static/webui/translations/ja.json | 129 ++++++++++++++++++
static/webui/translations/ko.json | 129 ++++++++++++++++++
static/webui/translations/old_en.json | 129 ++++++++++++++++++
static/webui/translations/pl.json | 129 ++++++++++++++++++
static/webui/translations/pt.json | 129 ++++++++++++++++++
static/webui/translations/tc.json | 129 ++++++++++++++++++
static/webui/translations/th.json | 129 ++++++++++++++++++
static/webui/translations/tr.json | 129 ++++++++++++++++++
static/webui/translations/uk.json | 129 ++++++++++++++++++
.../webui/translations/update-translations.ts | 108 +++++++++++++++
static/webui/translations/zh.json | 129 ++++++++++++++++++
17 files changed, 1923 insertions(+), 1 deletion(-)
create mode 100644 static/webui/translations/de.json
create mode 100644 static/webui/translations/es.json
create mode 100644 static/webui/translations/fr.json
create mode 100644 static/webui/translations/it.json
create mode 100644 static/webui/translations/ja.json
create mode 100644 static/webui/translations/ko.json
create mode 100644 static/webui/translations/old_en.json
create mode 100644 static/webui/translations/pl.json
create mode 100644 static/webui/translations/pt.json
create mode 100644 static/webui/translations/tc.json
create mode 100644 static/webui/translations/th.json
create mode 100644 static/webui/translations/tr.json
create mode 100644 static/webui/translations/uk.json
create mode 100644 static/webui/translations/update-translations.ts
create mode 100644 static/webui/translations/zh.json
diff --git a/package.json b/package.json
index 28cac72a..ab1d182c 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,8 @@
"build": "tsc && copyfiles static/webui/** build",
"lint": "eslint --ext .ts .",
"lint:fix": "eslint --fix --ext .ts .",
- "prettier": "prettier --write ."
+ "prettier": "prettier --write .",
+ "update-translations": "ts-node-dev -r tsconfig-paths/register static/webui/translations/update-translations.ts "
},
"license": "GNU",
"dependencies": {
diff --git a/src/routes/webui.ts b/src/routes/webui.ts
index 5ae72040..c94d05ea 100644
--- a/src/routes/webui.ts
+++ b/src/routes/webui.ts
@@ -15,6 +15,13 @@ webuiRouter.use("/webui", (req, res, next) => {
if (req.originalUrl === "/") {
return res.redirect("/webui/");
}
+ if (
+ req.originalUrl.includes("translations/update-locales.ts") ||
+ req.originalUrl.includes("translations/old_en.json")
+ ) {
+ res.status(404).json({ error: "endpoint was not found" });
+ return;
+ }
next();
});
diff --git a/static/webui/translations/de.json b/static/webui/translations/de.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/de.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/es.json b/static/webui/translations/es.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/es.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/fr.json b/static/webui/translations/fr.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/fr.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/it.json b/static/webui/translations/it.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/it.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/ja.json b/static/webui/translations/ja.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/ja.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/ko.json b/static/webui/translations/ko.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/ko.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/old_en.json b/static/webui/translations/old_en.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/old_en.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/pl.json b/static/webui/translations/pl.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/pl.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/pt.json b/static/webui/translations/pt.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/pt.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/tc.json b/static/webui/translations/tc.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/tc.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/th.json b/static/webui/translations/th.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/th.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/tr.json b/static/webui/translations/tr.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/tr.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/uk.json b/static/webui/translations/uk.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/uk.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}
diff --git a/static/webui/translations/update-translations.ts b/static/webui/translations/update-translations.ts
new file mode 100644
index 00000000..3c8758b2
--- /dev/null
+++ b/static/webui/translations/update-translations.ts
@@ -0,0 +1,108 @@
+import { logger } from "@/src/utils/logger";
+import fs from "fs";
+import path from "path";
+import prettier from "prettier";
+
+const languageList = ["de", "es", "fr", "it", "ja", "ko", "pl", "pt", "ru", "tr", "uk", "zh", "tc", "th"];
+const baseLangFile = "./static/webui/translations/en.json";
+const oldLangFile = "./static/webui/translations/old_en.json";
+
+function mergeTranslations(source: Record, target: Record) {
+ Object.keys(source).forEach(key => {
+ if (typeof source[key] === "object" && source[key] !== null) {
+ if (!target[key] || typeof target[key] !== "object") {
+ target[key] = {};
+ }
+ mergeTranslations(source[key] as Record, target[key] as Record);
+ } else if (!(key in target)) {
+ target[key] = "";
+ }
+ });
+}
+
+function compareAndUpdateTranslations(
+ newData: Record,
+ oldData: Record,
+ langData: Record
+): boolean {
+ let updated = false;
+
+ Object.keys(newData).forEach(key => {
+ const newValue = newData[key];
+ const oldValue = oldData[key];
+
+ if (typeof newValue === "object" && newValue !== null) {
+ if (typeof oldValue !== "object" || oldValue === null) {
+ langData[key] = { ...newValue };
+ updated = true;
+ } else {
+ const isSubUpdated = compareAndUpdateTranslations(
+ newValue as Record,
+ oldValue as Record,
+ langData[key] as Record
+ );
+ if (isSubUpdated) {
+ updated = true;
+ }
+ }
+ } else {
+ if (newValue !== oldValue) {
+ langData[key] = newValue;
+ updated = true;
+ }
+ }
+ });
+
+ return updated;
+}
+
+async function processTranslations() {
+ let enData: Record;
+ let oldEnData: Record = {};
+
+ try {
+ enData = JSON.parse(fs.readFileSync(baseLangFile, "utf-8"));
+ oldEnData = fs.existsSync(oldLangFile) ? JSON.parse(fs.readFileSync(oldLangFile, "utf-8")) : {};
+ } catch (error) {
+ logger.error("Error reading base or old language files:", error);
+ process.exit(1);
+ }
+
+ for (const lang of languageList) {
+ const langFile = `./static/webui/translations/${lang}.json`;
+ const langPath = path.resolve(langFile);
+
+ if (!fs.existsSync(langPath)) {
+ logger.warn(`File ${langFile} not found! Creating a new one.`);
+ fs.writeFileSync(langPath, JSON.stringify({}, null, 2), "utf-8");
+ }
+
+ try {
+ const langData: Record = JSON.parse(fs.readFileSync(langPath, "utf-8"));
+
+ const originalLangDataStr = JSON.stringify(langData);
+
+ compareAndUpdateTranslations(enData, oldEnData, langData);
+ mergeTranslations(enData, langData);
+
+ const newLangDataStr = JSON.stringify(langData);
+ if (originalLangDataStr !== newLangDataStr) {
+ const formattedLangData = await prettier.format(newLangDataStr, { parser: "json" });
+ fs.writeFileSync(langPath, formattedLangData, "utf-8");
+ logger.info(`Updated: ${langFile}`);
+ }
+ } catch (error) {
+ logger.error(`Error processing ${langFile}:`, error);
+ }
+ }
+
+ const formattedEnData = await prettier.format(JSON.stringify(enData), {
+ parser: "json"
+ });
+
+ fs.writeFileSync(oldLangFile, formattedEnData, "utf-8");
+ logger.info("Updated old_en.json with the latest translations.");
+ process.exit(0);
+}
+
+processTranslations();
diff --git a/static/webui/translations/zh.json b/static/webui/translations/zh.json
new file mode 100644
index 00000000..8a4cc569
--- /dev/null
+++ b/static/webui/translations/zh.json
@@ -0,0 +1,129 @@
+{
+ "general": {
+ "inventoryUpdateNote": "Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.",
+ "addButton": "Add",
+ "bulkActions": "Bulk Actions"
+ },
+ "code": {
+ "nonValidAuthz": "Your credentials are no longer valid.",
+ "changeNameConfirm": "What would you like to change your account name to?",
+ "deleteAccountConfirm": "Are you sure you want to delete your account {{displayName}} ({{email}})? This action cannot be undone.",
+ "archgun": "Archgun",
+ "melee": "Melee",
+ "pistol": "Pistol",
+ "rifle": "Rifle",
+ "shotgun": "Shotgun",
+ "kitgun": "Kitgun",
+ "zaw": "Zaw",
+ "moteAmp": "Mote Amp",
+ "amp": "Amp",
+ "sirocco": "Sirocco",
+ "kDrive": "K-Drive",
+ "legendaryCore": "Legendary Core",
+ "traumaticPeculiar": "Traumatic Peculiar",
+ "badItem": "(Imposter)",
+ "maxRank": "Max Rank",
+ "rename": "Rename",
+ "renamePrompt": "Enter new custom name:",
+ "remove": "Remove",
+ "addItemsConfirm": "Are you sure you want to add {{count}} items to your account?",
+ "noEquipmentToRankUp": "No equipment to rank up.",
+ "succAdded": "Successfully added.",
+ "buffsNumber": "Number of buffs",
+ "cursesNumber": "Number of curses",
+ "rerollsNumber": "Number of rerolls",
+ "viewStats": "View Stats",
+ "rank": "Rank",
+ "count": "Count",
+ "focusAllUnlocked": "All focus schools are already unlocked.",
+ "focusUnlocked": "Unlocked {{count}} new focus schools! An inventory update will be needed for the changes to be reflected in-game. Visiting the navigation should be the easiest way to trigger that.",
+ "addModsConfirm": "Are you sure you want to add {{count}} mods to your account?",
+ "succImport": "Successfully imported."
+ },
+ "login": {
+ "description": "Login using your OpenWF account credentials (same as in-game when connecting to this server).",
+ "emailLabel": "Email address",
+ "passwordLabel": "Password",
+ "loginButton": "Login"
+ },
+ "navbar": {
+ "logout": "Logout",
+ "renameAccount": "Rename Account",
+ "deleteAccount": "Delete Account",
+ "inventory": "Inventory",
+ "mods": "Mods",
+ "cheats": "Cheats",
+ "import": "Import"
+ },
+ "inventory": {
+ "addItems": "Add Items",
+ "suits": "Warframes",
+ "longGuns": "Primary Weapons",
+ "pistols": "Secondary Weapons",
+ "melee": "Melee Weapons",
+ "spaceSuits": "Archwings",
+ "spaceGuns": "Archwing Primary Weapons",
+ "spaceMelee": "Archwing Melee Weapons",
+ "mechSuits": "Necramechs",
+ "sentinels": "Sentinels",
+ "sentinelWeapons": "Sentinel Weapons",
+ "operatorAmps": "Amps",
+ "hoverboards": "K-Drives",
+ "bulkAddSuits": "Add Missing Warframes",
+ "bulkAddWeapons": "Add Missing Weapons",
+ "bulkAddSpaceSuits": "Add Missing Archwings",
+ "bulkAddSpaceWeapons": "Add Missing Archwing Weapons",
+ "bulkAddSentinels": "Add Missing Sentinels",
+ "bulkAddSentinelWeapons": "Add Missing Sentinel Weapons",
+ "bulkRankUpSuits": "Max Rank All Warframes",
+ "bulkRankUpWeapons": "Max Rank All Weapons",
+ "bulkRankUpSpaceSuits": "Max Rank All Archwings",
+ "bulkRankUpSpaceWeapons": "Max Rank All Archwing Weapons",
+ "bulkRankUpSentinels": "Max Rank All Sentinels",
+ "bulkRankUpSentinelWeapons": "Max Rank All Sentinel Weapons"
+ },
+ "powersuit": {
+ "archonShardsLabel": "Archon Shard Slots",
+ "archonShardsDescription": "You can use these unlimited slots to apply a wide range of upgrades."
+ },
+ "mods": {
+ "addRiven": "Add Riven",
+ "fingerprint": "Fingerprint",
+ "fingerprintHelp": "Need help with the fingerprint?",
+ "rivens": "Rivens",
+ "mods": "Mods",
+ "bulkAddMods": "Add Missing Mods"
+ },
+ "cheats": {
+ "administratorRequirement": "You must be an administrator to use this feature. To become an administrator, add \"\"
to administratorNames
in the config.json.",
+ "skipTutorial": "Skip Tutorial",
+ "skipAllDialogue": "Skip All Dialogue",
+ "unlockAllScans": "Unlock All Scans",
+ "unlockAllMissions": "Unlock All Missions",
+ "unlockAllQuests": "Unlock All Quests",
+ "completeAllQuests": "Complete All Quests",
+ "infiniteCredits": "Infinite Credits",
+ "infinitePlatinum": "Infinite Platinum",
+ "infiniteEndo": "Infinite Endo",
+ "infiniteRegalAya": "Infinite Regal Aya",
+ "unlockAllShipFeatures": "Unlock All Ship Features",
+ "unlockAllShipDecorations": "Unlock All Ship Decorations",
+ "unlockAllFlavourItems": "Unlock All Flavor Items",
+ "unlockAllSkins": "Unlock All Skins",
+ "unlockAllCapturaScenes": "Unlock All Captura Scenes",
+ "universalPolarityEverywhere": "Universal Polarity Everywhere",
+ "unlockDoubleCapacityPotatoesEverywhere": "Potatoes Everywhere",
+ "unlockExilusEverywhere": "Exilus Adapters Everywhere",
+ "unlockArcanesEverywhere": "Arcane Adapters Everywhere",
+ "noDailyStandingLimits": "No Daily Standing Limits",
+ "spoofMasteryRank": "Spoofed Mastery Rank (-1 to disable)",
+ "saveSettings": "Save Settings",
+ "account": "Account",
+ "unlockAllFocusSchools": "Unlock All Focus Schools",
+ "helminthUnlockAll": "Fully Level Up Helminth"
+ },
+ "import": {
+ "importNote": "You can provide a full or partial inventory response (client respresentation) here. All fields that are supported by the importer will be overwritten in your account.",
+ "submit": "Submit"
+ }
+}