Hello,
Anyone have any idea how to handle translation when you want to use data persistence?
Here, template helper + template kendo + kendo grid
@* ===================================== HELPER and Template ===================================== *@ @* =============== Toolbar =============== *@ @helper ToolbarTemplate() { <div> <a class="k-button k-button-icontext k-grid-excel" href="\#">@Tools.GetStringRessource("AllList_ExportToExcel", "Download To Excel")</a> </div> } <script type="text/x-kendo-template" id="toolbarTemplate"> @Html.Raw(@ToolbarTemplate().ToHtmlString().Replace("#", "\\#").Replace("</scr", "<\\/scr")) </script> @* =============== ColumnAction =============== *@ @helper ColumnActionTemplate(bool canEdit, bool canDelete) { @* Voir page CableDrum_Customer pour les différentes recherches *@ @* VERSION 2: Solution bricolé - href généré avec Url.Action (encode les params mais sera décodé dans le js pour retrouver #= #) *@ var hrefEdit = Url.Action("CableDrumEdit_Site", new { idCustomer = @ViewContext.RouteData.Values["idCustomer"], idSite = @ViewContext.RouteData.Values["idSite"], idCableDrum = "#=Id#" }); var edit = $"<a class=\"btn icon bg-white tooltip-bottom\" href=\"{@hrefEdit}\" title = \"{Tools.GetStringRessource("AllList_EditItem", "Edit")}\" >#=library.getKendoTemplate(data,'IconCreateTemplate')#</a>"; var resultEdit = Convert.ToBoolean(canEdit) ? edit : ""; var resultDelete = Convert.ToBoolean(canDelete) ? "#=library.getKendoTemplate(data,'DeleteTemplate')#" : ""; <div class="action"> <span> @Html.Raw(@resultEdit) </span> <span> @Html.Raw(@resultDelete) </span> </div> } <script type="text/x-kendo-template" id="columnActionTemplate"> @Html.Raw(@ColumnActionTemplate(ViewBag.CanEdit, ViewBag.CanDelete).ToHtmlString()) </script> @* =============== Header =============== *@ @helper HeaderTemplate() { <span class="k-link"> @Tools.GetStringRessource("AllList_EditBtn", "Action") </span>} <script type="text/x-kendo-template" id="headerTemplate"> @Html.Raw(@HeaderTemplate().ToHtmlString()) </script> @* ===================================== FIN HELPER and Template ===================================== *@ @(Html.Kendo().Grid<CableDrumUIDto>() .Name("CableDrumGrid") .ToolBar(tools => { tools.Template(@<text>@ToolbarTemplate()</text>); }) .Excel(excel => excel .FileName(Tools.GetStringRessource("ExportToExcel_CableDrums", "siteDrum.xlsx")) .Filterable(true) .AllPages(true) ) .DataSource(dataSource => dataSource .Ajax() .PageSize(10) .Read(read => read.Action("CableDrumInfo_Read", "CableDrums").Data("CableDrumLib.getAdditionalData").Type(HttpVerbs.Post)) ) .Events(e => e .DataBound(@<text>function(e){ CableDrumLib.gridDataBound(); library.dataBound(); }</text>) .ExcelExport("onExcelExport") ) .Columns(columns => { columns.Bound(p => p.ProductName).Title(Tools.GetStringRessource("CableDrum_ProductName", "PRODUCT NAME")); columns.Bound(p => p.ProductRef).Title(Tools.GetStringRessource("CableDrum_ProductRef", "REFERENCE")); columns.Bound(p => p.ProductRefCustomer).Title(Tools.GetStringRessource("CableDrum_ProductRefClient", "REFERENCE CUSTOMER")); columns.Bound(p => p.LabelProductSerialNumber).Title(Tools.GetStringRessource("CableDrum_Identifier", "DRUM")); columns.Bound(p => p.Location).Title(Tools.GetStringRessource("CableDrumEdit_DetailsTab_Location", "LOCATION")); if (ViewBag.DisplayLengthInFeets.Equals(true)) { columns.Bound(p => p.CurrentLengthInM).Title(Tools.GetStringRessource("CableDrum_ProductLengthInF", "LENGTH")); } if (ViewBag.DisplayLengthInMeters.Equals(true)) { columns.Bound(p => p.CurrentLengthInM).Title(Tools.GetStringRessource("CableDrum_ProductLengthInM", "LENGTH")); } /**/ columns.Bound(p => p.CF_CustomerDrumNumber).Title(Tools.GetStringRessource("Generic_CF_CustomerDrumNumber", "Customer Drum Number")).Hidden(); columns.Bound(p => p.CF_CustomerShipmentDate).ClientTemplate("#= (CF_CustomerShipmentDate !== null) ? kendo.toString(CF_CustomerShipmentDate,'d') : '' #").Title(Tools.GetStringRessource("Generic_CF_CustomerShipmentDate", "Customer Shipment Date")).Hidden(); columns.Bound(p => p.CF_SaleOrderNumber).Title(Tools.GetStringRessource("Generic_CF_SaleOrderNumber", "Sale Order Number")).Hidden(); columns.Bound(p => p.CF_LineOrderNumber).Title(Tools.GetStringRessource("Generic_CF_LineOrderNumber", "Line Order Number")).Hidden(); columns.Bound(p => p.CF_CustomerPurchaseOrderNumber).Title(Tools.GetStringRessource("Generic_CF_CustomerPurchaseOrderNumber", "Customer Purchase Order Number")).Hidden(); columns.Bound(p => p.CF_CustomerLineOrderNumber).Title(Tools.GetStringRessource("Generic_CF_CustomerLineOrderNumber", "Customer Line Order Number")).Hidden(); columns.Bound(p => p.CF_ProductionOrderNumber).Title(Tools.GetStringRessource("Generic_CF_ProductionOrderNumber", "Production Order Number")).Hidden(); columns .Template(@<text></text>) .Title(@Tools.GetStringRessource("AllList_EditBtn", "Action")) .HeaderTemplate(HeaderTemplate().ToHtmlString()) .Width(90) .ClientTemplate(ColumnActionTemplate(ViewBag.CanEdit, ViewBag.CanDelete).ToHtmlString()); }) .NoRecords(Tools.GetStringRessource("Grid_NoRecords", "No Data")) .ColumnMenu() .Sortable(s => s.SortMode(GridSortMode.MultipleColumn)) .Reorderable(r => r.Columns(true)) .Resizable(r => r.Columns(true)) .Scrollable(sc => sc.Height("auto")) .Pageable(page => page .Input(true) .Numeric(false) .Info(true) .PreviousNext(true) .Messages(message => message .Display(ViewBag.Title + " {0}-{1}/{2}") .Empty(Tools.GetStringRessource("Grid_NoRecords", "No Data")) .Of("/{0}") .Page(string.Empty) ) )
Here, i save grid option
window.onbeforeunload = function () { var elGrid = $(GRID_CABLEDRUM); if (elGrid !== null) { var grid = elGrid.data("kendoGrid"); if (grid !== null && grid.element.length > 0) { var fullOptions = grid.getOptions(); // Récupération uniquement des informations qui m'intéresse (affichage des colonnes, tri, filtre, taille colonnes) var options = { columns: fullOptions.columns, dataSource: fullOptions.dataSource } localStorage.setItem(`_kendoGridCookie_${grid.element[0].id}`, kendo.stringify(options)); } }}
Here i add my template toolbar + template header + i manually apply the translations.
var gridElement = $(this); var gridId = gridElement[0].id; var kendoGrid = $(`#${gridId}`).data("kendoGrid"); // Récupération des préférences utilisateurs de la grille dans le localStorage var kendoGridOptions = localStorage.getItem(`_kendoGridCookie_${gridId}`); if (kendoGridOptions && kendoGridOptions !== null) { var kendoGridOptionsParse = JSON.parse(kendoGridOptions); // Ajout du template présent dans le toolbar https://github.com/telerik/ui-for-aspnet-mvc-examples/blob/master/grid/grid-preserve-server-toolbar-template-after-set-options/GridPerserveToolbarServerTemplate/Views/Home/Index.cshtml var templateToolbar = $("#toolbarTemplate").html(); if (templateToolbar !== undefined) { kendoGridOptionsParse.toolbar = [ { template: templateToolbar } ]; } //Récupération de la colonne Action. J'ai pas beaucoup de moyen pour l'identifier donc je me base sur qu'elle est la propriété template var colAction = kendoGridOptionsParse.columns.find(c => c.template !== undefined) //Template header colonne action var templateHeader = $("#headerTemplate").html(); if (templateHeader !== undefined) { colAction.headerTemplate = templateHeader; } // Template colonne action var templateAction = $("#columnActionTemplate").html(); if (templateAction !== undefined) { var action = decodeURIComponent(templateAction); colAction.template = action; } //Récupération des traductions des entêtes des colonnes if (kendoGridOptionsParse !== null && kendoGrid !== null && kendoGridOptionsParse.columns !== null && kendoGrid.columns !== null && kendoGridOptionsParse.columns.length === kendoGrid.columns.length) { for (let indice = 0; indice < kendoGridOptionsParse.columns.length; indice++) { var kendoGridOptionsColCurrent = kendoGridOptionsParse.columns[indice] var listCorrespondanceColonne; var titleCurrent = ""; // Soit colonne lié à des champs if (kendoGridOptionsColCurrent.field !== undefined) { listCorrespondanceColonne = kendoGrid.columns.filter(c => c.field !== undefined && c.field === kendoGridOptionsColCurrent.field); } else {// Soit colonne template listCorrespondanceColonne = kendoGrid.columns.filter(c => c.field === undefined && c.template !== undefined); } if (listCorrespondanceColonne.length === 1) { titleCurrent = listCorrespondanceColonne[0].title; } kendoGridOptionsColCurrent.title = titleCurrent; } } //Rechargement option https://docs.telerik.com/kendo-ui/api/javascript/ui/grid/methods/setoptions kendoGrid.setOptions(kendoGridOptionsParse); }
I see that the operation is not solid and I would like to find a more standard solution for the translation of the columns.
Thank you for your time.