However, modern OpenGL doesn't support glTranslatef. What is the equilivant?

The equivalent for any sequence of matrix operations is to construct the equivalent matrix then pass it using glUniform() or a uniform block.

All of the legacy matrix functions specify the actual matrix in their manual pages. Other than that, you just need matrix multiplication (and inversion for the normal matrix, in the event that the model-view matrix isn't orthonormal).