Supongamos que tenemos un sitio que originalmente no fue preparado para múltiples idiomas y el cliente ahora nos pide una versión en inglés. Para simplificar vamos a suponer que tenemos un único modelo llamado Product que tiene un campo name, el cual ahora va a tener que ser guardado en dos idiomas.

CakePHP ya viene preparado para una situación así, sólo basta con crear la tabla i18n, adjuntar el TranslateBehavior al modelo, con el siguiente código:

var $actsAs = array('Translate' => array('name'));

Y listo, todo todo estará funcionando.

Sin embargo tenemos un problema: si el modelo ya tenía datos, veremos que desde el momento en que el behavior se agrega, estos datos ya no se verán cuando se haga un find(). Esto sucede porque la consulta SQL que realiza el Translate Behavior hace un JOIN entre la tabla del modelo (en este caso products) con la tabla i18n, y como la tabla i18n está vacía porque recién la creamos, la consulta no devuelve resultados.

La solución sería inicializar la tabla i18n con los datos que ya tiene la tabla products, lo cual se podría hacer mediante programación, pero es mucho más fácil escribiendo código SQL puro.

La siguiente consulta sirve para copiar los datos del campo name de la tabla products a la tabla i18n de modo que quede funcional para el Translate Behavior. Suponemos que los contenidos originalmente estaban publicados en español.

insert into i18n (select null, 'spa', 'Product', Product.id, 'name', Product.name from products as Product)

Este procedimiento hay que repetirlo para cada campo de cada modelo que queremos traducir.

No es una solución muy elegante ni tampoco muy automática, pero resuelve el problema de manera bastante rápida.