Compare commits
1 Commits
main
...
localizati
| Author | SHA1 | Date | |
|---|---|---|---|
| 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