I'ved used typesafe-i18n in the past, but we might as well use i18next, how bad could it be?
typesafe-i18n
i18next