A maneira mais comum que eu vi isso é com duas tabelas,
membership
e membership_ml
, com um armazenando os valores base e a tabela ml armazenando as strings localizadas. Isso é semelhante à sua segunda opção. A maioria dos sistemas que vejo como esse são feitos dessa maneira porque não foram projetados com a internacionalização em mente desde o início, então as tabelas _ml extras foram "colocadas" posteriormente. O que eu acho que é uma opção melhor é semelhante à sua primeira opção, mas um pouco diferente. Você teria uma tabela central para armazenar todas as traduções, mas em vez de colocar o nome da tabela e o nome do campo lá, você usaria tokens e uma tabela central de "Conteúdo" para armazenar todas as traduções. Dessa forma, você pode impor algum tipo de RI entre os tokens na tabela base e as traduções na tabela Content, se desejar.
Na verdade, faça uma pergunta sobre isso há algum tempo, para que você possa dar uma olhada nisso para obter mais informações (em vez de colar novamente os exemplos de esquema aqui).