Когда я впервые меняю язык своего приложения, служба перевода делает запрос на файл, представляющий новый язык. Строки моих «умных» компонентов правильно отражают обновление, НО любые «чистые/глупые» компоненты этого не делают, они остаются в предыдущем язык. Однако, как только новый языковой файл загружен в кеш, и я продолжаю менять языки, все работает нормально.
Кажется, что любой чистый компонент не разрешает обновления из ответа ajax для нового языкового файла, он будет правильно менять язык только тогда, когда файл уже загружен в кеш. Опять же, это только для компонентов, использующих ChangeDetectionStrategy.OnPush.
Я понимаю, что changeDetection использует Inputs и Observables в тупых компонентах, но я не очень хорошо разбираюсь в каналах в этом случае. Возможно, я что-то упускаю?
ОБНОВИТЬ
Мне удалось взломать исправление, это не здорово, но работает. Это конструктор в моем сервисе, который обертывает сервис Translate.
Я проверяю, есть ли в кеше языковой json-файл для языка, который я собираюсь выбрать. Если у меня его нет, я использую метод «reloadLang» в ng2-translate, чтобы пойти и получить его. Как только он у меня есть, я использую пустой тайм-аут, а затем вызываю «translate.use». Где-то есть проблема со временем, потому что если я уберу тайм-аут, это не сработает. Если у меня уже есть файл перевода, на который я собираюсь переключиться, я просто использую translate.use как обычно, и все работает нормально.
constructor(private translate: TranslateService, public store: Store<any>) {
// this language will be used as a fallback when a translation isn't found in the current language
translate.setDefaultLang('en');
// subscribe to changes
store.select('i18n').subscribe((state: MultilingualStateI) => {
// update ng2-translate which will cause translations to occur wherever the TranslatePipe is used in the view
if (this.translate.getLangs() && (this.translate.getLangs().indexOf(state.lang) > -1)) {
this.translate.use(state.lang)
} else {
this.translate.reloadLang(state.lang).take(1).subscribe(() => {
setTimeout(() => this.translate.use(state.lang), 0);
});
}
});
}
Я не совсем уверен, что здесь происходит, но, похоже, это сочетание использования ChangeDetectionStrategy.OnPush и свежего ответа на запрос файла перевода. Если кто-то еще видит это, пожалуйста, добавьте свой вклад.