1. 程式人生 > 實用技巧 >asp.net core 多語言解決方案

asp.net core 多語言解決方案

引用自:https://www.cnblogs.com/ives/p/language.html

這裡本文使用Microsoft.AspNetCore.Localization來實現多語言的解決方案

預設是包含這個包的,所有不需要再額外安裝

首先需要注入我們需要的服務

1.在startup.cs中注入

public void ConfigureServices(IServiceCollection services)
{
//設定語言包資料夾名稱
services.AddLocalization(o =>
{
o.ResourcesPath = "Language";

});services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

這裡的路徑是根據專案根目錄尋找的相對路徑,設定成最後語言檔案儲存的路徑即可

然後在Configure中新增我們需要的語言檔案的檔名,後面會再次提及檔名,

然後可以指定預設使用的語言檔案DefaultRequestCulture

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
IList<CultureInfo> supportedCultures = new List<CultureInfo>

{
new CultureInfo("zh-CN"),
new CultureInfo("zh"),
new CultureInfo("en-US")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
//這裡指定預設語言包
DefaultRequestCulture = new RequestCulture("zh-CN"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseMvc();
}

至此我們完成了需要的配置,然後新增最重要的語言檔案,

語言檔案有兩種新增方式

1.根據使用的控制器名稱進行命名,如預設的ValuesController,則語言檔案需要命名為Controllers.ValuesController.zh-CN.resx

2.可以在我們儲存語言檔案的路徑下建立一級Controllers目錄,然後語言檔案在名稱上就可以去掉開頭的Controllers.

雖然這種方式也不太美觀,不過也算好了一步,其實也可以自己手寫注入,然後通過過濾器實現類似的效果

接下來在語言檔案中新增我們需要的資料進行測試

在en-US中新增

在另外兩個檔案中新增相同的名稱

接下來測試呼叫,這裡我們有三種方法可以告知服務端需要使用哪一個語言檔案

1.cookie

2.http報文

3.url引數

在控制器中注入語言檔案

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IStringLocalizer<ValuesController> _localizer;

public ValuesController(IStringLocalizer<ValuesController> localizer)
{
_localizer = localizer;
}

// GET api/values
[HttpGet]
public string Get()
{
return _localizer["Error"].Value;
}
}

使用注入的物件就可以獲取我們需要的鍵

_localizer["Error"]
我們需要顯示的資料儲存在Value屬性中

訪問頁面顯示如下

這裡是因為我們設定的預設語言,所以載入了中文檔案

接下來通過url引數傳遞來訪問不同的語言,加上引數culture=en-US

這樣便會自動返回英文的結果

需要注意的是引數傳遞可以用三種寫法,效果一致

?culture=zh-CN&ui-culture=zh-CN
 
?culture=zh-CN
 
?ui-culture=zh-CN

如果是使用cookie方式的話,使用cookie名稱.AspNetCore.Culture,值如下

c=zh-CN|uic=zh-CN
c=zh-CN
uic=zh-CN

如果是使用http請求的話,則和常見請求一樣新增Accept-Language請求頭即可

Accept-Language:zh-CN