переключатель языка компонента p-calendar Prime-ng

Я новичок в angular2. Я пытаюсь разработать переключатель языка для приложения angular2. Я без проблем настроил ng2-translate, мой переключатель языков отлично работает для меток и текста.

Теперь я хочу поддерживать i18n для основного компонента p-calendar.

Как описано в документации Prime-ng:

Локализация для разных языков и форматов определяется привязкой объекта настроек к свойству локали. Ниже приведен испанский календарь.

<p-calendar [(ngModel)]="dateValue" [locale]="es"></p-calendar>


export class MyModel {

    es: any;

    ngOnInit() {
        this.es = {
            //date
            closeText: "Cerrar",
            prevText: "<Ant",
            nextText: "Sig>",
            currentText: "Hoy",
            monthNames: [ "enero","febrero","marzo","abril","mayo","junio",
            "julio","agosto","septiembre","octubre","noviembre","diciembre" ],
            monthNamesShort: [ "ene","feb","mar","abr","may","jun",
            "jul","ago","sep","oct","nov","dic" ],
            dayNames: [ "domingo","lunes","martes","miércoles","jueves","viernes","sábado" ],
            dayNamesShort: [ "dom","lun","mar","mié","jue","vie","sáb" ],
            dayNamesMin: [ "D","L","M","X","J","V","S" ],
            weekHeader: "Sm",
            dateFormat: "dd/mm/yy",
            firstDay: 1,
            isRTL: false,
            showMonthAfterYear: false,
            yearSuffix: "" 

            //time
            timeOnlyTitle: 'Elegir una hora',
            timeText: 'Hora',
            hourText: 'Horas',
            minuteText: 'Minutos',
            secondText: 'Segundos',
            millisecText: 'Milisegundos',
            microsecText: 'Microsegundos',
            timezoneText: 'Uso horario',
            timeFormat: 'HH:mm',
            timeSuffix: '',
            amNames: ['a.m.', 'AM', 'A'],
            pmNames: ['p.m.', 'PM', 'P'],
        };
    }
}

Мой вопрос: как связать глобальный объект, например «es», с любым компонентом в моем приложении и переключаться между локальными? Ниже приведены фрагменты моего кода:

app.component.ts

import {Component, ElementRef, AfterViewInit, OnInit} from '@angular/core';
import {TranslateService} from 'ng2-translate/ng2-translate';
import {environment} from '../environments/environment';
import {SelectItem} from 'primeng/primeng';

const SUPPORTED_LANGUAGES:Array<SelectItem> = [
  {label: 'English', value: 'en'},
  {label: 'French', value: 'fr'},
];
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit, AfterViewInit {
  ngOnInit():void {
    this.calendar_fr = {
      closeText: "Fermer",
      prevText: "Précédent",
      nextText: "Suivant",
      currentText: "Aujourd'hui",
      monthNames: [ "janvier", "février", "mars", "avril", "mai", "juin",
        "juillet", "août", "septembre", "octobre", "novembre", "décembre" ],
      monthNamesShort: [ "janv.", "févr.", "mars", "avr.", "mai", "juin",
        "juil.", "août", "sept.", "oct.", "nov.", "déc." ],
      dayNames: [ "dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi" ],
      dayNamesShort: [ "dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam." ],
      dayNamesMin: [ "D","L","M","M","J","V","S" ],
      weekHeader: "Sem.",
      dateFormat: "dd/mm/yy",
      firstDay: 1,
      isRTL: false,
      showMonthAfterYear: false,
      yearSuffix: ""
    };
    this.calendar_en = {
      closeText: "Done",
      prevText: "Prev",
      nextText: "Next",
      currentText: "Today",
      monthNames: [ "January","February","March","April","May","June",
        "July","August","September","October","November","December" ],
      monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ],
      dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
      dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
      dayNamesMin: [ "Su","Mo","Tu","We","Th","Fr","Sa" ],
      weekHeader: "Wk",
      dateFormat: "dd/mm/yy",
      firstDay: 1,
      isRTL: false,
      showMonthAfterYear: false,
      yearSuffix: "" };
  }
  public supportedLanguages:SelectItem[] = SUPPORTED_LANGUAGES;

  public calendar: any;
  public calendar_fr: any;
  public calendar_en: any;

  public lang:string;

  constructor(private el:ElementRef, private translate:TranslateService) {
    translate.addLangs(["en", "fr"]);
    translate.setDefaultLang('en');
    let browserLang = translate.getBrowserLang();
    let defaultLanguage = browserLang.match(/en|fr/) ? browserLang : 'en';
    translate.use(defaultLanguage);
    this.calendar = defaultLanguage == 'fr' ? this.calendar_fr : this.calendar_en;
  }


  changeLanguage() {
    this.translate.use(this.lang);
    this.calendar = this.lang == 'fr' ? this.calendar_fr : this.calendar_en;
  }
}

app.component.html

...
<p-dropdown [options]="supportedLanguages" [(ngModel)]="lang" [autoWidth]="false" (onChange)="changeLanguage()"></p-dropdown>
...

Как использовать p-calendar с locale="calendar" во всех моих компонентах, чтобы они прослушивали смену языка?

<p-calendar id="calendar" [locale]="calendar"></p-calendar>

Кажется, в привязке [locale] также есть проблема. Любая идея, как это исправить ?


person GUISSOUMA Issam    schedule 12.10.2016    source источник


Ответы (2)


Здравствуйте, вы можете использовать это:

<p-calendar *ngIf="calendar===calendar_fr" [locale]="calendar_fr"></p-calendar> <p-calendar *ngIf="calendar===calendar_en" [locale]="calendar_en"></p-calendar>

PS: Это единственный способ, который я нашел :).

person Mohamed Larbi Chouaiar    schedule 14.10.2016
comment
Я думаю, что это не плохо, как обходной путь. Возможно, я воспользуюсь этим решением, если проблема не будет решена быстро. - person GUISSOUMA Issam; 14.10.2016

Решение:

<p-calendar [(ngModel)]="currentDate" [minDate]="minDate" [maxDate]="maxDate" [inline]="true"
          [disabledDays]="[0,6]" (onSelect)="selectedDate($event)" [showOnFocus]="true" [locale]="CALENDER_CONFIG_EN" [monthNavigator]='true'
          [selectOtherMonths]='true' [disabled]="noDates" [disabledDates]="disabledPreviousMonth"></p-calendar>

В компоненте:

currentDate: Date;
minDate: Date;
maxDate: Date


CALENDER_CONFIG_EN = {
        firstDayOfWeek: 1,
        dayNames: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
        dayNamesShort: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
        dayNamesMin: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'],
        monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October',
            'November', 'December'],
        monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
        today: 'Today',
        clear: 'Clear',
    }
person suresh    schedule 30.08.2019