Localization and Internationalization in ASP.NET Core

ASP.NET Web
applications – ICD0015
TalTech IT College, Andres Käver, 2018-2019, Spring semester
Web: http://enos.Itcollege.ee/~akaver/ASP.NETCore
Skype: akaver   Email: 
akaver@itcollege.ee
1
ASP.NET Core 
 i18n
Globalization (G11N): The process of making an application support different
languages and regions.
Localization (L10N): The process of customizing an application for a given
language and region.
Internationalization (I18N): Describes both globalization and localization.
Culture: It is a language and, optionally, a region.
Locale: A locale is the same as a culture.
Neutral culture: A culture that has a specified language, but not a region. (e.g.
"en", "es")
Specific culture: A culture that has a specified language and region. (e.g. "en-US",
"en-GB", "es-CL")
https://msdn.microsoft.com/en-us/goglobal/bb896001.aspx
2
ASP.NET Core 
 i18n
3
ASP.NET Core 
 i18n - Example
 
4
int
 value = 5600;
Thread.CurrentThread.CurrentCulture = 
new
 System.Globalization.CultureInfo(
"es-CL"
);
Console.WriteLine(DateTime.Now.ToShortDateString());
Console.WriteLine(value.ToString(
"c"
));
Thread.CurrentThread.CurrentCulture = 
new
 System.Globalization.CultureInfo(
"es-MX"
);
Console.WriteLine(DateTime.Now.ToShortDateString());
Console.WriteLine(value.ToString(
"c"
));
// Output
26-07-2011 
// Date in es-CL, Spanish (Chile)
$5.600,00 
// Currency in es-CL, Spanish (Chile)
26/07/2011 
// Date in es-MX, Spanish (Mexico)
$5,600.00 
// Currency in es-MX, Spanish (Mexico)
ASP.NET Core 
 i18n
ASP.NET Core keeps track in each thread:
Culture
determines the results of culture-dependent functions, such as the
date, number, and currency formatting, and so on
UICulture
determines which resources are loaded for the page
5
ASP.NET Core 
 i18n
Set up i18n services in startup class
6
 
public
 
void
 ConfigureServices(
IServiceCollection
 services)
        {
            
// Add the localization services to the services container
            services.AddLocalization(options => options.ResourcesPath = 
"Resources"
);
            
// Add framework services.
            services.AddMvc()
    
  .AddViewLocalization(format: 
LanguageViewLocationExpanderFormat
.Suffix)
                .AddDataAnnotationsLocalization();
ASP.NET Core 
 i18n
Inject localization support into controllers
7
 
public
 
class
 
HomeController
 : 
Controller
    {
        
private
 
readonly
 
IStringLocalizer
<
HomeController
> _localizer;
        
private
 
readonly
 
IStringLocalizer
<
SharedResources
> _sharedLocalizer;
        
public
 HomeController(
   
IStringLocalizer
<
HomeController
> localizer,
   
IStringLocalizer
<
SharedResources
> sharedLocalizer)
        {
            _localizer = localizer;
            _sharedLocalizer = sharedLocalizer;
        }
ASP.NET Core 
 i18n
Use localization - controllers
8
 
public
 
IActionResult
 About()
        {
            ViewData[index: 
"Message"
] =
                _localizer[name: 
"Here is some text to be localized!"
]
                + 
" "
 +
                _sharedLocalizer[name: 
"Shared Info"
];
            
return
 View();
        }
ASP.NET Core 
 i18n
Use localization - views
9
@
using
 Microsoft.AspNetCore.Mvc.Localization
@
using
 Microsoft.Extensions.Localization
@inject 
IViewLocalizer
 Localizer
@inject 
IStringLocalizer
<
SharedResources
> SharedLocalizer
@inject 
IHtmlLocalizer
<
SharedResources
> SharedHtmlLocalizer
@{
    ViewData[index: 
"Title"
] = 
"About"
;
}
<
h2
>
@ViewData[index: 
"Title"
].
</
h2
>
<
h3
>
@ViewData[index: 
"Message"
]
</
h3
>
<
p
>
@Localizer[name: 
"Use this area to provide additional information."
]
</
p
>
<
p
>
@SharedLocalizer[name: 
"Shared Info"
]
</
p
>
ASP.NET Core 
 i18n
Initially localization resources are not needed 
 key values are used
as return values.
Typically localization is done later in app development lifecycle 
usually by hired service (do you write Chinese?)
10
ASP.NET Core 
 i18n - resources
Add new folder to web project 
 named “Resources” typically
Specify this folder name in startup.cs
Create resource files in this folder (dot or path naming)
Controllers.HomeController.et.resx
Views.Home.About.et.resx
11
ASP.NET Core 
 i18n
How to override automatically discovered localization settings?
by default, culture values are taken from current webserver settings.
Add this to end of _Layout file (and add @using System.Globalization)
Several possibilities how to override. Default implementation uses (middleware):
QueryStringRequestCultureProvider
CookieRequestCultureProvider
AcceptLanguageHeaderRequestCultureProvider
12
<
p
>
&copy;
 2017 - WebApp 
@(
$"CurrentCulture: 
{
CultureInfo
.CurrentCulture.Name}
,
CurrentUICulture: 
{
CultureInfo
.CurrentUICulture.Name}
"
)
</
p
>
ASP.NET Core 
 i18n
Set up the languages that are supported (ConfigureServices)
13
services.Configure<
RequestLocalizationOptions
>(options =>
{
                
var
 supportedCultures = 
new
[]{
     
new
 
CultureInfo
(name: 
"en"
),
 
                    
new
 
CultureInfo
(name: 
"et"
)
                };
                
// State what the default culture for your application is.
  
   
  options.DefaultRequestCulture = 
new
 
RequestCulture
(culture: 
"en-GB"
, uiCulture: 
"en-GB"
);
                
// You must explicitly state which cultures your application supports.
   
  options.SupportedCultures = supportedCultures;
                
// These are the cultures the app supports for UI strings
                options.SupportedUICultures = supportedCultures;
            });
ASP.NET Core 
 i18n
Set up the middleware (Configure)
Test from browser url 
 http://
./?culture=et
14
 
public
 
void
 Configure(
IApplicationBuilder
 app, 
IHostingEnvironment
 env, 
ILoggerFactory
loggerFactory)
        {
            loggerFactory...
            app.UseRequestLocalization(
   
 
 
options: app.ApplicationServices
    
.GetService<
IOptions
<
RequestLocalizationOptions
>>().Value);
ASP.NET Core 
 i18n
Set up cookie mechanism 
 create partial and use it in _Layout
15
@inject 
IViewLocalizer
 Localizer
@inject 
IOptions
<
RequestLocalizationOptions
> LocOptions
@{
    
var
 requestCulture = Context.Features.Get<
IRequestCultureFeature
>();
    
var
 cultureItems = LocOptions.Value.SupportedUICultures
        .Select(c => 
new
 
SelectListItem
 { Value = c.Name, Text = c.DisplayName })
        .ToList();
}
<
div
 
title
="
@Localizer[name: 
"Request culture provider:"
]
 
@requestCulture?.Provider?.GetType().Name
">
    
<
form
 
id
="selectLanguage"
 
asp-controller
="Home"
 
asp-action
="SetLanguage"
 
asp-route-returnUrl
="
@Context.Request.Path
"
method
="post"
 
class
="form-horizontal"
 
role
="form">
        @Localizer[name: 
"Language:"
] 
<
select
 
name
="culture"
 
onchange
="this
.form.submit();
"
 
asp-
items
="
cultureItems
"></
select
>
    
</
form
>
<
/div>
ASP.NET Core 
 i18n
Add method to HomeController for cookie creation
16
 [
HttpPost
]
        
public
 
IActionResult
 SetLanguage(
string
 culture, 
string
 returnUrl)
        {
            Response.Cookies.Append(
                key: 
CookieRequestCultureProvider
.DefaultCookieName,
                value: 
CookieRequestCultureProvider
.MakeCookieValue(
     
requestCulture: 
new
 
RequestCulture
(culture: culture)),
                options: 
new
 
CookieOptions
 {
      
Expires = 
DateTimeOffset
.UtcNow.AddYears(years: 1) }
            );
            
return
 LocalRedirect(localUrl: returnUrl);
        }
ASP.NET Core 
 i18n
More robust version: use resource strings directly – correct version is
chosen based on culture
In views:
In models:
17
<div> <h4>@Resources.WebApp.Views.Home.Index.NextEvent</h4>
[MaxLength(128)]
[Display(Name = "FirstName", ResourceType =
typeof(Resources.Domain.ApplicationUser))]
public string FirstName { get; set; }
ASP.NET Core 
 i18n
Keep all the localizations (resx files) in separate project
Maintain control over the file organization – can get messy real
quick!
18
ASP.NET Core 
 i18n
The end is near!
19
ASP.NET Core 
 i18n
But one more thing - Content in DB!
Several ways how to do it
2 extra tables
one for all the possible translations
second to hold default value and id (1:m relationship to translations) -
MultilangString
Replace all your strings in Domain with MultilangString
When quering DB, include correct language values
20
ASP.NET Core 
 i18n
The end!
21
ASP.NET Core 
 i18n
Todo:
Save cookie based on query string
Implement routing based language selection -
RouteDataRequestCultureProvider
22
ASP.NET Core 
 i18n
 
23
ASP.NET Core 
 i18n
 
24
ASP.NET Core 
 i18n
 
25
ASP.NET Core 
 i18n
 
26
ASP.NET Core 
 i18n
 
27
Slide Note
Embed
Share

Delve into the world of localization and internationalization in ASP.NET Core, learning about the processes of customization for different languages and regions, key concepts like culture and locale, and practical examples of implementing i18n services and injecting localization support into controllers.

  • ASP.NET Core
  • Localization
  • Internationalization
  • Culture
  • i18n

Uploaded on Sep 23, 2024 | 0 Views


Download Presentation

Please find below an Image/Link to download the presentation.

The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.

E N D

Presentation Transcript


  1. 1 ASP.NET Web applications ICD0015 TalTech IT College, Andres K ver, 2018-2019, Spring semester Web: http://enos.Itcollege.ee/~akaver/ASP.NETCore Skype: akaver Email: akaver@itcollege.ee

  2. ASP.NET Core i18n 2 Globalization (G11N): The process of making an application support different languages and regions. Localization (L10N): The process of customizing an application for a given language and region. Internationalization (I18N): Describes both globalization and localization. Culture: It is a language and, optionally, a region. Locale: A locale is the same as a culture. Neutral culture: A culture that has a specified language, but not a region. (e.g. "en", "es") Specific culture: A culture that has a specified language and region. (e.g. "en-US", "en-GB", "es-CL") https://msdn.microsoft.com/en-us/goglobal/bb896001.aspx

  3. ASP.NET Core i18n 3

  4. ASP.NET Core i18n - Example 4 int value = 5600; Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-CL"); Console.WriteLine(DateTime.Now.ToShortDateString()); Console.WriteLine(value.ToString("c")); Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("es-MX"); Console.WriteLine(DateTime.Now.ToShortDateString()); Console.WriteLine(value.ToString("c")); // Output 26-07-2011 // Date in es-CL, Spanish (Chile) $5.600,00 // Currency in es-CL, Spanish (Chile) 26/07/2011 // Date in es-MX, Spanish (Mexico) $5,600.00 // Currency in es-MX, Spanish (Mexico)

  5. ASP.NET Core i18n 5 ASP.NET Core keeps track in each thread: Culture determines the results of culture-dependent functions, such as the date, number, and currency formatting, and so on UICulture determines which resources are loaded for the page

  6. ASP.NET Core i18n 6 Set up i18n services in startup class public void ConfigureServices(IServiceCollection services) { // Add the localization services to the services container services.AddLocalization(options => options.ResourcesPath = "Resources"); // Add framework services. services.AddMvc() .AddViewLocalization(format: LanguageViewLocationExpanderFormat.Suffix) .AddDataAnnotationsLocalization();

  7. ASP.NET Core i18n 7 Inject localization support into controllers public class HomeController : Controller { private readonly IStringLocalizer<HomeController> _localizer; private readonly IStringLocalizer<SharedResources> _sharedLocalizer; public HomeController( IStringLocalizer<HomeController> localizer, IStringLocalizer<SharedResources> sharedLocalizer) { _localizer = localizer; _sharedLocalizer = sharedLocalizer; }

  8. ASP.NET Core i18n 8 Use localization - controllers public IActionResult About() { ViewData[index: "Message"] = _localizer[name: "Here is some text to be localized!"] + " " + _sharedLocalizer[name: "Shared Info"]; return View(); }

  9. ASP.NET Core i18n 9 Use localization - views @using Microsoft.AspNetCore.Mvc.Localization @using Microsoft.Extensions.Localization @inject IViewLocalizer Localizer @inject IStringLocalizer<SharedResources> SharedLocalizer @inject IHtmlLocalizer<SharedResources> SharedHtmlLocalizer @{ ViewData[index: "Title"] = "About"; } <h2>@ViewData[index: "Title"].</h2> <h3>@ViewData[index: "Message"]</h3> <p>@Localizer[name: "Use this area to provide additional information."]</p> <p>@SharedLocalizer[name: "Shared Info"]</p>

  10. ASP.NET Core i18n 10 Initially localization resources are not needed key values are used as return values. Typically localization is done later in app development lifecycle usually by hired service (do you write Chinese?)

  11. ASP.NET Core i18n - resources 11 Add new folder to web project named Resources typically Specify this folder name in startup.cs Create resource files in this folder (dot or path naming) Controllers.HomeController.et.resx Views.Home.About.et.resx

  12. ASP.NET Core i18n 12 How to override automatically discovered localization settings? by default, culture values are taken from current webserver settings. Add this to end of _Layout file (and add @using System.Globalization) <p>&copy; 2017 - WebApp @($"CurrentCulture: {CultureInfo.CurrentCulture.Name}, CurrentUICulture: {CultureInfo.CurrentUICulture.Name}")</p> Several possibilities how to override. Default implementation uses (middleware): QueryStringRequestCultureProvider CookieRequestCultureProvider AcceptLanguageHeaderRequestCultureProvider

  13. ASP.NET Core i18n 13 Set up the languages that are supported (ConfigureServices) services.Configure<RequestLocalizationOptions>(options =>{ var supportedCultures = new[]{ new CultureInfo(name: "en"), new CultureInfo(name: "et") }; // State what the default culture for your application is. options.DefaultRequestCulture = new RequestCulture(culture: "en-GB", uiCulture: "en-GB"); // You must explicitly state which cultures your application supports. options.SupportedCultures = supportedCultures; // These are the cultures the app supports for UI strings options.SupportedUICultures = supportedCultures; });

  14. ASP.NET Core i18n 14 Set up the middleware (Configure) public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory... app.UseRequestLocalization( options: app.ApplicationServices .GetService<IOptions<RequestLocalizationOptions>>().Value); Test from browser url http:// ./?culture=et

  15. ASP.NET Core i18n 15 Set up cookie mechanism create partial and use it in _Layout @inject IViewLocalizer Localizer @inject IOptions<RequestLocalizationOptions> LocOptions @{ var requestCulture = Context.Features.Get<IRequestCultureFeature>(); var cultureItems = LocOptions.Value.SupportedUICultures .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName }) .ToList(); } <div title="@Localizer[name: "Request culture provider:"] @requestCulture?.Provider?.GetType().Name"> <form id="selectLanguage" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path" method="post" class="form-horizontal" role="form"> @Localizer[name: "Language:"] <select name="culture" onchange="this.form.submit();" asp- items="cultureItems"></select> </form> </div>

  16. ASP.NET Core i18n 16 Add method to HomeController for cookie creation [HttpPost] public IActionResult SetLanguage(string culture, string returnUrl) { Response.Cookies.Append( key: CookieRequestCultureProvider.DefaultCookieName, value: CookieRequestCultureProvider.MakeCookieValue( requestCulture: new RequestCulture(culture: culture)), options: new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(years: 1) } ); return LocalRedirect(localUrl: returnUrl); }

  17. ASP.NET Core i18n 17 More robust version: use resource strings directly correct version is chosen based on culture In views: <div> <h4>@Resources.WebApp.Views.Home.Index.NextEvent</h4> In models: [MaxLength(128)] [Display(Name = "FirstName", ResourceType = typeof(Resources.Domain.ApplicationUser))] public string FirstName { get; set; }

  18. ASP.NET Core i18n 18 Keep all the localizations (resx files) in separate project Maintain control over the file organization can get messy real quick!

  19. ASP.NET Core i18n 19 The end is near!

  20. ASP.NET Core i18n 20 But one more thing - Content in DB! Several ways how to do it 2 extra tables one for all the possible translations second to hold default value and id (1:m relationship to translations) - MultilangString Replace all your strings in Domain with MultilangString When quering DB, include correct language values

  21. ASP.NET Core i18n 21 The end!

  22. ASP.NET Core i18n 22 Todo: Save cookie based on query string Implement routing based language selection - RouteDataRequestCultureProvider

  23. ASP.NET Core i18n 23

  24. ASP.NET Core i18n 24

  25. ASP.NET Core i18n 25

  26. ASP.NET Core i18n 26

  27. ASP.NET Core i18n 27

More Related Content

giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#giItT1WQy@!-/#