@OwDafuq

Как изменить локализацию приложения без локали Blazor?

Есть приложение Blazor (если важно, то MAUI).
Делаю свою локализацию через json Файлы (как в ТГ, где можно создать свою локализацию и делиться ей).
Сделал то, что хотел, но не понимаю как обновить текста при изменении локализации в `MyLanguage`.
Json файл:
internal sealed class MyLanguageModel
{
    /// <summary>
    /// Название.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Текста.
    /// </summary>
    public Dictionary<string, string> Texts { get; set; }
}


Свой статичный класс для языка:
internal static class MyLanguage
{
    private static string currentLanguageName = Preferences.Get(nameof(MyLanguage), "Lang.en.json");

    /// <summary>
    /// Текущий язык.
    /// </summary>
    public static string CurrentLanguageName
    {
        get => currentLanguageName;
        set
        {
            if (currentLanguageName != value)
            {
                currentLanguageName = value;
                Preferences.Set(nameof(MyLanguage), value);
            }
        }
    }
}


Фабрика создания IStringLocalizer:
internal sealed class JsonStringLocalizerFactoryImpl : IStringLocalizerFactory
{
    public IStringLocalizer Create(Type resourceSource)
    {
        throw new NotImplementedException();
    }

    public IStringLocalizer Create(string baseName, string location)
    {
        return new JsonStringLocalizerImpl(baseName);
    }
}


JsonStringLocalizerImpl:
internal sealed class JsonStringLocalizerImpl : IStringLocalizer
{
    private MyLanguageModel languageModel;

    public JsonStringLocalizerImpl(string fileName)
    {
        var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Localization", fileName);
        languageModel = JsonSerializer.Deserialize<MyLanguageModel>(File.ReadAllText(path));
    }

    public LocalizedString this[string name]
    {
        get
        {
            if (languageModel.Texts.ContainsKey(name))
            {
                return new LocalizedString(name, languageModel.Texts[name]);
            }
            else
            {
                return new LocalizedString(name, "string not found");
            }
        }
    }
    public LocalizedString this[string name, params object[] arguments]
    {
        get
        {
            if (languageModel.Texts.ContainsKey(name))
            {
                return new LocalizedString(name, string.Format(languageModel.Texts[name], arguments));
            }
            else
            {
                return new LocalizedString(name, "string not found");
            }
        }
    }

    public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures)
    {
        throw new NotImplementedException();
    }
}


И основной IStringLocalizer:
internal sealed class MyStringLocalizerImpl : IStringLocalizer
{
    private readonly IStringLocalizer localizer;

    public MyStringLocalizerImpl(IStringLocalizerFactory localizerFactory)
    {
        localizer = localizerFactory.Create(MyLanguage.CurrentLanguageName, "");
    }

    public LocalizedString this[string name] => localizer.GetString(name);

    public LocalizedString this[string name, params object[] arguments] => localizer.GetString(name, arguments);

    public IEnumerable<LocalizedString> GetAllStrings(bool includeParentCultures)
    {
        throw new NotImplementedException();
    }
}
  • Вопрос задан
  • 67 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы