mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-30 16:32:30 +00:00
997cfea730
## Description: Fixes for v28. In https://github.com/openfrontio/OpenFrontIO/pull/2444, lobby team preview was added. But for players with clan tags, this doesn't work correctly. They don't get assigned to the same team in the preview, while they do get assigned to the same team in the actual game. Also added some small fixes and QoL improvements like showing the number of Nations next to the number of Players. Since we needed that info anyway. Did not choose to show and assign Nations to teams (just the numbers), see why under CONSIDERED OPTIONS THAT I DIDN'T WENT WITH. **BEFORE:** https://youtu.be/AV_aDJ4PgOk <img width="767" height="117" alt="Malformed argument because of double accolades for remove_player" src="https://github.com/user-attachments/assets/7de1114e-7ce1-4a8f-95cc-6b0528a61e3b" /> **AFTER:** https://youtu.be/aDCKkwedqes Cause of bug: maxTeamSize is a number in assignTeams, only used to assign clan players. It uses the length of the players array as input. At actual game start, the Nations are also in the players array. But at lobby preview the Nations aren't yet fetched. So when 2 players want to do a 3 Teams private lobby with them using clan tags to be in the same team. maxTeamCount would do Math.ceil(2/3)=1. So only 1 clan player per team as a result. While actually there could be 10 Nations which would result in maxTeamCount Math.ceil(12/3)=4 so in the game they would actually be assigned to the same team. Fix for bug: fetch Nations count in HostLobbyModal and pass on to LobbyTeamView. Add it to the number of players for maxTeamCount that assignTeamsLobbyPreview uses for its calculation. Also added nation count to the similar teamMaxSize in LobbyTeamView itself, to display the same and correct number of max players. For random maps, we now need to know the random map before the game starts to get its Nation count. So made some changes for that too in HostLobbyModal. Also fixed: - willUpdate ran comptuteTeamPreview every second, now checks if properties like 'client' actually changed. PollPlayers in HostLobbyModal 'changes' the clients property every second even if there are no actual changes. Checks if the other properties are actually changed too, to make it more future proof. - cache teamsList so it is only fetched once instead of first in computeTeamPreview and then again for showTeamColors. - don't show the "Empty Teams" header if there are no empty teams. - console error ICU format error SyntaxError: MALFORMED ARGUMENT. Because of double accolades around remove_player in translation value. - remove fallback for comparing clients on clientID, which used client name. Players may have the same names so it's not safe to compare based on name. Also show number of Nations next to number of Players: now we now the nationCount since it is needed for the fix, show number of Nations next to number of Players. It's handy and it prevents confusion as to why it says 2/32 for two teams if there are only 2 players; it is because there are 61 Nations as well on the World map for example. Also determine number of teams based on Players + Nations: now we now the nationCount since it is needed for the fix, use it to determine the number of teams. Just like populateTeams in GameImpl does. This means for Duos on the World map, a minimum of 31 teams will be shown since there are 61 Nations. This is better than just show two teams based on 1 or 2 humans in the lobby. Also it makes more clear how many teams there'll be the game and how the players and nations are divided over the teams. Choose to not show the Nations' team assignments though. That could be for another PR. See explanation under CONSIDERED OPTIONS THAT I DIDN'T WENT WITH. Also show Nations team as pre-filled for HumansVSNations: now we now the nationCount since it is needed for the fix, for HumansVSNations, show the Nations team as fully assigned and non-empty. For example for World map it shows Nations 61/61. Don't show them as Empty Team but as Assigned Team. Although i choose not to show the actual Nations (see CONSIDERED OPTIONS THAT I DIDN'T WENT WITH), this makes it clear their team is pre-filled and how many Nations you're actually up against. Whereas for other Team game types like 7 Teams or Duos, it will display the teams that the Nations will fill up as empty. CONSIDERED OPTIONS THAT I DIDN'T WENT WITH - Use an optional param 'nationsCount' to assignTeams with default = 0. And simply add nationsCount to the players.length count for maxTeamSize. This would be error prone; 'nationsCount' should then never be assigned a value except when called from LobbyTeamView. But in the future someone might assign it a value even when called from somewhere else. Then you could say, check if there are Nations in the players array and if so, do not use Nationscount because we know they are already counted from players.length. But if Disable Nations is enabled, there would be no Nations in the players array but if nationsCount was somehow given a value we still should not use it. So again, too developer error prone. - Not only fetch the number of Nations, but actually get the Nations themselves to show them in the team assign preview as well. They are shuffled on team assignment but of course deterministicly (nation player ID assigned based on Pseudorandom seeded with GameID in GameRunner, then shuffled in TeamAssignment with Pseudorandom seeded with map's first Nation's playerID), so we could replicate it. But then, how to distinguish humans and Nations in the UI? This feels like something for a follow-up PR. FOR A FUTURE PR - change the way Clan team overflow is handled. Now they're "kicked" as in not assigned to a team without their knowing, are loaded into the game but cannot spawn. This UX could need some improvement. And the logic can be improved too, ie. don't "kick" too soon, check the number of Clans in the lobby and the number of teams to decide if we can assign the 'overflowing' Clan player to another team that doesn't have rivalling Clan players. Far out of scope for this PR. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: tryout33
813 lines
34 KiB
JSON
813 lines
34 KiB
JSON
{
|
||
"lang": {
|
||
"en": "English",
|
||
"native": "English",
|
||
"svg": "uk_us_flag",
|
||
"lang_code": "en"
|
||
},
|
||
"common": {
|
||
"close": "Close",
|
||
"available": "Available",
|
||
"preset_max": "Max",
|
||
"summary_send": "Send",
|
||
"summary_keep": "Keep",
|
||
"cancel": "Cancel",
|
||
"send": "Send",
|
||
"cap_label": "Cap",
|
||
"cap_tooltip": "Recipient’s remaining capacity",
|
||
"target_dead": "Target eliminated",
|
||
"target_dead_note": "You can't send resources to an eliminated player.",
|
||
"none": "None"
|
||
},
|
||
"main": {
|
||
"title": "OpenFront (ALPHA)",
|
||
"join_discord": "Discord",
|
||
"login_discord": "Login with Discord",
|
||
"checking_login": "Checking login...",
|
||
"logged_in": "Logged in!",
|
||
"log_out": "Log out",
|
||
"create_lobby": "Create Lobby",
|
||
"join_lobby": "Join Lobby",
|
||
"single_player": "Single Player",
|
||
"instructions": "Instructions",
|
||
"wiki": "Wiki",
|
||
"privacy_policy": "Privacy Policy",
|
||
"terms_of_service": "Terms of Service",
|
||
"reddit": "Reddit"
|
||
},
|
||
"news": {
|
||
"see_all_releases": "See all releases",
|
||
"github_link": "on GitHub",
|
||
"title": "Release Notes"
|
||
},
|
||
"help_modal": {
|
||
"hotkeys": "Hotkeys",
|
||
"table_key": "Key",
|
||
"table_action": "Action",
|
||
"action_alt_view": "Alternate view (terrain/countries)",
|
||
"action_attack_altclick": "Attack (when left click is set to open menu)",
|
||
"action_build": "Open build menu",
|
||
"action_emote": "Open emote menu",
|
||
"action_center": "Center camera on player",
|
||
"action_zoom": "Zoom out/in",
|
||
"action_move_camera": "Move camera",
|
||
"action_ratio_change": "Decrease/Increase attack ratio",
|
||
"action_reset_gfx": "Reset graphics",
|
||
"action_auto_upgrade": "Auto-upgrade nearest building",
|
||
"ui_section": "Game UI",
|
||
"ui_leaderboard": "Leaderboard",
|
||
"ui_your_team": "Your team:",
|
||
"ui_leaderboard_desc": "Shows the top players of the game and their names, % owned land, gold and troops. Using Show All shows all players in the game. If you don't want to see the leaderboard, click Hide.",
|
||
"ui_control": "Control panel",
|
||
"ui_control_desc": "The control panel contains the following elements:",
|
||
"ui_pop": "Pop - The amount of units you have, your max population and the rate at which you gain them.",
|
||
"ui_gold": "Gold - The amount of gold you have and the rate at which you gain it.",
|
||
"ui_attack_ratio": "Attack ratio - The amount of troops that will be used when you attack. You can adjust the attack ratio using the slider. Having more attacking troops than defending troops will make you lose fewer troops in the attack, while having less will increase the damage dealt to your attacking troops. The effect doesn't go beyond ratios of 2:1.",
|
||
"ui_events": "Event panel",
|
||
"ui_events_desc": "The Event panel displays the latest events, requests and Quick Chat messages. Some examples are:",
|
||
"ui_events_alliance": "Alliance - Alliance requests can be accepted or rejected. Allies can share resources and troops, but can't attack each other. Clicking Focus moves the view to the player who sent the request.",
|
||
"ui_events_attack": "Attacks - Incoming attacks and your outgoing attacks are shown. Click the message to center the view on the attack, nuke or Boat (transport ship). You can retreat troops by clicking the red X button. This will cost the lives of 25% of your attacking troops. If you retrieve a Boat attack, the boat returns to its starting point and will attack there if the land has been captured since. Nukes can't be retreated once launched.",
|
||
"ui_events_quickchat": "Quick Chat - You can see sent and recieved chat messages here. Send a message to a player by clicking the Quick Chat icon in their Info menu.",
|
||
"ui_options": "Options",
|
||
"ui_options_desc": "The following elements can be found inside:",
|
||
"ui_playeroverlay": "Player info overlay",
|
||
"ui_playeroverlay_desc": "When you hover over a country, the Player info overlay is displayed under Options. It shows the type of player: Human, Nation (smart bot), or Bot. A Nation's attitude towards you, ranging from Hostile to Friendly. And defending troops, gold, plus the number of Warships and various buildings the player has.",
|
||
"ui_wilderness": "Wilderness",
|
||
"option_pause": "Pause/Unpause the game - Only available in single player mode.",
|
||
"option_timer": "Timer - Time passed since the start of the game.",
|
||
"option_exit": "Exit button.",
|
||
"option_settings": "Settings - Open the settings menu. Inside you can toggle the Alternate view, Emojis, Dark Mode, Ninja (anonymous/random names mode), and action on left click.",
|
||
"radial_title": "Radial menu",
|
||
"radial_desc": "Right clicking (or touch on mobile) opens the Radial menu. Right click outside it to close it. From the menu you can:",
|
||
"radial_build": "Open the Build menu.",
|
||
"radial_attack": "Open the Attack menu.",
|
||
"radial_info": "Open the Info menu.",
|
||
"radial_boat": "Send a Boat (transport ship) to attack at the selected location. Only available if you have access to water.",
|
||
"radial_close": "Close the menu.",
|
||
"info_title": "Info menu",
|
||
"info_enemy_desc": "Contains information such as the selected player's name, gold, troops, stopped trading with you, nukes sent to you, and if the player is a traitor. Stopped trading means you won't receive gold from them and they won't sent you gold via trade ships. Manually (if the player clicked \"Stop trading\", which lasts until you both click \"Start trading\") or automatically (if you betrayed your alliance, which lasts until you become allies again or after 5 minutes). Traitor displays Yes for 30 seconds when the player betrayed and attacked a player who was in an alliance with them. The icons below represent the following interactions:",
|
||
"info_chat": "Send a quick chat message to the player. Select a Category, a Phrase, and if the phrase contains [P1] select a Player name to replace it with. Hit Send.",
|
||
"info_target": "Place a target mark on the player, marking it for all allies, used to coordinate attacks.",
|
||
"info_alliance": "Send an alliance request to the player. Allies can share resources and troops, but can't attack each other.",
|
||
"info_emoji": "Send an emoji to the player.",
|
||
"info_trade": "Use \"Stop trading\" to stop giving the player gold and receiving their gold via trade ships. If you both click \"Start trading\" it will start again.",
|
||
"info_ally_panel": "Ally info panel",
|
||
"info_ally_desc": "When you ally with a player, the following new icons become available:",
|
||
"ally_betray": "Betray your ally, ending the alliance, halting trade, and weakening your defense. Trading between you is paused for 5 minutes (or until you become allies again) and others may stop trading too. And unless the other player was a traitor themselves, you'll be marked a traitor for 30 seconds. During this time an icon will be above your name and you will have a 50% defense debuff. Bots are less likely to ally with you and players will think twice before doing so.",
|
||
"ally_donate": "Donate some of your troops to your ally. Used when they're low on troops and are being attacked, or when they need that extra power to crush an enemy.",
|
||
"ally_donate_gold": "Donate some of your gold to your ally. Used when they're low on gold and need it for buildings, or when your team member is saving for that MIRV.",
|
||
"build_menu_title": "Build menu",
|
||
"build_menu_desc": "Build these or see how many of each you already build:",
|
||
"build_name": "Name",
|
||
"build_icon": "Icon",
|
||
"build_desc": "Description",
|
||
"build_city": "City",
|
||
"build_city_desc": "Increases your max population. Useful when you can't expand your territory or you're about to hit your population limit.",
|
||
"build_factory": "Factory",
|
||
"build_factory_desc": "Automatically builds railroads to nearby cities, ports and other factories, and can also link up with friendly neighbors. Trains spawn regularly and give you a fixed amount of gold for each building they visit along the route, with extra gold for visiting your neighbors' buildings.",
|
||
"build_defense": "Defense Post",
|
||
"build_defense_desc": "Increases defenses around nearby borders, which show a checkered pattern. Attacks from enemies are slower and have more casualties.",
|
||
"build_port": "Port",
|
||
"build_port_desc": "Can only be built near water. Allows building Warships. Automatically sends trade ships between ports of your country and other countries (except when trade is stopped), giving gold to both sides. Trade with a player stops automatically when you attack or are attacked by a player. It resumes after 5 minutes or if you become allies. You can manually toggle trading with \"Stop trading\" or \"Start trading\".",
|
||
"build_warship": "Warship",
|
||
"build_warship_desc": "Patrols in an area, capturing enemy trade ships and destroying their Boats (transport ships) and Warships. Spawns from the nearest Port and patrols the area you first clicked to build it. You can control Warships by attack-clicking on them (see action Attack under Hotkeys) and then attack-clicking the new area you want them to move to.",
|
||
"build_silo": "Missile Silo",
|
||
"build_silo_desc": "Allows launching missiles.",
|
||
"build_sam": "SAM Launcher",
|
||
"build_sam_desc": "Can intercept enemy missiles in its 100 pixel range. With a 100% hit chance for Atom Bomb, 80% for Hydrogen Bomb and 50% for individual MIRV Warheads. The SAM has a 7.5 second cooldown.",
|
||
"build_atom": "Atom Bomb",
|
||
"build_atom_desc": "Small explosive bomb that destroys territory, buildings, ships and boats. Spawns from the nearest Missile Silo and lands in the area you first clicked to build it.",
|
||
"build_hydrogen": "Hydrogen Bomb",
|
||
"build_hydrogen_desc": "Large explosive bomb. Spawns from the nearest Missile Silo and lands in the area you first clicked to build it.",
|
||
"build_mirv": "MIRV",
|
||
"build_mirv_desc": "The most powerful bomb in the game. Splits up into smaller bombs that will cover a huge range of territory. Only damages the player that you first clicked on to build it. Spawns from the nearest Missile Silo and lands in the area you first clicked to build it.",
|
||
"player_icons": "Player icons",
|
||
"icon_desc": "Examples of some of the ingame icons you will encounter and what they mean:",
|
||
"icon_crown": "Crown - Number 1. This is the top player in the leaderboard.",
|
||
"icon_traitor": "Broken shield - Traitor. This player attacked an ally.",
|
||
"icon_ally": "Handshake - Ally. This player is your ally.",
|
||
"icon_embargo": "Dollar stop sign - Embargo. This player has stopped trading with you automatically or manually.",
|
||
"icon_request": "Envelope - Alliance request. This player has sent you an alliance request.",
|
||
"info_enemy_panel": "Enemy info panel",
|
||
"exit_confirmation": "Are you sure you want to exit the game?"
|
||
},
|
||
"single_modal": {
|
||
"title": "Single Player",
|
||
"random_spawn": "Random spawn",
|
||
"allow_alliances": "Allow alliances",
|
||
"options_title": "Options",
|
||
"bots": "Bots: ",
|
||
"bots_disabled": "Disabled",
|
||
"nations": "Nations: ",
|
||
"disable_nations": "Disable Nations",
|
||
"instant_build": "Instant build",
|
||
"infinite_gold": "Infinite gold",
|
||
"infinite_troops": "Infinite troops",
|
||
"compact_map": "Compact Map",
|
||
"max_timer": "Game length (minutes)",
|
||
"disable_nukes": "Disable Nukes",
|
||
"automatic_difficulty": "Automatic Difficulty",
|
||
"enables_title": "Enable Settings",
|
||
"start": "Start Game"
|
||
},
|
||
"token_login_modal": {
|
||
"title": "Logging in...",
|
||
"logging_in": "Logging in...",
|
||
"success": "Successfully logged in as {email}!"
|
||
},
|
||
"account_modal": {
|
||
"title": "Account",
|
||
"logged_in_as": "Logged in as {email}",
|
||
"fetching_account": "Fetching account information...",
|
||
"logged_in_with_discord": "Logged in with Discord",
|
||
"recovery_email_sent": "Recovery email sent to {email}"
|
||
},
|
||
"stats_modal": {
|
||
"title": "Stats",
|
||
"clan_stats": "Clan Stats",
|
||
"loading": "Loading...",
|
||
"error": "Error loading clan stats",
|
||
"no_stats": "No clan stats available",
|
||
"clan": "Clan",
|
||
"games": "Games",
|
||
"win_score": "Win Score",
|
||
"loss_score": "Loss Score",
|
||
"win_loss_ratio": "Win/Loss"
|
||
},
|
||
"map": {
|
||
"map": "Map",
|
||
"world": "World",
|
||
"giantworldmap": "Giant World Map",
|
||
"europe": "Europe",
|
||
"mena": "MENA",
|
||
"northamerica": "North America",
|
||
"oceania": "Oceania",
|
||
"blacksea": "Black Sea",
|
||
"africa": "Africa",
|
||
"asia": "Asia",
|
||
"mars": "Mars",
|
||
"southamerica": "South America",
|
||
"britannia": "Britannia",
|
||
"gatewaytotheatlantic": "Gateway to the Atlantic",
|
||
"australia": "Australia",
|
||
"random": "Random",
|
||
"iceland": "Iceland",
|
||
"pangaea": "Pangaea",
|
||
"eastasia": "East Asia",
|
||
"betweentwoseas": "Between Two Seas",
|
||
"faroeislands": "Faroe Islands",
|
||
"deglaciatedantarctica": "Deglaciated Antarctica",
|
||
"europeclassic": "Europe (classic)",
|
||
"falklandislands": "Falkland Islands",
|
||
"baikal": "Baikal",
|
||
"halkidiki": "Halkidiki",
|
||
"straitofgibraltar": "Strait of Gibraltar",
|
||
"italia": "Italia",
|
||
"japan": "Japan",
|
||
"yenisei": "Yenisei",
|
||
"pluto": "Pluto",
|
||
"montreal": "Montreal",
|
||
"achiran": "Achiran",
|
||
"baikalnukewars": "Baikal (Nuke Wars)",
|
||
"fourislands": "Four Islands",
|
||
"gulfofstlawrence": "Gulf of St. Lawrence",
|
||
"lisbon": "Lisbon"
|
||
},
|
||
"map_categories": {
|
||
"continental": "Continental",
|
||
"regional": "Regional",
|
||
"fantasy": "Other"
|
||
},
|
||
"map_component": {
|
||
"loading": "Loading..."
|
||
},
|
||
"private_lobby": {
|
||
"title": "Join Private Lobby",
|
||
"enter_id": "Enter Lobby ID",
|
||
"player": "Player",
|
||
"players": "Players",
|
||
"join_lobby": "Join Lobby",
|
||
"checking": "Checking lobby...",
|
||
"not_found": "Lobby not found. Please check the ID and try again.",
|
||
"error": "An error occurred. Please try again or contact support.",
|
||
"joined_waiting": "Joined successfully! Waiting for game to start...",
|
||
"version_mismatch": "This game was created with a different version. Cannot join."
|
||
},
|
||
"public_lobby": {
|
||
"join": "Join next Game",
|
||
"waiting": "players waiting",
|
||
"teams_Duos": "Duos (teams of 2)",
|
||
"teams_Trios": "Trios (teams of 3)",
|
||
"teams_Quads": "Quads (teams of 4)",
|
||
"teams_hvn": "Humans Vs Nations",
|
||
"teams": "{num} teams"
|
||
},
|
||
"matchmaking_modal": {
|
||
"title": "Matchmaking",
|
||
"connecting": "Connecting to matchmaking server...",
|
||
"searching": "Searching for game...",
|
||
"waiting_for_game": "Waiting for game to start..."
|
||
},
|
||
"username": {
|
||
"enter_username": "Enter your username",
|
||
"not_string": "Username must be a string.",
|
||
"too_short": "Username must be at least {min} characters long.",
|
||
"too_long": "Username must not exceed {max} characters.",
|
||
"invalid_chars": "Username can only contain letters, numbers, spaces, underscores, and [square brackets]."
|
||
},
|
||
"host_modal": {
|
||
"title": "Private Lobby",
|
||
"mode": "Mode",
|
||
"team_count": "Number of Teams",
|
||
"options_title": "Options",
|
||
"bots": "Bots: ",
|
||
"bots_disabled": "Disabled",
|
||
"nations": "Nations: ",
|
||
"disable_nations": "Disable Nations",
|
||
"max_timer": "Game length (minutes)",
|
||
"instant_build": "Instant build",
|
||
"infinite_gold": "Infinite gold",
|
||
"donate_gold": "Donate gold",
|
||
"infinite_troops": "Infinite troops",
|
||
"donate_troops": "Donate troops",
|
||
"compact_map": "Compact Map",
|
||
"automatic_difficulty": "Automatic Difficulty",
|
||
"enables_title": "Enable Settings",
|
||
"player": "Player",
|
||
"players": "Players",
|
||
"nation_players": "Nations",
|
||
"nation_player": "Nation",
|
||
"waiting": "Waiting for players...",
|
||
"random_spawn": "Random spawn",
|
||
"start": "Start Game",
|
||
"host_badge": "Host",
|
||
"assigned_teams": "Assigned Teams",
|
||
"empty_teams": "Empty Teams",
|
||
"empty_team": "Empty",
|
||
"remove_player": "Remove {username}"
|
||
},
|
||
"team_colors": {
|
||
"red": "Red",
|
||
"blue": "Blue",
|
||
"teal": "Teal",
|
||
"purple": "Purple",
|
||
"yellow": "Yellow",
|
||
"orange": "Orange",
|
||
"green": "Green",
|
||
"bot": "Bot"
|
||
},
|
||
"game_starting_modal": {
|
||
"title": "Game is Starting...",
|
||
"credits": "Credits",
|
||
"code_license": "Code licensed under AGPL-3.0 (no warranty)"
|
||
},
|
||
"difficulty": {
|
||
"difficulty": "Difficulty",
|
||
"Easy": "Relaxed",
|
||
"Medium": "Balanced",
|
||
"Hard": "Intense",
|
||
"Impossible": "Impossible"
|
||
},
|
||
"game_mode": {
|
||
"ffa": "Free for All",
|
||
"teams": "Teams"
|
||
},
|
||
"select_lang": {
|
||
"title": "Select Language"
|
||
},
|
||
"unit_type": {
|
||
"city": "City",
|
||
"defense_post": "Defense Post",
|
||
"port": "Port",
|
||
"warship": "Warship",
|
||
"missile_silo": "Missile Silo",
|
||
"sam_launcher": "SAM Launcher",
|
||
"atom_bomb": "Atom Bomb",
|
||
"hydrogen_bomb": "Hydrogen Bomb",
|
||
"mirv": "MIRV",
|
||
"factory": "Factory"
|
||
},
|
||
"user_setting": {
|
||
"title": "User Settings",
|
||
"tab_basic": "Basic Settings",
|
||
"tab_keybinds": "Keybinds",
|
||
"dark_mode_label": "Dark Mode",
|
||
"dark_mode_desc": "Toggle the site’s appearance between light and dark themes",
|
||
"emojis_label": "Emojis",
|
||
"emojis_desc": "Toggle whether emojis are shown in game",
|
||
"alert_frame_label": "Alert Frame",
|
||
"alert_frame_desc": "Toggle the alert frame. When enabled, the frame will be displayed when you are betrayed.",
|
||
"special_effects_label": "Special effects",
|
||
"special_effects_desc": "Toggle special effects. Deactivate to improve performances",
|
||
"structure_sprites_label": "Structure Sprites",
|
||
"structure_sprites_desc": "Toggle structure sprites",
|
||
"anonymous_names_label": "Hidden Names",
|
||
"anonymous_names_desc": "Hide real player names with random ones on your screen.",
|
||
"lobby_id_visibility_label": "Hidden Lobby IDs",
|
||
"lobby_id_visibility_desc": "Hide Lobby ID in private lobby creation",
|
||
"left_click_label": "Left Click to Open Menu",
|
||
"left_click_desc": "When ON, left-click opens menu and sword button attacks. When OFF, left-click attacks directly.",
|
||
"left_click_menu": "Left Click Menu",
|
||
"attack_ratio_label": "⚔️ Attack Ratio",
|
||
"attack_ratio_desc": "What percentage of your troops to send in an attack (1–100%)",
|
||
"troop_ratio_desc": "Adjust the balance between troops (for combat) and workers (for gold production) (1–100%)",
|
||
"territory_patterns_label": "🏳️ Territory Skins",
|
||
"territory_patterns_desc": "Choose whether to display territory skin designs in game",
|
||
"performance_overlay_label": "Performance Overlay",
|
||
"performance_overlay_desc": "Toggle the performance overlay. When enabled, the performance overlay will be displayed. Press shift-D during game to toggle.",
|
||
"easter_writing_speed_label": "Writing Speed Multiplier",
|
||
"easter_writing_speed_desc": "Adjust how fast you pretend to code (x1–x100)",
|
||
"easter_bug_count_label": "Bug Count",
|
||
"easter_bug_count_desc": "How many bugs you're okay with (0–1000, emotionally)",
|
||
"view_options": "View Options",
|
||
"toggle_view": "Toggle View",
|
||
"toggle_view_desc": "Alternate view (terrain/countries)",
|
||
"build_controls": "Build Controls",
|
||
"build_city": "Build City",
|
||
"build_city_desc": "Build a City under your cursor.",
|
||
"build_factory": "Build Factory",
|
||
"build_factory_desc": "Build a Factory under your cursor.",
|
||
"build_defense_post": "Build Defense Post",
|
||
"build_defense_post_desc": "Build a Defense Post under your cursor.",
|
||
"build_port": "Build Port",
|
||
"build_port_desc": "Build a Port under your cursor.",
|
||
"build_warship": "Build Warship",
|
||
"build_warship_desc": "Build a Warship under your cursor.",
|
||
"build_missile_silo": "Build Missile Silo",
|
||
"build_missile_silo_desc": "Build a Missile Silo under your cursor.",
|
||
"build_sam_launcher": "Build SAM Launcher",
|
||
"build_sam_launcher_desc": "Build a SAM Launcher under your cursor.",
|
||
"build_atom_bomb": "Build Atom Bomb",
|
||
"build_atom_bomb_desc": "Build an Atom Bomb under your cursor.",
|
||
"build_hydrogen_bomb": "Build Hydrogen Bomb",
|
||
"build_hydrogen_bomb_desc": "Build a Hydrogen Bomb under your cursor.",
|
||
"build_mirv": "Build MIRV",
|
||
"build_mirv_desc": "Build a MIRV under your cursor.",
|
||
"attack_ratio_controls": "Attack Ratio Controls",
|
||
"attack_ratio_up": "Increase Attack Ratio",
|
||
"attack_ratio_up_desc": "Increase attack ratio by 10%",
|
||
"attack_ratio_down": "Decrease Attack Ratio",
|
||
"attack_ratio_down_desc": "Decrease attack ratio by 10%",
|
||
"attack_keybinds": "Attack Keybinds",
|
||
"boat_attack": "Boat Attack",
|
||
"boat_attack_desc": "Send a boat attack to the tile under your cursor.",
|
||
"ground_attack": "Ground Attack",
|
||
"ground_attack_desc": "Send a ground attack to the tile under your cursor.",
|
||
"zoom_controls": "Zoom Controls",
|
||
"zoom_out": "Zoom Out",
|
||
"zoom_out_desc": "Zoom out the map",
|
||
"zoom_in": "Zoom In",
|
||
"zoom_in_desc": "Zoom in the map",
|
||
"camera_movement": "Camera Movement",
|
||
"center_camera": "Center Camera",
|
||
"center_camera_desc": "Center camera on player",
|
||
"move_up": "Move Camera Up",
|
||
"move_up_desc": "Move the camera upward",
|
||
"move_left": "Move Camera Left",
|
||
"move_left_desc": "Move the camera to the left",
|
||
"move_down": "Move Camera Down",
|
||
"move_down_desc": "Move the camera downward",
|
||
"move_right": "Move Camera Right",
|
||
"move_right_desc": "Move the camera to the right",
|
||
"reset": "Reset",
|
||
"unbind": "Unbind",
|
||
"on": "On",
|
||
"off": "Off",
|
||
"toggle_terrain": "Toggle Terrain",
|
||
"exit_game_label": "Exit Game",
|
||
"exit_game_info": "Return to main menu",
|
||
"background_music_volume": "Background Music Volume",
|
||
"sound_effects_volume": "Sound Effects Volume"
|
||
},
|
||
"chat": {
|
||
"title": "Quick Chat",
|
||
"to": "Sent {user}: {msg}",
|
||
"from": "From {user}: {msg}",
|
||
"category": "Category",
|
||
"phrase": "Phrase",
|
||
"player": "Player",
|
||
"send": "Send",
|
||
"search": "Search player...",
|
||
"build": "Build your message...",
|
||
"cat": {
|
||
"help": "Help",
|
||
"attack": "Attack",
|
||
"defend": "Defend",
|
||
"greet": "Greetings",
|
||
"misc": "Miscellaneous",
|
||
"warnings": "Warnings"
|
||
},
|
||
"help": {
|
||
"troops": "Please give me troops!",
|
||
"troops_frontlines": "Send troops to the frontlines!",
|
||
"gold": "Please give me gold!",
|
||
"no_attack": "Please don't attack me!",
|
||
"sorry_attack": "Sorry, I didn’t mean to attack.",
|
||
"alliance": "Alliance?",
|
||
"help_defend": "Help me defend against [P1]!",
|
||
"trade_partners": "Let's be trade partners!"
|
||
},
|
||
"attack": {
|
||
"attack": "Attack [P1]!",
|
||
"mirv": "Launch a MIRV at [P1]!",
|
||
"focus": "Focus fire on [P1]!",
|
||
"finish": "Let's finish off [P1]!",
|
||
"build_warships": "Build Warships!"
|
||
},
|
||
"defend": {
|
||
"defend": "Defend [P1]!",
|
||
"defend_from": "Defend from [P1]!",
|
||
"dont_attack": "Don’t attack [P1]!",
|
||
"ally": "[P1] is my ally!",
|
||
"build_posts": "Build Defense Posts!"
|
||
},
|
||
"greet": {
|
||
"hello": "Hello!",
|
||
"good_job": "Good job!",
|
||
"good_luck": "Good luck!",
|
||
"have_fun": "Have fun!",
|
||
"gg": "GG!",
|
||
"nice_to_meet": "Nice to meet you!",
|
||
"well_played": "Well played!",
|
||
"hi_again": "Hi again!",
|
||
"bye": "Bye!",
|
||
"thanks": "Thanks!",
|
||
"oops": "Oops, wrong button!",
|
||
"trust_me": "You can trust me. Promise!",
|
||
"trust_broken": "I trusted you...",
|
||
"ruining_games": "You're ruining both of our games.",
|
||
"dont_do_that": "Don't do that!",
|
||
"same_team": "I'm on your side!"
|
||
},
|
||
"misc": {
|
||
"go": "Let’s go!",
|
||
"strategy": "Nice strategy!",
|
||
"fun": "This game is fun!",
|
||
"team_up": "Let’s team up against [P1]!",
|
||
"pr": "When will my PR finally get merged...?",
|
||
"build_closer": "Build closer to get trains!",
|
||
"coastline": "Please let me get a coastline."
|
||
},
|
||
"warnings": {
|
||
"strong": "[P1] is strong.",
|
||
"weak": "[P1] is weak.",
|
||
"mirv_soon": "[P1] can launch a MIRV soon!",
|
||
"number1_warning": "The #1 player will win soon unless we team up!",
|
||
"stalemate": "Let's make peace. This is a stalemate, we will both lose.",
|
||
"has_allies": "[P1] has many allies.",
|
||
"no_allies": "[P1] has no allies.",
|
||
"betrayed": "[P1] betrayed their ally!",
|
||
"betrayed_me": "[P1] betrayed me!",
|
||
"getting_big": "[P1] is growing too fast!",
|
||
"danger_base": "[P1] is unprotected!",
|
||
"saving_for_mirv": "[P1] is saving up to launch a MIRV.",
|
||
"mirv_ready": "[P1] has enough gold to launch a MIRV!",
|
||
"snowballing": "[P1] is snowballing too fast!",
|
||
"cheating": "[P1] is cheating!",
|
||
"stop_trading": "Stop trading with [P1]!"
|
||
}
|
||
},
|
||
"build_menu": {
|
||
"desc": {
|
||
"atom_bomb": "Small explosion",
|
||
"hydrogen_bomb": "Large explosion",
|
||
"mirv": "Huge explosion, only targets selected player",
|
||
"missile_silo": "Used to launch nukes",
|
||
"sam_launcher": "Defends against incoming nukes",
|
||
"warship": "Captures trade ships, destroys ships and boats",
|
||
"port": "Sends trade ships to generate gold",
|
||
"defense_post": "Increases defenses of nearby borders",
|
||
"city": "Increases max population",
|
||
"factory": "Creates railroads and spawns trains"
|
||
},
|
||
"not_enough_money": "Not enough money"
|
||
},
|
||
"win_modal": {
|
||
"support_openfront": "Support OpenFront!",
|
||
"territory_pattern": "Purchase a territory skin to go ad-free!",
|
||
"died": "You died",
|
||
"your_team": "Your team won!",
|
||
"other_team": "{team} team has won!",
|
||
"you_won": "You Won!",
|
||
"other_won": "{player} has won!",
|
||
"exit": "Exit Game",
|
||
"keep": "Keep Playing",
|
||
"spectate": "Spectate",
|
||
"wishlist": "Wishlist on Steam!",
|
||
"ofm_winter": "OpenFront Masters Winter Tournament!",
|
||
"ofm_winter_description": "Join the competitive tournament and compete against the best players",
|
||
"join_tournament": "Join Tournament",
|
||
"join_discord": "Join Our Discord Community!",
|
||
"discord_description": "Connect with other players, get updates, and share strategies",
|
||
"join_server": "Join Server"
|
||
},
|
||
"leaderboard": {
|
||
"title": "Leaderboard",
|
||
"hide": "Hide",
|
||
"rank": "Rank",
|
||
"player": "Player",
|
||
"team": "Team",
|
||
"owned": "Owned",
|
||
"gold": "Gold",
|
||
"troops": "Troops",
|
||
"launchers": "Launchers",
|
||
"sams": "SAMs",
|
||
"warships": "Warships",
|
||
"cities": "Cities",
|
||
"show_control": "Show Control",
|
||
"show_units": "Show Units"
|
||
},
|
||
"player_info_overlay": {
|
||
"type": "Type",
|
||
"bot": "Bot",
|
||
"nation": "Nation",
|
||
"player": "Player",
|
||
"team": "Team",
|
||
"alliance_timeout": "Alliance ends in",
|
||
"troops": "Troops",
|
||
"a_troops": "Attacking troops",
|
||
"gold": "Gold",
|
||
"ports": "Ports",
|
||
"cities": "Cities",
|
||
"factories": "Factories",
|
||
"missile_launchers": "Missile launchers",
|
||
"sams": "SAMs",
|
||
"warships": "Warships",
|
||
"health": "Health",
|
||
"attitude": "Attitude",
|
||
"levels": "Levels"
|
||
},
|
||
"events_display": {
|
||
"retreating": "retreating",
|
||
"retaliate": "Retaliate",
|
||
"boat": "Boat",
|
||
"alliance_request_status": "{name} {status} your alliance request",
|
||
"alliance_accepted": "accepted",
|
||
"alliance_rejected": "rejected",
|
||
"duration_second": "1 second",
|
||
"betrayal_description": "You broke your alliance with {name}, making you a TRAITOR ({malusPercent}% defense debuff for {durationText})",
|
||
"duration_seconds_plural": "{seconds} seconds",
|
||
"betrayed_you": "{name} broke their alliance with you",
|
||
"about_to_expire": "Your alliance with {name} is about to expire!",
|
||
"alliance_expired": "Your alliance with {name} expired",
|
||
"attack_request": "{name} requests you attack {target}",
|
||
"sent_emoji": "Sent {name}: {emoji}",
|
||
"renew_alliance": "Request to renew",
|
||
"request_alliance": "{name} requests an alliance!",
|
||
"focus": "Focus",
|
||
"accept_alliance": "Accept",
|
||
"reject_alliance": "Reject",
|
||
"alliance_renewed": "Your alliance with {name} has been renewed",
|
||
"wants_to_renew_alliance": "{name} wants to renew your alliance",
|
||
"ignore": "Ignore",
|
||
"unit_voluntarily_deleted": "Unit voluntarily deleted",
|
||
"betrayal_debuff_ends": "{time} seconds left until betrayal debuff ends"
|
||
},
|
||
"unit_info_modal": {
|
||
"structure_info": "Structure Info",
|
||
"unit_type_unknown": "Unknown",
|
||
"close": "Close",
|
||
"cooldown": "Cooldown",
|
||
"type": "Type",
|
||
"upgrade": "Upgrade",
|
||
"level": "Level"
|
||
},
|
||
"player_type": {
|
||
"player": "Player",
|
||
"nation": "Nation",
|
||
"bot": "Bot"
|
||
},
|
||
"relation": {
|
||
"hostile": "Hostile",
|
||
"distrustful": "Distrustful",
|
||
"neutral": "Neutral",
|
||
"friendly": "Friendly",
|
||
"default": "Default"
|
||
},
|
||
"control_panel": {
|
||
"gold": "Gold",
|
||
"troops": "Troops",
|
||
"attack_ratio": "Attack Ratio"
|
||
},
|
||
"player_panel": {
|
||
"gold": "Gold",
|
||
"troops": "Troops",
|
||
"betrayals": "Betrayals",
|
||
"traitor": "Traitor",
|
||
"trading": "Trading",
|
||
"active": "Active",
|
||
"stopped": "Stopped",
|
||
"alliance_time_remaining": "Alliance Expires In",
|
||
"embargo": "Stopped trading with you",
|
||
"nuke": "Nukes sent by them to you",
|
||
"start_trade": "Start Trading",
|
||
"stop_trade": "Stop Trading",
|
||
"stop_trade_all": "Stop Trading with All",
|
||
"start_trade_all": "Start Trading with All",
|
||
"alliances": "Alliances",
|
||
"flag": "Flag",
|
||
"chat": "Chat",
|
||
"target": "Target",
|
||
"break": "Break",
|
||
"break_alliance": "Break Alliance",
|
||
"alliance": "Alliance",
|
||
"send_alliance": "Send Alliance",
|
||
"send_troops": "Send Troops",
|
||
"send_gold": "Send Gold",
|
||
"emotes": "Emojis"
|
||
},
|
||
"send_troops_modal": {
|
||
"title_with_name": "Send Troops to {name}",
|
||
"available_tooltip": "Your current available troops",
|
||
"min_keep": "Min keep",
|
||
"min_keep_pct": "(30%)",
|
||
"slider_tooltip": "{{percent}}% • {{amount}}",
|
||
"toggle_attack_bar_mode": "Use attack bar to send troops",
|
||
"warning_attackbar": "Once enabled, you can't open this modal directly. You'll only send troops via the attack bar.",
|
||
"aria_slider": "Troops slider",
|
||
"capacity_note": "Receiver can accept only {{amount}} right now."
|
||
},
|
||
"send_gold_modal": {
|
||
"title_with_name": "Send Gold to {name}",
|
||
"available_tooltip": "Your current available gold",
|
||
"aria_slider": "Amount slider",
|
||
"slider_tooltip": "{{percent}}% • {{amount}}"
|
||
},
|
||
"replay_panel": {
|
||
"replay_speed": "Replay speed",
|
||
"game_speed": "Game speed",
|
||
"fastest_game_speed": "Max"
|
||
},
|
||
"error_modal": {
|
||
"crashed": "Game crashed!",
|
||
"connection_error": "Connection error!",
|
||
"paste_discord": "Please paste the following in your bug report in Discord:",
|
||
"copy_clipboard": "Copy to clipboard",
|
||
"copied": "Copied!",
|
||
"failed_copy": "Failed to copy",
|
||
"spawn_failed": {
|
||
"title": "Spawn failed",
|
||
"description": "Automatic spawn selection failed. You can't play this game."
|
||
},
|
||
"desync_notice": "You are desynced from other players. What you see might differ from other players."
|
||
},
|
||
"performance_overlay": {
|
||
"reset": "Reset",
|
||
"copy_json_title": "Copy current performance metrics as JSON",
|
||
"copy_clipboard": "Copy JSON",
|
||
"copied": "Copied!",
|
||
"failed_copy": "Failed to copy",
|
||
"fps": "FPS:",
|
||
"avg_60s": "Avg (60s):",
|
||
"frame": "Frame:",
|
||
"tick_exec": "Tick Exec:",
|
||
"tick_delay": "Tick Delay:",
|
||
"layers_header": "Layers (avg / max, sorted by total time):"
|
||
},
|
||
"heads_up_message": {
|
||
"choose_spawn": "Choose a starting location",
|
||
"random_spawn": "Random spawn is enabled. Selecting starting location for you..."
|
||
},
|
||
"territory_patterns": {
|
||
"title": "Skins",
|
||
"colors": "Colors",
|
||
"purchase": "Purchase",
|
||
"show_only_owned": "My Skins",
|
||
"blocked": {
|
||
"login": "You must be logged in to access this skin.",
|
||
"purchase": "Purchase this skin to unlock it."
|
||
},
|
||
"pattern": {
|
||
"default": "Default"
|
||
}
|
||
},
|
||
"flag_input": {
|
||
"title": "Select Flag",
|
||
"button_title": "Pick a flag!",
|
||
"search_flag": "Search..."
|
||
},
|
||
"spawn_ad": {
|
||
"loading": "Loading advertisement..."
|
||
},
|
||
"auth": {
|
||
"login_required": "Login is required to access this website.",
|
||
"redirecting": "You are being redirected...",
|
||
"not_authorized": "You are not authorized to access this website.",
|
||
"contact_admin": "If you believe you are seeing this message in error, please contact the website administrator."
|
||
},
|
||
"radial_menu": {
|
||
"delete_unit_title": "Delete Unit",
|
||
"delete_unit_description": "Click to delete the nearest unit"
|
||
},
|
||
"discord_user_header": {
|
||
"avatar_alt": "Avatar"
|
||
},
|
||
"player_stats_table": {
|
||
"building_stats": "Building Statistics",
|
||
"ship_arrivals": "Ship Arrivals",
|
||
"nuke_stats": "Nuke Statistics",
|
||
"player_metrics": "Player Metrics",
|
||
"building": "Building",
|
||
"ship_type": "Ship Type",
|
||
"weapon": "Weapon",
|
||
"built": "Built",
|
||
"destroyed": "Destroyed",
|
||
"captured": "Captured",
|
||
"lost": "Lost",
|
||
"hits": "Hits",
|
||
"launched": "Launched",
|
||
"landed": "Landed",
|
||
"sent": "Sent",
|
||
"arrived": "Arrived",
|
||
"attack": "Attack",
|
||
"received": "Received",
|
||
"cancelled": "Cancelled",
|
||
"count": "Count",
|
||
"gold": "Gold",
|
||
"workers": "Workers",
|
||
"war": "War",
|
||
"trade": "Trade",
|
||
"steal": "Steal",
|
||
"unit": {
|
||
"city": "City",
|
||
"port": "Port",
|
||
"defp": "Defense Post",
|
||
"saml": "SAM Launcher",
|
||
"silo": "Missile Silo",
|
||
"wshp": "Warship",
|
||
"fact": "Factory",
|
||
"trade": "Trade Ship",
|
||
"trans": "Transport Ship",
|
||
"abomb": "Atom Bomb",
|
||
"hbomb": "Hydrogen Bomb",
|
||
"mirv": "MIRV",
|
||
"mirvw": "MIRV Warhead"
|
||
}
|
||
},
|
||
"game_list": {
|
||
"recent_games": "Recent Games",
|
||
"game_id": "Game ID",
|
||
"mode": "Mode",
|
||
"mode_ffa": "Free-for-All",
|
||
"mode_team": "Team",
|
||
"view": "View",
|
||
"details": "Details",
|
||
"started": "Started",
|
||
"map": "Map",
|
||
"difficulty": "Difficulty",
|
||
"type": "Type"
|
||
},
|
||
"player_stats_tree": {
|
||
"public": "Public",
|
||
"private": "Private",
|
||
"singleplayer": "Single Player",
|
||
"mode": "Mode",
|
||
"stats_wins": "Wins",
|
||
"stats_losses": "Losses",
|
||
"stats_wlr": "Win:Loss Ratio",
|
||
"stats_games_played": "Games Played",
|
||
"mode_ffa": "Free-for-All",
|
||
"mode_team": "Team"
|
||
}
|
||
}
|