Pour ma part c'est un fichier JSON pour chaque langue, ce qui permet de structurer les traductions et c'est lisible en PHP et en JS.
En BDD, une table langue pour ce qui est nécessaire (pages, objets, classes...)
Par exemple pour la table des pages, une table pages_lang qui contient toutes les données de la page qui varient selon la langue (le titre, les méta...) et dont les clés sont l'ID+lang.
Pour savoir la langue de l'utilisateur je vérifie le paramètre lang dans l'url.
Cela permet d'avoir des urls différentes pour chaque langue.
En BDD, une table langue pour ce qui est nécessaire (pages, objets, classes...)
Par exemple pour la table des pages, une table pages_lang qui contient toutes les données de la page qui varient selon la langue (le titre, les méta...) et dont les clés sont l'ID+lang.
Pour savoir la langue de l'utilisateur je vérifie le paramètre lang dans l'url.
Cela permet d'avoir des urls différentes pour chaque langue.