To support multiple cultures by changing the routes, you can read about this document: Apply the RouteDataRequest CultureProvider
Below is a sample demo:
In the asp.net core mvc test project:
1.Create the resource file first, refer to Resource files
The name of resource file must match the view page (my test view: Views\Home\Index.cshtml)

2.Configure in the program.cs:
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
builder.Services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en"),
new CultureInfo("it")
// Add more cultures as needed
};
options.DefaultRequestCulture = new RequestCulture("it");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new RouteDataRequestCultureProvider()
{
RouteDataStringKey = "culture",
Options = options // This line ensures options.DefaultRequestCulture is used
}
};
});
app.UseRequestLocalization();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "localized-login",
pattern: "{culture}/{action=Index}",
defaults: new { controller = "Home", action = "Index" }, // In your code, you should change to `controller = "Account" `
constraints: new { culture = new RegexRouteConstraint(@"^[a-zA-Z]{2}(-[a-zA-Z]{2})?$") }
);
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
In the external project:
3.Inject IStringLocalizer in the Controller:
private readonly IStringLocalizer<HomeController> _localizer;
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
public IActionResult Login()
{
ViewData["Title"] = _localizer["LoginPageTitle"];
ViewData["ButtonText"] = _localizer["LoginButtonText"];
return View();
}
4.Inject the IViewLocalizer in the Login view page:
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>@Localizer["LoginPageTitle"]</h1>
<button>@Localizer["LoginButtonText"]</button>
Test result:

