Je recommande la réponse publiée par Martin.
Mais vous semblez préoccupé par le fait que vos requêtes deviennent trop complexes:
Créer une table localisée pour chaque table rend la conception et les requêtes complexes ...
Vous pensez donc peut-être qu'au lieu d'écrire des requêtes simples comme celle-ci:
SELECT price, name, description FROM Products WHERE price < 100
... vous devrez commencer à écrire des requêtes comme celle-ci:
SELECT
p.price, pt.name, pt.description
FROM
Products p JOIN ProductTranslations pt
ON (p.id = pt.id AND pt.lang = "en")
WHERE
price < 100
Pas une très jolie perspective.
Mais au lieu de le faire manuellement, vous devez développer votre propre classe d'accès à la base de données, qui pré-analyse le SQL qui contient votre balisage de localisation spécial et le convertit en SQL réel que vous devrez envoyer à la base de données.
L'utilisation de ce système peut ressembler à ceci:
db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
FROM _(Products p) WHERE price < 100");
Et je suis sûr que vous pouvez faire encore mieux cela.
La clé est d'avoir vos tables et champs nommés de manière uniforme.