From 6ae01f763c810ff829703e6cc6a5ecbc82d21c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Osi=C5=84ski?= Date: Mon, 20 Feb 2023 23:45:01 +0100 Subject: [PATCH] new localization interface draft --- NEG/Localization.meta | 8 +++ NEG/Localization/Language.cs | 18 ++++++ NEG/Localization/Language.cs.meta | 3 + NEG/Localization/LocalizationContext.cs | 63 ++++++++++++++++++++ NEG/Localization/LocalizationContext.cs.meta | 3 + NEG/Localization/LocalizationManager.cs | 49 +++++++++++++++ NEG/Localization/LocalizationManager.cs.meta | 3 + NEG/Localization/Translation.cs | 26 ++++++++ NEG/Localization/Translation.cs.meta | 3 + 9 files changed, 176 insertions(+) create mode 100644 NEG/Localization.meta create mode 100644 NEG/Localization/Language.cs create mode 100644 NEG/Localization/Language.cs.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/Translation.cs create mode 100644 NEG/Localization/Translation.cs.meta diff --git a/NEG/Localization.meta b/NEG/Localization.meta new file mode 100644 index 0000000..495fd9d --- /dev/null +++ b/NEG/Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e37f36b09b24be54ea4e03cc602bbd59 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/NEG/Localization/Language.cs b/NEG/Localization/Language.cs new file mode 100644 index 0000000..3c8d58c --- /dev/null +++ b/NEG/Localization/Language.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using System.Collections.Generic; + +namespace BEG.Localization +{ + public class Language + { + [PublicAPI] + public readonly string Name; + + private Dictionary translations = new (); + + public ITranslation GetTranslation(string key) => translations[key]; + public void AddTranslation(ITranslation translation) => translations.Add(translation.Key, translation); + + public ITranslation this[string key] => GetTranslation(key); + } +} \ No newline at end of file diff --git a/NEG/Localization/Language.cs.meta b/NEG/Localization/Language.cs.meta new file mode 100644 index 0000000..4d70b5b --- /dev/null +++ b/NEG/Localization/Language.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 2755a88e374448688202c15c2d67777c +timeCreated: 1675712587 \ No newline at end of file diff --git a/NEG/Localization/LocalizationContext.cs b/NEG/Localization/LocalizationContext.cs new file mode 100644 index 0000000..3abe16a --- /dev/null +++ b/NEG/Localization/LocalizationContext.cs @@ -0,0 +1,63 @@ +using JetBrains.Annotations; +using System; +using System.Collections; +using System.Collections.Generic; + +namespace BEG.Localization +{ + public class LocalizationContext + { + public interface IParam + { + [PublicAPI] public event Action OnValueChanged; + } + + public class Param: IParam + { + public event Action OnValueChanged; + + [PublicAPI] + public T Value + { + get => value; + set + { + OnValueChanged?.Invoke(); + this.value = value; + } + } + + [NotNull] private readonly Func formatter; + private T value; + + public Param(T value, Func formatter) + { + this.formatter = formatter ?? (v => v.ToString()); + Value = value; + } + + public override string ToString() => formatter(value); + } + + private Dictionary parameters = new (); + + public void SetParam(string name, IParam param) + { + if (parameters.ContainsKey(name)) + parameters[name] = param; + else + parameters.Add(name, param); + } + + public void RemoveParam(string name) => parameters.Remove(name); + public IParam GetParam(string name) => parameters[name]; + + public void ClearParams() => parameters.Clear(); + + public IParam this[string name] + { + get => GetParam(name); + set => SetParam(name, value); + } + } +} \ 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..90ebb09 --- /dev/null +++ b/NEG/Localization/LocalizationContext.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 19a01d756a5548e7ab1e357fee9dc8b6 +timeCreated: 1675712674 \ No newline at end of file diff --git a/NEG/Localization/LocalizationManager.cs b/NEG/Localization/LocalizationManager.cs new file mode 100644 index 0000000..98a7f0e --- /dev/null +++ b/NEG/Localization/LocalizationManager.cs @@ -0,0 +1,49 @@ +using JetBrains.Annotations; +using System; +using System.Collections.Generic; + +namespace BEG.Localization +{ + public class LocalizationManager + { + public event Action OnLanguageChanged; + + public string CurrentLanguage + { + get => currentLanguage?.Name ?? ""; + set + { + currentLanguage = languages[value]; + OnLanguageChanged?.Invoke(); + } + } + + public readonly LocalizationContext GlobalContext = new (); + + private readonly Dictionary languages = new (); + private Language currentLanguage; + + [PublicAPI] + public void AddLanguage(Language language) => languages.Add(language.Name, language); + + [PublicAPI] + public ITranslation GetTranslation(string key) => + currentLanguage.GetTranslation(key); + + [PublicAPI] public Action Translate(string key, Action action, params LocalizationContext[] contexts) + { + void Update() + { + if (currentLanguage == null) return; + + var translation = currentLanguage.GetTranslation(key); + translation.Get(action, currentLanguage, contexts); + } + + Update(); + OnLanguageChanged += Update; + + return () => OnLanguageChanged -= Update; + } + } +} \ 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..e6ee883 --- /dev/null +++ b/NEG/Localization/LocalizationManager.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1544626d93fa411ea713f77d68a831ae +timeCreated: 1675712650 \ No newline at end of file diff --git a/NEG/Localization/Translation.cs b/NEG/Localization/Translation.cs new file mode 100644 index 0000000..3281a77 --- /dev/null +++ b/NEG/Localization/Translation.cs @@ -0,0 +1,26 @@ +using JetBrains.Annotations; +using System; + +namespace BEG.Localization +{ + public interface ITranslation + { + [PublicAPI] string Key { get; } + + [PublicAPI] void Get(Action action, Language language, params LocalizationContext[] contexts); + } + + public class SimpleTranslation: ITranslation + { + public string Key { get; } + public void Get(Action action, Language language, params LocalizationContext[] contexts) => action?.Invoke(value); + + private readonly string value; + + public SimpleTranslation(string key, string value) + { + Key = key; + this.value = value; + } + } +} \ No newline at end of file diff --git a/NEG/Localization/Translation.cs.meta b/NEG/Localization/Translation.cs.meta new file mode 100644 index 0000000..d20bc38 --- /dev/null +++ b/NEG/Localization/Translation.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 64ea16abf71b4c36ac03e0b14ef33e1f +timeCreated: 1675712656 \ No newline at end of file