Skip to content

Commit be24235

Browse files
author
Leszek
committed
📝 Comments added
1 parent 1357540 commit be24235

11 files changed

+137
-63
lines changed

Assets/LocalizationToolkit/Editor/LocalizationManagerEditor.cs

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,59 @@
1-
using UnityEditor;
1+
using System.IO;
2+
using UnityEditor;
23
using UnityEngine;
34

45
[CustomEditor(typeof(LocalizationManager))]
56
public class LocalizationManagerEditor : Editor {
67
private int _selectedIndex = 0;
78

89
public override void OnInspectorGUI() {
10+
GUILayout.BeginVertical();
11+
WebSection();
12+
GUILayout.EndVertical();
13+
14+
GUILayout.Space(20);
15+
16+
GUILayout.BeginVertical();
17+
FileSection();
18+
GUILayout.EndVertical();
19+
20+
GUILayout.Space(20);
21+
22+
GUILayout.BeginVertical();
23+
LanguageSection();
24+
GUILayout.EndVertical();
25+
}
26+
27+
// Draw GUI for fetch file from WWW
28+
private void WebSection()
29+
{
930
LocalizationManager localizationManager = (LocalizationManager)target;
1031
localizationManager.fileURL = EditorGUILayout.TextField("File URL: ", localizationManager.fileURL);
1132
if (GUILayout.Button("Load from web"))
1233
{
1334
localizationManager.LoadFromWeb(localizationManager.fileURL);
1435
}
36+
}
1537

16-
GUILayout.Space(20);
17-
18-
GUILayout.BeginHorizontal();
38+
// Draw GUI for fetch file from local storage
39+
private void FileSection()
40+
{
41+
LocalizationManager localizationManager = (LocalizationManager)target;
1942
localizationManager.fileName = EditorGUILayout.TextField("File name", localizationManager.fileName);
2043
localizationManager.extension = (AvailableExtensions)EditorGUILayout.EnumPopup(localizationManager.extension);
21-
GUILayout.EndHorizontal();
22-
2344
if (GUILayout.Button("Load local file"))
2445
{
25-
localizationManager.LoadFromFile(localizationManager.fileName, localizationManager.extension);
46+
string filepath = Path.Combine(Application.streamingAssetsPath, localizationManager.fileName + "." + localizationManager.extension.ToString().ToLower());
47+
localizationManager.LoadFromFile(filepath, localizationManager.extension);
2648
}
49+
}
2750

28-
GUILayout.Space(20);
29-
51+
// Draw GUI for load language
52+
private void LanguageSection()
53+
{
54+
LocalizationManager localizationManager = (LocalizationManager)target;
3055
string[] languagesToShow = localizationManager.GetAvailableLanguages();
31-
if (languagesToShow != null)
56+
if (languagesToShow != null && languagesToShow.Length > 0)
3257
{
3358
GUILayout.Label("Select language");
3459
_selectedIndex = EditorGUILayout.Popup(_selectedIndex, languagesToShow);

Assets/LocalizationToolkit/Editor/LocalizationWindowEditor.cs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
using Formatting = Newtonsoft.Json.Formatting;
1212

1313
public class LocalizationWindowEditor : EditorWindow {
14-
public LocalizationData localizationData;
14+
public LocalizationData localizationData = new LocalizationData();
1515
private string defaultLangName = "default";
1616
private string defaultKeyName = "NEW_KEY";
1717
private float removeButtonWidth = 50;
@@ -66,11 +66,11 @@ private void OnGUI() {
6666
CreateNewData();
6767
}
6868

69-
if (localizationData != null && localizationData.languages != null)
69+
if (localizationData.languages.Count > 0)
7070
{
7171
if (GUILayout.Button("Save data"))
7272
{
73-
SaveGameData();
73+
SaveToFile();
7474
}
7575

7676
GUILayout.Space(15);
@@ -381,33 +381,34 @@ private void LoadFromFile() {
381381

382382
private void LoadJSONFile(string data)
383383
{
384-
Dictionary<string, Dictionary<string, string>> objData = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(data);
385-
localizationData = new LocalizationData(objData);
384+
localizationData= JsonConvert.DeserializeObject<LocalizationData>(data);
386385
}
387386

388387
private void LoadXMLFile(string data) {
389388
XDocument xmlDocument = XDocument.Parse(data);
390389
localizationData = new LocalizationData(xmlDocument);
391390
}
392391

393-
private void SaveGameData() {
392+
private void SaveToFile() {
394393
string filePath = EditorUtility.SaveFilePanel("Save localization data file", Application.streamingAssetsPath, "", extension.ToString().ToLower());
395394
if (!string.IsNullOrEmpty(filePath))
396395
{
397-
if (extension == AvailableExtensions.json)
398-
{
399-
SaveJSONFile(filePath);
400-
}
401-
else if (extension == AvailableExtensions.xml)
396+
switch (extension)
402397
{
403-
SaveXMLFile(filePath);
398+
case AvailableExtensions.json:
399+
SaveJSONFile(filePath);
400+
break;
401+
case AvailableExtensions.xml:
402+
SaveXMLFile(filePath);
403+
break;
404+
404405
}
405406
}
406407
}
407408

408409
private void SaveJSONFile(string filePath)
409410
{
410-
var json = JsonConvert.SerializeObject(localizationData.languages, Formatting.Indented);
411+
var json = JsonConvert.SerializeObject(localizationData, Formatting.Indented);
411412
File.WriteAllText(filePath, json);
412413
}
413414

0 Bytes
Binary file not shown.

Assets/LocalizationToolkit/Scripts/DropdownChange.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@
33
using UnityEngine.UI;
44

55
public class DropdownChange : MonoBehaviour {
6+
// UI Dropdown Component
67
private Dropdown _dropdown;
78

89
private void Start() {
10+
// Load component
911
_dropdown = GetComponent<Dropdown>();
12+
13+
// Init language selection
1014
InitLanguageSelection();
1115
}
1216

1317
/// <summary>Fetch available languages</summary>
1418
private void InitLanguageSelection() {
19+
// Check if the component exists
1520
if (_dropdown) {
1621
_dropdown.options.Clear();
1722

23+
// fetch available languages
1824
List<Dropdown.OptionData> options = new List<Dropdown.OptionData>();
1925
string[] languages = LocalizationManager.instance.GetAvailableLanguages();
2026
if (languages != null)
@@ -23,7 +29,11 @@ private void InitLanguageSelection() {
2329
{
2430
options.Add(new Dropdown.OptionData(languages[i]));
2531
}
32+
33+
// Add available options to dropdown component
2634
_dropdown.AddOptions(options);
35+
36+
// Assign listener
2737
_dropdown.onValueChanged.AddListener(ChangeLanguage);
2838
}
2939
}

Assets/LocalizationToolkit/Scripts/LocalizationData.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
[System.Serializable]
66
public class LocalizationData
77
{
8-
public Dictionary<string, Dictionary<string, string>> languages;
8+
public Dictionary<string, Dictionary<string, string>> languages = new Dictionary<string, Dictionary<string, string>>();
99
private string xmlRootNode = "translations";
1010

1111
public LocalizationData() {

Assets/LocalizationToolkit/Scripts/LocalizationManager.cs

Lines changed: 23 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,31 @@
11
using System;
22
using System.Collections.Generic;
33
using System.IO;
4+
using System.Text;
5+
using System.Xml;
46
using System.Xml.Linq;
57
using UnityEngine;
68
using Newtonsoft.Json;
9+
using Formatting = Newtonsoft.Json.Formatting;
710

811
public enum AvailableExtensions { json, xml };
912

1013
[ExecuteInEditMode]
11-
public class LocalizationManager : MonoBehaviour {
12-
public static LocalizationManager instance;
14+
public class LocalizationManager : MonoBehaviourSingleton<LocalizationManager> {
1315
public static event Action OnLanguageChanged;
1416

1517
public string fileURL = "";
16-
public string fileName;
18+
public string fileName = "";
1719
public AvailableExtensions extension;
1820

19-
private LocalizationData _currentLocalizationData;
21+
private LocalizationData currentLocalizationData;
2022
private Dictionary<string, string> _currentlanguageTranslations;
2123
private string _missingTextString = "Localized text not found";
2224
private string _defaultLanguage = "default";
2325
private string _selectedLanguage = "";
2426

25-
private void Awake() {
26-
if (instance == null)
27-
{
28-
instance = this;
29-
}
30-
else if (instance != this)
31-
{
32-
Destroy(gameObject);
33-
}
27+
protected override void Awake() {
28+
base.Awake();
3429

3530
// Auto load
3631
if (fileURL.Trim().Length > 0)
@@ -39,24 +34,24 @@ private void Awake() {
3934
}
4035
else if (fileName.Trim().Length > 0)
4136
{
42-
LoadFromFile(fileName, extension);
37+
string filepath = Path.Combine(Application.streamingAssetsPath, fileName + "." + extension.ToString().ToLower());
38+
LoadFromFile(filepath, extension);
4339
}
4440
}
4541

4642
/// <summary>Load file from local</summary>
47-
/// <param name="filename">filename</param>
43+
/// <param name="filepath">filepath</param>
4844
/// /// <param name="extension">extension</param>
49-
public void LoadFromFile(string filename, AvailableExtensions extension) {
50-
string filePath = Path.Combine(Application.streamingAssetsPath, fileName + "." + extension.ToString().ToLower());
45+
public void LoadFromFile(string filepath, AvailableExtensions extension) {
5146
try
5247
{
53-
string rawData = File.ReadAllText(filePath);
54-
_currentLocalizationData = LoadLocalizationData(rawData, extension);
48+
string rawData = File.ReadAllText(filepath);
49+
currentLocalizationData = LoadLocalizationData(rawData, extension);
5550
LoadLanguage(_defaultLanguage);
5651
}
5752
catch (Exception e)
5853
{
59-
Debug.LogError("Cannot find file at: " + filePath);
54+
Debug.LogError("Cannot find file at: " + filepath);
6055
}
6156
}
6257

@@ -75,7 +70,7 @@ public void LoadFromWeb(string url) {
7570
}
7671

7772
AvailableExtensions currentExtension = (AvailableExtensions)Enum.Parse(typeof(AvailableExtensions), ext);
78-
_currentLocalizationData = LoadLocalizationData(data, currentExtension);
73+
currentLocalizationData = LoadLocalizationData(data, currentExtension);
7974
LoadLanguage(_defaultLanguage);
8075
}
8176

@@ -87,9 +82,8 @@ private LocalizationData LoadLocalizationData(string rawData, AvailableExtension
8782
switch (extension)
8883
{
8984
case AvailableExtensions.json:
90-
Dictionary<string, Dictionary<string, string>> jsonData = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(rawData);
91-
localizationData = new LocalizationData(jsonData);
92-
localizationData.SaveLocalizationDataToJSON();
85+
localizationData = JsonConvert.DeserializeObject<LocalizationData>(rawData);
86+
9387
break;
9488
case AvailableExtensions.xml:
9589
XDocument xmlDocument = XDocument.Parse(rawData);
@@ -102,8 +96,8 @@ private LocalizationData LoadLocalizationData(string rawData, AvailableExtension
10296
/// <summary>Load language Data</summary>
10397
/// <param name="langKey">Language Key</param>
10498
public void LoadLanguage(string langKey) {
105-
_selectedLanguage = _currentLocalizationData.languages.ContainsKey(langKey) ? langKey : _defaultLanguage;
106-
_currentlanguageTranslations = _currentLocalizationData.languages[_selectedLanguage];
99+
_selectedLanguage = currentLocalizationData.languages.ContainsKey(langKey) ? langKey : _defaultLanguage;
100+
_currentlanguageTranslations = currentLocalizationData.languages[_selectedLanguage];
107101
if (OnLanguageChanged != null)
108102
OnLanguageChanged();
109103
}
@@ -127,18 +121,17 @@ public string GetLocalizedValue(string key) {
127121
public string[] GetAvailableLanguages() {
128122
if (IsDataEmpty())
129123
return null;
130-
131-
return new List<string>(_currentLocalizationData.languages.Keys).ToArray();
124+
return new List<string>(currentLocalizationData.languages.Keys).ToArray();
132125
}
133126

134127
/// <summary>Get All Keys</summary>
135128
public string[] GetKeys() {
136129
if (IsDataEmpty())
137130
return null;
138-
return new List<string>(_currentLocalizationData.languages[_defaultLanguage].Keys).ToArray();
131+
return new List<string>(currentLocalizationData.languages[_defaultLanguage].Keys).ToArray();
139132
}
140133

141134
private bool IsDataEmpty() {
142-
return _currentLocalizationData == null || _currentLocalizationData.languages == null;
135+
return currentLocalizationData == null || currentLocalizationData.languages == null;
143136
}
144137
}

Assets/LocalizationToolkit/Scripts/LocalizedText.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
[RequireComponent(typeof(Text))]
55
public class LocalizedText : MonoBehaviour {
6+
// key by which the translation is searched for
67
public string key;
7-
private Text _myText;
8+
private Text _textComponent;
89

910
private void Awake() {
10-
_myText = GetComponent<Text>();
11+
_textComponent = GetComponent<Text>();
1112
RefreshText();
1213
LocalizationManager.OnLanguageChanged += RefreshText;
1314
}
@@ -16,8 +17,8 @@ private void OnDestroy() {
1617
LocalizationManager.OnLanguageChanged -= RefreshText;
1718
}
1819

19-
/// <summary>Refresh text</summary>
20+
/// <summary>Refresh text component</summary>
2021
private void RefreshText() {
21-
_myText.text = LocalizationManager.instance.GetLocalizedValue(key);
22+
_textComponent.text = LocalizationManager.instance.GetLocalizedValue(key);
2223
}
2324
}

Assets/LocalizationToolkit/Scripts/Patterns.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using UnityEngine;
2+
3+
// A MonoBehaviour-based singleton for use at runtime. Add to a single 'global' scene.
4+
// Note: OnEnable() / OnDisable() should be used to register with any global events
5+
// to properly support domain reloads.
6+
public class MonoBehaviourSingleton<T> : MonoBehaviour
7+
where T : MonoBehaviourSingleton<T>
8+
{
9+
// The singleton instance.
10+
public static T instance => _instance != null ? _instance :
11+
Application.isPlaying ? _instance = FindObjectOfType<T>() : null;
12+
static T _instance;
13+
14+
// Called when the instance is created.
15+
protected virtual void Awake()
16+
{
17+
// Verify there is not more than one instance and assign _instance.
18+
Debug.Assert( _instance == null || _instance == this,
19+
"More than one singleton instance instantiated!", this );
20+
_instance = ( T )this;
21+
}
22+
23+
// Clear the instance field when destroyed.
24+
protected virtual void OnDestroy() => _instance = null;
25+
}

Assets/LocalizationToolkit/Scripts/Patterns/MonoBehaviourSingleton.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)