Форматирование Angular 2 Datepipe на основе местоположения/настроек браузера

Есть ли способ сделать datepipe динамическим, чтобы, если это американский браузер, datepipe возвращал американский формат (гггг/мм/дд), а когда это европейский браузер, он возвращал европейский формат (дд/мм/гггг)?

Спасибо


person Martijn van den Bergh    schedule 08.08.2017    source источник


Ответы (4)


Это может быть сложно, особенно при использовании aot. Обычно это требует от вас создания разных сборок. Я расширил канал данных и использовал локаль браузера.

Датапайп:

@Pipe({name: 'datepipe', pure: true})
export class MyDatePipe extends DatePipe implements PipeTransform {
  constructor(private win: WindowRef) {
    super(win.ln);
  }

  transform(value: any, pattern?: string): string | null {
    return super.transform(value, pattern);
  }
}

Окно:

function _window(): any {
  // return the global native browser window object
  return window;
}

@Injectable()
export class WindowRef {
  get nativeWindow(): any {
    return _window();
  }

  public ln = 'en';


  constructor() {
    try {
      if (!isNullOrUndefined(this.nativeWindow.navigator.language) && this.nativeWindow.navigator.language !== '') {
        this.ln = this.nativeWindow.navigator.language;
      }
    }finally {}
  }
}
person Robin Dijkhof    schedule 08.08.2017
comment
Извините за мое невежество, но что именно вы имеете в виду под окном? это просто файл window.ts? Как мне реализовать это в моем проекте Angular? - person Martijn van den Bergh; 08.08.2017
comment
Это простой сервис - person Robin Dijkhof; 08.08.2017
comment
Что такое isNullOrUndefined? Мой редактор не распознает его. - person Martijn van den Bergh; 09.08.2017

Я думаю, вы должны использовать собственный JS API Date.prototype.toLocaleDateString() для достижения этой цели. См. эту ссылку.

Вы можете реализовать свой собственный канал Angular для использования этого API.

person steamfood    schedule 14.06.2018

Вы можете проверить местоположение и поместить его в оператор if. Да, вы можете использовать канал следующим образом:

     <div *ngif="Location() === 'Europe' "
     {{valueDate | date: 'dd/MM/yyyy'}}
     <div>
     <div *ngif="Location() === 'Ammerica' "
     {{valueDate | date: 'MM/dd/yyyy'}}
     <div>

Чтобы найти местоположение

getCurrentLocation(lat,lng): Observable<any> {
return this._http.get("http://maps.googleapis.com/maps/api/geocode/json?latlng="+lat+","+lng+"&sensor=true")
  .map(response => response.json())
  .catch(error => {
    console.log(error);
    return Observable.throw(error.json());
  });

}

person ZAhmed    schedule 08.08.2017
comment
Не могли бы вы объяснить, как я могу проверить местоположение? Разве мне не нужно разрешение от пользователя, чтобы сделать это? - person Martijn van den Bergh; 08.08.2017
comment
Я редактирую код выше, смотрите код, надеюсь, он будет полезен - person ZAhmed; 08.08.2017
comment
Спасибо за ответ, я думаю, что это тоже сработает. Но я думаю, что ответ от Робина Дейкхофа немного лучше, потому что он ищет язык в настройках браузера. Тем не менее, это тоже сработает, так что спасибо! - person Martijn van den Bergh; 08.08.2017

Я знаю, что это может показаться неприятным, но это намного проще, чем просить Angular сделать это за вас:

public renderLocaleDateTime(date: Date, dateStyle = 'medium', timeStyle = 'medium'): string {
    var script = 'const date = new Date("' + date + '"); const options = { dateStyle: "' + dateStyle + '", timeStyle: "' + timeStyle + '" }; date.toLocaleString({}, options);';
    return eval(script);
}

А потом:

<span title="{{ renderLocaleDateTime(date, 'long', 'long') }}">
    {{ renderLocaleDateTime(date) }}
</span>

А еще лучше сделать из него трубку.

person Newerth    schedule 14.10.2019