3 of 3 Edited elaborations from the comments into the question

How to prevent a colleague introducing extreme complexity and abstraction?

I am having a very difficult time because my colleague seems to exhibit

  1. Premature/Unnecessary optimization efforts
  2. Premature deduplication with questionable abstractions
    For example, we use a modified VIPER architecture. He introduced a base class for the Router component (using generics) as part of implementing the first viper stack without actually knowing what exactly will be duplicated in other routers. Now we are stuck with having to provide a type UseCase that holds use cases, but most of routers do not have multiple use cases, only one.
  3. Inventing general purpose solutions for speculative potential future features
    For example, he wrote a manager for populating static cell table views when we only had two screens like this in the app and he was not aware the design will move away from boring vertical forms to more custom UIs so the manager is useless.
  4. Opting for incidental complexity

How do I fight this when he also exhibits having a language barrier with lousy English?