65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET8 使用 DataTables.net – 第4部分 – 多语言

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2024年7月18日

CPOL

3分钟阅读

viewsIcon

4577

downloadIcon

154

在 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 组件可以在多语言应用程序中使用。 请注意,我们需要在两个层面上设置翻译

  1. DataTables.net 组件本身的翻译
  2. 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>

请注意,我们需要在两个层面上设置翻译

  1. DataTables.net 组件本身的翻译
  2. 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

 

© . All rights reserved.