On the library question, honestly: i18next was not designed around this constraint and you feel it. Two data points rather than a recommendation.
next-intl has been publishing guidance for the Cache Components world, and there is an open issue where its Link still triggers a request-context lookup inside a cached scope even when you pass the locale explicitly, so it is not a finished story either. Compile-time approaches like paraglide sidestep the whole problem because messages become plain imports with nothing dynamic to trip over.
I have only run the compile-time route on a small app. Before migrating anything large, go and read the current open issues for whichever one you pick, because this is all moving week to week.