diff --git a/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs b/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs index 4c352fbac..ef928a8ac 100644 --- a/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/GUI/LoadingScreen.cs @@ -16,7 +16,7 @@ namespace Barotrauma private RenderTarget2D renderTarget; private Sprite languageSelectionCursor; - private ScalableFont languageSelectionFont; + private ScalableFont languageSelectionFont, languageSelectionFontCJK; private Video currSplashScreen; private DateTime videoStartTime; @@ -220,7 +220,13 @@ namespace Barotrauma { if (languageSelectionFont == null) { - languageSelectionFont = new ScalableFont("Content/Fonts/BebasNeue-Regular.otf", (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice); + languageSelectionFont = new ScalableFont("Content/Fonts/NotoSans/NotoSans-Bold.ttf", + (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice); + } + if (languageSelectionFontCJK == null) + { + languageSelectionFontCJK = new ScalableFont("Content/Fonts/NotoSans/NotoSansCJKsc-Bold.otf", + (uint)(30 * (GameMain.GraphicsHeight / 1080.0f)), graphicsDevice, dynamicLoading: true); } if (languageSelectionCursor == null) { @@ -231,13 +237,15 @@ namespace Barotrauma Vector2 textSpacing = new Vector2(0.0f, (GameMain.GraphicsHeight * 0.5f) / TextManager.AvailableLanguages.Count()); foreach (string language in TextManager.AvailableLanguages) { - Vector2 textSize = languageSelectionFont.MeasureString(language); + string localizedLanguageName = TextManager.GetTranslatedLanguageName(language); + var font = TextManager.IsCJK(localizedLanguageName) ? languageSelectionFontCJK : languageSelectionFont; + + Vector2 textSize = font.MeasureString(localizedLanguageName); bool hover = Math.Abs(PlayerInput.MousePosition.X - textPos.X) < textSize.X / 2 && Math.Abs(PlayerInput.MousePosition.Y - textPos.Y) < textSpacing.Y / 2; - //TODO: display the name of the language in the target language? - languageSelectionFont.DrawString(spriteBatch, language, textPos - textSize / 2, + font.DrawString(spriteBatch, localizedLanguageName, textPos - textSize / 2, hover ? Color.White : Color.White * 0.6f); if (hover && PlayerInput.LeftButtonClicked()) { @@ -247,12 +255,15 @@ namespace Barotrauma GameMain.Config.SetDefaultBindings(legacy: false); GameMain.Config.CheckBindings(useDefaults: true); WaitForLanguageSelection = false; + languageSelectionFont?.Dispose(); languageSelectionFont = null; + languageSelectionFontCJK?.Dispose(); languageSelectionFontCJK = null; + break; } textPos += textSpacing; } - languageSelectionCursor.Draw(spriteBatch, PlayerInput.LatestMousePosition); + languageSelectionCursor.Draw(spriteBatch, PlayerInput.LatestMousePosition, scale: 0.5f); } private void DrawSplashScreen(SpriteBatch spriteBatch, GraphicsDevice graphics) diff --git a/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs b/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs index 0a45900e2..c949e94fc 100644 --- a/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs +++ b/Barotrauma/BarotraumaClient/Source/Utils/ToolBox.cs @@ -111,7 +111,7 @@ namespace Barotrauma string currWord = ""; for (int i = 0; i < text.Length; i++) { - if (isCJK.IsMatch(text[i].ToString())) + if (TextManager.IsCJK(text[i].ToString())) { if (currWord.Length > 0) { @@ -200,24 +200,13 @@ namespace Barotrauma linePos = size.X + spaceSize.X; } - if (i < words.Count - 1 && !isCJK.IsMatch(words[i]) && !isCJK.IsMatch(words[i + 1])) + if (i < words.Count - 1 && !TextManager.IsCJK(words[i]) && !TextManager.IsCJK(words[i + 1])) { wrappedText.Append(" "); } } return wrappedText.ToString().Replace(" \n ", "\n"); - } - - static Regex isCJK = new Regex( - @"\p{IsHangulJamo}|" + - @"\p{IsCJKRadicalsSupplement}|" + - @"\p{IsCJKSymbolsandPunctuation}|" + - @"\p{IsEnclosedCJKLettersandMonths}|" + - @"\p{IsCJKCompatibility}|" + - @"\p{IsCJKUnifiedIdeographsExtensionA}|" + - @"\p{IsCJKUnifiedIdeographs}|" + - @"\p{IsHangulSyllables}|" + - @"\p{IsCJKCompatibilityForms}"); + } } } diff --git a/Barotrauma/BarotraumaShared/Source/GameSettings.cs b/Barotrauma/BarotraumaShared/Source/GameSettings.cs index 74714c289..3227f1413 100644 --- a/Barotrauma/BarotraumaShared/Source/GameSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/GameSettings.cs @@ -337,79 +337,6 @@ namespace Barotrauma keyMapping[(int)InputType.SelectNextCharacter] = new KeyOrMouse(Keys.Z); keyMapping[(int)InputType.SelectPreviousCharacter] = new KeyOrMouse(Keys.X); } - } - - public void CheckBindings(bool useDefaults) - { - foreach (InputType inputType in Enum.GetValues(typeof(InputType))) - { - var binding = keyMapping[(int)inputType]; - if (binding == null) - { - switch (inputType) - { - case InputType.Deselect: - if (useDefaults) - { - binding = new KeyOrMouse(1); - } - else - { - // Legacy support - var selectKey = keyMapping[(int)InputType.Select]; - if (selectKey != null && selectKey.Key != Keys.None) - { - binding = new KeyOrMouse(selectKey.Key); - } - } - break; - case InputType.Shoot: - if (useDefaults) - { - binding = new KeyOrMouse(0); - } - else - { - // Legacy support - var useKey = keyMapping[(int)InputType.Use]; - if (useKey != null && useKey.MouseButton.HasValue) - { - binding = new KeyOrMouse(useKey.MouseButton.Value); - } - } - break; - default: - break; - } - if (binding == null) - { - DebugConsole.ThrowError("Key binding for the input type \"" + inputType + " not set!"); - binding = new KeyOrMouse(Keys.D1); - } - keyMapping[(int)inputType] = binding; - } - } - } - - #region Load DefaultConfig - private void LoadDefaultConfig(bool setLanguage = true) - { - XDocument doc = XMLExtensions.TryLoadXml(savePath); - - if (setLanguage || string.IsNullOrEmpty(Language)) - { - Language = doc.Root.GetAttributeString("language", "English"); - } - - MasterServerUrl = doc.Root.GetAttributeString("masterserverurl", ""); - - AutoCheckUpdates = doc.Root.GetAttributeBool("autocheckupdates", true); - WasGameUpdated = doc.Root.GetAttributeBool("wasgameupdated", false); - - VerboseLogging = doc.Root.GetAttributeBool("verboselogging", false); - SaveDebugConsoleLogs = doc.Root.GetAttributeBool("savedebugconsolelogs", false); - - QuickStartSubmarineName = doc.Root.GetAttributeString("quickstartsub", ""); if (legacy) { @@ -962,19 +889,7 @@ namespace Barotrauma foreach (XElement subElement in doc.Root.Elements()) { - DebugConsole.ThrowError(TextManager.Get("ContentPackageNotFound").Replace("[packagepath]", missingPackagePath)); - } - foreach (ContentPackage incompatiblePackage in incompatiblePackages) - { - DebugConsole.ThrowError(TextManager.Get(incompatiblePackage.GameVersion <= new Version(0, 0, 0, 0) ? "IncompatibleContentPackageUnknownVersion" : "IncompatibleContentPackage") - .Replace("[packagename]", incompatiblePackage.Name) - .Replace("[packageversion]", incompatiblePackage.GameVersion.ToString()) - .Replace("[gameversion]", GameMain.Version.ToString())); - } - foreach (ContentPackage contentPackage in SelectedContentPackages) - { - bool packageOk = contentPackage.VerifyFiles(out List errorMessages); - if (!packageOk) + switch (subElement.Name.ToString().ToLowerInvariant()) { case "contentpackage": string path = System.IO.Path.GetFullPath(subElement.GetAttributeString("path", "")); @@ -1088,7 +1003,6 @@ namespace Barotrauma new XAttribute("autocheckupdates", AutoCheckUpdates), new XAttribute("musicvolume", musicVolume), new XAttribute("soundvolume", soundVolume), - new XAttribute("voicechatvolume", voiceChatVolume), new XAttribute("verboselogging", VerboseLogging), new XAttribute("savedebugconsolelogs", SaveDebugConsoleLogs), new XAttribute("enablesplashscreen", EnableSplashScreen), @@ -1115,6 +1029,7 @@ namespace Barotrauma gMode = new XElement("graphicsmode"); doc.Root.Add(gMode); } + if (GraphicsWidth == 0 || GraphicsHeight == 0) { gMode.ReplaceAttributes(new XAttribute("displaymode", windowMode)); diff --git a/Barotrauma/BarotraumaShared/Source/TextManager.cs b/Barotrauma/BarotraumaShared/Source/TextManager.cs index 00b59b288..60ff00a43 100644 --- a/Barotrauma/BarotraumaShared/Source/TextManager.cs +++ b/Barotrauma/BarotraumaShared/Source/TextManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace Barotrauma { @@ -42,6 +43,26 @@ namespace Barotrauma GetTextFilesRecursive(subDir, ref list); } } + + /// + /// Returns the name of the language in the respective language + /// + public static string GetTranslatedLanguageName(string language) + { + if (!textPacks.ContainsKey(language)) + { + return language; + } + + foreach (var textPack in textPacks[language]) + { + if (textPack.Language == language) + { + return textPack.TranslatedName; + } + } + return language; + } public static void LoadTextPacks(IEnumerable selectedContentPackages) { @@ -371,6 +392,25 @@ namespace Barotrauma .Replace("[Genderpronounreflexive]", Capitalize(Get("PronounReflexiveFemale"))); } } + + static Regex isCJK = new Regex( + @"\p{IsHangulJamo}|" + + @"\p{IsCJKRadicalsSupplement}|" + + @"\p{IsCJKSymbolsandPunctuation}|" + + @"\p{IsEnclosedCJKLettersandMonths}|" + + @"\p{IsCJKCompatibility}|" + + @"\p{IsCJKUnifiedIdeographsExtensionA}|" + + @"\p{IsCJKUnifiedIdeographs}|" + + @"\p{IsHangulSyllables}|" + + @"\p{IsCJKCompatibilityForms}"); + + /// + /// Does the string contain symbols from Chinese, Japanese or Korean languages + /// + public static bool IsCJK(string text) + { + return isCJK.IsMatch(text); + } #if DEBUG public static void CheckForDuplicates(string lang) diff --git a/Barotrauma/BarotraumaShared/Source/TextPack.cs b/Barotrauma/BarotraumaShared/Source/TextPack.cs index 18b0170d8..565b752da 100644 --- a/Barotrauma/BarotraumaShared/Source/TextPack.cs +++ b/Barotrauma/BarotraumaShared/Source/TextPack.cs @@ -10,6 +10,11 @@ namespace Barotrauma { public readonly string Language; + /// + /// The name of the language in the language this pack is written in + /// + public readonly string TranslatedName; + private Dictionary> texts; private readonly string filePath; @@ -23,6 +28,7 @@ namespace Barotrauma if (doc == null || doc.Root == null) return; Language = doc.Root.GetAttributeString("language", "Unknown"); + TranslatedName = doc.Root.GetAttributeString("translatedname", Language); foreach (XElement subElement in doc.Root.Elements()) {