Introduction
After finishing a project, it was time to apply localization. I faced a problem and I would like to share the solution here.
Definitions
- Globalization is the process of designing apps that support different cultures. Globalization adds support for the input, display, and output of a defined set of language scripts that relate to specific geographic areas.
- Localization is the process of adapting a globalized app, which you have already processed for localizability, to a particular culture/locale.
The problem scope
I have added the localization in the middleware as below,
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services.AddLocalization();
}
}
In my login page, I added the ability to choose a language from 2 options set (Arabic Or English) as shown in the image below,
In my login handling action. I called a function to specify the application culture as seen below,
public IActionResult LoginPost(EmployeeLogin EmployeeLoginModel) {
if (LoginObj.CheckLogin(_Context, EmployeeLoginModel)) {
SpecifyCulture();
}
}
private void SpecifyCulture() {
string lang = Request.Form["hdnLang"];
//hdnLang is a hidden field in the login form
//filled by a default value
//and this value gets changed when selecting an option from culture drop down
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang);
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
}
I have also created two resource files as seen below,
I began applying localization on a page with little content. So I,
- Imported the namespace
- Injected the string localization interface
The following shows demonstration for these two steps,
@using TaskManagementSystem
@using TaskManagementSystem.Models
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Localization
@inject IStringLocalizer CloseTaskLocalizer
<div class="form-group">
<input type="submit" value="@CloseTaskLocalizer["Close"].Value" class="btn btn-default" />
<!---onclick="return submitForm()"-->
</div>
After applying the above steps, localization did not work as seen in the following image,
Solution
After spending a while with the code trying to solve the problem, I applied the following solution.
I went to the resource designer file and put the mouse on the definition of the method that returns the string of the button.
The thread in which HTTP request is processed holds a property of type CultureInfo.
The ResourceManager class static methods(e.g. GetString) receive the value of the property mentioned above.
Accordingly, I changed the SpecifyCulture method code in the login controller to be as follows,
private void SpecifyCulture() {
string lang = Request.Form["hdnLang"];
var cultureInfo = new CultureInfo(Request.Form["hdnLang"]);
//hdnLang is a hidden field in the login form
//filled by a default value
//and this value gets changed when selecting an option from culture drop down
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;
}
After running, you can see that the problem has been solved as shown below,
Hope somebody finds this helpful.