ASP.NET8 使用 DataTables.net – 第4部分 – 多语言
在 Asp.Net 8 MVC 应用程序中使用 jQuery DataTables.net 组件的实用指南。
1 ASP.NET8 使用 jQuery DataTables.net
我正在评估 jQuery DataTables.net 组件 [1] 在 ASP.NET8 项目中的使用,并创建了几个原型(概念验证)应用程序,这些应用程序在这些文章中展示。
1.1 本系列文章
本系列文章包括:
- ASP.NET8 使用 DataTables.net – 第1部分 – 基础
- ASP.NET8 使用 DataTables.net – 第2部分 – 操作按钮
- ASP.NET8 使用 DataTables.net – 第3部分 – 状态保存
- ASP.NET8 使用 DataTables.net – 第4部分 – 多语言
- ASP.NET8 使用 DataTables.net – 第5部分 – 在 AJAX 中传递附加参数
- ASP.NET8 使用 DataTables.net – 第6部分 – 在 AJAX 中返回附加参数
- ASP.NET8 使用 DataTables.net – 第7部分 – 常规按钮
- ASP.NET8 使用 DataTables.net – 第8部分 – 选择行
- ASP.NET8 使用 DataTables.net – 第9部分 – 高级筛选器
2 最终结果
本文的目的是创建一个概念验证应用程序,演示 ASP.NET 多语言应用程序中的 DataTables.net 组件。 让我们展示一下本文的结果。
这是英文版
这是德语版
因此,DataTables.net 组件可以在多语言应用程序中使用。 请注意,我们需要在两个层面上设置翻译
- DataTables.net 组件本身的翻译
- DataTables.net 组件使用的字符串的翻译
正确设置这一切有点棘手,但它是可行的。
3 多语言设置
如果您不熟悉 ASP.NET8 的多语言设置,请阅读我的文章 [2]-[5]。 我不会在这里再次复制粘贴相同的文本,我将直接从这些示例中使用相同的代码。 正如这些文章中所解释的,主要的技巧是为特定语言正确设置 AspNetCore.Culture cookie。 所有细节都在这些文章 [2]-[5] 中详细说明。
这是执行此操作的控制器代码
//HomeController.cs
public IActionResult ChangeLanguage(ChangeLanguageViewModel model)
{
if (model.IsSubmit)
{
HttpContext myContext = this.HttpContext;
ChangeLanguage_SetCookie(myContext, model.SelectedLanguage);
//doing funny redirect to get new Request Cookie
//for presentation
return LocalRedirect("/Home/ChangeLanguage");
}
//prepare presentation
ChangeLanguage_PreparePresentation(model);
return View(model);
}
private void ChangeLanguage_PreparePresentation(ChangeLanguageViewModel model)
{
model.ListOfLanguages = new List<SelectListItem>
{
new SelectListItem
{
Text = "English",
Value = "en"
},
new SelectListItem
{
Text = "German",
Value = "de",
},
new SelectListItem
{
Text = "French",
Value = "fr"
},
new SelectListItem
{
Text = "Italian",
Value = "it"
}
};
}
private void ChangeLanguage_SetCookie(HttpContext myContext, string? culture)
{
if (culture == null) { throw new Exception("culture == null"); };
//this code sets .AspNetCore.Culture cookie
CookieOptions cookieOptions = new CookieOptions();
cookieOptions.Expires = DateTimeOffset.UtcNow.AddMonths(1);
cookieOptions.IsEssential = true;
myContext.Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
cookieOptions
);
}
这是我在视图中用于调试目的的页脚
@* _Debug.AspNetCore.CultureCookie.cshtml ===================================================*@
@using Microsoft.AspNetCore.Localization;
@{
string text = String.Empty;
try
{
var myContext = Context;
string? cultureCookieValue = null;
myContext.Request.Cookies.TryGetValue(
CookieRequestCultureProvider.DefaultCookieName, out cultureCookieValue);
string? text1 = "Request Cookie was (Refresh might be needed if changing language) " +
CookieRequestCultureProvider.DefaultCookieName + "[" + cultureCookieValue + "]";
text = text1;
}
catch (Exception ex)
{
text = ex.Message;
}
<span>
@text
</span>
}
这是 DataTables.net 组件本身的翻译
这是应用程序中字符串的翻译
4 客户端 DataTables.net 组件
在这里,我将只展示使用 DataTables 组件的 ASP.NET 视图的样子。
<!-- Employees.cshtml -->
<partial name="_LoadingDatatablesJsAndCss" />
@{
<div class="text-center">
<h3 class="display-4">Employees table</h3>
</div>
<!-- Here is our table HTML element defined. JavaScript library Datatables
will do all the magic to turn it into interactive component -->
<table id="EmployeesTable01" class="table table-striped table-bordered ">
</table>
}
@{
<!-- Method to tell DatTables.net component which
language file to load -->
string GetUrlForDatatablesLanguageFile()
{
string urlResult = String.Empty;
try
{
string culture = Thread.CurrentThread.CurrentUICulture.ToString();
if (culture.Length > 2)
{
culture = culture.Substring(0, 2).ToLower();
}
string baseUrl = Url.Content("~/lib/datatables/i18n/");
switch (culture)
{
case "de":
urlResult = baseUrl + "de-DE.json";
break;
case "fr":
urlResult = baseUrl + "fr-FR.json";
break;
case "it":
urlResult = baseUrl + "it-IT.json";
break;
default:
urlResult = String.Empty;
break;
}
}
catch
{
urlResult = String.Empty;
}
return urlResult;
}
}
<script>
// Datatables script initialization=========================================
// we used defer attribute on jQuery so it might not be available at this point
// so we go for vanilla JS event
document.addEventListener("DOMContentLoaded", InitializeDatatable);
function InitializeDatatable() {
$("#EmployeesTable01").dataTable({
//processing-Feature control the processing indicator.
processing: true,
//paging-Enable or disable table pagination.
paging: true,
//info-Feature control table information display field
info: true,
//ordering-Feature control ordering (sorting) abilities in DataTables.
ordering: true,
//searching-Feature control search (filtering) abilities
searching: true,
//search.return-Enable / disable DataTables' search on return.
search: {
return: true
},
//autoWidth-Feature control DataTables' smart column width handling.
autoWidth: true,
//lengthMenu-Change the options in the page length select list.
lengthMenu: [10, 15, 25, 50, 100],
//pageLength-Change the initial page length (number of rows per page)
pageLength: 10,
//order-Initial order (sort) to apply to the table.
order: [[1, 'asc']],
//serverSide-Feature control DataTables' server-side processing mode.
serverSide: true,
//stateSave-State saving - restore table state on page reload.
stateSave: true,
//stateDuration-Saved state validity duration.
//-1 sessionStorage will be used, while for 0 or greater localStorage will be used.
stateDuration: -1,
//language.url- Load language information from remote file.
language: {
url: '@GetUrlForDatatablesLanguageFile()'
},
//Load data for the table's content from an Ajax source.
ajax: {
"url": "@Url.Action("EmployeesDT", "Home")",
"type": "POST",
"datatype": "json"
},
//Set column specific initialization properties
columns: [
//name-Set a descriptive name for a column
//data-Set the data source for the column from the rows data object / array
//title-Set the column title
//orderable-Enable or disable ordering on this column
//searchable-Enable or disable search on the data in this column
//type-Set the column type - used for filtering and sorting string processing
//visible-Enable or disable the display of this column.
//width-Column width assignment.
//render-Render (process) the data for use in the table.
//className-Class to assign to each cell in the column.
{ //0
name: 'id',
data: 'id',
title: "@Example04.Resources.SharedResource.EmployeeId",
orderable: true,
searchable: false,
type: 'num',
visible: true
},
{
//1
name: 'givenName',
data: "givenName",
title: "@Example04.Resources.SharedResource.GivenName",
orderable: true,
searchable: true,
type: 'string',
visible: true
},
{
//2
name: 'familyName',
data: "familyName",
title: "@Example04.Resources.SharedResource.FamilyName",
orderable: true,
searchable: true,
type: 'string',
visible: true
},
{
//3
name: 'town',
data: "town",
title: "@Example04.Resources.SharedResource.Town",
orderable: true,
searchable: true,
type: 'string',
visible: true
},
{
//4
name: 'country',
data: "country",
title: "@Example04.Resources.SharedResource.Country",
orderable: true,
searchable: true,
type: 'string',
visible: true,
width: "150px",
className: 'text-center '
},
{
//5
name: 'email',
data: "email",
title: "@Example04.Resources.SharedResource.Email",
orderable: true,
searchable: true,
type: 'string',
visible: true
},
{
//6
name: 'phoneNo',
data: "phoneNo",
title: "@Example04.Resources.SharedResource.PhoneNumber",
orderable: false,
searchable: true,
type: 'string',
visible: true
},
{
//7
name: 'actions',
data: "actions",
title: "@Example04.Resources.SharedResource.Actions",
orderable: false,
searchable: false,
type: 'string',
visible: true,
render: renderActions
},
{
//8
name: 'urlForEdit',
data: "urlForEdit",
title: "urlForEdit",
orderable: false,
searchable: false,
type: 'string',
visible: false
}
]
});
function renderActions(data, type, row, meta) {
//for Edit button we get Url from the table data
let html1 =
'<a class="btn btn-info" href="' +
row.urlForEdit +
'"> @Example04.Resources.SharedResource.Edit</a>';
//for Info button we create Url in JavaScript
let editUrl = "@Url.Action("EmployeeInfo", "Home")" +
"?EmployeeId=" + row.id;
let html2 =
'<a class="btn btn-info" style="margin-left: 10px" href="' +
editUrl + '"> @Example04.Resources.SharedResource.Info</a>';
return html1 + html2;
}
}
</script>
请注意,我们需要在两个层面上设置翻译
- DataTables.net 组件本身的翻译
- DataTables.net 组件使用的字符串的翻译
对于 1),我们使用方法 GetUrlForDatatablesLanguageFile() 告诉 DatTables.net 组件要加载哪个语言文件。
对于 2),我们使用资源管理器,如 [5] 中所述。
5 结论
可以下载完整的示例代码项目。
6 参考资料
[1] https://datatables.net.cn/
[2] https://codeproject.org.cn/Articles/5378651/ASP-NET-8-Multilingual-Application-with-Single-Res
[3] https://codeproject.org.cn/Articles/5378997/ASP-NET-8-Multilingual-Application-with-Single-R-2
[4] https://codeproject.org.cn/Articles/5379125/ASP-NET-8-Multilingual-Application-with-Single-R-3
[5] https://codeproject.org.cn/Articles/5379436/ASP-NET-8-Multilingual-Application-with-Single-R-4
[21] ASP.NET8 使用 DataTables.net – 第1部分 – 基础
https://codeproject.org.cn/Articles/5385033/ASP-NET-8-Using-DataTables-net-Part1-Foundation
[22] ASP.NET8 使用 DataTables.net – 第2部分 – 操作按钮
https://codeproject.org.cn/Articles/5385098/ASP-NET8-using-DataTables-net-Part2-Action-buttons
[23] ASP.NET8 使用 DataTables.net – 第3部分 – 状态保存
https://codeproject.org.cn/Articles/5385308/ASP-NET8-using-DataTables-net-Part3-State-saving
[24] ASP.NET8 使用 DataTables.net – 第4部分 – 多语言
https://codeproject.org.cn/Articles/5385407/ASP-NET8-using-DataTables-net-Part4-Multilingual
[25] ASP.NET8 使用 DataTables.net – 第5部分 – 在 AJAX 中传递附加参数
https://codeproject.org.cn/Articles/5385575/ASP-NET8-using-DataTables-net-Part5-Passing-additi
[26] ASP.NET8 使用 DataTables.net – 第6部分 – 在 AJAX 中返回附加参数
https://codeproject.org.cn/Articles/5385692/ASP-NET8-using-DataTables-net-Part6-Returning-addi
[27] ASP.NET8 使用 DataTables.net – 第7部分 – 常规按钮
https://codeproject.org.cn/Articles/5385828/ASP-NET8-using-DataTables-net-Part7-Buttons-regula
[28] ASP.NET8 使用 DataTables.net – 第8部分 – 选择行
https://codeproject.org.cn/Articles/5386103/ASP-NET8-using-DataTables-net-Part8-Select-rows
[29] ASP.NET8 使用 DataTables.net – 第9部分 – 高级筛选器
https://codeproject.org.cn/Articles/5386263/ASP-NET8-using-DataTables-net-Part9-Advanced-Filte