* Request headers (#2394) * add support for per-request headers * remove unnecessary usings * Revert "remove unnecessary usings" This reverts commit 8d674fe4faf985b117f143fae3877a1698170ad2. * remove nullable strings from RequestOptions * Add Localization Support to Interaction Service (#2211) * add json and resx localization managers * add utils class for getting command paths * update json regex to make langage code optional * remove IServiceProvider from ILocalizationManager method params * replace the command path method in command map * add localization fields to rest and websocket application command entity implementations * move deconstruct extensions method to extensions folder * add withLocalizations parameter to rest methods * fix build error * add rest conversions to interaction service * add localization to the rest methods * add inline docs * fix implementation bugs * add missing inline docs * inline docs correction (Name/Description Localized properties) * add choice localization * fix conflicts * fix conflicts * add missing command props fields to ToApplicationCommandProps methods * add locale parameter to Get*ApplicationCommandsAsync methods for fetching localized command names/descriptions * Apply suggestions from code review Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> * Update src/Discord.Net.Core/Entities/Guilds/IGuild.cs Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> * add inline docs to LocalizationTarget * fix upstream merge errors * fix command parsing for context command names with space char * fix command parsing for context command names with space char * fix failed to generate buket id * fix get guild commands endpoint * update rexs localization manager to use single-file pattern * Upstream Merge Localization Branch (#2434) * fix ci/cd error (#2428) * Fix role icon & emoji assignment. (#2416) * Fix IGuild.GetBansAsync() (#2424) fix the problem of not being able to get more than 1000 bans * [DOCS] Add a note about `DontAutoRegisterAttribute` (#2430) * add a note about `DontAutoRegisterAttribute` * Remove "to to" and add punctuation Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> * fix: Missing Fact attribute in ColorTests (#2425) * feat: Embed comparison (#2347) * Fix broken code snippet in dependency injection docs (#2420) * Fixed markdown formatting to show code snippet * Fixed constructor injection code snippet pointer * Added support for lottie stickers (#2359) Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Co-authored-by: BokuNoPasya <49203428+1NieR@users.noreply.github.com> Co-authored-by: Misha133 <61027276+Misha-133@users.noreply.github.com> Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Co-authored-by: Ge <gehongyan1996@126.com> Co-authored-by: Charlie U <52503242+cpurules@users.noreply.github.com> Co-authored-by: Kuba_Z2 <77853483+KubaZ2@users.noreply.github.com> * remove unnecassary fields from ResxLocalizationManager * update int framework guides * remove space character tokenization from ResxLocalizationManager Co-authored-by: Armano den Boef <68127614+Rozen4334@users.noreply.github.com> Co-authored-by: BokuNoPasya <49203428+1NieR@users.noreply.github.com> Co-authored-by: Misha133 <61027276+Misha-133@users.noreply.github.com> Co-authored-by: MrCakeSlayer <13650699+MrCakeSlayer@users.noreply.github.com> Co-authored-by: Ge <gehongyan1996@126.com> Co-authored-by: Charlie U <52503242+cpurules@users.noreply.github.com> Co-authored-by: Kuba_Z2 <77853483+KubaZ2@users.noreply.github.com>
73 lines
2.6 KiB
C#
73 lines
2.6 KiB
C#
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Discord.Interactions
|
|
{
|
|
/// <summary>
|
|
/// The default localization provider for Json resource files.
|
|
/// </summary>
|
|
public sealed class JsonLocalizationManager : ILocalizationManager
|
|
{
|
|
private const string NameIdentifier = "name";
|
|
private const string DescriptionIdentifier = "description";
|
|
private const string SpaceToken = "~";
|
|
|
|
private readonly string _basePath;
|
|
private readonly string _fileName;
|
|
private readonly Regex _localeParserRegex = new Regex(@"\w+.(?<locale>\w{2}(?:-\w{2})?).json", RegexOptions.Compiled | RegexOptions.Singleline);
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="JsonLocalizationManager"/> class.
|
|
/// </summary>
|
|
/// <param name="basePath">Base path of the Json file.</param>
|
|
/// <param name="fileName">Name of the Json file.</param>
|
|
public JsonLocalizationManager(string basePath, string fileName)
|
|
{
|
|
_basePath = basePath;
|
|
_fileName = fileName;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public IDictionary<string, string> GetAllDescriptions(IList<string> key, LocalizationTarget destinationType) =>
|
|
GetValues(key, DescriptionIdentifier);
|
|
|
|
/// <inheritdoc />
|
|
public IDictionary<string, string> GetAllNames(IList<string> key, LocalizationTarget destinationType) =>
|
|
GetValues(key, NameIdentifier);
|
|
|
|
private string[] GetAllFiles() =>
|
|
Directory.GetFiles(_basePath, $"{_fileName}.*.json", SearchOption.TopDirectoryOnly);
|
|
|
|
private IDictionary<string, string> GetValues(IList<string> key, string identifier)
|
|
{
|
|
var result = new Dictionary<string, string>();
|
|
var files = GetAllFiles();
|
|
|
|
foreach (var file in files)
|
|
{
|
|
var match = _localeParserRegex.Match(Path.GetFileName(file));
|
|
if (!match.Success)
|
|
continue;
|
|
|
|
var locale = match.Groups["locale"].Value;
|
|
|
|
using var sr = new StreamReader(file);
|
|
using var jr = new JsonTextReader(sr);
|
|
var obj = JObject.Load(jr);
|
|
var token = string.Join(".", key.Select(x => $"['{x}']")) + $".{identifier}";
|
|
var value = (string)obj.SelectToken(token);
|
|
if (value is not null)
|
|
result[locale] = value;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|