Trabalhar com i18n (internacionalização) no Ruby on Rails já era, em suas versões anteriores, um prazer – e na versão 3.1 houveram algumas adições interessantes neste aspecto do framework. A documentação oficial é ótima, porém deixa a desejar em alguns casos que acabam sendo bem frequentes.

Neste post irei tentar ajudar com alguns tópicos não-triviais de uma aplicação com i18n em Ruby on Rails, baseado na experiência que tive e estou tendo no desenvolvimento da nossa querida plataforma open source de gestão acadêmica, a Uni.

Documentação Oficial

Para melhor entedimento deste artigo, sugiro primeiro a seguinte leitura:

Traduzindo os Models

As traduções dos Models, assim como as outras, devem estar em um ou mais arquivos de tradução a serem carregados pelo Rails, conforme é muito bem descrito pela documentação oficial. A sintaxe para traduzir models é a seguinte:

pt:
  activerecord:
    models:
      course: "Curso"
    attributes:
      course:
        code: "Código"
        name: "Nome"

 

Traduzindo as Mensagens de Sucesso/Erro

Outro uso bem comum de i18n é para a tradução das mensagens de erro/sucesso dos controllers. Com o advento do Rails 3.1, isso fica muito mais simples. Primeiro, precisamos da gem “responders”. No GemFile, acrescente:

gem "responders"

Agora, no terminal, digite:

rails generate responders:install

Isso irá deixar sua aplicação pronta para tradução das mensagens de status dos controllers. Repare no arquivo responders.en.yml, criado na pasta config/locales:

en:
  flash:
    actions:
      create: 
        notice: '%{resource_name} was successfully created.'
      update: 
        notice: '%{resource_name} was successfully updated.'
      destroy: 
        notice: '%{resource_name} was successfully destroyed.'
        alert: '%{resource_name} could not be destroyed.'

Para que isto funcione, você precisa usar o método respond_with em suas actions. Por exemplo:

class CoursesController < ApplicationController
  ...
  def create
    @course = Course.new params[:course]
    @course.save

    respond_with @course
  end
  ...
end

Pronto, agora o Responder será chamado e ele irá utilizar o arquivo de tradução para o i18n. Para definir mensagens específicas para uma determinada action, adicione ao arquivo de tradução do responders as traduções no seguinte formato:

en:
  flash:
    ...
    controller_name:
      action_name:
        notice: "This will be this action's notice"
        alert: "This will be this action's alert"
    ..

Bom, é (só) isso. Deixando as mensagens de status para o arquivo de tradução, acho que os controllers ficam mais limpos e, realmente, cuidando apenas do tratamento de requests. Palmas para o pessoal da 37signals e os desenvolvedores do Ruby on Rails, que continuam a melhorar cada vez mais esse já ótimo framework.