Add indexed list of messages.
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
@@ -9,8 +10,9 @@ namespace Claunia.Localization.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Localization
|
public class Localization
|
||||||
{
|
{
|
||||||
readonly ObservableCollection<Message> messages;
|
readonly Dictionary<string, Dictionary<string, string>> indexes;
|
||||||
readonly ObservableCollection<Translator> translators;
|
readonly ObservableCollection<Message> messages;
|
||||||
|
readonly ObservableCollection<Translator> translators;
|
||||||
|
|
||||||
public Localization()
|
public Localization()
|
||||||
{
|
{
|
||||||
@@ -24,6 +26,7 @@ namespace Claunia.Localization.Core
|
|||||||
messages = new ObservableCollection<Message>();
|
messages = new ObservableCollection<Message>();
|
||||||
Messages = new ReadOnlyObservableCollection<Message>(messages);
|
Messages = new ReadOnlyObservableCollection<Message>(messages);
|
||||||
messages.CollectionChanged += OnModified;
|
messages.CollectionChanged += OnModified;
|
||||||
|
indexes = new Dictionary<string, Dictionary<string, string>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Date this localization has been created</summary>
|
/// <summary>Date this localization has been created</summary>
|
||||||
@@ -97,5 +100,31 @@ namespace Claunia.Localization.Core
|
|||||||
Message message = messages.FirstOrDefault(t => t.Id == id);
|
Message message = messages.FirstOrDefault(t => t.Id == id);
|
||||||
return !(message is null) && messages.Remove(message);
|
return !(message is null) && messages.Remove(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Dictionary<string, string> GetIndex(string locale)
|
||||||
|
{
|
||||||
|
// TODO: Plurals
|
||||||
|
if(indexes.TryGetValue(locale, out Dictionary<string, string> existingIndex)) return existingIndex;
|
||||||
|
|
||||||
|
Dictionary<string, string> index = new Dictionary<string, string>();
|
||||||
|
foreach(Message message in messages)
|
||||||
|
{
|
||||||
|
LocalizedString translated = message.Translations.FirstOrDefault(l => l.Locale == locale);
|
||||||
|
|
||||||
|
if(translated is null)
|
||||||
|
{
|
||||||
|
// TODO: Requested "es" but only "es_ES" exists
|
||||||
|
int underscore = locale.IndexOf('_');
|
||||||
|
if(underscore > 0)
|
||||||
|
translated = message.Translations.FirstOrDefault(l => l.Locale == locale.Substring(underscore));
|
||||||
|
}
|
||||||
|
|
||||||
|
index.Add(message.Id, translated is null ? message.Source.Singular : translated.Singular);
|
||||||
|
}
|
||||||
|
|
||||||
|
indexes.Add(locale, index);
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using Claunia.Localization.Parsers;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
|
||||||
namespace Claunia.Localization.Test.gettext
|
namespace Claunia.Localization.Test.gettext
|
||||||
@@ -10,9 +13,14 @@ namespace Claunia.Localization.Test.gettext
|
|||||||
[Test]
|
[Test]
|
||||||
public void Parse()
|
public void Parse()
|
||||||
{
|
{
|
||||||
var testPath = Path.Combine(".", "gettext","es_ES.po");
|
string testPath = Path.Combine(".", "gettext", "es_ES.po");
|
||||||
|
|
||||||
var localization = Claunia.Localization.Parsers.GetText.Parse(testPath, Encoding.GetEncoding("iso8859-1"));
|
Core.Localization localization = GetText.Parse(testPath, Encoding.GetEncoding("iso8859-1"));
|
||||||
|
|
||||||
|
DateTime start = DateTime.UtcNow;
|
||||||
|
Dictionary<string, string> indexed = localization.GetIndex("es_ES");
|
||||||
|
DateTime end = DateTime.UtcNow;
|
||||||
|
TimeSpan elapsed = end - start;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user