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.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
@@ -9,8 +10,9 @@ namespace Claunia.Localization.Core
/// </summary>
public class Localization
{
readonly ObservableCollection<Message> messages;
readonly ObservableCollection<Translator> translators;
readonly Dictionary<string, Dictionary<string, string>> indexes;
readonly ObservableCollection<Message> messages;
readonly ObservableCollection<Translator> translators;
public Localization()
{
@@ -24,6 +26,7 @@ namespace Claunia.Localization.Core
messages = new ObservableCollection<Message>();
Messages = new ReadOnlyObservableCollection<Message>(messages);
messages.CollectionChanged += OnModified;
indexes = new Dictionary<string, Dictionary<string, string>>();
}
/// <summary>Date this localization has been created</summary>
@@ -97,5 +100,31 @@ namespace Claunia.Localization.Core
Message message = messages.FirstOrDefault(t => t.Id == id);
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.Text;
using Claunia.Localization.Parsers;
using NUnit.Framework;
namespace Claunia.Localization.Test.gettext
@@ -10,9 +13,14 @@ namespace Claunia.Localization.Test.gettext
[Test]
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;
}
}
}