Eu recomendo a resposta postada por Martin.
Mas você parece estar preocupado com o fato de suas consultas ficarem muito complexas:
Criar tabela localizada para cada tabela torna o design e a consulta complexos ...
Então você deve estar pensando que, em vez de escrever consultas simples como esta:
SELECT price, name, description FROM Products WHERE price < 100
... você precisaria começar a escrever consultas assim:
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
Não é uma perspectiva muito bonita.
Mas, em vez de fazê-lo manualmente, você deve desenvolver sua própria classe de acesso ao banco de dados, que pré-analisa o SQL que contém sua marcação de localização especial e o converte no SQL real que você precisará enviar ao banco de dados.
Usar esse sistema pode ser algo como isto:
db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
FROM _(Products p) WHERE price < 100");
E tenho certeza que você pode fazer ainda melhor isso.
A chave é ter suas tabelas e campos nomeados de maneira uniforme.