首先,您需要将您的语言和字符串资源存储在数据库中。
-
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();
}