Тут принципиально важно сначала определиться с двумя вещами:
1) Известны ли все экземпляры классов, которым нужно сообщать о смене языка или их много и они создаются из самых разных мест?
2) Как часто меняется язык, насколько велика сложность его «узнавания» и как работают с языком те классы.
Соотвественно, как варианты, которыми можно решить задачу:
1) Трейты (как вариант множественного наследованиях), на мой взгляд неочевидно и сложно, не переносимо.
2) Наследование от класса Localized, если можно логично встроить в цепочку наследования и код установки языка для каждого класса-наследника похожий.
3) Интерфейсы, если наследование невозможно ИЛИ код/логика установки языка отличается для разных классов.
4) Callback-функции, каждый класс, которому нужна информация о смене языка может в конструкторе регистрировать Callback в менеджере языков, а в деструкторе - удалять.
5) Обновление статической переменной в классе-менеджере языков и просто использование её в классах, которым нужен язык.