Recomiendo la respuesta publicada por Martin.
Pero parece que le preocupa que sus consultas se vuelvan demasiado complejas:
Crear una tabla localizada para cada tabla hace que el diseño y las consultas sean complejas ...
Por lo tanto, podría estar pensando que, en lugar de escribir consultas simples como esta:
SELECT price, name, description FROM Products WHERE price < 100
... tendrías que empezar a escribir consultas así:
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
No es una perspectiva muy bonita.
Pero en lugar de hacerlo manualmente, debe desarrollar su propia clase de acceso a la base de datos, que analiza previamente el SQL que contiene su marcado de localización especial y lo convierte al SQL real que deberá enviar a la base de datos.
Usar ese sistema podría verse más o menos así:
db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
FROM _(Products p) WHERE price < 100");
Y estoy seguro de que puedes hacerlo aún mejor.
La clave es tener sus tablas y campos nombrados de manera uniforme.