Add autocomplete based on language identifier

Signed-off-by: Nikolay Kochulin <porez0xfeedface@gmail.com>
This commit is contained in:
Nikolay Kochulin 2019-04-24 21:42:06 +03:00
parent 8322f4f871
commit 79e78f41c5
5 changed files with 36 additions and 1 deletions

View File

@ -48,7 +48,18 @@ namespace JetKarmaBot.Commands
if (Locale.ContainsLocale(cmd.Parameters[0]))
localeId = cmd.Parameters[0];
else
try
{
localeId = Locale.FindByCommonName(cmd.Parameters[0]).Name;
}
catch (LocalizationException e)
{
Client.SendTextMessageAsync(
args.Message.Chat.Id,
currentLocale["jetkarmabot.changelocale.toomany"] + "\n" + string.Join("\n", (e.Data["LocaleNames"] as Locale[]).Select(x => x.Name)),
replyToMessageId: args.Message.MessageId);
return true;
}
db.Chats.Find(args.Message.Chat.Id).Locale = localeId;
log.Debug($"Changed language of chat {args.Message.Chat.Id} to {localeId}");
db.SaveChanges();

View File

@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using Newtonsoft.Json.Linq;
using NLog;
using Perfusion;
@ -67,6 +68,16 @@ namespace JetKarmaBot
return l;
}
}
// Try to find as locale prefix
IEnumerable<Locale> matchinglocales = locales.Values.Where(x => x.Name.StartsWith(name + "-"));
if (matchinglocales.Count() > 1)
{
LocalizationException l = new LocalizationException("Too many locales");
l.Data["LocaleNames"] = matchinglocales.ToArray();
throw l;
}
else if (matchinglocales.Count() == 1)
return matchinglocales.First();
log.Warn("Failed to find locale " + name);
return null;
}
@ -148,4 +159,14 @@ namespace JetKarmaBot
return ((IReadOnlyDictionary<string, string>)locale).GetEnumerator();
}
}
[System.Serializable]
public class LocalizationException : Exception
{
public LocalizationException() { }
public LocalizationException(string message) : base(message) { }
public LocalizationException(string message, Exception inner) : base(message, inner) { }
protected LocalizationException(
SerializationInfo info,
StreamingContext context) : base(info, context) { }
}
}

View File

@ -26,6 +26,7 @@
"jetkarmabot.changelocale.listalltext": "Я ведаю:",
"jetkarmabot.changelocale.errorall": "Мне б хацелася гаварыць на ўсіх мовах у той жа самы час, але з-за абмежаванняў сусвету, мне гэта не дазваляецца.",
"jetkarmabot.changelocale.beforenote": "Увага: ",
"jetkarmabot.changelocale.toomany": "Не ведаю, на якім дыялекце хочаш, каб я казаў.\nЯ ведаю гэтыя:",
"jetkarmabot.changelocale.help": "Змяняе мову, на якім бот кажа ў гэтым чаце",
"jetkarmabot.changelocale.localehelp": "Новая лакаль, альбо каманда list - спіс перакладаў. Калі пуста - паказваецца бягучая лакаль.",
"jetkarmabot.help.help": "Паказвае інструкцыю да каманды, ці спіс каманд.",

View File

@ -25,6 +25,7 @@
"jetkarmabot.changelocale.listalltext": "I know:",
"jetkarmabot.changelocale.errorall": "I would like to speak all languages at once, but because of the rules of the universe, I am not allowed to do that.",
"jetkarmabot.changelocale.beforenote": "Warning: ",
"jetkarmabot.changelocale.toomany": "I don't know what dialect you want me to speak in.\nI know these:",
"jetkarmabot.changelocale.help": "Switches current chat locale to [locale]",
"jetkarmabot.changelocale.localehelp": "The locale to switch to. Can be \"list\" to list all possible locales. Also can be empty to get current locale",
"jetkarmabot.help.help": "Displays help text for all(one) command(s)",

View File

@ -25,6 +25,7 @@
"jetkarmabot.changelocale.listalltext": "Я знаю:",
"jetkarmabot.changelocale.errorall": "Мне бы хотелось говорить на всех языках в то же самое время, но из-за ограничений вселенной, мне это не позволяется.",
"jetkarmabot.changelocale.beforenote": "Внимание: ",
"jetkarmabot.changelocale.toomany": "Не знаю, на каком диалекте хочешь, чтобы я говорил.\nЯ знаю эти:",
"jetkarmabot.changelocale.help": "Меняет язык, на котором бот говорит в этом чате",
"jetkarmabot.changelocale.localehelp": "Новая локаль, либо команда list - список переводов. Если пусто - показывается текущая локаль.",
"jetkarmabot.help.help": "Показывает инструкцию к команде, или список команд.",