Есть приложение 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();
}
}