【问题标题】:ASP. net core localization with resoucrce data in databaseASP。使用数据库中的资源数据进行网络核心本地化
【发布时间】:2020-06-11 14:13:10
【问题描述】:

我有一个正在升级到 asp.net core mvc 的 asp.net webforms 应用程序。 当前的 webforms 应用程序支持本地化,所有资源数据都在 数据库表。我正在为 mvc 应用程序进行本地化并希望重用我的数据库 存储本地化资源文件信息。

Loalization.sqlLocalizer(nuget包)https://localizationsqllocalizer.readthedocs.io/en/latest/据我了解是需要使用包定义的数据库结构,不可自定义。

我可以查看哪些其他选项或指针以在 MVC 中实现此功能?

【问题讨论】:

  • 检查this tool,它提供基于db、xml等的本地化,支持在线翻译和自动资源创建。
  • 嗨,我和你在同一个地方。我很想知道你们是如何实施本地化的?

标签: asp.net-mvc asp.net-mvc-4 asp.net-core model-view-controller localization


【解决方案1】:

首先,您需要将您的语言和字符串资源存储在数据库中。

  • Languages 表可以包含 Id、Name 和 Culture 列。
  • StringResources 表可以有 Id、Name、Value 和 LanguageId 列。

接下来,生成与这些数据库表相关的 EF Core 实体。

这是一个语言实体的例子

public partial class Language
{
    public Language()
    {
        StringResources = new HashSet<StringResource>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Culture { get; set; }

    public virtual ICollection<StringResource> StringResources { get; set; }
}

这是一个StringResource实体的例子

public partial class StringResource
{
    public int Id { get; set; }
    public int? LanguageId { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }

    public virtual Language Language { get; set; }
}

接下来,实现一些服务来从数据库中获取语言和字符串资源。下面是 LanguageService 的一个例子

public class LanguageService : ILanguageService
{
    private readonly MyAppDbContext _context;

    public LanguageService(MyAppDbContext context)
    {
        _context = context;
    }

    public IEnumerable<Language> GetLanguages()
    {
        return _context.Languages.ToList();
    }

    public Language GetLanguageByCulture(string culture)
    {
       return _context.Languages.FirstOrDefault(x => 
           x.Culture.Trim().ToLower() == culture.Trim().ToLower());
    } 
}

这是一个 LocalizationService 的示例,它具有使用资源键从数据库返回 StringResource 的方法。

public class LocalizationService : ILocalizationService
{
    private readonly MyAppDbContext _context;

    public LocalizationService(MyAppDbContext context)
    {
        _context = context;
    }

    public StringResource GetStringResource(string resourceKey, int languageId)
    {
        return _context.StringResources.FirstOrDefault(x => 
            x.Name.Trim().ToLower() == resourceKey.Trim().ToLower() 
            && x.LanguageId == languageId);
    }
}

下一步是根据官方 Microsoft 文档中提供的指南配置 ASP.NET Core 本地化。一切都设置好后,您可以创建一个方法,例如本地化以读取本地化字符串。要在多个Controller中使用该方法,可以在BaseController类中定义该方法。

public class BaseController : Controller
{
    private readonly ILanguageService _languageService;
    private readonly ILocalizationService _localizationService;

    public BaseController(ILanguageService languageService, ILocalizationService localizationService)
    {
        _languageService = languageService;
        _localizationService = localizationService;
    }

    public HtmlString Localize(string resourceKey, params object[] args)
    {
        var currentCulture = Thread.CurrentThread.CurrentUICulture.Name;

        var language = _languageService.GetLanguageByCulture(currentCulture);
        if (language != null)
        {
            var stringResource = _localizationService.GetStringResource(resourceKey, language.Id);
            if (stringResource == null || string.IsNullOrEmpty(stringResource.Value))
            {
                return new HtmlString(resourceKey);
            }

            return new HtmlString((args == null || args.Length == 0)
                ? stringResource.Value
                : string.Format(stringResource.Value, args));
        }

        return new HtmlString(resourceKey);
    }
}

使用此 Localize 方法,读取本地化字符串就像以下示例一样简单。

public IActionResult Index()
{
    ViewData["Title"] = Localize("customer.page.create.title");

    return View();
}

【讨论】:

  • 感谢瓦卡斯。正是我想要的
猜你喜欢
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2019-10-22
  • 2021-09-10
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多