Хорошим решением может быть использование Observable - а точнее BehaviorSubject.
Он в отличие от Observable всегда возвращает последнее сохраненное значение.
Вы инициализируете приложение, берете код из локалСторедж и помещаете его в BehaviorSubject.
Все остальные компоненты подписываются на него и получают последнее значение.
Если в какой-то момент, значение изменится (незнаю, пользователь выбрал другой язык) - вы опять помещаете его в BehaviorSubject и все подписанные на него компоненты (слушатели) будут уведомлены об изменении
// Behavior Subject
// инициализируем где-то в сервисе и помещаем первое значение
bSubject = new BehaviorSubject("a");
// создаем метод который будет возвращать наш инстанс bSubject
getSubject = () => return this.bSubject
// В компененте инжектим сервис, вызываем метод getSubject и подписываемся
bSubject.subscribe((value) => {
console.log("Subscription got", value);
// Тут выполняем действия при смене языка
});
// Позже в другом месте пользователь меняет язык и мы сохраняем его опять в поток
bSubject.next("c"); // Subscription got c