From 84eb999143bc099a6e96574e15060c2eb57e9e13 Mon Sep 17 00:00:00 2001
From: kaedr <kaedraar@gmail.com>
Date: Sat, 16 Oct 2021 20:15:32 -0400
Subject: [PATCH] Added localization for server error message display on client

---
 assets/voxygen/i18n/en/main.ron |  8 +++++++-
 voxygen/src/menu/main/mod.rs    | 30 ++++++++++++++++++++++++++++--
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/assets/voxygen/i18n/en/main.ron b/assets/voxygen/i18n/en/main.ron
index 79c7f4ad90..48209ec675 100644
--- a/assets/voxygen/i18n/en/main.ron
+++ b/assets/voxygen/i18n/en/main.ron
@@ -64,7 +64,13 @@ https://veloren.net/account/."#,
         "main.login.username_bad_characters": "Username contains invalid characters! (Only alphanumeric, '_' and '-' are allowed)",
         "main.login.username_too_long": "Username is too long! Max length is: {max_len}",
         "main.servers.select_server": "Select a server",
-        "main.servers.singleplayer_error": "Failed to connect to internal server.",
+        "main.servers.singleplayer_error": "Failed to connect to internal server: {sp_error}",
+        "main.servers.network_error": "Server network/socket error: {raw_error}",
+        "main.servers.participant_error": "Participant disconnect/protocol error: {raw_error}",
+        "main.servers.stream_error": "Client connection/compression/(de)serialization error: {raw_error}",
+        "main.servers.database_error": "Server database error: {raw_error}",
+        "main.servers.persistence_error": "Server persistence error (Probably Asset/Character Data related): {raw_error}",
+        "main.servers.other_error": "Server general error: {raw_error}",
 
         // Credits screen
         "main.credits": "Credits",
diff --git a/voxygen/src/menu/main/mod.rs b/voxygen/src/menu/main/mod.rs
index e2bcc6b8ee..f01047eca7 100644
--- a/voxygen/src/menu/main/mod.rs
+++ b/voxygen/src/menu/main/mod.rs
@@ -113,17 +113,43 @@ impl PlayState for MainMenuState {
                         global_state.singleplayer = None;
                         self.init = InitState::None;
                         self.main_menu_ui.cancel_connection();
+                        let server_err = match e {
+                            server::Error::NetworkErr(e) => localized_strings
+                                .get("main.servers.network_error")
+                                .to_owned()
+                                .replace("{raw_error}", e.to_string().as_str()),
+                            server::Error::ParticipantErr(e) => localized_strings
+                                .get("main.servers.participant_error")
+                                .to_owned()
+                                .replace("{raw_error}", e.to_string().as_str()),
+                            server::Error::StreamErr(e) => localized_strings
+                                .get("main.servers.stream_error")
+                                .to_owned()
+                                .replace("{raw_error}", e.to_string().as_str()),
+                            server::Error::DatabaseErr(e) => localized_strings
+                                .get("main.servers.database_error")
+                                .to_owned()
+                                .replace("{raw_error}", e.to_string().as_str()),
+                            server::Error::PersistenceErr(e) => localized_strings
+                                .get("main.servers.persistence_error")
+                                .to_owned()
+                                .replace("{raw_error}", e.to_string().as_str()),
+                            server::Error::Other(e) => localized_strings
+                                .get("main.servers.other_error")
+                                .to_owned()
+                                .replace("{raw_error}", e.to_string().as_str()),
+                        };
                         global_state.info_message = Some(
                             localized_strings
                                 .get("main.servers.singleplayer_error")
-                                .to_owned(),
+                                .to_owned()
+                                .replace("{sp_error}", server_err.as_str()),
                         );
                     },
                     Err(_) => (),
                 }
             }
         }
-
         // Handle window events.
         for event in events {
             // Pass all events to the ui first.