WIP
This commit is contained in:
parent
829de37cd6
commit
1a676320b0
8
NEG/Localization.meta
Normal file
8
NEG/Localization.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ae6126b91ed6cf14d98898d4e2cbce75
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
NEG/Localization/Editor.meta
Normal file
8
NEG/Localization/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d0f8fd7f245b23d42af02e65d743ed9c
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
22
NEG/Localization/Editor/LocalizationPreBuild.cs
Normal file
22
NEG/Localization/Editor/LocalizationPreBuild.cs
Normal file
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
NEG/Localization/Editor/LocalizationPreBuild.cs.meta
Normal file
3
NEG/Localization/Editor/LocalizationPreBuild.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7a787e11f9704339b362f95e333b2daf
|
||||||
|
timeCreated: 1675691755
|
||||||
19
NEG/Localization/Editor/NEG.Localization.Editor.asmdef
Normal file
19
NEG/Localization/Editor/NEG.Localization.Editor.asmdef
Normal file
@ -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
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 733193857df9bde4ba34c6b5715d9519
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
7
NEG/Localization/LocalizationContext.cs
Normal file
7
NEG/Localization/LocalizationContext.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace NEG.Localization
|
||||||
|
{
|
||||||
|
public class LocalizationContext
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
3
NEG/Localization/LocalizationContext.cs.meta
Normal file
3
NEG/Localization/LocalizationContext.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ce1c159bd9384adea90c1a2103a3fb12
|
||||||
|
timeCreated: 1675688372
|
||||||
75
NEG/Localization/LocalizationManager.cs
Normal file
75
NEG/Localization/LocalizationManager.cs
Normal file
@ -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<string> 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<string> Languages => languages;
|
||||||
|
|
||||||
|
private static LocalizationManager instance;
|
||||||
|
private List<string> languages;
|
||||||
|
private HashSet<Action<LocalizationProvider>> actions = new();
|
||||||
|
private LocalizationProvider provider;
|
||||||
|
|
||||||
|
public LocalizationManager()
|
||||||
|
{
|
||||||
|
var file = Resources.Load<TextAsset>($"{LanguageResourcePath}/{AvailableLanguagesFile}");
|
||||||
|
var available = JsonConvert.DeserializeObject<AvailableLanguages>(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register action for localization. Always fire provided action
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="action">action to call on localization change</param>
|
||||||
|
public static void Register(Action<LocalizationProvider> action)
|
||||||
|
{
|
||||||
|
if (!Instance.actions.Contains(action))
|
||||||
|
{
|
||||||
|
Instance.actions.Add(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
action.Invoke(Instance.provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unregister action from localization.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="action">action to unregister</param>
|
||||||
|
public static void Unregister(Action<LocalizationProvider> action) => Instance.actions.Remove(action);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
11
NEG/Localization/LocalizationManager.cs.meta
Normal file
11
NEG/Localization/LocalizationManager.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 05250c8a035fbdc41a66717ccdd9e694
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
57
NEG/Localization/LocalizationProvider.cs
Normal file
57
NEG/Localization/LocalizationProvider.cs
Normal file
@ -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<string, string> texts = new();
|
||||||
|
private readonly Dictionary<int, string> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
11
NEG/Localization/LocalizationProvider.cs.meta
Normal file
11
NEG/Localization/LocalizationProvider.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b4d51a82fa182b64db93b7057762f8a2
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
46
NEG/Localization/LocalizedText.cs
Normal file
46
NEG/Localization/LocalizedText.cs
Normal file
@ -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<TMP_Text>();
|
||||||
|
if (tmpText != null)
|
||||||
|
return;
|
||||||
|
text = GetComponent<Text>();
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
11
NEG/Localization/LocalizedText.cs.meta
Normal file
11
NEG/Localization/LocalizedText.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 307c41c8e2487e3488480dd4696efaf6
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
16
NEG/Localization/NEG.Localization.asmdef
Normal file
16
NEG/Localization/NEG.Localization.asmdef
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "NEG.Localization",
|
||||||
|
"rootNamespace": "",
|
||||||
|
"references": [
|
||||||
|
"GUID:6055be8ebefd69e48b49212b09b47b2f"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
7
NEG/Localization/NEG.Localization.asmdef.meta
Normal file
7
NEG/Localization/NEG.Localization.asmdef.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9fb3d516715e5574db1dd1f3d557a8ab
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
27
NEG/Localization/SteamLocalizationHelper.cs
Normal file
27
NEG/Localization/SteamLocalizationHelper.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace NEG.Localization
|
||||||
|
{
|
||||||
|
public static class SteamLocalizationHelper
|
||||||
|
{
|
||||||
|
private static readonly Dictionary<string, string> 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";
|
||||||
|
}
|
||||||
|
}
|
||||||
3
NEG/Localization/SteamLocalizationHelper.cs.meta
Normal file
3
NEG/Localization/SteamLocalizationHelper.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3640a0fcfb0c4ea89159e0c64e5135b0
|
||||||
|
timeCreated: 1675474100
|
||||||
Loading…
x
Reference in New Issue
Block a user