diff --git a/resources/lang/en.json b/resources/lang/en.json index 071730a05..e911c92c5 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -1,1442 +1,1442 @@ { - "lang": { - "en": "English", - "native": "English", - "svg": "uk_us_flag", - "lang_code": "en" + "account_modal": { + "cancel_subscription": "Cancel", + "cancel_subscription_confirm": "Cancel your subscription? It will stay active until the end of the current billing period.", + "cancel_subscription_failed": "Failed to cancel subscription. Please try again or use Manage.", + "cancel_subscription_success": "Subscription canceled. Access continues until the end of the billing period.", + "change_tier": "Change Tier", + "clear_session": "Clear Session", + "connected_as": "Connected as", + "email_placeholder": "Enter your email address", + "enter_email_address": "Please enter an email address", + "failed_to_send_recovery_email": "Failed to send recovery email", + "fetching_account": "Fetching account information...", + "get_magic_link": "Get Magic Link", + "link_discord": "Link Discord Account", + "linked_account": "Logged in as {account_name}", + "log_out": "Log Out", + "manage_subscription": "Manage", + "no_games": "No games played yet.", + "no_stats": "No stats available yet. Play some games to start tracking.", + "not_found": "Not Found", + "or": "OR", + "public_player_id": "Public Player ID:", + "reactivate_subscription": "Reactivate", + "recovery_email_sent": "Recovery email sent to {email}", + "sign_in_desc": "Sign in to save your stats and progress", + "stats_overview": "Stats Overview", + "sub_price_monthly": "{price}/mo", + "sub_renews_on": "Renews {date}", + "sub_status_active": "Active", + "sub_status_canceled": "Canceled", + "sub_status_canceling": "Canceling", + "sub_status_canceling_on": "Cancels {date}", + "sub_status_incomplete": "Incomplete", + "sub_status_incomplete_expired": "Expired", + "sub_status_past_due": "Past Due", + "sub_status_paused": "Paused", + "sub_status_trialing": "Trial", + "sub_status_unpaid": "Unpaid", + "subscription_portal_failed": "Failed to open the subscription management portal.", + "tab_account": "Account", + "tab_friends": "Friends", + "tab_games": "Games", + "tab_stats": "Stats", + "title": "Account", + "your_subscription": "Your Subscription" }, - "common": { - "not_logged_in": "Not logged in", - "close": "Close", - "copy": "Copy", - "paste": "Paste", - "back": "Back", - "available": "Available", - "preset_max": "Max", - "summary_send": "Send", - "summary_keep": "Keep", - "cancel": "Cancel", - "confirm": "Confirm", + "build_menu": { + "desc": { + "atom_bomb": "Small explosion", + "city": "Increases max population", + "defense_post": "Increases defenses of nearby borders", + "factory": "Creates railroads and spawns trains", + "hydrogen_bomb": "Large explosion", + "mirv": "Huge explosion, only targets selected player", + "missile_silo": "Used to launch nukes", + "port": "Sends trade ships to generate gold", + "sam_launcher": "Defends against incoming nukes", + "warship": "Captures trade ships, destroys ships and boats" + }, + "not_enough_money": "Not enough money", + "warship_shift_hint": "Hold Shift and drag to select multiple warships at once" + }, + "chat": { + "attack": { + "attack": "Attack [P1]!", + "build_warships": "Build Warships!", + "finish": "Let's finish off [P1]!", + "focus": "Focus fire on [P1]!", + "mirv": "Launch a MIRV at [P1]!" + }, + "build": "Build your message...", + "cat": { + "attack": "Attack", + "defend": "Defend", + "greet": "Greetings", + "help": "Help", + "misc": "Miscellaneous", + "warnings": "Warnings" + }, + "category": "Category", + "defend": { + "ally": "[P1] is my ally!", + "build_posts": "Build Defense Posts!", + "defend": "Defend [P1]!", + "defend_from": "Defend from [P1]!", + "dont_attack": "Don’t attack [P1]!" + }, + "from": "From {user}: {msg}", + "greet": { + "bye": "Bye!", + "dont_do_that": "Don't do that!", + "gg": "GG!", + "good_job": "Good job!", + "good_luck": "Good luck!", + "have_fun": "Have fun!", + "hello": "Hello!", + "hi_again": "Hi again!", + "nice_to_meet": "Nice to meet you!", + "oops": "Oops, wrong button!", + "ruining_games": "You're ruining both of our games.", + "same_team": "I'm on your side!", + "thanks": "Thanks!", + "trust_broken": "I trusted you...", + "trust_me": "You can trust me. Promise!", + "well_played": "Well played!" + }, + "help": { + "alliance": "Alliance?", + "gold": "Please give me gold!", + "help_defend": "Help me defend against [P1]!", + "no_attack": "Please don't attack me!", + "sorry_attack": "Sorry, I didn’t mean to attack.", + "trade_partners": "Let's be trade partners!", + "troops": "Please give me troops!", + "troops_frontlines": "Send troops to the frontlines!" + }, + "misc": { + "build_closer": "Build closer to get trains!", + "coastline": "Please let me get a coastline.", + "fun": "This game is fun!", + "go": "Let’s go!", + "pr": "When will my PR finally get merged...?", + "strategy": "Nice strategy!", + "team_up": "Let’s team up against [P1]!" + }, + "phrase": "Phrase", + "player": "Player", + "search": "Search player...", "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", - "copied": "Copied!", - "click_to_copy": "Click to copy", - "enabled": "Enabled", - "disabled": "Disabled", - "map_default": "Map default", - "month_jan": "January", - "month_feb": "February", - "month_mar": "March", - "month_apr": "April", - "month_may": "May", - "month_jun": "June", - "month_jul": "July", - "month_aug": "August", - "month_sep": "September", - "month_oct": "October", - "month_nov": "November", - "month_dec": "December", - "duration_hour_short": "h", - "duration_minute_short": "min", - "duration_second_short": "s" - }, - "main": { - "title": "OpenFront (ALPHA)", - "login_discord": "Login with Discord", - "sign_in": "Sign in", - "discord_avatar_alt": "Discord profile avatar", - "user_avatar_alt": "{username}'s avatar", - "create": "Create Lobby", - "join": "Join Lobby", - "solo": "Solo", - "game_info": "Game info", - "github": "GitHub", - "wiki": "Wiki", - "privacy_policy": "Privacy Policy", - "terms_of_service": "Terms of Service", - "copyright": "© OpenFront™ and Contributors", - "play": "Play", - "news": "News", - "store": "Store", - "settings": "Settings", - "leaderboard": "Leaderboard", - "account": "Account", - "help": "Help", - "clans": "Clans", - "menu": "Menu", - "troubleshooting": "Troubleshooting", - "go_to_troubleshooting": "Go to our troubleshooting page" - }, - "news": { - "title": "Release Notes" - }, - "troubleshooting": { - "title": "Troubleshooting", - "environment": "Environment", - "rendering": "Rendering", - "power": "Power", - "browser": "Browser", - "platform": "Platform", - "copied_to_clipboard": "Info copied to the clipboard! Feel free to share it on our Discord if you need help.", - "os": "OS", - "device_pixel_ratio": "Device Pixel Ratio", - "chromium_tip": "OpenFront runs best on Chromium-based browsers.", - "hardware_acceleration_tip": "Make sure hardware acceleration is enabled in your browser settings for optimal performance.", - "renderer": "Renderer", - "max_texture_size": "Max Texture Size", - "high_precision_shaders": "High Precision Shaders", - "gpu": "GPU", - "unavailable": "Unavailable", - "gpu_tip": "Verify that this is the dedicated GPU, if one is available.", - "battery": "Battery", - "charging": "Charging", - "battery_level": "Battery Level", - "power_saving_tip": "Make sure that your browser is not set to power saving mode.", - "yes": "Yes", - "no": "No", - "unknown": "Unknown", - "software_rendering": "Software rendering", - "canvas_2d_no_gpu": "Canvas 2D (no GPU)" - }, - "help_modal": { - "video_tutorial": "Video Tutorial", - "video_tutorial_title": "OpenFront.io Tutorial", - "hotkeys": "Hotkeys", - "table_key": "Key", - "table_action": "Action", - "action_esc": "Closes menu. Cancels unit build preview.", - "action_enter": "Builds unit under cursor", - "action_alt_view": "Alternate view (terrain/countries)", - "action_coordinate_grid": "Toggle coordinate grid overlay", - "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_pause_game": "Pause / Resume game", - "action_game_speed": "Game speed down / up (single 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", - "action_warship_multiselect": "Select multiple warships (drag to draw selection box)", - "action_warship_selectall": "Select all your warships", - "drag": "drag", - "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_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 received 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 appears. It shows the player type (Human, Nation, or Tribe), a Nation's attitude toward you (Hostile to Friendly), defending troops, gold, and the number of Warships and buildings they have.", - "ui_wilderness": "Wilderness", - "option_pause": "Pause/Unpause the game - Unavailable in public games.", - "option_speed": "Speed - Adjust the game speed. Unavailable in public games.", - "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 things like Alternate view, Emojis, Dark Mode, Hidden names, action on left click and more.", - "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_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_donate_troops": "Donate troops equivalent to your attack ratio slider percentage to the ally you opened the radial menu on.", - "radial_donate_gold": "Opens the gold donation slider menu so you can quickly send allies gold.", - "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. Tribes 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. 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", - "troubleshooting_desc": "If you experience performance issues, crashes, or other problems while playing OpenFront, please visit our Troubleshooting page for help diagnosing and fixing common issues:", - "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?", - "bomb_direction": "Atom / Hydrogen bomb arc direction", - "icon_alt_player_leaderboard": "Player Leaderboard Icon", - "icon_alt_team_leaderboard": "Team Leaderboard Icon", - "game_id_tooltip": "Game ID" - }, - "single_modal": { - "random_spawn": "Random spawn", - "toggle_achievements": "Toggle achievements", - "sign_in_for_achievements": "Sign in for achievements", - "options_title": "Options", - "bots": "Tribes: ", - "bots_disabled": "Disabled", - "nations": "Nations: ", - "nations_disabled": "Disabled", - "instant_build": "Instant build", - "infinite_gold": "Infinite gold", - "infinite_troops": "Infinite troops", - "compact_map": "Compact Map", - "disable_alliances": "Disable alliances", - "water_nukes": "Water nukes", - "max_timer": "Game length (minutes)", - "max_timer_placeholder": "Mins", - "max_timer_invalid": "Please enter a valid max timer value (1-120 minutes)", - "enables_title": "Disable Units", - "start": "Start Game", - "options_changed_no_achievements": "Custom settings – achievements disabled", - "gold_multiplier": "Gold multiplier", - "gold_multiplier_placeholder": "2.0x", - "starting_gold": "Starting Gold (Millions)", - "starting_gold_placeholder": "5" - }, - "token_login_modal": { - "title": "Logging in...", - "logging_in": "Logging in...", - "success": "Successfully logged in as {email}!" + "title": "Quick Chat", + "to": "Sent {user}: {msg}", + "warnings": { + "betrayed": "[P1] betrayed their ally!", + "betrayed_me": "[P1] betrayed me!", + "cheating": "[P1] is cheating!", + "danger_base": "[P1] is unprotected!", + "getting_big": "[P1] is growing too fast!", + "has_allies": "[P1] has many allies.", + "mirv_ready": "[P1] has enough gold to launch a MIRV!", + "mirv_soon": "[P1] can launch a MIRV soon!", + "no_allies": "[P1] has no allies.", + "number1_warning": "The #1 player will win soon unless we team up!", + "saving_for_mirv": "[P1] is saving up to launch a MIRV.", + "snowballing": "[P1] is snowballing too fast!", + "stalemate": "Let's make peace. This is a stalemate, we will both lose.", + "stop_trading": "Stop trading with [P1]!", + "stop_trading_all": "Please stop trading with all!", + "strong": "[P1] is strong.", + "weak": "[P1] is weak." + } }, "clan_modal": { - "title": "Clans", - "my_clans": "My Clans", - "browse": "Browse", - "no_clans": "You're not in any clans yet.", - "sign_in_for_clans": "Sign in to join and manage clans", - "request_pending": "Request Pending", - "search_placeholder": "Search by clan tag...", - "no_results": "No clans found.", - "invite_only": "Invite Only", - "members": "Members", - "status": "Status", - "open": "Open", - "join_clan": "Join Clan", - "request_invite": "Request Invite", - "leave_clan": "Leave Clan", - "manage_clan": "Manage", - "transfer_leadership": "Transfer Leadership", - "clan_name": "Clan Name", - "description": "Description", - "open_clan": "Open Clan", - "open_clan_desc": "Anyone can join without an invite", - "clan_settings": "Clan Settings", - "save_changes": "Save Changes", - "promote": "Promote", - "demote": "Demote", - "kick": "Kick", - "danger_zone": "Danger Zone", - "disband_clan": "Disband Clan", - "transfer_warning": "This will make the selected member the new leader. You will become a regular member. This action cannot be undone.", - "confirm_transfer": "Transfer leadership to {name}", - "select_new_leader": "Select a new leader", - "search_members_placeholder": "Filter current page by ID or role...", - "search_requests_placeholder": "Search by player public ID...", - "per_page": "Per page", - "sort_by": "Sort by", - "sort_default": "Role", - "sort_total_wins": "Total Wins", - "sort_total_losses": "Total Losses", - "sort_ffa_wins": "FFA Wins", - "sort_ffa_losses": "FFA Losses", - "sort_team_wins": "Team Wins", - "sort_team_losses": "Team Losses", - "sort_hvn_wins": "HvN Wins", - "sort_hvn_losses": "HvN Losses", - "sort_ranked_wins": "Ranked Wins", - "sort_ranked_losses": "Ranked Losses", - "sort_1v1_wins": "1v1 Wins", - "sort_1v1_losses": "1v1 Losses", - "sort_order_asc": "Ascending", - "sort_order_desc": "Descending", - "join_requests": "Join Requests", - "no_requests": "No pending join requests.", - "pending_requests_count": "{count, plural, one {# pending request} other {# pending requests}}", - "approve": "Approve", - "deny": "Deny", - "requested_on": "Requested to join [{tag}] on {date}.", - "pending_applications": "Pending Applications", - "no_pending_applications": "No pending applications.", "applied": "Applied", - "cancel_request": "Cancel", - "stats_total": "Total", - "stats_ffa": "FFA", - "stats_team": "Teams", - "stats_hvn": "HvN", - "stats_ranked": "Ranked", - "stats_1v1": "1v1", - "stats_duos": "Duos", - "stats_trios": "Trios", - "stats_quads": "Quads", - "stats_team_count": "{count} Teams", - "stats_expand": "Show breakdown", - "stats_collapse": "Hide breakdown", - "stats_expand_all": "Expand all", - "stats_collapse_all": "Collapse all", - "no_description": "No description", - "saving": "Saving...", - "join_request_cancelled": "Join request cancelled.", - "failed_to_load_clan": "Failed to load clan", - "join_request_sent": "Join request sent! Waiting for approval.", - "left_clan": "You left the clan.", - "settings_saved": "Clan settings saved!", - "clan_disbanded": "Clan disbanded.", - "member_promoted": "Member promoted!", - "member_demoted": "Member demoted.", - "member_kicked": "Member kicked.", - "leadership_transferred": "Leadership transferred!", - "failed_to_load_requests": "Failed to load requests", - "request_approved": "Request approved!", - "request_denied": "Request denied.", + "approve": "Approve", "ban": "Ban", - "unban": "Unban", + "ban_reason": "Reason: {reason}", + "ban_reason_prompt": "Ban reason (optional, max 200 characters):", + "banned_by_label": "by", "banned_players": "Banned Players", "banned_players_count": "{count, plural, one {# banned player} other {# banned players}}", - "no_bans": "No banned players.", - "ban_reason_prompt": "Ban reason (optional, max 200 characters):", + "browse": "Browse", + "cancel_request": "Cancel", + "clan_disbanded": "Clan disbanded.", + "clan_name": "Clan Name", + "clan_settings": "Clan Settings", "confirm_ban": "Are you sure you want to ban this player? They will be removed from the clan and unable to rejoin.", - "member_banned": "Player banned.", - "member_unbanned": "Player unbanned.", - "banned_by_label": "by", - "ban_reason": "Reason: {reason}", + "confirm_disband": "Are you sure you want to disband [{tag}] {name}? This cannot be undone.", + "confirm_kick": "Are you sure you want to kick this member?", + "confirm_transfer": "Transfer leadership to {name}", + "danger_zone": "Danger Zone", + "demote": "Demote", + "deny": "Deny", + "description": "Description", + "disband_clan": "Disband Clan", + "error_already_member": "Already a member", "error_banned": "You are banned from this clan.", "error_banned_reason": "You are banned from this clan. Reason: {reason}", - "confirm_kick": "Are you sure you want to kick this member?", - "confirm_disband": "Are you sure you want to disband [{tag}] {name}? This cannot be undone.", - "joined_date": "Member since {date}.", - "member_count": "{count, plural, one {# member} other {# members}}", - "role_leader": "Leader", - "role_officer": "Officer", - "role_member": "Member", - "error_already_member": "Already a member", - "error_request_pending": "Join request already pending", - "error_rate_limited_generic": "Please wait before joining another clan", - "error_network": "Network error", "error_failed": "Action failed", "error_loading": "Failed to load", - "tab_overview": "Overview", - "tab_members": "Members", - "tab_game_history": "Game History", - "members_visible_to_members": "Member list is visible to clan members only.", - "history_empty": "No games played yet.", - "history_unavailable": "Game history is unavailable.", - "history_members_only": "Game history is visible to clan members only.", - "history_watch_replay": "Watch Replay", - "history_result_victory": "Victory!", - "history_result_defeat": "Defeat", - "history_result_partial": "{wins} / {total} Won", - "history_clan_winners": "Clan Member Winners", + "error_network": "Network error", + "error_rate_limited_generic": "Please wait before joining another clan", + "error_request_pending": "Join request already pending", + "failed_to_load_clan": "Failed to load clan", + "failed_to_load_requests": "Failed to load requests", "history_clan_members": "Clan Members", + "history_clan_players": "Clan players", + "history_clan_players_value": "{clanCount} / {total} total", + "history_clan_winners": "Clan Member Winners", + "history_duration": "Duration", + "history_empty": "No games played yet.", + "history_end_of_history": "End of history.", "history_filter_all": "All", "history_filter_hvn": "HvN", "history_filter_ranked": "Ranked", - "history_game_type": "Game Type", - "history_type_ffa": "FFA", - "history_type_team": "Team", - "history_type_hvn": "Humans vs Nations", - "history_type_duos": "Duos", - "history_type_trios": "Trios", - "history_type_quads": "Quads", - "history_type_n_teams": "{count, plural, one {# Team} other {# Teams}}", - "history_type_ranked": "Ranked {ranked}", - "history_map": "Map", - "history_clan_players": "Clan players", - "history_clan_players_value": "{clanCount} / {total} total", - "history_players": "Players", - "history_duration": "Duration", "history_game_id": "Game ID", - "history_today_at": "Today at {time}", - "history_yesterday": "Yesterday", - "history_today": "Today", + "history_game_type": "Game Type", "history_load_more_failed": "Couldn't load more games.", - "history_end_of_history": "End of history." - }, - "account_modal": { - "title": "Account", - "connected_as": "Connected as", - "your_subscription": "Your Subscription", - "manage_subscription": "Manage", - "change_tier": "Change Tier", - "reactivate_subscription": "Reactivate", - "cancel_subscription": "Cancel", - "cancel_subscription_confirm": "Cancel your subscription? It will stay active until the end of the current billing period.", - "cancel_subscription_success": "Subscription canceled. Access continues until the end of the billing period.", - "cancel_subscription_failed": "Failed to cancel subscription. Please try again or use Manage.", - "subscription_portal_failed": "Failed to open the subscription management portal.", - "sub_status_active": "Active", - "sub_status_trialing": "Trial", - "sub_status_past_due": "Past Due", - "sub_status_unpaid": "Unpaid", - "sub_status_incomplete": "Incomplete", - "sub_status_incomplete_expired": "Expired", - "sub_status_canceled": "Canceled", - "sub_status_paused": "Paused", - "sub_status_canceling": "Canceling", - "sub_status_canceling_on": "Cancels {date}", - "sub_renews_on": "Renews {date}", - "sub_price_monthly": "{price}/mo", - "stats_overview": "Stats Overview", - "link_discord": "Link Discord Account", - "log_out": "Log Out", - "sign_in_desc": "Sign in to save your stats and progress", - "or": "OR", - "email_placeholder": "Enter your email address", - "get_magic_link": "Get Magic Link", - "linked_account": "Logged in as {account_name}", - "fetching_account": "Fetching account information...", - "recovery_email_sent": "Recovery email sent to {email}", - "not_found": "Not Found", - "clear_session": "Clear Session", - "failed_to_send_recovery_email": "Failed to send recovery email", - "enter_email_address": "Please enter an email address", - "public_player_id": "Public Player ID:", - "tab_account": "Account", - "tab_stats": "Stats", - "tab_games": "Games", - "tab_friends": "Friends", - "no_stats": "No stats available yet. Play some games to start tracking.", - "no_games": "No games played yet." - }, - "friends": { - "team_info": "Friends are placed on the same team.", - "add_friend": "Add Friend", - "public_id_placeholder": "Enter their public player ID", - "send_request": "Send Request", - "pending_requests": "Pending Requests", - "incoming": "Incoming", - "outgoing": "Outgoing", - "accept": "Accept", - "deny": "Deny", - "withdraw": "Withdraw", - "your_friends": "Your Friends", - "no_friends": "You haven't added any friends yet.", - "friends_since": "Friends since {date}", - "remove": "Remove", - "load_more": "Load More", - "confirm_remove": "Remove {publicId} from your friends?", - "request_sent": "Friend request sent", - "request_auto_accepted": "Friend request accepted — you are now friends", - "request_accepted": "Friend request accepted", - "request_denied": "Friend request denied", - "request_withdrawn": "Friend request withdrawn", - "friend_removed": "Friend removed", - "load_failed": "Failed to load friends", - "cannot_friend_self": "You can't add yourself as a friend", - "error_not_found": "Player not found", - "error_conflict": "Already friends or request already sent", - "error_bad_request": "Invalid request", - "error_generic": "Something went wrong. Please try again." - }, - "leaderboard_modal": { - "title": "Leaderboard", - "ranked_tab": "1v1 Ranked", - "clans_tab": "Clans", - "refresh_time": "Refreshed every 1 hour", - "loading": "Loading...", - "error": "Error loading leaderboard", - "no_stats": "No stats available", - "no_data_yet": "No Data Yet", - "clan": "Clan", - "player": "Player", - "games": "Games", - "elo": "ELO", - "win_score": "Win Score", - "win_score_tooltip": "Weighted wins based on clan participation and match difficulty", - "loss_score": "Loss Score", - "loss_score_tooltip": "Weighted losses based on clan participation and match difficulty", - "win_loss_ratio": "Win/Loss", - "ratio": "Ratio", - "rank": "Rank", - "try_again": "Try Again", - "your_ranking": "Your Ranking" - }, - "game_info_modal": { - "title": "Game info", - "players": "Players", - "atoms": "Atoms", - "hydros": "Hydros", - "mirv": "MIRV", - "bombs": "Bombs", - "total_gold": "Total", - "all_gold": "All gold", - "trade": "Trade", - "train_trade": "Train", - "naval_trade": "Tradeship", - "conquest_gold": "Conquered player gold", - "stolen_gold": "Stolen with warships", - "num_of_conquests_humans": "Player kills", - "num_of_conquests_bots": "Tribe kills", - "duration": "Duration", - "survival_time": "Survival time", - "war": "War", - "economy": "Economy", - "conquests": "Conquests", - "pirate": "Pirate", - "conquered": "Conquered", - "loading_game_info": "Loading game stats", - "no_winner": "This game ended with no winner (or a Nation won)" - }, - "map": { - "map": "Map", - "featured": "Featured", - "all": "All", - "favorites": "Favourites", - "world": "World", - "worldinverted": "World Inverted", - "giantworldmap": "Giant World Map", - "europe": "Europe", - "mena": "MENA", - "middleeast": "Middle East", - "northamerica": "North America", - "oceania": "Oceania", - "blacksea": "Black Sea", - "africa": "Africa", - "asia": "Asia", - "mars": "Mars", - "southamerica": "South America", - "britanniaclassic": "Britannia (Classic)", - "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", - "newyorkcity": "New York City", - "achiran": "Achiran", - "baikalnukewars": "Baikal (Nuke Wars)", - "fourislands": "Four Islands", - "gulfofstlawrence": "Gulf of St. Lawrence", - "lisbon": "Lisbon", - "svalmel": "Svalmel", - "manicouagan": "Manicouagan", - "lemnos": "Lemnos", - "tourney1": "Tourney 2 Teams", - "tourney2": "Tourney 3 Teams", - "tourney3": "Tourney 4 Teams", - "tourney4": "Tourney 8 Teams", - "passage": "Passage", - "sierpinski": "Sierpinski", - "thebox": "The Box", - "twolakes": "Two Lakes", - "straitofhormuz": "Strait of Hormuz", - "surrounded": "Surrounded", - "didier": "Didier", - "didierfrance": "Didier (France)", - "amazonriver": "Amazon River", - "bosphorusstraits": "Bosphorus Straits", - "beringstrait": "Bering Strait", - "tradersdream": "Traders Dream", - "hawaii": "Hawaii", - "alps": "Alps", - "niledelta": "Nile Delta", - "arctic": "Arctic", - "sanfrancisco": "San Francisco", - "aegean": "Aegean", - "milkyway": "Milky Way", - "marenostrum": "Mare Nostrum", - "dyslexdria": "Dyslexdria", - "greatlakes": "Great Lakes", - "straitofmalacca": "Strait Of Malacca", - "luna": "Luna", - "conakry": "Conakry", - "caucasus": "Caucasus", - "losangeles": "Los Angeles", - "beringsea": "Bering Sea", - "antarctica": "Antarctica", - "archipelagosea": "Archipelago Sea", - "bajacalifornia": "Baja California", - "taiwanstrait": "Taiwan Strait", - "danishstraits": "Danish Straits", - "northwestpassage": "Northwest Passage", - "venice": "Venice", - "korea": "Korea", - "indiansubcontinent": "Indian Subcontinent", - "balkans": "Balkans", - "onion": "Onion", - "yellowsea": "Yellow Sea", - "labyrinth": "Labyrinth", - "caribbean": "Caribbean", - "choppingblock": "Chopping Block", - "southeastasia": "Southeast Asia", - "mississippiriver": "Mississippi River", - "titan": "Titan", - "hongkong": "Hong Kong", - "juandefucastrait": "Juan De Fuca Strait" - }, - "map_categories": { - "featured": "Featured", - "world": "World", - "europe": "Europe", - "asia": "Asia", - "north_america": "North America", - "africa": "Africa", - "south_america": "South America", - "oceania": "Oceania", - "antarctica": "Antarctica", - "cosmic": "Cosmic", - "tournament": "Tournament", - "other": "Other", - "special": "Special", - "favorites": "Favourites" - }, - "map_component": { - "loading": "Loading...", - "error": "Error", - "favorite": "Add to favourites", - "unfavorite": "Remove from favourites", - "favorites_empty": "Click the star on any map to favourite it" - }, - "private_lobby": { - "title": "Join Private Lobby", - "enter_id": "Enter Lobby ID", - "join_lobby": "Join 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": "Lobby joined! Waiting for host to start...", - "version_mismatch": "This game was created with a different version. Cannot join.", - "disabled_units": "Disabled Units", - "game_length": "Game length", - "pvp_immunity": "PVP immunity duration", - "starting_gold": "Starting Gold", - "host_cheats": "Host Cheats" - }, - "public_lobby": { - "title": "Waiting for Game Start...", - "waiting_for_players": "Waiting for players", - "connecting": "Connecting to lobby...", - "starting_in": "Starting in {time}", - "starting_game": "Starting…", - "teams_hvn": "Humans vs Nations", - "teams_hvn_detailed": "{num} Humans vs {num} Nations", - "teams": "{num} teams", - "players_per_team": "of {num}", - "started": "Started", + "history_map": "Map", + "history_members_only": "Game history is visible to clan members only.", + "history_players": "Players", + "history_result_defeat": "Defeat", + "history_result_partial": "{wins} / {total} Won", + "history_result_victory": "Victory!", + "history_today": "Today", + "history_today_at": "Today at {time}", + "history_type_duos": "Duos", + "history_type_ffa": "FFA", + "history_type_hvn": "Humans vs Nations", + "history_type_n_teams": "{count, plural, one {# Team} other {# Teams}}", + "history_type_quads": "Quads", + "history_type_ranked": "Ranked {ranked}", + "history_type_team": "Team", + "history_type_trios": "Trios", + "history_unavailable": "Game history is unavailable.", + "history_watch_replay": "Watch Replay", + "history_yesterday": "Yesterday", + "invite_only": "Invite Only", + "join_clan": "Join Clan", + "join_request_cancelled": "Join request cancelled.", + "join_request_sent": "Join request sent! Waiting for approval.", + "join_requests": "Join Requests", + "joined_date": "Member since {date}.", + "kick": "Kick", + "leadership_transferred": "Leadership transferred!", + "leave_clan": "Leave Clan", + "left_clan": "You left the clan.", + "manage_clan": "Manage", + "member_banned": "Player banned.", + "member_count": "{count, plural, one {# member} other {# members}}", + "member_demoted": "Member demoted.", + "member_kicked": "Member kicked.", + "member_promoted": "Member promoted!", + "member_unbanned": "Player unbanned.", + "members": "Members", + "members_visible_to_members": "Member list is visible to clan members only.", + "my_clans": "My Clans", + "no_bans": "No banned players.", + "no_clans": "You're not in any clans yet.", + "no_description": "No description", + "no_pending_applications": "No pending applications.", + "no_requests": "No pending join requests.", + "no_results": "No clans found.", + "open": "Open", + "open_clan": "Open Clan", + "open_clan_desc": "Anyone can join without an invite", + "pending_applications": "Pending Applications", + "pending_requests_count": "{count, plural, one {# pending request} other {# pending requests}}", + "per_page": "Per page", + "promote": "Promote", + "request_approved": "Request approved!", + "request_denied": "Request denied.", + "request_invite": "Request Invite", + "request_pending": "Request Pending", + "requested_on": "Requested to join [{tag}] on {date}.", + "role_leader": "Leader", + "role_member": "Member", + "role_officer": "Officer", + "save_changes": "Save Changes", + "saving": "Saving...", + "search_members_placeholder": "Filter current page by ID or role...", + "search_placeholder": "Search by clan tag...", + "search_requests_placeholder": "Search by player public ID...", + "select_new_leader": "Select a new leader", + "settings_saved": "Clan settings saved!", + "sign_in_for_clans": "Sign in to join and manage clans", + "sort_1v1_losses": "1v1 Losses", + "sort_1v1_wins": "1v1 Wins", + "sort_by": "Sort by", + "sort_default": "Role", + "sort_ffa_losses": "FFA Losses", + "sort_ffa_wins": "FFA Wins", + "sort_hvn_losses": "HvN Losses", + "sort_hvn_wins": "HvN Wins", + "sort_order_asc": "Ascending", + "sort_order_desc": "Descending", + "sort_ranked_losses": "Ranked Losses", + "sort_ranked_wins": "Ranked Wins", + "sort_team_losses": "Team Losses", + "sort_team_wins": "Team Wins", + "sort_total_losses": "Total Losses", + "sort_total_wins": "Total Wins", + "stats_1v1": "1v1", + "stats_collapse": "Hide breakdown", + "stats_collapse_all": "Collapse all", + "stats_duos": "Duos", + "stats_expand": "Show breakdown", + "stats_expand_all": "Expand all", + "stats_ffa": "FFA", + "stats_hvn": "HvN", + "stats_quads": "Quads", + "stats_ranked": "Ranked", + "stats_team": "Teams", + "stats_team_count": "{count} Teams", + "stats_total": "Total", + "stats_trios": "Trios", "status": "Status", - "join_timeout": "You didn't enter the game in time." + "tab_game_history": "Game History", + "tab_members": "Members", + "tab_overview": "Overview", + "title": "Clans", + "transfer_leadership": "Transfer Leadership", + "transfer_warning": "This will make the selected member the new leader. You will become a regular member. This action cannot be undone.", + "unban": "Unban" }, - "matchmaking_modal": { - "title": "1v1 Ranked Matchmaking (ALPHA)", - "connecting": "Connecting to matchmaking server...", - "searching": "Searching for game...", - "waiting_for_game": "Waiting for game to start...", - "elo": "Your ELO: {elo}", - "no_elo": "No ELO yet" + "common": { + "available": "Available", + "back": "Back", + "cancel": "Cancel", + "cap_label": "Cap", + "cap_tooltip": "Recipient’s remaining capacity", + "click_to_copy": "Click to copy", + "close": "Close", + "confirm": "Confirm", + "copied": "Copied!", + "copy": "Copy", + "disabled": "Disabled", + "duration_hour_short": "h", + "duration_minute_short": "min", + "duration_second_short": "s", + "enabled": "Enabled", + "map_default": "Map default", + "month_apr": "April", + "month_aug": "August", + "month_dec": "December", + "month_feb": "February", + "month_jan": "January", + "month_jul": "July", + "month_jun": "June", + "month_mar": "March", + "month_may": "May", + "month_nov": "November", + "month_oct": "October", + "month_sep": "September", + "none": "None", + "not_logged_in": "Not logged in", + "paste": "Paste", + "preset_max": "Max", + "send": "Send", + "summary_keep": "Keep", + "summary_send": "Send", + "target_dead": "Target eliminated", + "target_dead_note": "You can't send resources to an eliminated player." }, - "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, and underscores.", - "tag": "TAG", - "tag_too_short": "Clan tag must be 2-5 alphanumeric characters.", - "tag_too_long": "Clan tag cannot exceed 5 characters.", - "tag_invalid_chars": "Clan tag can only contain letters and numbers.", - "tag_not_member": "Join the {tag} clan before using its tag. Click this message to join it." + "control_panel": { + "allied_afk_neighbor_info": "You can attack disconnected players even if you are allied with them.", + "army_limit_warning": "You're near your army limit! Consider sending troops to teammates.", + "low_troops_warning": "You are very low on troops - You should always keep some troops for defense.", + "teammate_afk_neighbor_info": "You can attack disconnected teammates.", + "traitor_neighbor_info": "You can betray traitors without becoming a traitor yourself." }, - "host_modal": { - "title": "Create Private Lobby", - "mode": "Mode", - "team_count": "Number of Teams", - "options_title": "Options", - "bots": "Tribes: ", - "bots_disabled": "Disabled", - "nations": "Nations: ", - "nations_disabled": "Disabled", - "player_immunity_duration": "PVP immunity duration (minutes)", - "max_timer": "Game length (minutes)", - "mins_placeholder": "Mins", - "instant_build": "Instant build", - "infinite_gold": "Infinite gold", - "donate_gold": "Donate gold", - "infinite_troops": "Infinite troops", - "donate_troops": "Donate troops", - "compact_map": "Compact Map", - "disable_alliances": "Disable alliances", - "water_nukes": "Water nukes", - "enables_title": "Disable Units", - "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}", - "teams_Duos": "Duos (teams of 2)", - "teams_Trios": "Trios (teams of 3)", - "teams_Quads": "Quads (teams of 4)", - "teams_Humans Vs Nations": "Humans vs Nations", - "crowded": "Crowded modifier", - "hard_nations": "Hard Nations", - "gold_multiplier": "Gold multiplier", - "gold_multiplier_placeholder": "2.0x", - "starting_gold": "Starting Gold (Millions)", - "starting_gold_placeholder": "5", - "host_cheats": "Host Cheats", - "leave_confirmation": "Are you sure you want to leave the lobby?" - }, - "team_colors": { - "red": "Red", - "blue": "Blue", - "teal": "Teal", - "purple": "Purple", - "yellow": "Yellow", - "orange": "Orange", - "green": "Green", - "bot": "Tribes", - "humans": "Humans", - "nations": "Nations" - }, - "game_starting_modal": { - "title": "Game is Starting...", - "credits": "Credits", - "code_license": "Code licensed under AGPL-3.0 (no warranty)" + "cosmetics": { + "adfree": "ad-free for life!", + "artist_label": "Artist:", + "color_label": "Color:", + "common": "Common", + "epic": "Epic", + "free": "+{numFree} BONUS!", + "hard": "Plutonium", + "legendary": "Legendary", + "per_day": "/day", + "rare": "Rare", + "soft": "Caps", + "uncommon": "Uncommon" }, "difficulty": { "difficulty": "Nation difficulty", "easy": "Easy", - "medium": "Medium", "hard": "Hard", - "impossible": "Impossible" + "impossible": "Impossible", + "medium": "Medium" + }, + "discord_user_header": { + "avatar_alt": "Avatar" + }, + "error_modal": { + "connection_error": "Connection error!", + "copied": "Copied!", + "copy_clipboard": "Copy to clipboard", + "crashed": "Game crashed!", + "desync_notice": "You are desynced from other players. What you see might differ from other players.", + "failed_copy": "Failed to copy", + "paste_discord": "Please paste the following in your bug report in Discord:", + "spawn_failed": { + "description": "Automatic spawn selection failed. You can't play this game.", + "title": "Spawn failed" + } + }, + "events_display": { + "about_to_expire": "Your alliance with {name} is about to expire!", + "accept_alliance": "Accept", + "alliance_accepted": "accepted", + "alliance_expired": "Your alliance with {name} expired", + "alliance_nukes_destroyed_incoming": "{count, plural, one {# nuke launched by {name} was destroyed due to the alliance} other {# nukes launched by {name} were destroyed due to the alliance}}", + "alliance_nukes_destroyed_outgoing": "{count, plural, one {# nuke launched toward {name} was destroyed due to the alliance} other {# nukes launched toward {name} were destroyed due to the alliance}}", + "alliance_rejected": "rejected", + "alliance_renewed": "Your alliance with {name} has been renewed", + "alliance_request_sent": "Alliance request sent to {name}.", + "alliance_request_status": "{name} {status} your alliance request", + "atom_bomb_detonated": "{name} - atom bomb detonated", + "attack_cancelled_retreat": "Attack cancelled, {troops} soldiers killed during retreat", + "attack_request": "{name} requests you attack {target}", + "betrayal_debuff_ends": "{time} seconds left until betrayal debuff ends", + "betrayal_description": "You broke your alliance with {name}, making you a TRAITOR ({malusPercent}% defense debuff for {durationText})", + "betrayed_you": "{name} broke their alliance with you", + "conquered_no_gold": "Conquered {name} (didn't play, no gold awarded)", + "duration_second": "1 second", + "duration_seconds_plural": "{seconds} seconds", + "focus": "Focus", + "hydrogen_bomb_detonated": "{name} - hydrogen bomb detonated", + "ignore": "Ignore", + "mirv_warheads_intercepted": "{count, plural, one {{count} MIRV warhead intercepted} other {{count} MIRV warheads intercepted}}", + "missile_intercepted": "Missile intercepted {unit}", + "no_boats_available": "No boats available, max {max}", + "received_gold_from_captured_ship": "Received {gold} gold from ship captured from {name}", + "received_gold_from_conquest": "Conquered {name}, received {gold} gold", + "received_gold_from_player": "Received {gold} gold from {name}", + "received_troops_from_player": "Received {troops} troops from {name}", + "reject_alliance": "Reject", + "renew_alliance": "Request to renew", + "request_alliance": "{name} requests an alliance!", + "retreating": "retreating", + "sent_emoji": "Sent {name}: {emoji}", + "sent_gold_to_player": "Sent {gold} gold to {name}", + "sent_troops_to_player": "Sent {troops} troops to {name}", + "unit_destroyed": "Your {unit} was destroyed", + "unit_voluntarily_deleted": "Unit voluntarily deleted", + "wants_to_renew_alliance": "{name} wants to renew your alliance" + }, + "flag_input": { + "button_title": "Pick a flag!", + "search_flag": "Search...", + "title": "Select Flag" + }, + "friends": { + "accept": "Accept", + "add_friend": "Add Friend", + "cannot_friend_self": "You can't add yourself as a friend", + "confirm_remove": "Remove {publicId} from your friends?", + "deny": "Deny", + "error_bad_request": "Invalid request", + "error_conflict": "Already friends or request already sent", + "error_generic": "Something went wrong. Please try again.", + "error_not_found": "Player not found", + "friend_removed": "Friend removed", + "friends_since": "Friends since {date}", + "incoming": "Incoming", + "load_failed": "Failed to load friends", + "load_more": "Load More", + "no_friends": "You haven't added any friends yet.", + "outgoing": "Outgoing", + "pending_requests": "Pending Requests", + "public_id_placeholder": "Enter their public player ID", + "remove": "Remove", + "request_accepted": "Friend request accepted", + "request_auto_accepted": "Friend request accepted — you are now friends", + "request_denied": "Friend request denied", + "request_sent": "Friend request sent", + "request_withdrawn": "Friend request withdrawn", + "send_request": "Send Request", + "team_info": "Friends are placed on the same team.", + "withdraw": "Withdraw", + "your_friends": "Your Friends" + }, + "fullscreen": { + "enter": "Enter fullscreen", + "exit": "Exit fullscreen" + }, + "game_info_modal": { + "all_gold": "All gold", + "atoms": "Atoms", + "bombs": "Bombs", + "conquered": "Conquered", + "conquest_gold": "Conquered player gold", + "conquests": "Conquests", + "duration": "Duration", + "economy": "Economy", + "hydros": "Hydros", + "loading_game_info": "Loading game stats", + "mirv": "MIRV", + "naval_trade": "Tradeship", + "no_winner": "This game ended with no winner (or a Nation won)", + "num_of_conquests_bots": "Tribe kills", + "num_of_conquests_humans": "Player kills", + "pirate": "Pirate", + "players": "Players", + "stolen_gold": "Stolen with warships", + "survival_time": "Survival time", + "title": "Game info", + "total_gold": "Total", + "trade": "Trade", + "train_trade": "Train", + "war": "War" + }, + "game_list": { + "details": "Details", + "difficulty": "Difficulty", + "game_id": "Game ID", + "map": "Map", + "mode": "Mode", + "ranking": "Ranking", + "recent_games": "Recent Games", + "replay": "Replay", + "type": "Type" }, "game_mode": { "ffa": "Free for All", "teams": "Teams" }, + "game_starting_modal": { + "code_license": "Code licensed under AGPL-3.0 (no warranty)", + "credits": "Credits", + "title": "Game is Starting..." + }, + "graphics_setting": { + "black": "Black", + "classic_icons_desc": "Lighter outline with near-black interior", + "classic_icons_label": "Classic icons", + "colored": "Colored", + "colored_names_desc": "Show player names in their player color or in black", + "colored_names_label": "Name color", + "coordinate_grid_opacity_desc": "How opaque the coordinate grid is (lower lets more things show through)", + "coordinate_grid_opacity_label": "Coordinate grid opacity", + "highlight_brighten_desc": "How strongly the border brightens on hover (0 to disable)", + "highlight_brighten_label": "Border highlight amount", + "highlight_fill_desc": "How strongly territory brightens on hover (0 to disable)", + "highlight_fill_label": "Territory highlight", + "highlight_thicken_desc": "How much the border thickens on hover", + "highlight_thicken_label": "Border highlight thickness", + "hover_fade_desc": "How visible names are while your cursor is over them (1 to disable fading)", + "hover_fade_label": "Name opacity under cursor", + "hover_glow_alpha_desc": "How bright the white glow behind the hovered player's name is (0 to disable)", + "hover_glow_alpha_label": "Hover glow strength", + "hover_glow_width_desc": "How far the white glow extends behind the hovered player's name", + "hover_glow_width_label": "Hover glow size", + "name_cull_desc": "Hide names smaller than this size", + "name_cull_label": "Minimum name size", + "name_scale_label": "Name Scale", + "rail_distance_desc": "How far zoomed out train tracks remain visible", + "rail_distance_label": "Train track draw distance", + "rail_thickness_desc": "How wide train tracks are drawn", + "rail_thickness_label": "Train track thickness", + "reset_desc": "Clear all graphics overrides", + "reset_label": "Reset to defaults", + "section_accessibility": "Accessibility", + "section_effects": "Effects", + "section_map": "Map", + "section_name_labels": "Name Labels", + "section_structure_icons": "Structure Icons", + "territory_alpha_desc": "How opaque the territory fill is (lower lets terrain show through)", + "territory_alpha_label": "Territory opacity", + "territory_sat_desc": "How vivid the territory fill colors are (lower mutes them)", + "territory_sat_label": "Territory saturation", + "title": "Graphics Settings" + }, + "heads_up_message": { + "catching_up": "Catching up...", + "choose_spawn": "Choose a starting location", + "dont_show_again": "Don't show again", + "ffa_collusion": "Reminder: teaming up before the game is not allowed in FFA", + "multiplayer_game_paused": "Game paused by Lobby Creator", + "pvp_immunity_active": "PVP immunity active for {seconds}s", + "random_spawn": "Random spawn is enabled. Selecting starting location for you...", + "singleplayer_game_paused": "Game paused" + }, + "help_modal": { + "action_alt_view": "Alternate view (terrain/countries)", + "action_attack_altclick": "Attack (when left click is set to open menu)", + "action_auto_upgrade": "Auto-upgrade nearest building", + "action_build": "Open build menu", + "action_center": "Center camera on player", + "action_coordinate_grid": "Toggle coordinate grid overlay", + "action_emote": "Open emote menu", + "action_enter": "Builds unit under cursor", + "action_esc": "Closes menu. Cancels unit build preview.", + "action_game_speed": "Game speed down / up (single player)", + "action_move_camera": "Move camera", + "action_pause_game": "Pause / Resume game", + "action_ratio_change": "Decrease/Increase attack ratio", + "action_reset_gfx": "Reset graphics", + "action_warship_multiselect": "Select multiple warships (drag to draw selection box)", + "action_warship_selectall": "Select all your warships", + "action_zoom": "Zoom out/in", + "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. Tribes 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.", + "bomb_direction": "Atom / Hydrogen bomb arc direction", + "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_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_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_desc": "Description", + "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_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_icon": "Icon", + "build_menu_desc": "Build these or see how many of each you already build:", + "build_menu_title": "Build menu", + "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.", + "build_name": "Name", + "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_sam": "SAM Launcher", + "build_sam_desc": "Can intercept enemy missiles in its 100 pixel range. The SAM has a 7.5 second cooldown.", + "build_silo": "Missile Silo", + "build_silo_desc": "Allows launching missiles.", + "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.", + "drag": "drag", + "exit_confirmation": "Are you sure you want to exit the game?", + "game_id_tooltip": "Game ID", + "hotkeys": "Hotkeys", + "icon_ally": "Handshake - Ally. This player is your ally.", + "icon_alt_player_leaderboard": "Player Leaderboard Icon", + "icon_alt_team_leaderboard": "Team Leaderboard Icon", + "icon_crown": "Crown - Number 1. This is the top player in the leaderboard.", + "icon_desc": "Examples of some of the ingame icons you will encounter and what they mean:", + "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.", + "icon_traitor": "Broken shield - Traitor. This player attacked an ally.", + "info_alliance": "Send an alliance request to the player. Allies can share resources and troops, but can't attack each other.", + "info_ally_desc": "When you ally with a player, the following new icons become available:", + "info_ally_panel": "Ally info panel", + "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_emoji": "Send an emoji to the player.", + "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_enemy_panel": "Enemy info panel", + "info_target": "Place a target mark on the player, marking it for all allies, used to coordinate attacks.", + "info_title": "Info menu", + "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.", + "option_exit": "Exit button.", + "option_pause": "Pause/Unpause the game - Unavailable in public games.", + "option_settings": "Settings - Open the settings menu. Inside you can toggle things like Alternate view, Emojis, Dark Mode, Hidden names, action on left click and more.", + "option_speed": "Speed - Adjust the game speed. Unavailable in public games.", + "option_timer": "Timer - Time passed since the start of the game.", + "player_icons": "Player icons", + "radial_boat": "Send a Boat (transport ship) to attack at the selected location. Only available if you have access to water.", + "radial_build": "Open the Build 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_donate_gold": "Opens the gold donation slider menu so you can quickly send allies gold.", + "radial_donate_troops": "Donate troops equivalent to your attack ratio slider percentage to the ally you opened the radial menu on.", + "radial_info": "Open the Info menu.", + "radial_title": "Radial menu", + "table_action": "Action", + "table_key": "Key", + "troubleshooting_desc": "If you experience performance issues, crashes, or other problems while playing OpenFront, please visit our Troubleshooting page for help diagnosing and fixing common issues:", + "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_control": "Control panel", + "ui_control_desc": "The control panel contains the following elements:", + "ui_events": "Event panel", + "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_desc": "The Event panel displays the latest events, requests and Quick Chat messages. Some examples are:", + "ui_events_quickchat": "Quick Chat - You can see sent and received chat messages here. Send a message to a player by clicking the Quick Chat icon in their Info menu.", + "ui_gold": "Gold - The amount of gold you have and the rate at which you gain it.", + "ui_leaderboard": "Leaderboard", + "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_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 appears. It shows the player type (Human, Nation, or Tribe), a Nation's attitude toward you (Hostile to Friendly), defending troops, gold, and the number of Warships and buildings they have.", + "ui_section": "Game UI", + "ui_wilderness": "Wilderness", + "ui_your_team": "Your team:", + "video_tutorial": "Video Tutorial", + "video_tutorial_title": "OpenFront.io Tutorial" + }, + "host_modal": { + "assigned_teams": "Assigned Teams", + "bots": "Tribes: ", + "bots_disabled": "Disabled", + "compact_map": "Compact Map", + "crowded": "Crowded modifier", + "disable_alliances": "Disable alliances", + "donate_gold": "Donate gold", + "donate_troops": "Donate troops", + "empty_team": "Empty", + "empty_teams": "Empty Teams", + "enables_title": "Disable Units", + "gold_multiplier": "Gold multiplier", + "gold_multiplier_placeholder": "2.0x", + "hard_nations": "Hard Nations", + "host_badge": "Host", + "host_cheats": "Host Cheats", + "infinite_gold": "Infinite gold", + "infinite_troops": "Infinite troops", + "instant_build": "Instant build", + "leave_confirmation": "Are you sure you want to leave the lobby?", + "max_timer": "Game length (minutes)", + "mins_placeholder": "Mins", + "mode": "Mode", + "nation_player": "Nation", + "nation_players": "Nations", + "nations": "Nations: ", + "nations_disabled": "Disabled", + "options_title": "Options", + "player": "Player", + "player_immunity_duration": "PVP immunity duration (minutes)", + "players": "Players", + "random_spawn": "Random spawn", + "remove_player": "Remove {username}", + "start": "Start Game", + "starting_gold": "Starting Gold (Millions)", + "starting_gold_placeholder": "5", + "team_count": "Number of Teams", + "teams_Duos": "Duos (teams of 2)", + "teams_Humans Vs Nations": "Humans vs Nations", + "teams_Quads": "Quads (teams of 4)", + "teams_Trios": "Trios (teams of 3)", + "title": "Create Private Lobby", + "waiting": "Waiting for players...", + "water_nukes": "Water nukes" + }, + "ios_banner": { + "got_it": "Got it", + "how": "How", + "later": "Later", + "modal_desc": "Your browser doesn't support fullscreen, but you can add OpenFront to your Home Screen for an immersive experience:", + "modal_title": "Fullscreen on iOS", + "never": "Never", + "step_add_to_home_label": "Add to Home Screen", + "step_open": "Open from your Home Screen — launches fullscreen without the address bar", + "step_scroll_and_tap": "Scroll down and tap", + "step_share": "Tap the Share button in your browser", + "text": "For fullscreen, add OpenFront to your Home Screen" + }, + "kick_reason": { + "admin": "Kicked by an admin", + "duplicate_session": "Kicked from game (you may have been playing on another tab)", + "host_left": "The host has left the lobby.", + "lobby_creator": "Kicked by lobby creator" + }, + "lang": { + "en": "English", + "lang_code": "en", + "native": "English", + "svg": "uk_us_flag" + }, + "leaderboard": { + "cities": "Cities", + "gold": "Gold", + "launchers": "Launchers", + "maxtroops": "Max troops", + "owned": "Owned", + "player": "Player", + "sams": "SAMs", + "show_control": "Show Control", + "show_units": "Show Units", + "team": "Team", + "warships": "Warships" + }, + "leaderboard_modal": { + "clan": "Clan", + "clans_tab": "Clans", + "elo": "ELO", + "error": "Error loading leaderboard", + "games": "Games", + "loading": "Loading...", + "loss_score": "Loss Score", + "loss_score_tooltip": "Weighted losses based on clan participation and match difficulty", + "no_data_yet": "No Data Yet", + "no_stats": "No stats available", + "player": "Player", + "rank": "Rank", + "ranked_tab": "1v1 Ranked", + "ratio": "Ratio", + "refresh_time": "Refreshed every 1 hour", + "title": "Leaderboard", + "try_again": "Try Again", + "win_loss_ratio": "Win/Loss", + "win_score": "Win Score", + "win_score_tooltip": "Weighted wins based on clan participation and match difficulty", + "your_ranking": "Your Ranking" + }, + "main": { + "account": "Account", + "clans": "Clans", + "copyright": "© OpenFront™ and Contributors", + "create": "Create Lobby", + "discord_avatar_alt": "Discord profile avatar", + "game_info": "Game info", + "github": "GitHub", + "go_to_troubleshooting": "Go to our troubleshooting page", + "help": "Help", + "join": "Join Lobby", + "leaderboard": "Leaderboard", + "login_discord": "Login with Discord", + "menu": "Menu", + "news": "News", + "play": "Play", + "privacy_policy": "Privacy Policy", + "settings": "Settings", + "sign_in": "Sign in", + "solo": "Solo", + "store": "Store", + "terms_of_service": "Terms of Service", + "title": "OpenFront (ALPHA)", + "troubleshooting": "Troubleshooting", + "user_avatar_alt": "{username}'s avatar", + "wiki": "Wiki" + }, + "map": { + "achiran": "Achiran", + "aegean": "Aegean", + "africa": "Africa", + "all": "All", + "alps": "Alps", + "amazonriver": "Amazon River", + "antarctica": "Antarctica", + "archipelagosea": "Archipelago Sea", + "arctic": "Arctic", + "asia": "Asia", + "australia": "Australia", + "baikal": "Baikal", + "baikalnukewars": "Baikal (Nuke Wars)", + "bajacalifornia": "Baja California", + "balkans": "Balkans", + "beringsea": "Bering Sea", + "beringstrait": "Bering Strait", + "betweentwoseas": "Between Two Seas", + "blacksea": "Black Sea", + "bosphorusstraits": "Bosphorus Straits", + "britannia": "Britannia", + "britanniaclassic": "Britannia (Classic)", + "caribbean": "Caribbean", + "caucasus": "Caucasus", + "choppingblock": "Chopping Block", + "conakry": "Conakry", + "danishstraits": "Danish Straits", + "deglaciatedantarctica": "Deglaciated Antarctica", + "didier": "Didier", + "didierfrance": "Didier (France)", + "dyslexdria": "Dyslexdria", + "eastasia": "East Asia", + "europe": "Europe", + "europeclassic": "Europe (Classic)", + "falklandislands": "Falkland Islands", + "faroeislands": "Faroe Islands", + "favorites": "Favourites", + "featured": "Featured", + "fourislands": "Four Islands", + "gatewaytotheatlantic": "Gateway to the Atlantic", + "giantworldmap": "Giant World Map", + "greatlakes": "Great Lakes", + "gulfofstlawrence": "Gulf of St. Lawrence", + "halkidiki": "Halkidiki", + "hawaii": "Hawaii", + "hongkong": "Hong Kong", + "iceland": "Iceland", + "indiansubcontinent": "Indian Subcontinent", + "italia": "Italia", + "japan": "Japan", + "juandefucastrait": "Juan De Fuca Strait", + "korea": "Korea", + "labyrinth": "Labyrinth", + "lemnos": "Lemnos", + "lisbon": "Lisbon", + "losangeles": "Los Angeles", + "luna": "Luna", + "manicouagan": "Manicouagan", + "map": "Map", + "marenostrum": "Mare Nostrum", + "mars": "Mars", + "mena": "MENA", + "middleeast": "Middle East", + "milkyway": "Milky Way", + "mississippiriver": "Mississippi River", + "montreal": "Montreal", + "newyorkcity": "New York City", + "niledelta": "Nile Delta", + "northamerica": "North America", + "northwestpassage": "Northwest Passage", + "oceania": "Oceania", + "onion": "Onion", + "pangaea": "Pangaea", + "passage": "Passage", + "pluto": "Pluto", + "random": "Random", + "sanfrancisco": "San Francisco", + "sierpinski": "Sierpinski", + "southamerica": "South America", + "southeastasia": "Southeast Asia", + "straitofgibraltar": "Strait of Gibraltar", + "straitofhormuz": "Strait of Hormuz", + "straitofmalacca": "Strait Of Malacca", + "surrounded": "Surrounded", + "svalmel": "Svalmel", + "taiwanstrait": "Taiwan Strait", + "thebox": "The Box", + "titan": "Titan", + "tourney1": "Tourney 2 Teams", + "tourney2": "Tourney 3 Teams", + "tourney3": "Tourney 4 Teams", + "tourney4": "Tourney 8 Teams", + "tradersdream": "Traders Dream", + "twolakes": "Two Lakes", + "venice": "Venice", + "world": "World", + "worldinverted": "World Inverted", + "yellowsea": "Yellow Sea", + "yenisei": "Yenisei" + }, + "map_categories": { + "africa": "Africa", + "antarctica": "Antarctica", + "asia": "Asia", + "cosmic": "Cosmic", + "europe": "Europe", + "favorites": "Favourites", + "featured": "Featured", + "north_america": "North America", + "oceania": "Oceania", + "other": "Other", + "south_america": "South America", + "special": "Special", + "tournament": "Tournament", + "world": "World" + }, + "map_component": { + "error": "Error", + "favorite": "Add to favourites", + "favorites_empty": "Click the star on any map to favourite it", + "loading": "Loading...", + "unfavorite": "Remove from favourites" + }, + "matchmaking_button": { + "description": "(ALPHA)", + "login_required": "Login to play ranked!", + "must_login": "You must be logged in to play ranked matchmaking.", + "play_ranked": "1v1 Ranked Matchmaking" + }, + "matchmaking_modal": { + "connecting": "Connecting to matchmaking server...", + "elo": "Your ELO: {elo}", + "no_elo": "No ELO yet", + "searching": "Searching for game...", + "title": "1v1 Ranked Matchmaking (ALPHA)", + "waiting_for_game": "Waiting for game to start..." + }, "mode_selector": { - "teams_title": "Teams", - "teams_count": "{teamCount} teams", - "teams_of": "{teamCount} teams of {playersPerTeam}", - "ranked_title": "Ranked", + "coming_soon": "Coming Soon", "ranked_1v1_title": "1v1", "ranked_2v2_title": "2v2", - "coming_soon": "Coming Soon" + "ranked_title": "Ranked", + "teams_count": "{teamCount} teams", + "teams_of": "{teamCount} teams of {playersPerTeam}", + "teams_title": "Teams" + }, + "news": { + "title": "Release Notes" + }, + "news_box": { + "dismiss": "Dismiss", + "firefox_warning": "OpenFront.io doesn't perform well with [Firefox-based browsers](https://simple.wikipedia.org/wiki/Web_browsers_based_on_Firefox). We recommend you to use a [Chromium-based browser](https://en.wikipedia.org/wiki/Chromium_(web_browser)#Browsers_based_on_Chromium) for best performance.", + "go_to_item": "Go to item {num}", + "news": "NEWS", + "tournament": "TOURNAMENT", + "tutorial": "TUTORIAL", + "warning": "WARNING" + }, + "performance_overlay": { + "avg_60s": "Avg (60s):", + "collapse": "Collapse", + "copied": "Copied!", + "copy_clipboard": "Copy JSON", + "copy_json_title": "Copy current performance metrics as JSON", + "expand": "Expand", + "failed_copy": "Failed to copy", + "fps": "FPS:", + "frame": "Frame:", + "layers_header": "Render Layers", + "max_label": "max:", + "render_layers_summary": "Last tick: {frames} frames, {ms}ms", + "render_layers_table_header": "avg / max | tick avg", + "reset": "Reset", + "tick_delay": "Tick Delay:", + "tick_exec": "Tick Exec:", + "tick_layers_header": "Tick Layers", + "tick_layers_summary": "Last tick: {count} layers, {ms}ms", + "tick_layers_table_header": "avg / max", + "tps": "TPS:", + "tps_avg_60s": "Avg:" + }, + "player_panel": { + "active": "Active", + "alliance_time_remaining": "Alliance Expires In", + "alliances": "Alliances", + "arc_down": "Downward arc", + "arc_up": "Upward arc", + "betrayals": "Betrayals", + "break_alliance": "Break Alliance", + "chat": "Chat", + "emotes": "Emojis", + "flip_rocket_trajectory": "Flip rocket trajectory", + "gold": "Gold", + "kick": "Kick player", + "kick_confirm": "Kick {name}?\n\nThey won't be able to rejoin this game.", + "kicked": "Already kicked", + "moderation": "Moderation", + "send_alliance": "Send Alliance", + "send_gold": "Send Gold", + "send_troops": "Send Troops", + "start_trade": "Start Trading", + "start_trade_all": "Start Trading with All", + "stop_trade": "Stop Trading", + "stop_trade_all": "Stop Trading with All", + "stopped": "Stopped", + "target": "Target", + "trading": "Trading", + "traitor": "Traitor", + "troops": "Troops" + }, + "player_stats_table": { + "arrived": "Arrived", + "attack": "Attack", + "building": "Building", + "building_stats": "Building Statistics", + "built": "Built", + "cancelled": "Cancelled", + "captured": "Captured", + "count": "Count", + "destroyed": "Destroyed", + "gold": "Gold", + "hits": "Hits", + "landed": "Landed", + "launched": "Launched", + "lost": "Lost", + "nuke_stats": "Nuke Statistics", + "player_metrics": "Player Metrics", + "received": "Received", + "sent": "Sent", + "ship_arrivals": "Ship Arrivals", + "ship_type": "Ship Type", + "steal": "Steal", + "trade": "Trade", + "unit": { + "abomb": "Atom Bomb", + "city": "City", + "defp": "Defense Post", + "fact": "Factory", + "hbomb": "Hydrogen Bomb", + "mirv": "MIRV", + "mirvw": "MIRV Warhead", + "port": "Port", + "saml": "SAM Launcher", + "silo": "Missile Silo", + "trade": "Trade Ship", + "trans": "Transport Ship", + "wshp": "Warship" + }, + "war": "War", + "weapon": "Weapon", + "workers": "Workers" + }, + "player_stats_tree": { + "mode": "Mode", + "no_stats": "No stats recorded for this selection.", + "private": "Private", + "public": "Public", + "ranked": "Ranked", + "ranked_1v1": "1v1", + "solo": "Solo", + "stats_games_played": "Games Played", + "stats_losses": "Losses", + "stats_wins": "Wins", + "stats_wlr": "Win:Loss Ratio" + }, + "player_type": { + "bot": "Tribe", + "nation": "Nation", + "player": "Player" + }, + "private_lobby": { + "disabled_units": "Disabled Units", + "enter_id": "Enter Lobby ID", + "error": "An error occurred. Please try again or contact support.", + "game_length": "Game length", + "host_cheats": "Host Cheats", + "join_lobby": "Join Lobby", + "joined_waiting": "Lobby joined! Waiting for host to start...", + "not_found": "Lobby not found. Please check the ID and try again.", + "pvp_immunity": "PVP immunity duration", + "starting_gold": "Starting Gold", + "title": "Join Private Lobby", + "version_mismatch": "This game was created with a different version. Cannot join." }, "public_game_modifier": { - "random_spawn": "Random Spawn", "compact_map": "Compact Map", "crowded": "Crowded", - "hard_nations": "Hard Nations", - "starting_gold": "{amount}M Starting Gold", - "starting_gold_label": "Starting Gold", - "gold_multiplier": "x{amount} Gold Multiplier", "disable_alliances": "Alliances Disabled", "disable_alliances_label": "Alliances", - "ports_disabled": "Ports Disabled", - "ports_disabled_label": "Ports", + "gold_multiplier": "x{amount} Gold Multiplier", + "hard_nations": "Hard Nations", "nukes_disabled": "Nukes Disabled", "nukes_disabled_label": "Nukes", - "sams_disabled": "SAMs Disabled", - "sams_disabled_label": "SAMs", "peace_time": "4min Peace", "peace_time_label": "PVP Immunity", + "ports_disabled": "Ports Disabled", + "ports_disabled_label": "Ports", + "random_spawn": "Random Spawn", + "sams_disabled": "SAMs Disabled", + "sams_disabled_label": "SAMs", + "starting_gold": "{amount}M Starting Gold", + "starting_gold_label": "Starting Gold", "water_nukes": "Water Nukes", "water_nukes_label": "Water Nukes" }, + "public_lobby": { + "connecting": "Connecting to lobby...", + "join_timeout": "You didn't enter the game in time.", + "players_per_team": "of {num}", + "started": "Started", + "starting_game": "Starting…", + "starting_in": "Starting in {time}", + "status": "Status", + "teams": "{num} teams", + "teams_hvn": "Humans vs Nations", + "teams_hvn_detailed": "{num} Humans vs {num} Nations", + "title": "Waiting for Game Start...", + "waiting_for_players": "Waiting for players" + }, + "radial_menu": { + "delete_unit_description": "Click to delete the nearest unit", + "delete_unit_title": "Delete Unit" + }, + "relation": { + "default": "Default", + "distrustful": "Distrustful", + "friendly": "Friendly", + "hostile": "Hostile", + "neutral": "Neutral" + }, + "replay_panel": { + "fastest_game_speed": "Max", + "game_speed": "Game speed", + "replay_speed": "Replay speed" + }, "select_lang": { "title": "Select Language" }, - "unit_type": { - "boat": "Boat", - "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": "Settings", - "tab_basic": "Basic Settings", - "tab_keybinds": "Keybinds", - "keybinds_hint": "Click a key to rebind it. You can assign a single key or Shift + key combination.", - "dark_mode_label": "Dark Mode", - "dark_mode_desc": "Toggle the site’s appearance between light and dark themes", - "colorblind_label": "Colorblind Mode", - "colorblind_desc": "Use colorblind-friendly territory and border colors", - "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 or attacked over land.", - "help_messages_label": "Help Messages", - "help_messages_desc": "Show contextual tips and warnings during gameplay, such as army limit warnings and general gameplay advice.", - "special_effects_label": "Special effects", - "special_effects_desc": "Toggle special effects. Deactivate to improve performances", - "cursor_cost_label_label": "Cursor Build Cost", - "cursor_cost_label_desc": "Show a cost pill under the build cursor icon", - "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", - "toggle_visibility": "Toggle Visibility", - "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%)", - "territory_patterns_label": "Territory Skins", - "territory_patterns_desc": "Choose whether to display territory skin designs in game", - "coordinate_grid_label": "Coordinate Grid", - "coordinate_grid_desc": "Toggle the alphanumeric grid overlay", - "attacking_troops_overlay_label": "Attacking Troops Overlay", - "attacking_troops_overlay_desc": "Show attacker vs defender troop counts on active front lines.", - "go_to_player_label": "Go to player on start", - "go_to_player_desc": "Toggle zooming in on the player in the beginning of a 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.", - "render_debug_gui": "Render Debug GUI", - "render_debug_gui_desc": "Toggle the renderer tuning panel", - "development_only": "Development Only", - "graphics_settings_label": "Graphics Settings", - "graphics_settings_desc": "Adjust how the map looks", - "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)", - "press_a_key": "Press a key", - "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.", - "menu_shortcuts": "Menu Shortcuts", - "build_menu_modifier": "Build Menu Modifier", - "build_menu_modifier_desc": "Hold this key while clicking to open the build menu.", - "emoji_menu_modifier": "Emoji Menu Modifier", - "emoji_menu_modifier_desc": "Hold this key while clicking to open the emoji menu.", - "pause_game": "Pause", - "pause_game_desc": "Pause or resume the game (single player and custom games for host).", - "game_speed_up": "Game Speed Up", - "game_speed_up_desc": "Cycle to next game speed (0.5, 1, 2, max). Single player only.", - "game_speed_down": "Game Speed Down", - "game_speed_down_desc": "Cycle to previous game speed. Single player only.", - "attack_ratio_controls": "Attack Ratio Controls", - "attack_ratio_up": "Increase Attack Ratio", - "attack_ratio_up_desc": "Increase attack ratio by {amount}%", - "attack_ratio_down": "Decrease Attack Ratio", - "attack_ratio_down_desc": "Decrease attack ratio by {amount}%", - "attack_ratio_increment_label": "Attack Ratio Keybind Increment", - "attack_ratio_increment_desc": "How much the attack ratio keybinds change per press/scroll.", - "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.", - "retaliate_attack": "Retaliate", - "retaliate_attack_desc": "Send a retaliation attack to blunt/negate the force of the most recent active attacker. Only available when you are being attacked.", - "ally_keybinds": "Ally Keybinds", - "request_alliance": "Request Alliance", - "request_alliance_desc": "Send an alliance request to the player whose tile is under your cursor.", - "break_alliance": "Break Alliance (Betray)", - "break_alliance_desc": "Break alliance with the player whose tile is under your cursor.", - "swap_direction": "Swap Rocket Direction", - "swap_direction_desc": "Toggle rocket launch direction (up/down).", - "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", - "keybind_conflict_error": "The key {key} is already bound to another action." - }, - "graphics_setting": { - "title": "Graphics Settings", - "section_name_labels": "Name Labels", - "name_scale_label": "Name Scale", - "name_cull_label": "Minimum name size", - "name_cull_desc": "Hide names smaller than this size", - "hover_fade_label": "Name opacity under cursor", - "hover_fade_desc": "How visible names are while your cursor is over them (1 to disable fading)", - "hover_glow_width_label": "Hover glow size", - "hover_glow_width_desc": "How far the white glow extends behind the hovered player's name", - "hover_glow_alpha_label": "Hover glow strength", - "hover_glow_alpha_desc": "How bright the white glow behind the hovered player's name is (0 to disable)", - "colored_names_label": "Name color", - "colored_names_desc": "Show player names in their player color or in black", - "colored": "Colored", - "black": "Black", - "section_structure_icons": "Structure Icons", - "section_accessibility": "Accessibility", - "classic_icons_label": "Classic icons", - "classic_icons_desc": "Lighter outline with near-black interior", - "section_map": "Map", - "highlight_fill_label": "Territory highlight", - "highlight_fill_desc": "How strongly territory brightens on hover (0 to disable)", - "highlight_brighten_label": "Border highlight amount", - "highlight_brighten_desc": "How strongly the border brightens on hover (0 to disable)", - "highlight_thicken_label": "Border highlight thickness", - "highlight_thicken_desc": "How much the border thickens on hover", - "territory_sat_label": "Territory saturation", - "territory_sat_desc": "How vivid the territory fill colors are (lower mutes them)", - "territory_alpha_label": "Territory opacity", - "territory_alpha_desc": "How opaque the territory fill is (lower lets terrain show through)", - "coordinate_grid_opacity_label": "Coordinate grid opacity", - "coordinate_grid_opacity_desc": "How opaque the coordinate grid is (lower lets more things show through)", - "rail_distance_label": "Train track draw distance", - "rail_distance_desc": "How far zoomed out train tracks remain visible", - "rail_thickness_label": "Train track thickness", - "rail_thickness_desc": "How wide train tracks are drawn", - "section_effects": "Effects", - "reset_label": "Reset to defaults", - "reset_desc": "Clear all graphics overrides" - }, - "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]!", - "stop_trading_all": "Please stop trading with all!" - } - }, - "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" - }, - "warship_shift_hint": "Hold Shift and drag to select multiple warships at once", - "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!", - "nation_won": "Nation {nation} has won!", - "exit": "Exit Game", - "keep": "Keep Playing", - "spectate": "Spectate", - "requeue": "Play Again", - "wishlist": "Wishlist on Steam!", - "join_discord": "Join Our Discord Community!", - "discord_description": "Connect with players, discover new features, and win prizes!", - "join_server": "Join Server", - "youtube_tutorial": "Need some help?" - }, - "leaderboard": { - "player": "Player", - "team": "Team", - "owned": "Owned", - "gold": "Gold", - "maxtroops": "Max troops", - "launchers": "Launchers", - "sams": "SAMs", - "warships": "Warships", - "cities": "Cities", - "show_control": "Show Control", - "show_units": "Show Units" - }, - "events_display": { - "retreating": "retreating", - "alliance_request_status": "{name} {status} your alliance request", - "alliance_accepted": "accepted", - "alliance_rejected": "rejected", - "alliance_nukes_destroyed_outgoing": "{count, plural, one {# nuke launched toward {name} was destroyed due to the alliance} other {# nukes launched toward {name} were destroyed due to the alliance}}", - "alliance_nukes_destroyed_incoming": "{count, plural, one {# nuke launched by {name} was destroyed due to the alliance} other {# nukes launched by {name} were destroyed due to the alliance}}", - "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", - "atom_bomb_detonated": "{name} - atom bomb detonated", - "hydrogen_bomb_detonated": "{name} - hydrogen bomb detonated", - "attack_request": "{name} requests you attack {target}", - "sent_emoji": "Sent {name}: {emoji}", - "renew_alliance": "Request to renew", - "request_alliance": "{name} requests an alliance!", - "alliance_request_sent": "Alliance request sent to {name}.", - "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", - "attack_cancelled_retreat": "Attack cancelled, {troops} soldiers killed during retreat", - "received_gold_from_captured_ship": "Received {gold} gold from ship captured from {name}", - "received_gold_from_conquest": "Conquered {name}, received {gold} gold", - "conquered_no_gold": "Conquered {name} (didn't play, no gold awarded)", - "missile_intercepted": "Missile intercepted {unit}", - "mirv_warheads_intercepted": "{count, plural, one {{count} MIRV warhead intercepted} other {{count} MIRV warheads intercepted}}", - "sent_troops_to_player": "Sent {troops} troops to {name}", - "received_troops_from_player": "Received {troops} troops from {name}", - "sent_gold_to_player": "Sent {gold} gold to {name}", - "received_gold_from_player": "Received {gold} gold from {name}", - "unit_destroyed": "Your {unit} was destroyed", - "no_boats_available": "No boats available, max {max}" - }, - "player_type": { - "player": "Player", - "nation": "Nation", - "bot": "Tribe" - }, - "relation": { - "hostile": "Hostile", - "distrustful": "Distrustful", - "neutral": "Neutral", - "friendly": "Friendly", - "default": "Default" - }, - "player_panel": { - "gold": "Gold", - "troops": "Troops", - "betrayals": "Betrayals", - "traitor": "Traitor", - "trading": "Trading", - "active": "Active", - "stopped": "Stopped", - "alliance_time_remaining": "Alliance Expires In", - "start_trade": "Start Trading", - "stop_trade": "Stop Trading", - "stop_trade_all": "Stop Trading with All", - "start_trade_all": "Start Trading with All", - "alliances": "Alliances", - "chat": "Chat", - "target": "Target", - "break_alliance": "Break Alliance", - "send_alliance": "Send Alliance", - "send_troops": "Send Troops", - "send_gold": "Send Gold", - "emotes": "Emojis", - "moderation": "Moderation", - "kick": "Kick player", - "kicked": "Already kicked", - "kick_confirm": "Kick {name}?\n\nThey won't be able to rejoin this game.", - "arc_up": "Upward arc", - "arc_down": "Downward arc", - "flip_rocket_trajectory": "Flip rocket trajectory" - }, - "kick_reason": { - "duplicate_session": "Kicked from game (you may have been playing on another tab)", - "lobby_creator": "Kicked by lobby creator", - "admin": "Kicked by an admin", - "host_left": "The host has left the lobby." + "send_gold_modal": { + "aria_slider": "Amount slider", + "available_tooltip": "Your current available gold", + "slider_tooltip": "{percent}% • {amount}", + "title_with_name": "Send Gold to {name}" }, "send_troops_modal": { - "title_with_name": "Send Troops to {name}", - "available_tooltip": "Your current available troops", - "slider_tooltip": "{percent}% • {amount}", "aria_slider": "Troops slider", - "capacity_note": "Receiver can accept only {amount} right now." + "available_tooltip": "Your current available troops", + "capacity_note": "Receiver can accept only {amount} right now.", + "slider_tooltip": "{percent}% • {amount}", + "title_with_name": "Send Troops to {name}" }, - "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:", - "tps": "TPS:", - "tps_avg_60s": "Avg:", - "tick_exec": "Tick Exec:", - "max_label": "max:", - "tick_delay": "Tick Delay:", - "layers_header": "Render Layers", - "render_layers_table_header": "avg / max | tick avg", - "render_layers_summary": "Last tick: {frames} frames, {ms}ms", - "tick_layers_header": "Tick Layers", - "tick_layers_table_header": "avg / max", - "tick_layers_summary": "Last tick: {count} layers, {ms}ms", - "expand": "Expand", - "collapse": "Collapse" - }, - "heads_up_message": { - "choose_spawn": "Choose a starting location", - "random_spawn": "Random spawn is enabled. Selecting starting location for you...", - "ffa_collusion": "Reminder: teaming up before the game is not allowed in FFA", - "dont_show_again": "Don't show again", - "singleplayer_game_paused": "Game paused", - "multiplayer_game_paused": "Game paused by Lobby Creator", - "pvp_immunity_active": "PVP immunity active for {seconds}s", - "catching_up": "Catching up..." + "single_modal": { + "bots": "Tribes: ", + "bots_disabled": "Disabled", + "compact_map": "Compact Map", + "disable_alliances": "Disable alliances", + "enables_title": "Disable Units", + "gold_multiplier": "Gold multiplier", + "gold_multiplier_placeholder": "2.0x", + "infinite_gold": "Infinite gold", + "infinite_troops": "Infinite troops", + "instant_build": "Instant build", + "max_timer": "Game length (minutes)", + "max_timer_invalid": "Please enter a valid max timer value (1-120 minutes)", + "max_timer_placeholder": "Mins", + "nations": "Nations: ", + "nations_disabled": "Disabled", + "options_changed_no_achievements": "Custom settings – achievements disabled", + "options_title": "Options", + "random_spawn": "Random spawn", + "sign_in_for_achievements": "Sign in for achievements", + "start": "Start Game", + "starting_gold": "Starting Gold (Millions)", + "starting_gold_placeholder": "5", + "toggle_achievements": "Toggle achievements", + "water_nukes": "Water nukes" }, "store": { - "title": "Store", - "patterns": "Skins", - "flags": "Flags", - "packs": "Packs", - "subscriptions": "Subscriptions", - "no_flags": "No flags available. Check back later for new items.", - "no_skins": "No skins available. Check back later for new items.", - "no_packs": "No packs available. Check back later for new items.", - "no_subscriptions": "No subscriptions available. Check back later for new items.", "already_subscribed": "Already subscribed.", - "current_plan": "Current Plan", - "subscribe_button": "Subscribe", - "switch_button": "Switch", - "price_per_month": "/mo", - "confirm_upgrade": "Upgrade to {tier}? You'll be charged the prorated difference now.", - "confirm_downgrade": "Downgrade to {tier}? You'll get account credit for the unused portion of your current plan.", - "change_tier_success": "Switched to {tier}.", "change_tier_failed": "Couldn't update your subscription. Please try again.", - "currency_pack_purchase_success": "Currency pack purchase successful!", - "subscription_purchase_success": "Subscription activated!", + "change_tier_success": "Switched to {tier}.", "checkout_failed": "Failed to create checkout session.", + "confirm_downgrade": "Downgrade to {tier}? You'll get account credit for the unused portion of your current plan.", + "confirm_upgrade": "Upgrade to {tier}? You'll be charged the prorated difference now.", + "currency_pack_purchase_success": "Currency pack purchase successful!", + "current_plan": "Current Plan", + "flags": "Flags", "login_required": "You must be logged in to purchase with currency.", + "no_flags": "No flags available. Check back later for new items.", + "no_packs": "No packs available. Check back later for new items.", + "no_skins": "No skins available. Check back later for new items.", + "no_subscriptions": "No subscriptions available. Check back later for new items.", "not_enough_currency": "Not enough currency for this purchase.", + "packs": "Packs", + "patterns": "Skins", + "price_per_month": "/mo", "purchase_failed": "Purchase failed. Please try again.", - "purchase_success": "Purchase succeeded: {name}" + "purchase_success": "Purchase succeeded: {name}", + "subscribe_button": "Subscribe", + "subscription_purchase_success": "Subscription activated!", + "subscriptions": "Subscriptions", + "switch_button": "Switch", + "title": "Store" + }, + "team_colors": { + "blue": "Blue", + "bot": "Tribes", + "green": "Green", + "humans": "Humans", + "nations": "Nations", + "orange": "Orange", + "purple": "Purple", + "red": "Red", + "teal": "Teal", + "yellow": "Yellow" }, "territory_patterns": { - "title": "Skins", - "purchase": "Purchase", "pattern": { "default": "Default" }, + "purchase": "Purchase", + "search": "Search...", "select_skin": "Select Skin", "selected": "selected", - "search": "Search..." + "title": "Skins" }, - "cosmetics": { - "artist_label": "Artist:", - "color_label": "Color:", - "common": "Common", - "uncommon": "Uncommon", - "rare": "Rare", - "epic": "Epic", - "legendary": "Legendary", - "adfree": "ad-free for life!", - "hard": "Plutonium", - "soft": "Caps", - "per_day": "/day", - "free": "+{numFree} BONUS!" + "token_login_modal": { + "logging_in": "Logging in...", + "success": "Successfully logged in as {email}!", + "title": "Logging in..." }, - "flag_input": { - "title": "Select Flag", - "button_title": "Pick a flag!", - "search_flag": "Search..." + "troubleshooting": { + "battery": "Battery", + "battery_level": "Battery Level", + "browser": "Browser", + "canvas_2d_no_gpu": "Canvas 2D (no GPU)", + "charging": "Charging", + "chromium_tip": "OpenFront runs best on Chromium-based browsers.", + "copied_to_clipboard": "Info copied to the clipboard! Feel free to share it on our Discord if you need help.", + "device_pixel_ratio": "Device Pixel Ratio", + "environment": "Environment", + "gpu": "GPU", + "gpu_tip": "Verify that this is the dedicated GPU, if one is available.", + "hardware_acceleration_tip": "Make sure hardware acceleration is enabled in your browser settings for optimal performance.", + "high_precision_shaders": "High Precision Shaders", + "max_texture_size": "Max Texture Size", + "no": "No", + "os": "OS", + "platform": "Platform", + "power": "Power", + "power_saving_tip": "Make sure that your browser is not set to power saving mode.", + "renderer": "Renderer", + "rendering": "Rendering", + "software_rendering": "Software rendering", + "title": "Troubleshooting", + "unavailable": "Unavailable", + "unknown": "Unknown", + "yes": "Yes" }, - "radial_menu": { - "delete_unit_title": "Delete Unit", - "delete_unit_description": "Click to delete the nearest unit" + "unit_type": { + "atom_bomb": "Atom Bomb", + "boat": "Boat", + "city": "City", + "defense_post": "Defense Post", + "factory": "Factory", + "hydrogen_bomb": "Hydrogen Bomb", + "mirv": "MIRV", + "missile_silo": "Missile Silo", + "port": "Port", + "sam_launcher": "SAM Launcher", + "warship": "Warship" }, - "discord_user_header": { - "avatar_alt": "Avatar" + "user_setting": { + "alert_frame_desc": "Toggle the alert frame. When enabled, the frame will be displayed when you are betrayed or attacked over land.", + "alert_frame_label": "Alert Frame", + "ally_keybinds": "Ally Keybinds", + "anonymous_names_desc": "Hide real player names with random ones on your screen.", + "anonymous_names_label": "Hidden Names", + "attack_keybinds": "Attack Keybinds", + "attack_ratio_controls": "Attack Ratio Controls", + "attack_ratio_desc": "What percentage of your troops to send in an attack (1–100%)", + "attack_ratio_down": "Decrease Attack Ratio", + "attack_ratio_down_desc": "Decrease attack ratio by {amount}%", + "attack_ratio_increment_desc": "How much the attack ratio keybinds change per press/scroll.", + "attack_ratio_increment_label": "Attack Ratio Keybind Increment", + "attack_ratio_label": "Attack Ratio", + "attack_ratio_up": "Increase Attack Ratio", + "attack_ratio_up_desc": "Increase attack ratio by {amount}%", + "attacking_troops_overlay_desc": "Show attacker vs defender troop counts on active front lines.", + "attacking_troops_overlay_label": "Attacking Troops Overlay", + "background_music_volume": "Background Music Volume", + "boat_attack": "Boat Attack", + "boat_attack_desc": "Send a boat attack to the tile under your cursor.", + "break_alliance": "Break Alliance (Betray)", + "break_alliance_desc": "Break alliance with the player whose tile is under your cursor.", + "build_atom_bomb": "Build Atom Bomb", + "build_atom_bomb_desc": "Build an Atom Bomb under your cursor.", + "build_city": "Build City", + "build_city_desc": "Build a City under your cursor.", + "build_controls": "Build Controls", + "build_defense_post": "Build Defense Post", + "build_defense_post_desc": "Build a Defense Post under your cursor.", + "build_factory": "Build Factory", + "build_factory_desc": "Build a Factory under your cursor.", + "build_hydrogen_bomb": "Build Hydrogen Bomb", + "build_hydrogen_bomb_desc": "Build a Hydrogen Bomb under your cursor.", + "build_menu_modifier": "Build Menu Modifier", + "build_menu_modifier_desc": "Hold this key while clicking to open the build menu.", + "build_mirv": "Build MIRV", + "build_mirv_desc": "Build a MIRV under your cursor.", + "build_missile_silo": "Build Missile Silo", + "build_missile_silo_desc": "Build a Missile Silo under your cursor.", + "build_port": "Build Port", + "build_port_desc": "Build a Port under your cursor.", + "build_sam_launcher": "Build SAM Launcher", + "build_sam_launcher_desc": "Build a SAM Launcher under your cursor.", + "build_warship": "Build Warship", + "build_warship_desc": "Build a Warship under your cursor.", + "camera_movement": "Camera Movement", + "center_camera": "Center Camera", + "center_camera_desc": "Center camera on player", + "colorblind_desc": "Use colorblind-friendly territory and border colors", + "colorblind_label": "Colorblind Mode", + "coordinate_grid_desc": "Toggle the alphanumeric grid overlay", + "coordinate_grid_label": "Coordinate Grid", + "cursor_cost_label_desc": "Show a cost pill under the build cursor icon", + "cursor_cost_label_label": "Cursor Build Cost", + "dark_mode_desc": "Toggle the site’s appearance between light and dark themes", + "dark_mode_label": "Dark Mode", + "development_only": "Development Only", + "easter_bug_count_desc": "How many bugs you're okay with (0–1000, emotionally)", + "easter_bug_count_label": "Bug Count", + "easter_writing_speed_desc": "Adjust how fast you pretend to code (x1–x100)", + "easter_writing_speed_label": "Writing Speed Multiplier", + "emoji_menu_modifier": "Emoji Menu Modifier", + "emoji_menu_modifier_desc": "Hold this key while clicking to open the emoji menu.", + "emojis_desc": "Toggle whether emojis are shown in game", + "emojis_label": "Emojis", + "exit_game_info": "Return to main menu", + "exit_game_label": "Exit Game", + "game_speed_down": "Game Speed Down", + "game_speed_down_desc": "Cycle to previous game speed. Single player only.", + "game_speed_up": "Game Speed Up", + "game_speed_up_desc": "Cycle to next game speed (0.5, 1, 2, max). Single player only.", + "go_to_player_desc": "Toggle zooming in on the player in the beginning of a game.", + "go_to_player_label": "Go to player on start", + "graphics_settings_desc": "Adjust how the map looks", + "graphics_settings_label": "Graphics Settings", + "ground_attack": "Ground Attack", + "ground_attack_desc": "Send a ground attack to the tile under your cursor.", + "help_messages_desc": "Show contextual tips and warnings during gameplay, such as army limit warnings and general gameplay advice.", + "help_messages_label": "Help Messages", + "keybind_conflict_error": "The key {key} is already bound to another action.", + "keybinds_hint": "Click a key to rebind it. You can assign a single key or Shift + key combination.", + "left_click_desc": "When ON, left-click opens menu and sword button attacks. When OFF, left-click attacks directly.", + "left_click_label": "Left Click to Open Menu", + "left_click_menu": "Left Click Menu", + "lobby_id_visibility_desc": "Hide Lobby ID in private lobby creation", + "lobby_id_visibility_label": "Hidden Lobby IDs", + "menu_shortcuts": "Menu Shortcuts", + "move_down": "Move Camera Down", + "move_down_desc": "Move the camera downward", + "move_left": "Move Camera Left", + "move_left_desc": "Move the camera to the left", + "move_right": "Move Camera Right", + "move_right_desc": "Move the camera to the right", + "move_up": "Move Camera Up", + "move_up_desc": "Move the camera upward", + "off": "Off", + "on": "On", + "pause_game": "Pause", + "pause_game_desc": "Pause or resume the game (single player and custom games for host).", + "performance_overlay_desc": "Toggle the performance overlay. When enabled, the performance overlay will be displayed. Press shift-D during game to toggle.", + "performance_overlay_label": "Performance Overlay", + "press_a_key": "Press a key", + "render_debug_gui": "Render Debug GUI", + "render_debug_gui_desc": "Toggle the renderer tuning panel", + "request_alliance": "Request Alliance", + "request_alliance_desc": "Send an alliance request to the player whose tile is under your cursor.", + "reset": "Reset", + "retaliate_attack": "Retaliate", + "retaliate_attack_desc": "Send a retaliation attack to blunt/negate the force of the most recent active attacker. Only available when you are being attacked.", + "sound_effects_volume": "Sound Effects Volume", + "special_effects_desc": "Toggle special effects. Deactivate to improve performances", + "special_effects_label": "Special effects", + "swap_direction": "Swap Rocket Direction", + "swap_direction_desc": "Toggle rocket launch direction (up/down).", + "tab_basic": "Basic Settings", + "tab_keybinds": "Keybinds", + "territory_patterns_desc": "Choose whether to display territory skin designs in game", + "territory_patterns_label": "Territory Skins", + "title": "Settings", + "toggle_terrain": "Toggle Terrain", + "toggle_view": "Toggle View", + "toggle_view_desc": "Alternate view (terrain/countries)", + "toggle_visibility": "Toggle Visibility", + "unbind": "Unbind", + "view_options": "View Options", + "zoom_controls": "Zoom Controls", + "zoom_in": "Zoom In", + "zoom_in_desc": "Zoom in the map", + "zoom_out": "Zoom Out", + "zoom_out_desc": "Zoom out the map" }, - "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" - } + "username": { + "enter_username": "Enter your username", + "invalid_chars": "Username can only contain letters, numbers, spaces, and underscores.", + "not_string": "Username must be a string.", + "tag": "TAG", + "tag_invalid_chars": "Clan tag can only contain letters and numbers.", + "tag_not_member": "Join the {tag} clan before using its tag. Click this message to join it.", + "tag_too_long": "Clan tag cannot exceed 5 characters.", + "tag_too_short": "Clan tag must be 2-5 alphanumeric characters.", + "too_long": "Username must not exceed {max} characters.", + "too_short": "Username must be at least {min} characters long." }, - "game_list": { - "recent_games": "Recent Games", - "game_id": "Game ID", - "mode": "Mode", - "replay": "Replay", - "details": "Details", - "ranking": "Ranking", - "map": "Map", - "difficulty": "Difficulty", - "type": "Type" - }, - "player_stats_tree": { - "public": "Public", - "private": "Private", - "solo": "Solo", - "ranked": "Ranked", - "ranked_1v1": "1v1", - "mode": "Mode", - "stats_wins": "Wins", - "stats_losses": "Losses", - "stats_wlr": "Win:Loss Ratio", - "stats_games_played": "Games Played", - "no_stats": "No stats recorded for this selection." - }, - "matchmaking_button": { - "play_ranked": "1v1 Ranked Matchmaking", - "description": "(ALPHA)", - "login_required": "Login to play ranked!", - "must_login": "You must be logged in to play ranked matchmaking." - }, - "news_box": { - "tournament": "TOURNAMENT", - "tutorial": "TUTORIAL", - "news": "NEWS", - "warning": "WARNING", - "dismiss": "Dismiss", - "go_to_item": "Go to item {num}", - "firefox_warning": "OpenFront.io doesn't perform well with [Firefox-based browsers](https://simple.wikipedia.org/wiki/Web_browsers_based_on_Firefox). We recommend you to use a [Chromium-based browser](https://en.wikipedia.org/wiki/Chromium_(web_browser)#Browsers_based_on_Chromium) for best performance." - }, - "control_panel": { - "army_limit_warning": "You're near your army limit! Consider sending troops to teammates.", - "traitor_neighbor_info": "You can betray traitors without becoming a traitor yourself.", - "allied_afk_neighbor_info": "You can attack disconnected players even if you are allied with them.", - "teammate_afk_neighbor_info": "You can attack disconnected teammates.", - "low_troops_warning": "You are very low on troops - You should always keep some troops for defense." - }, - "ios_banner": { - "text": "For fullscreen, add OpenFront to your Home Screen", - "how": "How", - "later": "Later", - "never": "Never", - "modal_title": "Fullscreen on iOS", - "modal_desc": "Your browser doesn't support fullscreen, but you can add OpenFront to your Home Screen for an immersive experience:", - "step_share": "Tap the Share button in your browser", - "step_scroll_and_tap": "Scroll down and tap", - "step_add_to_home_label": "Add to Home Screen", - "step_open": "Open from your Home Screen — launches fullscreen without the address bar", - "got_it": "Got it" - }, - "fullscreen": { - "enter": "Enter fullscreen", - "exit": "Exit fullscreen" + "win_modal": { + "died": "You died", + "discord_description": "Connect with players, discover new features, and win prizes!", + "exit": "Exit Game", + "join_discord": "Join Our Discord Community!", + "join_server": "Join Server", + "keep": "Keep Playing", + "nation_won": "Nation {nation} has won!", + "other_team": "{team} team has won!", + "other_won": "{player} has won!", + "requeue": "Play Again", + "spectate": "Spectate", + "support_openfront": "Support OpenFront!", + "territory_pattern": "Purchase a territory skin to go ad-free!", + "wishlist": "Wishlist on Steam!", + "you_won": "You Won!", + "your_team": "Your team won!", + "youtube_tutorial": "Need some help?" } } diff --git a/tests/EnJsonSorted.test.ts b/tests/EnJsonSorted.test.ts new file mode 100644 index 000000000..2831a6314 --- /dev/null +++ b/tests/EnJsonSorted.test.ts @@ -0,0 +1,40 @@ +import fs from "fs"; +import path from "path"; + +const EN_JSON = path.join(__dirname, "..", "resources", "lang", "en.json"); + +/** Collect every object whose keys are out of order, as dotted paths. */ +function findUnsortedObjects(value: unknown, objectPath: string): string[] { + if (typeof value !== "object" || value === null || Array.isArray(value)) { + return []; + } + const errors: string[] = []; + const keys = Object.keys(value); + for (let i = 1; i < keys.length; i++) { + if (keys[i - 1] > keys[i]) { + errors.push( + `${objectPath}: "${keys[i]}" should come before "${keys[i - 1]}"`, + ); + } + } + for (const [key, child] of Object.entries(value)) { + errors.push(...findUnsortedObjects(child, `${objectPath}.${key}`)); + } + return errors; +} + +// en.json keys are kept alphabetically sorted at every level. This keeps the +// file deterministic, gives translation PRs stable insertion points, and lets +// the map-generator rewrite it with a plain JSON round-trip (Go's +// encoding/json sorts object keys on marshal). +// Other language files are managed by Crowdin and are not checked. +test("en.json keys are alphabetically sorted at every level", () => { + const content = JSON.parse(fs.readFileSync(EN_JSON, "utf8")); + const errors = findUnsortedObjects(content, "en.json"); + if (errors.length > 0) { + throw new Error( + "en.json keys are out of order (sort with `jq -S . resources/lang/en.json` + prettier):\n" + + errors.join("\n"), + ); + } +});