AG-Grid:使用 ngx-translate(角度)翻译 headerName

问题描述 投票:0回答:5

我们正在使用 Angular 来可视化 AG 网格。我们希望将农业网格的标题翻译成用户的语言。

Ag网格代码:

<ag-grid-angular class="ag-theme-material" [rowData]="productionOrders">
  <ag-grid-column [headerName]="'ORDERS.GRID.EntryCode' | translate" field="entry"></ag-grid-column>
  <ag-grid-column [headerName]="ORDERS.GRID.EntryDescription" field="entryDescription"></ag-grid-column>
</ag-grid-angular>

我们可以用同样的方式翻译 html 页面本身的值:

<span>{{ 'ORDERS.Status' | translate}}</span>

我注意到,当加载翻译时,ag grid 不会注意到翻译何时加载。然而,html 页面本身的值会被翻译。

额外信息:ngx-translate 的翻译管道是一个“不纯”管道,这意味着它的值可以改变(例如,当加载所有翻译时)

同样,当使用没有翻译的 headerName 时,它不会更新:

Ag网格代码:

<ag-grid-angular class="ag-theme-material" [rowData]="productionOrders">
  <ag-grid-column [headerName]="bindedString" field="entry"></ag-grid-column>
</ag-grid-angular>
this.lazyString = 'test-1';
setTimeout(() => {
  this.lazyString = 'test-2';
}, 3000);

标头名称永远不会更新为“test-2”

angular typescript ag-grid
5个回答
6
投票

演示.component.html

<ag-grid-angular style="width: 100%; height: 100%;" class="ag-theme-material" [rowData]="rowData"
    [columnDefs]="columnDefs" (gridReady)="onGridReady($event)" [pagination]="true">
</ag-grid-angular>

演示.组件.ts

import { Component } from '@angular/core';
import { ColDef, GridApi } from 'ag-grid-community';
import { TranslateService } from '@ngx-translate/core';

@Component({
  selector: 'app-demo',
  templateUrl: './demo.component.html',
  styleUrls: ['./demo.component.scss']
})
export class DemoComponent {
  private gridApi: GridApi = null;

  public columnDefs: ColDef[] = [
    { headerName: "Code", field: 'code', sortable: true, resizable: true, headerValueGetter: this.localizeHeader.bind(this) },
    { headerName: 'Version', field: 'version', sortable: true, resizable: true, headerValueGetter: this.localizeHeader.bind(this) },
    { headerName: 'IsEnabled', field: 'isEnabled', sortable: true, resizable: true, headerValueGetter: this.localizeHeader.bind(this) }
  ];

  public rowData: any[] = [];

  constructor(private translateService: TranslateService) {
    this.translateService.onLangChange.subscribe(() => {
      this.gridApi.refreshHeader();
    })
  }

  public onGridReady(parameters: any): void {
    this.gridApi = parameters.api;
  }

  public localizeHeader(parameters: ICellRendererParams): string {
    let headerIdentifier = parameters.colDef.field;
    return this.translateService.instant(headerIdentifier);
  }
}

3
投票

标头值获取器

使用

headerValueGetter
而不是
colDef.headerName
来允许动态标头名称。

private translator: TranslateService;
...
colDef.headerValueGetter : this.localizeHeader.bind(this)
....
localizeHeader(params){
    let headerIdentifier = params.colDef.field; // params.column.getColId();
    this.translator.get(headerIdentifier).map((res: string) => {
        return res;
    });
}

文档样本

{ 
    headerName: "Country", 
    field: "country", 
    width: 120, 
    enableRowGroup: true, 
    enablePivot: true, 
    headerValueGetter: countryHeaderValueGetter 
},

function countryHeaderValueGetter(params) {
    switch (params.location) {
        case 'csv': return 'CSV Country';
        case 'clipboard': return 'CLIP Country';
        case 'toolPanel': return 'TP Country';
        case 'columnDrop': return 'CD Country';
        case 'header': return 'H Country';
        default: return 'Should never happen!';
    }
}

0
投票

如果您想使用 TurboYang 的解决方案进行异步翻译加载,只需添加以下内容:

  private destroy = new Subject<void>();

  constructor(private toastService: ToastService, private translate: TranslateService) {
    translate.onLangChange.pipe(takeUntil(this.destroy)).subscribe(() => {
      this.gridApi.refreshHeader();
    });
    translate.onDefaultLangChange.pipe(takeUntil(this.destroy)).subscribe(() => {
      this.gridApi.refreshHeader();
    });
  }

  ngOnDestroy(): void {
    this.destroy.next();
    this.destroy.complete();
  }

0
投票

服务中的功能

  getTr(key: string) {
    return this.translate.instant(key);
  }

ColumnDef 中的用法

  {
    field: 'name', headerName: this.trService.getTr('NAME')
  },

0
投票

另一个简单的解决方案,从上面的参考文献中对我有用

columDef = [
               {
                  field: 'firstname',
                  headerValueGetter: () => translate.instant('fname') // fname is the translation key
               },
               {
                   field: 'lastname',
                   headerValueGetter: () => translate.instant('lname')
               },
           ]
 
 ngOnInit() 
 {
   this.translate.onLangChange.pipe(takeUntil(this.destroy)).subscribe(() => {
         this.gridApi.refreshHeader();
   });
  }
© www.soinside.com 2019 - 2024. All rights reserved.