La forma más común que he visto hacer esto es con dos tablas, membership
y membership_ml
, uno almacena los valores base y la tabla ml almacena las cadenas localizadas. Esto es similar a su segunda opción. La mayoría de los sistemas que veo así están hechos de esa manera porque no fueron diseñados teniendo en cuenta la internacionalización desde el principio, por lo que las tablas _ml adicionales se "añadieron" más tarde.
Lo que creo que es una mejor opción es similar a su primera opción, pero un poco diferente. Tendría una tabla central para almacenar todas las traducciones, pero en lugar de poner el nombre de la tabla y el nombre del campo allí, usaría tokens y una tabla central de "Contenido" para almacenar todas las traducciones. De esa forma, también puede aplicar algún tipo de RI entre los tokens en la tabla base y las traducciones en la tabla de contenido.
De hecho, hice una pregunta sobre esto mismo hace un tiempo, por lo que puede echarle un vistazo para obtener más información (en lugar de volver a pegar los ejemplos de esquema aquí).