Si leíste el tutorial I18n en Rails  podrás notar que hasta este punto, los usuarios pueden cambiar el idioma del sitio y todos los enlaces, botones, etiquetas y todos los elementos que definiste con <%= t(‘cualquier texto’) %> serán traducidos. Sin embargo, el contenido de tus tablas de la base datos, por ejemplo un modelo de posts no lo hará. Los artículos sólo se mostrarán en el idioma en que fueron escritos, por supuesto. ¿Cómo podemos almacenar traducciones de contenido generado por los usuarios? La forma más sencilla de hacerlo es mediante el uso de la gema Globalize.

Creamos un nuevo proyecto en Rails, yo le pondré GlobalTest

 

Abre tu proyecto y agrega esto a tu Gemfile:

en la Terminal ejecuta:

y como siempre, cada vez que agregas una nueva gema tenemos que reiniciar el server.

Luego en la Terminal creamos un scaffold llamado Post

Revisa que este correcta la migración y corres:

Cuando ejecutamos una migración, en el schema.rb se creará una tabla llamada “posts” y tiene que verse así:

Ahora en el modelo de Post que está en app/models/post.rb e ingresa los campos que quieres que sean traducidos, no tienen necesariamente que ser todos, dependerá de lo que necesite tu proyecto, en mi caso quiero que title y description tengan traducciones al ingles y español, por ende los ingreso separados por coma.

Para crear la tabla que almacenará nuestras traducciones,  (tendrá el nombre posts_translations) crearémos una migración vacía, en la terminal escribe lo siguiente:

Luego abre la migración vacía que hemos creado, será algo como esto: globalTest/db/migrate/xxxxxxxxxx_create_translation_for_posts.rb y ahora tenemos que eliminar lo que tiene en su interior. Por defecto rails crea un método change pero no nos sirve para el caso de globalize, por lo que tenemos que modificar por lo siguiente:

En primer lugar, ten en cuenta que tenemos que utilizar métodos “up” y “down”. Globalize no puede trabajar con el método “change”. En segundo lugar, la migrate_data: tienes que ponerla en “true” debido a que si aplicas este tutorial a un proyecto que no viene desde cero probablemente ya contienes tu tabla con algunos datos y queremos migrarlos a la tabla de traducciones también (los datos se migrarán a la localidad por defecto que configuraste).

en la Terminal ejecuta la migración que hemos modificado:

Ahora reinicia el servidor para hacer una prueba ingresando en tu browser la siguiente ruta

(observación: en la demo agregué traducciones para los botones y textos estáticos también!)

http://localhost:3000/es/posts

Agrega un post en “nuevo articulo”,  luego de crearlo debes ver el post en español tal como:

Screen Shot 2015-03-28 at 10.20.36 PM

Pero, qué ocurre si ingresas a http://localhost:3000/en/posts ?

Seguramente verás el registro con su id creado para ese Post, pero con sus campos vacíoscomo te muestro en la imágen:

Screen Shot 2015-03-28 at 10.23.32 PM

 

¿Cómo solucionar esto? Muy sencillo, agrega esta línea de código en config/application.rb (justo debajo de config.i18n.default_locale = :es )

Esto permite que nunca queden posts con textos vacíos, entonces al momento de crear un post en español (por ejemplo) si no encuentra su versión en inglés, al ingresar al listado de post en inglés  te mostrará momentáneamente el contenido en español, lo mismo si realizas primero el post en idioma inglés, finalmente tu puedes editar el texto ingresando a su versión correspondiente y guardarla.

Aqui dejo el repo en gitHub: https://github.com/dgattoni/translateYourPosts

Espero que este tutorial haya sido de utilidad para tu proyecto

Keep Coding!

Written by Daniela Gattoni

Software Engineering Student at USM, Santiago, Chile. Web Designer & programmer. #hack4good Santiago 1st place 2014 with #BringYourCup app.

Leave a Comment

Your email address will not be published. Required fields are marked *