-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLocalizationController_Initialization.cs
More file actions
120 lines (90 loc) · 4.02 KB
/
LocalizationController_Initialization.cs
File metadata and controls
120 lines (90 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
//Copyright 2024 Daniil Glagolev
//Licensed under the Apache License, Version 2.0
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using DGGLocalization.Data;
using DGGLocalization.Loaders;
using UnityEngine;
[assembly: InternalsVisibleTo("AD_LocalizationEditor"), InternalsVisibleTo("AD_LocalizationEditorXLSX")]
namespace DGGLocalization
{
public static partial class LocalizationController
{
#region Initialization
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void Initialize() => Initialize(Loader.LoadLocalizations());
internal static void Initialize(List<(Localization data, string displayName)> dates)
{
_localizations.Clear();
foreach (var localization in dates) AddLocalization(localization.data);
if (_languages.Length == 0) return;
SwitchLanguage(0);
}
#endregion
#region Add
/// <summary>
/// Add an additional localization package.
/// </summary>
public static void AddLocalization(Localization localization)
{
var languages = _languages.ToList();
foreach (var language in localization.Languages)
{
if (languages.Find(l => l == language) != null) continue;
languages.Add(language);
}
foreach (var data in localization.Localizations)
{
if (!_localizations.ContainsKey(data.LocalizationCode))
{
_localizations[data.LocalizationCode] = data.Data;
continue;
}
var target = _localizations[data.LocalizationCode];
foreach (var languageData in data.Data)
{
if (target.FindIndex(t => t.Language == languageData.Language) != -1)
{
Debug.LogWarning($"Duplicate! {languageData.Language}:{languageData.Localization} ignored!");
continue;
}
target.Add(languageData);
}
}
_languages = languages.ToArray();
if (_languages.Length > 0 && _currentLanguage == null) SwitchLanguage(0);
}
/// <summary>
/// Remove an additional localization package. WARNING: High performance cost, due to the need to enumerate all keys.
/// </summary>
public static void RemoveLocalization(Localization localization)
{
foreach (var data in localization.Localizations)
{
if (!_localizations.TryGetValue(data.LocalizationCode, out var target)) continue;
foreach (var languageData in data.Data)
{
var indexToRemove = target.FindIndex(t => t.Language == languageData.Language);
if (indexToRemove != -1)
{
if (target[indexToRemove].Localization != languageData.Localization) continue;
target.RemoveAt(indexToRemove);
}
}
if (target.Count == 0) _localizations.Remove(data.LocalizationCode);
}
var languages = _languages.ToList();
foreach (var language in localization.Languages)
{
if (_localizations.Values.All(localizationData => localizationData.All(data => data.Language != language)))
{
languages.Remove(language);
}
}
_languages = languages.ToArray();
if (!languages.Contains(_currentLanguage) && languages.Count > 0) SwitchLanguage(0);
}
#endregion
}
}