diff --git a/Source/Editor/CustomEditors/Dedicated/LocalizationSettingsEditor.cs b/Source/Editor/CustomEditors/Dedicated/LocalizationSettingsEditor.cs index 374b1aacb..6127a3ab7 100644 --- a/Source/Editor/CustomEditors/Dedicated/LocalizationSettingsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/LocalizationSettingsEditor.cs @@ -2,18 +2,24 @@ using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using FlaxEditor.Content.Settings; using FlaxEditor.CustomEditors.Editors; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.GUI; using FlaxEngine.Utilities; +using Object = FlaxEngine.Object; namespace FlaxEditor.CustomEditors.Dedicated { [CustomEditor(typeof(LocalizationSettings))] sealed class LocalizationSettingsEditor : GenericEditor { + private CultureInfo _theMostTranslatedCulture; + private int _theMostTranslatedCultureCount; + /// public override void Initialize(LayoutElementsContainer layout) { @@ -51,12 +57,20 @@ namespace FlaxEditor.CustomEditors.Dedicated var group = layout.Group("Locales"); // Show all existing locales + _theMostTranslatedCulture = null; + _theMostTranslatedCultureCount = -1; foreach (var e in locales) { var culture = new CultureInfo(e.Key); var prop = group.AddPropertyItem(CultureInfoEditor.GetName(culture), culture.NativeName); - int count = e.Sum(x => tableEntries[x].Values.Count(y => y != null && y.Length != 0 && !string.IsNullOrEmpty(y[0]))); - prop.Label(string.Format("Progress: {0}% ({1}/{2})", (int)(((float)count / allKeys.Count * 100.0f)), count, allKeys.Count)); + int count = e.Sum(x => tableEntries[x].Count); + int validCount = e.Sum(x => tableEntries[x].Values.Count(y => y != null && y.Length != 0 && !string.IsNullOrEmpty(y[0]))); + if (count > _theMostTranslatedCultureCount) + { + _theMostTranslatedCulture = culture; + _theMostTranslatedCultureCount = count; + } + prop.Label(string.Format("Progress: {0}% ({1}/{2})", (int)(((float)validCount / allKeys.Count * 100.0f)), validCount, allKeys.Count)); prop.Label("Tables:"); foreach (var table in e) { @@ -69,6 +83,69 @@ namespace FlaxEditor.CustomEditors.Dedicated } group.Space(10); } + + // New locale add button + var addLocale = group.Button("Add Locale..").Button; + addLocale.Height = 16.0f; + addLocale.ButtonClicked += delegate(Button button) + { + var menu = CultureInfoEditor.CreatePicker(null, culture => + { + var displayName = CultureInfoEditor.GetName(culture); + if (locales.Any(x => x.Key == culture.Name)) + { + MessageBox.Show($"Culture '{displayName}' is already added."); + return; + } + Editor.Log($"Adding culture '{displayName}' to localization settings"); + var newTables = settings.LocalizedStringTables.ToList(); + if (_theMostTranslatedCulture != null) + { + // Duplicate localization for culture with the highest amount of keys + var g = locales.First(x => x.Key == _theMostTranslatedCulture.Name); + foreach (var e in g) + { + var path = e.Path; + var filename = Path.GetFileNameWithoutExtension(path); + if (filename.EndsWith(_theMostTranslatedCulture.Name)) + filename = filename.Substring(0, filename.Length - _theMostTranslatedCulture.Name.Length); + path = Path.Combine(Path.GetDirectoryName(path), filename + culture.Name + ".json"); + var table = FlaxEngine.Content.CreateVirtualAsset(); + table.Locale = culture.Name; + var entries = new Dictionary(); + foreach (var ee in tableEntries[e]) + { + var vv = (string[])ee.Value.Clone(); + for (var i = 0; i < vv.Length; i++) + vv[i] = string.Empty; + entries.Add(ee.Key, vv); + } + table.Entries = entries; + if (!table.Save(path)) + { + Object.Destroy(table); + newTables.Add(FlaxEngine.Content.LoadAsync(path)); + } + } + } + else + { + // No localization so initialize with empty table + var path = Path.Combine(Path.Combine(Path.GetDirectoryName(GameSettings.Load().Localization.Path), "Localization", culture.Name + ".json")); + var table = FlaxEngine.Content.CreateVirtualAsset(); + table.Locale = culture.Name; + if (!table.Save(path)) + { + Object.Destroy(table); + newTables.Add(FlaxEngine.Content.LoadAsync(path)); + } + } + settings.LocalizedStringTables = newTables.ToArray(); + Presenter.OnModified(); + RebuildLayout(); + }); + menu.Show(button, new Vector2(0, button.Height)); + }; } {