From a5572d8834601099689de48705f4df3c92ea20e3 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:03:25 +0100 Subject: [PATCH 01/14] fix "Failed to find locale language" warning --- Mapify/Locale.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mapify/Locale.cs b/Mapify/Locale.cs index 193a2c8c..353bddca 100644 --- a/Mapify/Locale.cs +++ b/Mapify/Locale.cs @@ -48,8 +48,8 @@ public static string Get(string key) return MISSING_TRANSLATION; } + Mapify.LogWarning($"Failed to find locale language '{locale}', using default language '{DEFAULT_LANGUAGE}'"); locale = DEFAULT_LANGUAGE; - Mapify.LogWarning($"Failed to find locale language {locale}"); } Dictionary localeDict = csv[locale]; From 0960a6b56bc9fb323cf9d192c85235bed091625a Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:23:12 +0100 Subject: [PATCH 02/14] easier debug logging --- Mapify/Mapify.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 068ddac3..ac5355f9 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -43,7 +43,7 @@ private static bool Load(UnityModManager.ModEntry modEntry) private static void LoadLocale() { string localePath = Path.Combine(ModEntry.Path, LOCALE_FILE); - if (!Locale.Load(localePath)) + if (!Locale.LoadCSV(localePath)) LogError($"Failed to find locale file at {localePath}! Please make sure it's there."); } @@ -63,12 +63,22 @@ public static void LogDebugExtreme(Func resolver) LogDebug(resolver); } + public static void LogDebugExtreme(object msg) + { + LogDebugExtreme(() => msg); + } + public static void LogDebug(Func resolver) { if (Settings.VerboseLogging) ModEntry.Logger.Log($"[Debug] {resolver.Invoke()}"); } + public static void LogDebug(object msg) + { + LogDebug(() => msg); + } + public static void Log(object msg) { ModEntry.Logger.Log($"[Info] {msg}"); From 1d49bc162d960ee87f52d0a5686b211391c5be39 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:58:28 +0100 Subject: [PATCH 03/14] Add more languages --- locale.csv | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/locale.csv b/locale.csv index c080492a..a5646181 100644 --- a/locale.csv +++ b/locale.csv @@ -1,8 +1,13 @@ -Keys,Description,English -launcher/session_map,,Map: -session/map_selector,,Map -session/map_selector__tooltip,,Select a Map -launcher/map_selector__tooltip_disabled,, -loading/please_wait,,"loading{0}, please wait... {1}%" -loading/loading_map,,Loading map {0} -launcher/session_map_not_installed,,The map {0} isn't installed! Please install it before loading this save. +Keys,Description,English,Dutch,Chinese_Simplified,Chinese_Traditional,German,Italian,French,Russian,Hungarian,Spanish +launcher/session_map,,Map:,Kaart:,地图:,地圖:,Karte:,Mappa:,Carte:,карта,Térkép,Mapa: +session/map_selector,,Map,Kaart,地图,地圖,Karte,Mappa,Carte,выбор карты,Térkép,Mapa +session/map_selector__tooltip,,Select a Map,Kies een kaart,选择一张地图,選擇壹張地圖:,Wähle eine Karte,Seleziona una mappa,Selectionner une carte,,Válasszon ki egy térkép,Selecciona un mapa +launcher/map_selector__tooltip_disabled,,,,,,,,,,, +loading/please_wait,,"loading{0}, please wait... {1}%","laden{0}, even wachten aub... {1}%","加载中{0}, 请稍等...{1}%","加載中{0}, 請稍等...{1}%",Lädt {0} bitte warten ....{1}%,"caricamento{0}, attendere... {1}%","chargement{0}, veuillez patienter..{1}%","Загрузка{0}, пожалуйста подождите... {1}%","Betöltés{0}, kérem várjon... {1}%","cargando{0}, por favor espere... {1}%" +loading/loading_map,,Loading map {0},Kaart aan het laden: {0},"加载地图""{0}""中","加載地圖""{0}""中",Karte wird geladen... {0}%,Caricamento mappa {0},Chargement de la carte {0},Загрузка карты {0},Térkép betöltés{0},Cargando mapa {0} +launcher/session_map_not_installed,,The map {0} isn't installed! Please install it before loading this save.,De kaart {0} is niet geïnstalleerd! Installeer het a.u.b. voordat u dit opgeslagen spel laadt.,"""{0}""这张地图还没下载呢!请你在加载这个存档之前先下载它","""{0}""這張地圖還沒下載呢!請妳在加載這個存檔之前先下載它",Die Karte {0} ist nicht installiert! Bitte installieren Sie die Karte bevor Sie diesen Spielstand laden.,La mappa {0} non è installata! Per favore installala prima di caricare questo salvataggio.,La carte {0} n'est pas installée sur le système! Veuillez l'installer avant de charger cette sauvegarde. ,Карта не установлена. Установите карту прежде чем загружать сохранение.,A {0} térkép nincs telepítve!! Kérem telepítése mielőtt betőlti a játékot,"¡El mapa {0} no está instalado! Por favor, instálalo antes de cargar esta partida." +,,,,,,,,,,, +,,,,,,,,,,, +,,,,,,,,,,, +,,,,,,,,,,, +Translator:,,Insprill,Tostiman,我叫无聊 My Name Is BorING,我叫无聊 My Name Is BorING,kev & Coookie,tablesidecat02,"Corpet, Louvet & Cie",RaY,Dank_memey,The72 From d7cf1f76436bc251712e5de470cd02ad8ff6ff65 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 20 Dec 2024 12:59:00 +0100 Subject: [PATCH 04/14] ignore empty lines in locale.csv --- Mapify/Utils/CSVParser.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Mapify/Utils/CSVParser.cs b/Mapify/Utils/CSVParser.cs index 8df6da2e..60562147 100644 --- a/Mapify/Utils/CSVParser.cs +++ b/Mapify/Utils/CSVParser.cs @@ -21,13 +21,16 @@ public static ReadOnlyDictionary> Parse(strin List keys = ParseLine(lines[0]); foreach (string key in keys) + { + if(key == "") continue; columns.Add(key, new Dictionary()); + } for (int i = 1; i < lines.Length; i++) { string line = lines[i]; List values = ParseLine(line); - if (values.Count == 0) + if (values.Count == 0 || values[0] == "") continue; string key = values[0]; for (int j = 0; j < values.Count; j++) From 1c46d035514c1bb15a61f317c05c0c01c90166b7 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 20 Dec 2024 13:04:07 +0100 Subject: [PATCH 05/14] add ability to translate station names --- Mapify/Locale.cs | 82 +++++++++++++++++-- Mapify/Map/MapLifeCycle.cs | 8 +- Mapify/Mapify.cs | 13 +-- Mapify/Mapify.csproj | 2 +- .../GameContent/StationSetup.cs | 2 +- .../GameContent/WorldMapSetup.cs | 11 +-- Mapify/Utils/Extensions.cs | 10 +++ 7 files changed, 102 insertions(+), 26 deletions(-) diff --git a/Mapify/Locale.cs b/Mapify/Locale.cs index 353bddca..7d95499a 100644 --- a/Mapify/Locale.cs +++ b/Mapify/Locale.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; +using System.Linq; using I2.Loc; using Mapify.Utils; @@ -9,42 +10,78 @@ namespace Mapify { public static class Locale { + private const string LOCALE_FILE = "locale.csv"; private const string DEFAULT_LANGUAGE = "English"; private const string MISSING_TRANSLATION = "[ MISSING TRANSLATION ]"; + public const string PREFIX = "mapify/"; + private static readonly char[] PREFIX_CHARS = PREFIX.ToCharArray(); + public const string STATION_PREFIX = PREFIX + "station/"; public const string SESSION__MAP_SELECTOR = PREFIX + "session/map_selector"; public const string LAUNCHER__SESSION_MAP = PREFIX + "launcher/session_map"; public const string LAUNCHER__SESSION_MAP_NOT_INSTALLED = PREFIX + "launcher/session_map_not_installed"; public const string LOADING__PLEASE_WAIT = PREFIX + "loading/please_wait"; public const string LOADING__LOADING_MAP = PREFIX + "loading/loading_map"; - private static readonly char[] PREFIX_CHARS = PREFIX.ToCharArray(); private static bool initializeAttempted; - private static ReadOnlyDictionary> csv; + private static ReadOnlyDictionary> mapifyTranslations; + private static bool mapSpecificTranslationsLoaded = false; + private static ReadOnlyDictionary> mapSpecificTranslations = new (new Dictionary>()); - public static bool Load(string localeFilePath) + public static bool LoadCSV(string modDir) { initializeAttempted = true; + var localeFilePath = Path.Combine(modDir, LOCALE_FILE); if (!File.Exists(localeFilePath)) + { + Mapify.LogError($"Failed to find locale file at {localeFilePath}! Please make sure it's there."); return false; - csv = CSV.Parse(File.ReadAllText(localeFilePath)); + } + + mapifyTranslations = CSV.Parse(File.ReadAllText(localeFilePath)); return true; } + public static void LoadMapCSV(string mapDir) + { + var localeFilePath = Path.Combine(mapDir, LOCALE_FILE); + if (!File.Exists(localeFilePath)) + { + Mapify.LogDebug(nameof(LoadMapCSV)+$" no map CSV at {localeFilePath}"); + return; + } + + mapSpecificTranslations = CSV.Parse(File.ReadAllText(localeFilePath)); + mapSpecificTranslationsLoaded = true; + + Mapify.LogDebug(nameof(LoadMapCSV)+$" loaded map CSV at {localeFilePath}"); + } + + public static void UnloadMapCSV() + { + mapSpecificTranslations = new (new Dictionary>()); + mapSpecificTranslationsLoaded = false; + } + public static string Get(string key) { if (!initializeAttempted) throw new InvalidOperationException("Not initialized"); + if (TryGetMapSpecificTranslation(key, out var translation)) + { + return translation; + } + string locale = LocalizationManager.CurrentLanguage; - if (!csv.ContainsKey(locale)) + if (!mapifyTranslations.ContainsKey(locale)) { if (locale == DEFAULT_LANGUAGE) { Mapify.LogError($"Failed to find locale language {locale}! Something is broken, this shouldn't happen. Dumping CSV data:"); - Mapify.LogError($"\n{CSV.Dump(csv)}"); + Mapify.LogError($"\n{CSV.Dump(mapifyTranslations)}"); return MISSING_TRANSLATION; } @@ -52,20 +89,47 @@ public static string Get(string key) locale = DEFAULT_LANGUAGE; } - Dictionary localeDict = csv[locale]; + Dictionary localeDict = mapifyTranslations[locale]; if (localeDict.TryGetValue(key.TrimStart(PREFIX_CHARS), out string value)) { return value; } // If there is no translation for this station's name, don't translate it. - if (key.StartsWith(STATION_PREFIX)) { - return key.Replace(STATION_PREFIX, "");; + if (key.StartsWith(STATION_PREFIX)) + { + var stationID = key.Replace(STATION_PREFIX, ""); + var stationName = StationController.allStations + .Select(stationController => stationController.stationInfo) + .Where(stationInfo => stationInfo.YardID == stationID) + .Select(stationInfo => stationInfo.Name) + .ToList() + .FirstOrDefault(); + return stationName; } return MISSING_TRANSLATION; } + public static bool TryGetMapSpecificTranslation(string key, out string translation) + { + translation = ""; + if (!mapSpecificTranslationsLoaded) return false; + + var locale = LocalizationManager.CurrentLanguage; + Mapify.LogDebug($"{nameof(TryGetMapSpecificTranslation)} key: '{key}' locale: '{locale}'"); + + if (!mapSpecificTranslations.ContainsKey(locale)) return false; + + var success = mapSpecificTranslations[locale].TryGetValue(key.TrimStart(PREFIX_CHARS), out translation); + success = success && translation != ""; + if (success) + { + Mapify.LogDebug($"translation: '{translation}'"); + } + return success; + } + public static string Get(string key, params object[] placeholders) { return string.Format(Get(key), placeholders); diff --git a/Mapify/Map/MapLifeCycle.cs b/Mapify/Map/MapLifeCycle.cs index 71bee184..297e502b 100644 --- a/Mapify/Map/MapLifeCycle.cs +++ b/Mapify/Map/MapLifeCycle.cs @@ -50,8 +50,12 @@ public static IEnumerator LoadMap(BasicMapInfo basicMapInfo) loadingInfo.UpdateLoadingStatus(loadingMapLogMsg, 0); yield return null; - // Load asset bundles string mapDir = Maps.GetDirectory(basicMapInfo); + + // Register translations + Locale.LoadMapCSV(mapDir+"/../"); + + // Load asset bundles string[] assets_assetBundlePaths = Maps.GetMapAssets(Names.ASSETS_ASSET_BUNDLES_PREFIX+"*", mapDir); assets_assetBundles = new List(assets_assetBundlePaths.Length); @@ -269,6 +273,8 @@ private static void Cleanup() scenes = null; } + Locale.UnloadMapCSV(); + isMapLoaded = false; } } diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index ac5355f9..0284e6a8 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -13,7 +13,6 @@ public static class Mapify { private static UnityModManager.ModEntry ModEntry { get; set; } private static Settings Settings; - private const string LOCALE_FILE = "locale.csv"; internal static Harmony Harmony { get; private set; } @@ -27,7 +26,10 @@ private static bool Load(UnityModManager.ModEntry modEntry) try { - LoadLocale(); + if (!Locale.LoadCSV(ModEntry.Path)) + { + return false; + } Maps.Init(); Patch(); } @@ -40,13 +42,6 @@ private static bool Load(UnityModManager.ModEntry modEntry) return true; } - private static void LoadLocale() - { - string localePath = Path.Combine(ModEntry.Path, LOCALE_FILE); - if (!Locale.LoadCSV(localePath)) - LogError($"Failed to find locale file at {localePath}! Please make sure it's there."); - } - private static void Patch() { Log("Patching..."); diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index 350321be..155c1288 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -2,7 +2,7 @@ net48 - 7.3 + 9 Mapify true diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index 5a6ede14..e2ab32cf 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -32,7 +32,7 @@ public override void Run() StationController stationController = stationObject.GetComponent(); // Station info - stationController.stationInfo = new StationInfo(station.stationName, " ", station.stationID, station.color, Locale.STATION_PREFIX+station.stationName); + stationController.stationInfo = new StationInfo(station.stationName, " ", station.stationID, station.color, Locale.STATION_PREFIX+station.stationID); // Station tracks stationController.storageRailtracksGONames = station.storageTrackNames; diff --git a/Mapify/SceneInitializers/GameContent/WorldMapSetup.cs b/Mapify/SceneInitializers/GameContent/WorldMapSetup.cs index 0b436fc8..c509a355 100644 --- a/Mapify/SceneInitializers/GameContent/WorldMapSetup.cs +++ b/Mapify/SceneInitializers/GameContent/WorldMapSetup.cs @@ -52,11 +52,12 @@ private static void UpdateMapOverview(Transform transform) name.FindChildByName("Color").GetComponent().color = station.color; name.FindChildByName("IndustryCode").GetComponent().text = station.stationID; name.FindChildByName("OriginalName").GetComponent().text = station.stationName; - GameObject localizedName = name.FindChildByName("LocalizedName"); - localizedName.GetComponent().text = station.stationName; - foreach (Localize i2Localize in localizedName.GetComponents()) + GameObject localizedNameObject = name.FindChildByName("LocalizedName"); + localizedNameObject.GetComponent().text = station.GetLocalizedStationName(); + + foreach (Localize i2Localize in localizedNameObject.GetComponents()) Object.DestroyImmediate(i2Localize); - Object.DestroyImmediate(localizedName.GetComponent()); + Object.DestroyImmediate(localizedNameObject.GetComponent()); } Object.Destroy(listItemPrefab.gameObject); @@ -117,7 +118,7 @@ private static void ShowNamesOnMap(Transform mapTransform) TMP_Text tmp = name.GetComponent(); tmp.rectTransform.localPosition = station.YardCenter.position.ToXZ().Scale(0, Maps.LoadedMap.worldSize, -0.175f, 0.175f); - tmp.text = ShowStationNamesOnMap ? station.stationName : station.stationID; + tmp.text = ShowStationNamesOnMap ? station.GetLocalizedStationName() : station.stationID; } Object.Destroy(namePrefab); diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 4e7a1edd..da274157 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -232,6 +232,16 @@ public static GameObject Replace(this VanillaObject vanillaObject, bool active = return vanillaObject.gameObject.Replace(AssetCopier.Instantiate(vanillaObject.asset, active, originShift), preserveTypes, vanillaObject.keepChildren, vanillaObject.rotationOffset); } + public static string GetLocalizedStationName(this Station station) + { + if(Locale.TryGetMapSpecificTranslation(Locale.STATION_PREFIX+station.stationID, out var localizedName)) + { + return localizedName; + } + + return station.stationName; + } + #endregion } } From 7091c932f8da9122b5b2dde65a719acc85c0692f Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:03:47 +0100 Subject: [PATCH 06/14] get rid of annoying debug log --- Mapify/Locale.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Mapify/Locale.cs b/Mapify/Locale.cs index 7d95499a..e8cee3ad 100644 --- a/Mapify/Locale.cs +++ b/Mapify/Locale.cs @@ -117,16 +117,11 @@ public static bool TryGetMapSpecificTranslation(string key, out string translati if (!mapSpecificTranslationsLoaded) return false; var locale = LocalizationManager.CurrentLanguage; - Mapify.LogDebug($"{nameof(TryGetMapSpecificTranslation)} key: '{key}' locale: '{locale}'"); if (!mapSpecificTranslations.ContainsKey(locale)) return false; var success = mapSpecificTranslations[locale].TryGetValue(key.TrimStart(PREFIX_CHARS), out translation); success = success && translation != ""; - if (success) - { - Mapify.LogDebug($"translation: '{translation}'"); - } return success; } From 60b47022f3214e3b069d240b08359988d829fd6b Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Sun, 2 Feb 2025 15:41:30 +0100 Subject: [PATCH 07/14] improved a Dutch translation --- locale.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale.csv b/locale.csv index a5646181..39b5b813 100644 --- a/locale.csv +++ b/locale.csv @@ -3,7 +3,7 @@ launcher/session_map,,Map:,Kaart:,地图:,地圖:,Karte:,Mappa:,Carte:,карт session/map_selector,,Map,Kaart,地图,地圖,Karte,Mappa,Carte,выбор карты,Térkép,Mapa session/map_selector__tooltip,,Select a Map,Kies een kaart,选择一张地图,選擇壹張地圖:,Wähle eine Karte,Seleziona una mappa,Selectionner une carte,,Válasszon ki egy térkép,Selecciona un mapa launcher/map_selector__tooltip_disabled,,,,,,,,,,, -loading/please_wait,,"loading{0}, please wait... {1}%","laden{0}, even wachten aub... {1}%","加载中{0}, 请稍等...{1}%","加載中{0}, 請稍等...{1}%",Lädt {0} bitte warten ....{1}%,"caricamento{0}, attendere... {1}%","chargement{0}, veuillez patienter..{1}%","Загрузка{0}, пожалуйста подождите... {1}%","Betöltés{0}, kérem várjon... {1}%","cargando{0}, por favor espere... {1}%" +loading/please_wait,,"loading{0}, please wait... {1}%","{0} aan het laden, even wachten aub... {1}%","加载中{0}, 请稍等...{1}%","加載中{0}, 請稍等...{1}%",Lädt {0} bitte warten ....{1}%,"caricamento{0}, attendere... {1}%","chargement{0}, veuillez patienter..{1}%","Загрузка{0}, пожалуйста подождите... {1}%","Betöltés{0}, kérem várjon... {1}%","cargando{0}, por favor espere... {1}%" loading/loading_map,,Loading map {0},Kaart aan het laden: {0},"加载地图""{0}""中","加載地圖""{0}""中",Karte wird geladen... {0}%,Caricamento mappa {0},Chargement de la carte {0},Загрузка карты {0},Térkép betöltés{0},Cargando mapa {0} launcher/session_map_not_installed,,The map {0} isn't installed! Please install it before loading this save.,De kaart {0} is niet geïnstalleerd! Installeer het a.u.b. voordat u dit opgeslagen spel laadt.,"""{0}""这张地图还没下载呢!请你在加载这个存档之前先下载它","""{0}""這張地圖還沒下載呢!請妳在加載這個存檔之前先下載它",Die Karte {0} ist nicht installiert! Bitte installieren Sie die Karte bevor Sie diesen Spielstand laden.,La mappa {0} non è installata! Per favore installala prima di caricare questo salvataggio.,La carte {0} n'est pas installée sur le système! Veuillez l'installer avant de charger cette sauvegarde. ,Карта не установлена. Установите карту прежде чем загружать сохранение.,A {0} térkép nincs telepítve!! Kérem telepítése mielőtt betőlti a játékot,"¡El mapa {0} no está instalado! Por favor, instálalo antes de cargar esta partida." ,,,,,,,,,,, From 9f39c41369c8e09d3e6af31c9cb9c5c77e357d06 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 16 May 2025 19:53:36 +0200 Subject: [PATCH 08/14] use the old style constructor --- Mapify/Locale.cs | 4 ++-- Mapify/Mapify.csproj | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Mapify/Locale.cs b/Mapify/Locale.cs index e8cee3ad..574a6cc8 100644 --- a/Mapify/Locale.cs +++ b/Mapify/Locale.cs @@ -27,7 +27,7 @@ public static class Locale private static bool initializeAttempted; private static ReadOnlyDictionary> mapifyTranslations; private static bool mapSpecificTranslationsLoaded = false; - private static ReadOnlyDictionary> mapSpecificTranslations = new (new Dictionary>()); + private static ReadOnlyDictionary> mapSpecificTranslations = new ReadOnlyDictionary> (new Dictionary>()); public static bool LoadCSV(string modDir) { @@ -60,7 +60,7 @@ public static void LoadMapCSV(string mapDir) public static void UnloadMapCSV() { - mapSpecificTranslations = new (new Dictionary>()); + mapSpecificTranslations = new ReadOnlyDictionary> (new Dictionary>()); mapSpecificTranslationsLoaded = false; } diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index f46e3832..b7817e81 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -2,7 +2,7 @@ net48 - 9 + 7.3 Mapify true From cdb5f0ced5152c99ae09aa054edd63e92f6b9ac4 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Wed, 11 Jun 2025 21:36:39 +0200 Subject: [PATCH 09/14] use languagehelper --- Mapify/Locale.cs | 131 +++--------------- Mapify/Map/MapLifeCycle.cs | 10 +- Mapify/Mapify.cs | 8 +- Mapify/Mapify.csproj | 7 + Mapify/Patches/DisplayLoadingInfoPatch.cs | 3 +- Mapify/Patches/LauncherControllerPatch.cs | 3 +- Mapify/Patches/LocalizationManagerPatch.cs | 18 --- .../GameContent/StationSetup.cs | 17 ++- Mapify/Utils/Extensions.cs | 13 +- .../GameContent/StationUpdater.cs | 7 + .../GameContent/StationValidator.cs | 6 + MapifyEditor/MapifyEditor.csproj | 4 + MapifyEditor/Station/Station.cs | 7 + MapifyEditor/Translations/TranslationSet.cs | 21 +++ .../Translations/TranslationSetBehaviour.cs | 20 +++ info.json | 3 +- locale.csv | 6 +- 17 files changed, 133 insertions(+), 151 deletions(-) delete mode 100644 Mapify/Patches/LocalizationManagerPatch.cs create mode 100644 MapifyEditor/Translations/TranslationSet.cs create mode 100644 MapifyEditor/Translations/TranslationSetBehaviour.cs diff --git a/Mapify/Locale.cs b/Mapify/Locale.cs index 574a6cc8..33736e0f 100644 --- a/Mapify/Locale.cs +++ b/Mapify/Locale.cs @@ -1,133 +1,48 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; using System.IO; -using System.Linq; -using I2.Loc; -using Mapify.Utils; +using DVLangHelper.Data; +using DVLangHelper.Runtime; +using UnityModManagerNet; namespace Mapify { public static class Locale { private const string LOCALE_FILE = "locale.csv"; - private const string DEFAULT_LANGUAGE = "English"; - private const string MISSING_TRANSLATION = "[ MISSING TRANSLATION ]"; + // copied from DV.Localization.LocalizationAPI.Sanitized + public const string MISSING_TRANSLATION = "[ MISSING TRANSLATION ]"; - public const string PREFIX = "mapify/"; - private static readonly char[] PREFIX_CHARS = PREFIX.ToCharArray(); + public const string SESSION__MAP_SELECTOR = "session/map_selector"; + public const string LAUNCHER__SESSION_MAP = "launcher/session_map"; + public const string LAUNCHER__SESSION_MAP_NOT_INSTALLED = "launcher/session_map_not_installed"; + public const string LOADING__PLEASE_WAIT = "loading/please_wait"; + public const string LOADING__LOADING_MAP = "loading/loading_map"; - public const string STATION_PREFIX = PREFIX + "station/"; - public const string SESSION__MAP_SELECTOR = PREFIX + "session/map_selector"; - public const string LAUNCHER__SESSION_MAP = PREFIX + "launcher/session_map"; - public const string LAUNCHER__SESSION_MAP_NOT_INSTALLED = PREFIX + "launcher/session_map_not_installed"; - public const string LOADING__PLEASE_WAIT = PREFIX + "loading/please_wait"; - public const string LOADING__LOADING_MAP = PREFIX + "loading/loading_map"; + private static TranslationInjector translationsInjector; - private static bool initializeAttempted; - private static ReadOnlyDictionary> mapifyTranslations; - private static bool mapSpecificTranslationsLoaded = false; - private static ReadOnlyDictionary> mapSpecificTranslations = new ReadOnlyDictionary> (new Dictionary>()); + public static bool Setup() + { + translationsInjector = new TranslationInjector(Mapify.ModEntry.Info.Id); + return Reset(); + } - public static bool LoadCSV(string modDir) + public static bool Reset() { - initializeAttempted = true; - var localeFilePath = Path.Combine(modDir, LOCALE_FILE); + translationsInjector.ResetData(); + var localeFilePath = Path.Combine(Mapify.ModEntry.Path, LOCALE_FILE); + if (!File.Exists(localeFilePath)) { Mapify.LogError($"Failed to find locale file at {localeFilePath}! Please make sure it's there."); return false; } - mapifyTranslations = CSV.Parse(File.ReadAllText(localeFilePath)); + translationsInjector.AddTranslationsFromCsv(localeFilePath); return true; } - public static void LoadMapCSV(string mapDir) - { - var localeFilePath = Path.Combine(mapDir, LOCALE_FILE); - if (!File.Exists(localeFilePath)) - { - Mapify.LogDebug(nameof(LoadMapCSV)+$" no map CSV at {localeFilePath}"); - return; - } - - mapSpecificTranslations = CSV.Parse(File.ReadAllText(localeFilePath)); - mapSpecificTranslationsLoaded = true; - - Mapify.LogDebug(nameof(LoadMapCSV)+$" loaded map CSV at {localeFilePath}"); - } - - public static void UnloadMapCSV() - { - mapSpecificTranslations = new ReadOnlyDictionary> (new Dictionary>()); - mapSpecificTranslationsLoaded = false; - } - - public static string Get(string key) - { - if (!initializeAttempted) - throw new InvalidOperationException("Not initialized"); - - if (TryGetMapSpecificTranslation(key, out var translation)) - { - return translation; - } - - string locale = LocalizationManager.CurrentLanguage; - - if (!mapifyTranslations.ContainsKey(locale)) - { - if (locale == DEFAULT_LANGUAGE) - { - Mapify.LogError($"Failed to find locale language {locale}! Something is broken, this shouldn't happen. Dumping CSV data:"); - Mapify.LogError($"\n{CSV.Dump(mapifyTranslations)}"); - return MISSING_TRANSLATION; - } - - Mapify.LogWarning($"Failed to find locale language '{locale}', using default language '{DEFAULT_LANGUAGE}'"); - locale = DEFAULT_LANGUAGE; - } - - Dictionary localeDict = mapifyTranslations[locale]; - - if (localeDict.TryGetValue(key.TrimStart(PREFIX_CHARS), out string value)) { - return value; - } - - // If there is no translation for this station's name, don't translate it. - if (key.StartsWith(STATION_PREFIX)) - { - var stationID = key.Replace(STATION_PREFIX, ""); - var stationName = StationController.allStations - .Select(stationController => stationController.stationInfo) - .Where(stationInfo => stationInfo.YardID == stationID) - .Select(stationInfo => stationInfo.Name) - .ToList() - .FirstOrDefault(); - return stationName; - } - - return MISSING_TRANSLATION; - } - - public static bool TryGetMapSpecificTranslation(string key, out string translation) - { - translation = ""; - if (!mapSpecificTranslationsLoaded) return false; - - var locale = LocalizationManager.CurrentLanguage; - - if (!mapSpecificTranslations.ContainsKey(locale)) return false; - - var success = mapSpecificTranslations[locale].TryGetValue(key.TrimStart(PREFIX_CHARS), out translation); - success = success && translation != ""; - return success; - } - - public static string Get(string key, params object[] placeholders) + public static void AddTranslation(string key, DVLanguage translationSetLanguage, string translationSetTranslation) { - return string.Format(Get(key), placeholders); + translationsInjector.AddTranslation(key, translationSetLanguage, translationSetTranslation); } } } diff --git a/Mapify/Map/MapLifeCycle.cs b/Mapify/Map/MapLifeCycle.cs index ab372ff5..3354ec5d 100644 --- a/Mapify/Map/MapLifeCycle.cs +++ b/Mapify/Map/MapLifeCycle.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; using DV.CashRegister; +using DV.Localization; using DV.Utils; using Mapify.Editor; using Mapify.Editor.Utils; @@ -44,18 +45,15 @@ public static IEnumerator LoadMap(BasicMapInfo basicMapInfo) WorldStreamingInit wsi = SingletonBehaviour.Instance; DisplayLoadingInfo loadingInfo = Object.FindObjectOfType(); - string loadingMapLogMsg = Locale.Get(Locale.LOADING__LOADING_MAP, basicMapInfo.name); + string loadingMapLogMsg = LocalizationAPI.L(Locale.LOADING__LOADING_MAP, basicMapInfo.name); loadingInfo.UpdateLoadingStatus(loadingMapLogMsg, 0); yield return null; - // Register translations - string mapDir = Maps.GetDirectory(basicMapInfo); - Locale.LoadMapCSV(mapDir+"/../"); - // Load asset bundles loadedAssetBundles = new List(); // Register mapinfo + string mapDir = Maps.GetDirectory(basicMapInfo); Mapify.LogDebug(() => $"Loading AssetBundle '{Names.MAP_INFO_ASSET_BUNDLE}'"); AssetBundleCreateRequest mapInfoRequest = AssetBundle.LoadFromFileAsync(Maps.GetMapAsset(Names.MAP_INFO_ASSET_BUNDLE, mapDir)); do @@ -339,6 +337,7 @@ private static void InitializeLists() private static void Cleanup() { + Locale.Reset(); WorldMapSetup.Cleanup(); StreamedObjectInitPatch.ResetStreamers(); Maps.UnregisterLoadedMap(); @@ -358,7 +357,6 @@ private static void Cleanup() } loadedAssetBundles = null; - Locale.UnloadMapCSV(); isMapLoaded = false; } } diff --git a/Mapify/Mapify.cs b/Mapify/Mapify.cs index 0284e6a8..adbae3ed 100644 --- a/Mapify/Mapify.cs +++ b/Mapify/Mapify.cs @@ -1,17 +1,13 @@ using System; -using System.IO; -using DV.UI; using HarmonyLib; using Mapify.Map; -using Mapify.Patches; using UnityModManagerNet; -using Object = UnityEngine.Object; namespace Mapify { public static class Mapify { - private static UnityModManager.ModEntry ModEntry { get; set; } + public static UnityModManager.ModEntry ModEntry { get; private set; } private static Settings Settings; internal static Harmony Harmony { get; private set; } @@ -26,7 +22,7 @@ private static bool Load(UnityModManager.ModEntry modEntry) try { - if (!Locale.LoadCSV(ModEntry.Path)) + if (!Locale.Setup()) { return false; } diff --git a/Mapify/Mapify.csproj b/Mapify/Mapify.csproj index 2cc1751a..6acd2cad 100644 --- a/Mapify/Mapify.csproj +++ b/Mapify/Mapify.csproj @@ -16,6 +16,7 @@ + @@ -49,6 +50,12 @@ + + + + + + diff --git a/Mapify/Patches/DisplayLoadingInfoPatch.cs b/Mapify/Patches/DisplayLoadingInfoPatch.cs index 03c05b95..aafff53c 100644 --- a/Mapify/Patches/DisplayLoadingInfoPatch.cs +++ b/Mapify/Patches/DisplayLoadingInfoPatch.cs @@ -1,3 +1,4 @@ +using DV.Localization; using HarmonyLib; namespace Mapify.Patches @@ -44,7 +45,7 @@ private static bool Prefix(DisplayLoadingInfo __instance, string message, bool i } string formattedWhat = string.IsNullOrWhiteSpace(what) ? "" : $" {what}"; - __instance.percentageLoadedTMP.text = Locale.Get(Locale.LOADING__PLEASE_WAIT, formattedWhat, percentageLoaded.ToString("F0")); + __instance.percentageLoadedTMP.text = LocalizationAPI.L(Locale.LOADING__PLEASE_WAIT, formattedWhat, percentageLoaded.ToString("F0")); if (!Bootstrap.bootstrapped) return false; diff --git a/Mapify/Patches/LauncherControllerPatch.cs b/Mapify/Patches/LauncherControllerPatch.cs index a843d518..89b0d52f 100644 --- a/Mapify/Patches/LauncherControllerPatch.cs +++ b/Mapify/Patches/LauncherControllerPatch.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using DV.Common; +using DV.Localization; using DV.UI; using DV.UI.PresetEditors; using DV.UIFramework; @@ -71,7 +72,7 @@ private static bool Prefix(LauncherController __instance, ISaveGame ___saveGame) Popup okPopupPrefab = __instance.GetComponentInParent().continueLoadNewController.career.okPopupPrefab; Popup popup = popupManager.ShowPopup(okPopupPrefab); - popup.labelTMPro.text = Locale.Get(Locale.LAUNCHER__SESSION_MAP_NOT_INSTALLED, basicMapInfo.name); + popup.labelTMPro.text = LocalizationAPI.L(Locale.LAUNCHER__SESSION_MAP_NOT_INSTALLED, basicMapInfo.name); return false; } } diff --git a/Mapify/Patches/LocalizationManagerPatch.cs b/Mapify/Patches/LocalizationManagerPatch.cs deleted file mode 100644 index b8ea7c52..00000000 --- a/Mapify/Patches/LocalizationManagerPatch.cs +++ /dev/null @@ -1,18 +0,0 @@ -using HarmonyLib; -using I2.Loc; - -namespace Mapify.Patches -{ - [HarmonyPatch(typeof(LocalizationManager), nameof(LocalizationManager.GetTranslation))] - public static class LocalizationManager_GetTranslation_Patch - { - private static bool Prefix(ref string __result, string Term) - { - if (!Term.StartsWith(Locale.PREFIX)) - return true; - - __result = Locale.Get(Term); - return false; - } - } -} diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index e2ab32cf..8855f579 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -31,8 +31,7 @@ public override void Run() GameObject stationObject = station.gameObject; StationController stationController = stationObject.GetComponent(); - // Station info - stationController.stationInfo = new StationInfo(station.stationName, " ", station.stationID, station.color, Locale.STATION_PREFIX+station.stationID); + SetupStationInfo(station, stationController); // Station tracks stationController.storageRailtracksGONames = station.storageTrackNames; @@ -51,6 +50,20 @@ public override void Run() SingletonBehaviour.Instance.gameObject.SetActive(true); } + private void SetupStationInfo(Station station, StationController stationController) + { + var locaKey = station.GetStationLocalizationKey(); + stationController.stationInfo = new StationInfo(station.stationName, " ", station.stationID, station.color, locaKey); + + var mbs = station.GetComponents(); + station.stationNameTranslations = mbs.Take(station.stationNameTranslationsCount).Select(mb => mb.ToOriginal()).ToList(); + + foreach (var translationSet in station.stationNameTranslations) + { + Locale.AddTranslation(locaKey, translationSet.language, translationSet.translation); + } + } + private static void SetupJobBookletSpawnSurface(Station station, StationController stationController) { PointOnPlane jobBookletSpawnSurface = station.transform.parent.GetComponentInChildren(); diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 5b44aa21..4f00c25e 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -5,6 +5,7 @@ using CommandTerminal; using DV; using DV.JObjectExtstensions; +using DV.Localization; using DV.PointSet; using DV.ThingTypes; using HarmonyLib; @@ -293,12 +294,14 @@ public static GameObject Replace(this VanillaObject vanillaObject, bool active = public static string GetLocalizedStationName(this Station station) { - if(Locale.TryGetMapSpecificTranslation(Locale.STATION_PREFIX+station.stationID, out var localizedName)) - { - return localizedName; - } + var localized = LocalizationAPI.L(station.GetStationLocalizationKey()); + //if there is no translation, don't translate + return localized == Locale.MISSING_TRANSLATION ? station.stationName : localized; + } - return station.stationName; + public static string GetStationLocalizationKey(this Station station) + { + return "station/" + station.stationID; } #endregion diff --git a/MapifyEditor/Export/BuildUpdaters/GameContent/StationUpdater.cs b/MapifyEditor/Export/BuildUpdaters/GameContent/StationUpdater.cs index b36ca6aa..dff9d4d0 100644 --- a/MapifyEditor/Export/BuildUpdaters/GameContent/StationUpdater.cs +++ b/MapifyEditor/Export/BuildUpdaters/GameContent/StationUpdater.cs @@ -46,6 +46,13 @@ protected override void Update(Scenes scenes) station.outputCargoGroups.ForEach(set => set.ToMonoBehaviour(station.gameObject)); #endregion + + #region Translations + + station.stationNameTranslationsCount = station.stationNameTranslations.Count; + station.stationNameTranslations.ForEach(set => set.ToMonoBehaviour(station.gameObject)); + + #endregion } } diff --git a/MapifyEditor/Export/Validators/GameContent/StationValidator.cs b/MapifyEditor/Export/Validators/GameContent/StationValidator.cs index 6256669e..fa2a47fc 100644 --- a/MapifyEditor/Export/Validators/GameContent/StationValidator.cs +++ b/MapifyEditor/Export/Validators/GameContent/StationValidator.cs @@ -3,6 +3,7 @@ using System.Linq; using System.Text.RegularExpressions; using Mapify.Editor.Utils; +using UnityEngine; namespace Mapify.Editor.Validators { @@ -28,6 +29,11 @@ protected override IEnumerator Validate(Scenes scenes) if (string.IsNullOrWhiteSpace(station.stationName)) yield return Result.Error($"Station '{station.name}' must have a name", station); + foreach (var translationSet in station.stationNameTranslations.Where(translationSet => string.IsNullOrWhiteSpace(translationSet.translation))) + { + yield return Result.Error($"Station name translation in {translationSet.language} on '{station.stationName}' must not be empty", station); + } + if (string.IsNullOrWhiteSpace(station.stationID)) yield return Result.Error($"Station '{station.name}' must have an ID", station); diff --git a/MapifyEditor/MapifyEditor.csproj b/MapifyEditor/MapifyEditor.csproj index 3690f8d6..482daf0e 100644 --- a/MapifyEditor/MapifyEditor.csproj +++ b/MapifyEditor/MapifyEditor.csproj @@ -20,6 +20,10 @@ + + + + diff --git a/MapifyEditor/Station/Station.cs b/MapifyEditor/Station/Station.cs index 7b527744..76bdcff6 100644 --- a/MapifyEditor/Station/Station.cs +++ b/MapifyEditor/Station/Station.cs @@ -11,6 +11,13 @@ public class Station : MonoBehaviour [Header("Station Info")] [Tooltip("The display name of the station")] public string stationName; + + [Tooltip("Station name translations")] + [SerializeField] + public List stationNameTranslations; + [HideInNormalInspector] + public int stationNameTranslationsCount; + [Tooltip("The 2-3 character ID of the station (e.g. HB for Harbor, SM for Steel Mill, etc)")] public string stationID; [Tooltip("The color of the station shown on job booklets")] diff --git a/MapifyEditor/Translations/TranslationSet.cs b/MapifyEditor/Translations/TranslationSet.cs new file mode 100644 index 00000000..b412e894 --- /dev/null +++ b/MapifyEditor/Translations/TranslationSet.cs @@ -0,0 +1,21 @@ +using System; +using DVLangHelper.Data; +using UnityEngine; + +namespace Mapify.Editor +{ + [Serializable] + public class TranslationSet + { + public DVLanguage language; + public string translation; + + public TranslationSetBehaviour ToMonoBehaviour(GameObject gameObject) + { + var mb = gameObject.AddComponent(); + mb.language = language; + mb.translation = translation; + return mb; + } + } +} diff --git a/MapifyEditor/Translations/TranslationSetBehaviour.cs b/MapifyEditor/Translations/TranslationSetBehaviour.cs new file mode 100644 index 00000000..6d797066 --- /dev/null +++ b/MapifyEditor/Translations/TranslationSetBehaviour.cs @@ -0,0 +1,20 @@ +using DVLangHelper.Data; +using UnityEngine; + +namespace Mapify.Editor +{ + //this is a hack. we are using this because serializing Lists of serializable classes just doesn't work i guess + public class TranslationSetBehaviour : MonoBehaviour + { + public DVLanguage language; + public string translation; + + public TranslationSet ToOriginal() + { + return new TranslationSet { + language = language, + translation = translation + }; + } + } +} diff --git a/info.json b/info.json index 2543bede..e61eb405 100644 --- a/info.json +++ b/info.json @@ -6,5 +6,6 @@ "EntryMethod": "Mapify.Mapify.Load", "ManagerVersion": "0.27.13", "HomePage": "https://www.nexusmods.com/derailvalley/mods/593", - "Repository": "https://raw.githubusercontent.com/Insprill/dv-mapify/master/repository.json" + "Repository": "https://raw.githubusercontent.com/Insprill/dv-mapify/master/repository.json", + "Requirements": ["DVLangHelper-1.2.1"] } diff --git a/locale.csv b/locale.csv index 39b5b813..1edab247 100644 --- a/locale.csv +++ b/locale.csv @@ -3,9 +3,9 @@ launcher/session_map,,Map:,Kaart:,地图:,地圖:,Karte:,Mappa:,Carte:,карт session/map_selector,,Map,Kaart,地图,地圖,Karte,Mappa,Carte,выбор карты,Térkép,Mapa session/map_selector__tooltip,,Select a Map,Kies een kaart,选择一张地图,選擇壹張地圖:,Wähle eine Karte,Seleziona una mappa,Selectionner une carte,,Válasszon ki egy térkép,Selecciona un mapa launcher/map_selector__tooltip_disabled,,,,,,,,,,, -loading/please_wait,,"loading{0}, please wait... {1}%","{0} aan het laden, even wachten aub... {1}%","加载中{0}, 请稍等...{1}%","加載中{0}, 請稍等...{1}%",Lädt {0} bitte warten ....{1}%,"caricamento{0}, attendere... {1}%","chargement{0}, veuillez patienter..{1}%","Загрузка{0}, пожалуйста подождите... {1}%","Betöltés{0}, kérem várjon... {1}%","cargando{0}, por favor espere... {1}%" -loading/loading_map,,Loading map {0},Kaart aan het laden: {0},"加载地图""{0}""中","加載地圖""{0}""中",Karte wird geladen... {0}%,Caricamento mappa {0},Chargement de la carte {0},Загрузка карты {0},Térkép betöltés{0},Cargando mapa {0} -launcher/session_map_not_installed,,The map {0} isn't installed! Please install it before loading this save.,De kaart {0} is niet geïnstalleerd! Installeer het a.u.b. voordat u dit opgeslagen spel laadt.,"""{0}""这张地图还没下载呢!请你在加载这个存档之前先下载它","""{0}""這張地圖還沒下載呢!請妳在加載這個存檔之前先下載它",Die Karte {0} ist nicht installiert! Bitte installieren Sie die Karte bevor Sie diesen Spielstand laden.,La mappa {0} non è installata! Per favore installala prima di caricare questo salvataggio.,La carte {0} n'est pas installée sur le système! Veuillez l'installer avant de charger cette sauvegarde. ,Карта не установлена. Установите карту прежде чем загружать сохранение.,A {0} térkép nincs telepítve!! Kérem telepítése mielőtt betőlti a játékot,"¡El mapa {0} no está instalado! Por favor, instálalo antes de cargar esta partida." +loading/please_wait,,"loading{[0]}, please wait... {[1]}%","{[0]} aan het laden, even wachten aub... {[1]}%","加载中{[0]}, 请稍等...{[1]}%","加載中{[0]}, 請稍等...{[1]}%",Lädt {[0]} bitte warten ....{[1]}%,"caricamento{[0]}, attendere... {[1]}%","chargement{[0]}, veuillez patienter..{[1]}%","Загрузка{[0]}, пожалуйста подождите... {[1]}%","Betöltés{[0]}, kérem várjon... {[1]}%","cargando{[0]}, por favor espere... {[1]}%" +loading/loading_map,,Loading map {[0]},Kaart aan het laden: {[0]},"加载地图""{[0]}""中","加載地圖""{[0]}""中",Karte wird geladen... {[0]}%,Caricamento mappa {[0]},Chargement de la carte {[0]},Загрузка карты {[0]},Térkép betöltés{[0]},Cargando mapa {[0]} +launcher/session_map_not_installed,,The map {[0]} isn't installed! Please install it before loading this save.,De kaart {[0]} is niet geïnstalleerd! Installeer het a.u.b. voordat u dit opgeslagen spel laadt.,"""{[0]}""这张地图还没下载呢!请你在加载这个存档之前先下载它","""{[0]}""這張地圖還沒下載呢!請妳在加載這個存檔之前先下載它",Die Karte {[0]} ist nicht installiert! Bitte installieren Sie die Karte bevor Sie diesen Spielstand laden.,La mappa {[0]} non è installata! Per favore installala prima di caricare questo salvataggio.,La carte {[0]} n'est pas installée sur le système! Veuillez l'installer avant de charger cette sauvegarde. ,Карта не установлена. Установите карту прежде чем загружать сохранение.,A {[0]} térkép nincs telepítve!! Kérem telepítése mielőtt betőlti a játékot,"¡El mapa {[0]} no está instalado! Por favor, instálalo antes de cargar esta partida." ,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,, From 6981a61d254b80603edea961d9f9f24e48029e60 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 12 Jun 2025 12:25:10 +0200 Subject: [PATCH 10/14] delete obsolete CSVParser --- Mapify/Utils/CSVParser.cs | 117 -------------------------------------- 1 file changed, 117 deletions(-) delete mode 100644 Mapify/Utils/CSVParser.cs diff --git a/Mapify/Utils/CSVParser.cs b/Mapify/Utils/CSVParser.cs deleted file mode 100644 index 60562147..00000000 --- a/Mapify/Utils/CSVParser.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Collections.Specialized; -using System.Linq; -using System.Text; - -namespace Mapify.Utils -{ - public static class CSV - { - /// - /// Parses a CSV string into a dictionary of columns, each of which is a dictionary of rows, keyed by the first column. - /// - public static ReadOnlyDictionary> Parse(string data) - { - string[] lines = data.Split('\n'); - - // Dictionary> - OrderedDictionary columns = new OrderedDictionary(lines.Length - 1); - - List keys = ParseLine(lines[0]); - foreach (string key in keys) - { - if(key == "") continue; - columns.Add(key, new Dictionary()); - } - - for (int i = 1; i < lines.Length; i++) - { - string line = lines[i]; - List values = ParseLine(line); - if (values.Count == 0 || values[0] == "") - continue; - string key = values[0]; - for (int j = 0; j < values.Count; j++) - ((Dictionary)columns[j]).Add(key, values[j]); - } - - return new ReadOnlyDictionary>(columns.Cast() - .ToDictionary(entry => (string)entry.Key, entry => (Dictionary)entry.Value)); - } - - private static List ParseLine(string line) - { - bool inQuotes = false; - List values = new List(); - StringBuilder builder = new StringBuilder(); - - void FinishLine() - { - values.Add(builder.ToString()); - builder.Clear(); - } - - foreach (char c in line) - { - if (c == '\r') - { - Mapify.LogWarning("Encountered carriage return in CSV! Please use Unix-style line endings (LF)."); - continue; - } - - if (c == '\n' || (!inQuotes && c == ',')) - { - FinishLine(); - continue; - } - - if (c == '"') - { - inQuotes = !inQuotes; - continue; - } - - builder.Append(c); - } - - if (builder.Length > 0) - FinishLine(); - - return values; - } - - public static string Dump(ReadOnlyDictionary> data) - { - StringBuilder result = new StringBuilder(); - - foreach (KeyValuePair> column in data) - result.Append($"{column.Key},"); - - result.Remove(result.Length - 1, 1); - result.Append('\n'); - - int rowCount = data.Values.FirstOrDefault()?.Count ?? 0; - - for (int i = 0; i < rowCount; i++) - { - foreach (KeyValuePair> column in data) - if (column.Value.Count > i) - { - string value = column.Value.ElementAt(i).Value; - result.Append(value.Contains(',') ? $"\"{value}\"," : $"{value},"); - } - else - { - result.Append(','); - } - - result.Remove(result.Length - 1, 1); - result.Append('\n'); - } - - return result.ToString(); - } - } -} From 915df718c8d6fd27168e74877f19a61d6c22b7ac Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:02:17 +0200 Subject: [PATCH 11/14] hide in editor --- MapifyEditor/Cargo/CargoSetMonoBehaviour.cs | 7 +++++++ MapifyEditor/Translations/TranslationSetBehaviour.cs | 11 +++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/MapifyEditor/Cargo/CargoSetMonoBehaviour.cs b/MapifyEditor/Cargo/CargoSetMonoBehaviour.cs index 80dbbca6..8af619ad 100644 --- a/MapifyEditor/Cargo/CargoSetMonoBehaviour.cs +++ b/MapifyEditor/Cargo/CargoSetMonoBehaviour.cs @@ -4,6 +4,7 @@ namespace Mapify.Editor { // I can't with Unity man... + [ExecuteInEditMode] public class CargoSetMonoBehaviour : MonoBehaviour { public List cargoTypes; @@ -16,5 +17,11 @@ public CargoSet ToOriginal() stations = stations }; } + + private void OnEnable() + { + //hide this script in the editor + hideFlags = HideFlags.HideInInspector; + } } } diff --git a/MapifyEditor/Translations/TranslationSetBehaviour.cs b/MapifyEditor/Translations/TranslationSetBehaviour.cs index 6d797066..274b96b5 100644 --- a/MapifyEditor/Translations/TranslationSetBehaviour.cs +++ b/MapifyEditor/Translations/TranslationSetBehaviour.cs @@ -1,12 +1,13 @@ -using DVLangHelper.Data; +using System; using UnityEngine; namespace Mapify.Editor { //this is a hack. we are using this because serializing Lists of serializable classes just doesn't work i guess + [ExecuteInEditMode] public class TranslationSetBehaviour : MonoBehaviour { - public DVLanguage language; + public LanguageEnum language; public string translation; public TranslationSet ToOriginal() @@ -16,5 +17,11 @@ public TranslationSet ToOriginal() translation = translation }; } + + private void OnEnable() + { + //hide this script in the editor + hideFlags = HideFlags.HideInInspector; + } } } From d920834f4e089340b99cefa22e1fe05ae12b4425 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Thu, 12 Jun 2025 21:05:04 +0200 Subject: [PATCH 12/14] remove LangHelper dependency from MapifyEditor --- .../GameContent/StationSetup.cs | 2 +- Mapify/Utils/Extensions.cs | 35 +++++++++++++++++++ MapifyEditor/MapifyEditor.csproj | 4 --- MapifyEditor/Translations/LanguageEnum.cs | 32 +++++++++++++++++ MapifyEditor/Translations/TranslationSet.cs | 3 +- 5 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 MapifyEditor/Translations/LanguageEnum.cs diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index 8855f579..fefab7d0 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -60,7 +60,7 @@ private void SetupStationInfo(Station station, StationController stationControll foreach (var translationSet in station.stationNameTranslations) { - Locale.AddTranslation(locaKey, translationSet.language, translationSet.translation); + Locale.AddTranslation(locaKey, translationSet.GetLanguageAsDVLanguage(), translationSet.translation); } } diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 4f00c25e..8237c7c9 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -8,6 +8,7 @@ using DV.Localization; using DV.PointSet; using DV.ThingTypes; +using DVLangHelper.Data; using HarmonyLib; using Mapify.Editor; using Mapify.Editor.Utils; @@ -304,6 +305,40 @@ public static string GetStationLocalizationKey(this Station station) return "station/" + station.stationID; } + public static DVLanguage GetLanguageAsDVLanguage(this TranslationSet languageSet) + { + switch (languageSet.language) + { + case LanguageEnum.English: return DVLanguage.English; + case LanguageEnum.Czech: return DVLanguage.Czech; + case LanguageEnum.Danish: return DVLanguage.Danish; + case LanguageEnum.German: return DVLanguage.German; + case LanguageEnum.Spanish: return DVLanguage.Spanish; + case LanguageEnum.Finnish: return DVLanguage.Finnish; + case LanguageEnum.French: return DVLanguage.French; + case LanguageEnum.Hindi: return DVLanguage.Hindi; + case LanguageEnum.Hungarian: return DVLanguage.Hungarian; + case LanguageEnum.Italian: return DVLanguage.Italian; + case LanguageEnum.Japanese: return DVLanguage.Japanese; + case LanguageEnum.Korean: return DVLanguage.Korean; + case LanguageEnum.Norwegian: return DVLanguage.Norwegian; + case LanguageEnum.Dutch: return DVLanguage.Dutch; + case LanguageEnum.Polish: return DVLanguage.Polish; + case LanguageEnum.Portuguese: return DVLanguage.Portuguese; + case LanguageEnum.Portuguese_BR: return DVLanguage.Portuguese_BR; + case LanguageEnum.Romanian: return DVLanguage.Romanian; + case LanguageEnum.Russian: return DVLanguage.Russian; + case LanguageEnum.Slovak: return DVLanguage.Slovak; + case LanguageEnum.Swedish: return DVLanguage.Swedish; + case LanguageEnum.Turkish: return DVLanguage.Turkish; + case LanguageEnum.Ukrainian: return DVLanguage.Ukrainian; + case LanguageEnum.Chinese_Simple: return DVLanguage.Chinese_Simple; + case LanguageEnum.Chinese_Trad: return DVLanguage.Chinese_Trad; + default: throw new ArgumentOutOfRangeException(); + } + } + + #endregion } } diff --git a/MapifyEditor/MapifyEditor.csproj b/MapifyEditor/MapifyEditor.csproj index 482daf0e..3690f8d6 100644 --- a/MapifyEditor/MapifyEditor.csproj +++ b/MapifyEditor/MapifyEditor.csproj @@ -20,10 +20,6 @@ - - - - diff --git a/MapifyEditor/Translations/LanguageEnum.cs b/MapifyEditor/Translations/LanguageEnum.cs new file mode 100644 index 00000000..d6c8c42d --- /dev/null +++ b/MapifyEditor/Translations/LanguageEnum.cs @@ -0,0 +1,32 @@ +namespace Mapify.Editor +{ + //must match DVLangHelper.Data.DVLanguage + public enum LanguageEnum + { + English, + Czech, + Danish, + German, + Spanish, + Finnish, + French, + Hindi, + Hungarian, + Italian, + Japanese, + Korean, + Norwegian, + Dutch, + Polish, + Portuguese, + Portuguese_BR, + Romanian, + Russian, + Slovak, + Swedish, + Turkish, + Ukrainian, + Chinese_Simple, + Chinese_Trad + } +} diff --git a/MapifyEditor/Translations/TranslationSet.cs b/MapifyEditor/Translations/TranslationSet.cs index b412e894..2b0c2332 100644 --- a/MapifyEditor/Translations/TranslationSet.cs +++ b/MapifyEditor/Translations/TranslationSet.cs @@ -1,5 +1,4 @@ using System; -using DVLangHelper.Data; using UnityEngine; namespace Mapify.Editor @@ -7,7 +6,7 @@ namespace Mapify.Editor [Serializable] public class TranslationSet { - public DVLanguage language; + public LanguageEnum language; public string translation; public TranslationSetBehaviour ToMonoBehaviour(GameObject gameObject) From c8dfd1c58c3095626620391eca086d789cdd639c Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Fri, 13 Jun 2025 09:42:20 +0200 Subject: [PATCH 13/14] cast language enum --- .../GameContent/StationSetup.cs | 3 +- Mapify/Utils/Extensions.cs | 34 ------------------- 2 files changed, 2 insertions(+), 35 deletions(-) diff --git a/Mapify/SceneInitializers/GameContent/StationSetup.cs b/Mapify/SceneInitializers/GameContent/StationSetup.cs index fefab7d0..44f2e384 100644 --- a/Mapify/SceneInitializers/GameContent/StationSetup.cs +++ b/Mapify/SceneInitializers/GameContent/StationSetup.cs @@ -4,6 +4,7 @@ using DV.Teleporters; using DV.ThingTypes; using DV.Utils; +using DVLangHelper.Data; using HarmonyLib; using Mapify.Editor; using Mapify.Map; @@ -60,7 +61,7 @@ private void SetupStationInfo(Station station, StationController stationControll foreach (var translationSet in station.stationNameTranslations) { - Locale.AddTranslation(locaKey, translationSet.GetLanguageAsDVLanguage(), translationSet.translation); + Locale.AddTranslation(locaKey, (DVLanguage)translationSet.language, translationSet.translation); } } diff --git a/Mapify/Utils/Extensions.cs b/Mapify/Utils/Extensions.cs index 8237c7c9..8faa771b 100644 --- a/Mapify/Utils/Extensions.cs +++ b/Mapify/Utils/Extensions.cs @@ -305,40 +305,6 @@ public static string GetStationLocalizationKey(this Station station) return "station/" + station.stationID; } - public static DVLanguage GetLanguageAsDVLanguage(this TranslationSet languageSet) - { - switch (languageSet.language) - { - case LanguageEnum.English: return DVLanguage.English; - case LanguageEnum.Czech: return DVLanguage.Czech; - case LanguageEnum.Danish: return DVLanguage.Danish; - case LanguageEnum.German: return DVLanguage.German; - case LanguageEnum.Spanish: return DVLanguage.Spanish; - case LanguageEnum.Finnish: return DVLanguage.Finnish; - case LanguageEnum.French: return DVLanguage.French; - case LanguageEnum.Hindi: return DVLanguage.Hindi; - case LanguageEnum.Hungarian: return DVLanguage.Hungarian; - case LanguageEnum.Italian: return DVLanguage.Italian; - case LanguageEnum.Japanese: return DVLanguage.Japanese; - case LanguageEnum.Korean: return DVLanguage.Korean; - case LanguageEnum.Norwegian: return DVLanguage.Norwegian; - case LanguageEnum.Dutch: return DVLanguage.Dutch; - case LanguageEnum.Polish: return DVLanguage.Polish; - case LanguageEnum.Portuguese: return DVLanguage.Portuguese; - case LanguageEnum.Portuguese_BR: return DVLanguage.Portuguese_BR; - case LanguageEnum.Romanian: return DVLanguage.Romanian; - case LanguageEnum.Russian: return DVLanguage.Russian; - case LanguageEnum.Slovak: return DVLanguage.Slovak; - case LanguageEnum.Swedish: return DVLanguage.Swedish; - case LanguageEnum.Turkish: return DVLanguage.Turkish; - case LanguageEnum.Ukrainian: return DVLanguage.Ukrainian; - case LanguageEnum.Chinese_Simple: return DVLanguage.Chinese_Simple; - case LanguageEnum.Chinese_Trad: return DVLanguage.Chinese_Trad; - default: throw new ArgumentOutOfRangeException(); - } - } - - #endregion } } From 2fd70d7a6c6d1563d376a531b7bfc116cde0bcf0 Mon Sep 17 00:00:00 2001 From: t0stiman <18124323+t0stiman@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:03:11 +0200 Subject: [PATCH 14/14] change translator key --- locale.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale.csv b/locale.csv index 1edab247..05fce76b 100644 --- a/locale.csv +++ b/locale.csv @@ -10,4 +10,4 @@ launcher/session_map_not_installed,,The map {[0]} isn't installed! Please instal ,,,,,,,,,,, ,,,,,,,,,,, ,,,,,,,,,,, -Translator:,,Insprill,Tostiman,我叫无聊 My Name Is BorING,我叫无聊 My Name Is BorING,kev & Coookie,tablesidecat02,"Corpet, Louvet & Cie",RaY,Dank_memey,The72 +mapify/translator:,,Insprill,Tostiman,我叫无聊 My Name Is BorING,我叫无聊 My Name Is BorING,kev & Coookie,tablesidecat02,"Corpet, Louvet & Cie",RaY,Dank_memey,The72