I18n mantenible con Rails y AngularJS

Nicolás Galdámez
2 min readFeb 14, 2015

--

por Alessandro Desantis

angular-translate es uno de los mejores módulos que tiene AngularJS disponibles actualmente. Es elegante, flexible y extensible más allá del sentido común.

Sin embargo, al desarrollar mi primera aplicación con Angular y Rails, me encontré con que no había una manera sencilla de probar el sistema con RSpec y Capybara, ya que no tenía acceso a las traducciones.

Se me ocurrieron algunas ideas, pero estaban lejos del ideal:

  1. Podría escribir mis traducciones en Rails y luego copiarlas en los archivos JS estáticos, quizás con una tarea Rake, pero no me pareció una solución elegante.
  2. Podría forzar una localización específica y utilizar strings fijos en mis pruebas. De más está decir, que esto era simplemente descabellado.

No se me ocurrió inmediatamente que una buena solución podría ser enviar todas las traducciones vía AJAX.

Configuración

Terminé creando un translations_controller.rb:

Luego, configuré mi aplicación para utilizar angular-translate-loader-static-files (se debe instalar por separado):

También añadí las rutas a config/routes.rb:

Uso

¡Probemos esto! En primer lugar, vamos a crear un HomeController con Angular. Para ello, editaremos el archivo app.js:

Y aquí está la vista home.html correspondiente:

Ahora, tendremos que poner nuestra traducciones en config/locales/en.yml (o donde lo tengas configurado en Rails):

Si cargamos nuestra aplicación ahora, deberíamos ver el texto «Hello, world!».

A partir de esto, escribir una prueba de integración con Capybara es bastante sencillo. Todo lo que debemos hacer es crear un archivo spec/features/home_spec.rb con algo de este estilo:

¡Listo!

Nota: Con unas pocas líneas más de código puedes ampliar esto para que cargue sólo dominios específicos de tus traducciones en vez de todo a la vez (si quieres saber cómo, échale un vistazo al partialLoader de angular-translate).

--

--

Nicolás Galdámez

Co-fundador de @unagi. Me gusta el cine, la lectura, y la ensalada de frutas.