Add indexed list of messages.

This commit is contained in:
2019-05-24 01:12:54 +01:00
parent 868f202be5
commit 040e1fccf4
2 changed files with 41 additions and 4 deletions

View File

@@ -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;
}
} }
} }

View File

@@ -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;
} }
} }
} }