Compare commits

...

1 Commits

Author SHA1 Message Date
1a676320b0 WIP 2023-02-06 16:13:58 +01:00
18 changed files with 341 additions and 0 deletions

8
NEG/Localization.meta Normal file
View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ae6126b91ed6cf14d98898d4e2cbce75
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d0f8fd7f245b23d42af02e65d743ed9c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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");
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 7a787e11f9704339b362f95e333b2daf
timeCreated: 1675691755

View 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
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 733193857df9bde4ba34c6b5715d9519
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,7 @@
namespace NEG.Localization
{
public class LocalizationContext
{
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: ce1c159bd9384adea90c1a2103a3fb12
timeCreated: 1675688372

View 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);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 05250c8a035fbdc41a66717ccdd9e694
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View 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();
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b4d51a82fa182b64db93b7057762f8a2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View 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
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 307c41c8e2487e3488480dd4696efaf6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View 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
}

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 9fb3d516715e5574db1dd1f3d557a8ab
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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";
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3640a0fcfb0c4ea89159e0c64e5135b0
timeCreated: 1675474100