From 1a676320b0adb3440334c08dde3b494a2bca7447 Mon Sep 17 00:00:00 2001 From: Hubert Mattusch Date: Mon, 6 Feb 2023 16:13:58 +0100 Subject: [PATCH] WIP --- NEG/Localization.meta | 8 ++ NEG/Localization/Editor.meta | 8 ++ .../Editor/LocalizationPreBuild.cs | 22 ++++++ .../Editor/LocalizationPreBuild.cs.meta | 3 + .../Editor/NEG.Localization.Editor.asmdef | 19 +++++ .../NEG.Localization.Editor.asmdef.meta | 7 ++ NEG/Localization/LocalizationContext.cs | 7 ++ NEG/Localization/LocalizationContext.cs.meta | 3 + NEG/Localization/LocalizationManager.cs | 75 +++++++++++++++++++ NEG/Localization/LocalizationManager.cs.meta | 11 +++ NEG/Localization/LocalizationProvider.cs | 57 ++++++++++++++ NEG/Localization/LocalizationProvider.cs.meta | 11 +++ NEG/Localization/LocalizedText.cs | 46 ++++++++++++ NEG/Localization/LocalizedText.cs.meta | 11 +++ NEG/Localization/NEG.Localization.asmdef | 16 ++++ NEG/Localization/NEG.Localization.asmdef.meta | 7 ++ NEG/Localization/SteamLocalizationHelper.cs | 27 +++++++ .../SteamLocalizationHelper.cs.meta | 3 + 18 files changed, 341 insertions(+) create mode 100644 NEG/Localization.meta create mode 100644 NEG/Localization/Editor.meta create mode 100644 NEG/Localization/Editor/LocalizationPreBuild.cs create mode 100644 NEG/Localization/Editor/LocalizationPreBuild.cs.meta create mode 100644 NEG/Localization/Editor/NEG.Localization.Editor.asmdef create mode 100644 NEG/Localization/Editor/NEG.Localization.Editor.asmdef.meta create mode 100644 NEG/Localization/LocalizationContext.cs create mode 100644 NEG/Localization/LocalizationContext.cs.meta create mode 100644 NEG/Localization/LocalizationManager.cs create mode 100644 NEG/Localization/LocalizationManager.cs.meta create mode 100644 NEG/Localization/LocalizationProvider.cs create mode 100644 NEG/Localization/LocalizationProvider.cs.meta create mode 100644 NEG/Localization/LocalizedText.cs create mode 100644 NEG/Localization/LocalizedText.cs.meta create mode 100644 NEG/Localization/NEG.Localization.asmdef create mode 100644 NEG/Localization/NEG.Localization.asmdef.meta create mode 100644 NEG/Localization/SteamLocalizationHelper.cs create mode 100644 NEG/Localization/SteamLocalizationHelper.cs.meta diff --git a/NEG/Localization.meta b/NEG/Localization.meta new file mode 100644 index 0000000..0e6a2da --- /dev/null +++ b/NEG/Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ae6126b91ed6cf14d98898d4e2cbce75 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/Editor.meta b/NEG/Localization/Editor.meta new file mode 100644 index 0000000..f7cf298 --- /dev/null +++ b/NEG/Localization/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d0f8fd7f245b23d42af02e65d743ed9c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/Editor/LocalizationPreBuild.cs b/NEG/Localization/Editor/LocalizationPreBuild.cs new file mode 100644 index 0000000..6ea53e7 --- /dev/null +++ b/NEG/Localization/Editor/LocalizationPreBuild.cs @@ -0,0 +1,22 @@ +using System.IO; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using UnityEngine; + +namespace NEG.Localization.Editor +{ + public class LocalizationPreBuild : IPreprocessBuildWithReport + { + public int callbackOrder => 0; + + public void OnPreprocessBuild(BuildReport report) + { + if(!Directory.Exists($"{Application.dataPath}/{LocalizationManager.ResourcesFolderPath}/{LocalizationManager.LanguageResourcePath}")) + { + Debug.LogWarning("No folder for localization, creating"); + + } + Debug.Log("test"); + } + } +} \ No newline at end of file diff --git a/NEG/Localization/Editor/LocalizationPreBuild.cs.meta b/NEG/Localization/Editor/LocalizationPreBuild.cs.meta new file mode 100644 index 0000000..0a2b61e --- /dev/null +++ b/NEG/Localization/Editor/LocalizationPreBuild.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7a787e11f9704339b362f95e333b2daf +timeCreated: 1675691755 \ No newline at end of file diff --git a/NEG/Localization/Editor/NEG.Localization.Editor.asmdef b/NEG/Localization/Editor/NEG.Localization.Editor.asmdef new file mode 100644 index 0000000..3405e0d --- /dev/null +++ b/NEG/Localization/Editor/NEG.Localization.Editor.asmdef @@ -0,0 +1,19 @@ +{ + "name": "NEG.Localization.Editor", + "rootNamespace": "", + "references": [ + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:9fb3d516715e5574db1dd1f3d557a8ab" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/NEG/Localization/Editor/NEG.Localization.Editor.asmdef.meta b/NEG/Localization/Editor/NEG.Localization.Editor.asmdef.meta new file mode 100644 index 0000000..8b6bf79 --- /dev/null +++ b/NEG/Localization/Editor/NEG.Localization.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 733193857df9bde4ba34c6b5715d9519 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/LocalizationContext.cs b/NEG/Localization/LocalizationContext.cs new file mode 100644 index 0000000..936544e --- /dev/null +++ b/NEG/Localization/LocalizationContext.cs @@ -0,0 +1,7 @@ +namespace NEG.Localization +{ + public class LocalizationContext + { + + } +} \ No newline at end of file diff --git a/NEG/Localization/LocalizationContext.cs.meta b/NEG/Localization/LocalizationContext.cs.meta new file mode 100644 index 0000000..30a3509 --- /dev/null +++ b/NEG/Localization/LocalizationContext.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ce1c159bd9384adea90c1a2103a3fb12 +timeCreated: 1675688372 \ No newline at end of file diff --git a/NEG/Localization/LocalizationManager.cs b/NEG/Localization/LocalizationManager.cs new file mode 100644 index 0000000..0d01c6f --- /dev/null +++ b/NEG/Localization/LocalizationManager.cs @@ -0,0 +1,75 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace NEG.Localization +{ + [PublicAPI] + public class LocalizationManager + { + private class AvailableLanguages + { + public List Languages { get; set; } + } + + public const string LanguageResourcePath = "Localization"; + public const string ResourcesFolderPath = "Data/Resources"; + public const string AvailableLanguagesFile = "Languages"; + + public static LocalizationManager Instance => instance ??= new LocalizationManager(); + + public IEnumerable Languages => languages; + + private static LocalizationManager instance; + private List languages; + private HashSet> actions = new(); + private LocalizationProvider provider; + + public LocalizationManager() + { + var file = Resources.Load($"{LanguageResourcePath}/{AvailableLanguagesFile}"); + var available = JsonConvert.DeserializeObject(file.text); + languages = available.Languages; + } + + public void SelectLanguage(string languageCode) + { + if (!languages.Contains(languageCode)) + { + Debug.LogError($"Localization {languageCode} not found in files"); + return; + } + + provider = new LocalizationProvider($"{LanguageResourcePath}/{languageCode}"); + + foreach (var item in actions) + { + item?.Invoke(provider); + } + } + + /// + /// Register action for localization. Always fire provided action + /// + /// action to call on localization change + public static void Register(Action action) + { + if (!Instance.actions.Contains(action)) + { + Instance.actions.Add(action); + } + + action.Invoke(Instance.provider); + } + + /// + /// Unregister action from localization. + /// + /// action to unregister + public static void Unregister(Action action) => Instance.actions.Remove(action); + + } +} \ No newline at end of file diff --git a/NEG/Localization/LocalizationManager.cs.meta b/NEG/Localization/LocalizationManager.cs.meta new file mode 100644 index 0000000..0f6b27b --- /dev/null +++ b/NEG/Localization/LocalizationManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 05250c8a035fbdc41a66717ccdd9e694 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/LocalizationProvider.cs b/NEG/Localization/LocalizationProvider.cs new file mode 100644 index 0000000..c3908b9 --- /dev/null +++ b/NEG/Localization/LocalizationProvider.cs @@ -0,0 +1,57 @@ +using Newtonsoft.Json.Linq; +using System.IO; +using System.Collections.Generic; +using UnityEngine; + +namespace NEG.Localization +{ + public class LocalizationProvider + { + private readonly Dictionary texts = new(); + private readonly Dictionary posToString = new(); + + public LocalizationProvider(string path) + { + + } + + public string GetText(string key) + { + if (texts.TryGetValue(key, out string val)) + { + return val; + } + + return "BAD_" + key; + } + + public string GetText(string key, params LocalizationContext[] contexts) + { + return "BAD_" + key; + } + + internal void RegisterKeys(BinaryReader keysReader) + { + int i = 0; + while (keysReader.BaseStream.Position < keysReader.BaseStream.Length) + { + string read = keysReader.ReadString(); + if (texts.ContainsKey(read)) + Debug.LogWarning($"{read} is already added to localization"); + else + texts.Add(read, ""); + posToString.Add(++i, read); + } + } + + internal void ChangeLanguage(BinaryReader reader) + { + int i = 0; + while (reader.BaseStream.Position < reader.BaseStream.Length) + { + texts[posToString[++i]] = reader.ReadString(); + } + } + } +} + diff --git a/NEG/Localization/LocalizationProvider.cs.meta b/NEG/Localization/LocalizationProvider.cs.meta new file mode 100644 index 0000000..b3a669d --- /dev/null +++ b/NEG/Localization/LocalizationProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b4d51a82fa182b64db93b7057762f8a2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/LocalizedText.cs b/NEG/Localization/LocalizedText.cs new file mode 100644 index 0000000..8640b92 --- /dev/null +++ b/NEG/Localization/LocalizedText.cs @@ -0,0 +1,46 @@ +using System; +using UnityEngine; +using TMPro; +using UnityEngine.UI; + +namespace NEG.Localization +{ + public class LocalizedText : MonoBehaviour + { + [SerializeField] private string key = ""; + [SerializeField] private TMP_Text tmpText; + [SerializeField] private Text text; + + private void Awake() => LocalizationManager.Register(SetText); + + private void OnDestroy() => LocalizationManager.Unregister(SetText); + + private void OnValidate() + { + if (tmpText != null || text != null) + return; + tmpText = GetComponent(); + if (tmpText != null) + return; + text = GetComponent(); + } + + private void SetText(LocalizationProvider ctx) + { + if (text != null) + text.text = ctx.GetText(key); + if (tmpText != null) + tmpText.text = ctx.GetText(key); + } + +#if UNITY_EDITOR + public void SetTextForEditor() + { + if (text != null) + text.text = "_" + key; + if (tmpText != null) + tmpText.text = "_" + key; + } +#endif + } +} \ No newline at end of file diff --git a/NEG/Localization/LocalizedText.cs.meta b/NEG/Localization/LocalizedText.cs.meta new file mode 100644 index 0000000..d63a05f --- /dev/null +++ b/NEG/Localization/LocalizedText.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 307c41c8e2487e3488480dd4696efaf6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/NEG.Localization.asmdef b/NEG/Localization/NEG.Localization.asmdef new file mode 100644 index 0000000..caff7b7 --- /dev/null +++ b/NEG/Localization/NEG.Localization.asmdef @@ -0,0 +1,16 @@ +{ + "name": "NEG.Localization", + "rootNamespace": "", + "references": [ + "GUID:6055be8ebefd69e48b49212b09b47b2f" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/NEG/Localization/NEG.Localization.asmdef.meta b/NEG/Localization/NEG.Localization.asmdef.meta new file mode 100644 index 0000000..d427604 --- /dev/null +++ b/NEG/Localization/NEG.Localization.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9fb3d516715e5574db1dd1f3d557a8ab +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/SteamLocalizationHelper.cs b/NEG/Localization/SteamLocalizationHelper.cs new file mode 100644 index 0000000..d354a73 --- /dev/null +++ b/NEG/Localization/SteamLocalizationHelper.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace NEG.Localization +{ + public static class SteamLocalizationHelper + { + private static readonly Dictionary steamLangMapping = new() + { + { "english", "en" }, + { "polish", "pl" }, + { "spanish", "es" }, + { "german", "de" }, + { "schinese", "zh" }, + { "japanese", "ja" }, + { "french", "fr" }, + { "russian", "ru" }, + { "koreana", "ko" }, + { "italian", "it" }, + { "portuguese", "pt" }, + { "ukrainian", "uk" }, + { "norwegian", "no" }, + { "czech", "cs" } + }; + + public static string MapLanguageFromSteam(string lang) => steamLangMapping.TryGetValue(lang, out string mapped) ? mapped : "en"; + } +} \ No newline at end of file diff --git a/NEG/Localization/SteamLocalizationHelper.cs.meta b/NEG/Localization/SteamLocalizationHelper.cs.meta new file mode 100644 index 0000000..08900d8 --- /dev/null +++ b/NEG/Localization/SteamLocalizationHelper.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3640a0fcfb0c4ea89159e0c64e5135b0 +timeCreated: 1675474100 \ No newline at end of file