Issue #20: separating user language choice storage from translation logic