Go to English Blog

Gerando títulos da página com I18n no Rails

Leia em 1 minuto

Mesmo quando eu não tenho que dar suporte para diversos idiomas, acho infinitamente mais simples utilizar o I18n para gerenciar os textos do meu site, que deixar direto no HTML.

E uma das coisas que eu sempre replicava era o processo de geração de de títulos da página (aqueles que são exibidos na tag <title>). Ontem eu decidi perder um tempinho e criei uma gem chamada page_title que permite definir títulos de página de um modo muito simples.

Instalando

Para instalar a biblioteca, basta adiciona a seguinte linha ao arquivo Gemfile.

gem "page_title"

Lembre-se de instalá-la com o comando bundle install.

Usando

A gem page_title adiciona um método page_title nos controllers e views. Para definir o título de uma página basta definir uma tradução seguindo o formato titles.<controller>.<action>. Para o caso de uma action como SitesController#index, você pode ter a seguinte internacionalização:

pt-BR:
  titles:
    base: "%{title} - HOWTO"
    site:
      index: "Cursos sobre Ruby, JavaScript, HTML5/CSS3 e muito mais!"

Note que você precisa definir a chave titles.base; neste caso, estou usando o nome do site.

Você também pode definir o título de controllers que estão em um namespace, como em Admin::CategoriesController#Index.

pt-BR:
  titles:
    base: "%{title} - HOWTO"
    admin:
      categories:
        index: "Lista de categorias"

Às vezes também precisamos interpolar valores dinamicamente. Para isso você pode usar o método PageTitle::Base#[]= diretamente em seu controller. Para definir o título Desenvolvimento Web com Ruby on Rails – HOWTO, você pode usar a seguinte internacionalização:

pt-BR:
  titles:
    base: "%{title}  HOWTO"
    workshops:
      show: "%{name}"

No seu controller, basta atribuir o valor do placeholder como no trecho abaixo.

class WorkshopsController < ApplicationController
  def show
    @workshop = Workshop.find_by_permalink!(params[:permalink])
    page_title[:name] = @workshop.name
  end
end

Finalmente, para exibir o título da página, basta adicionar uma chamada ao método page_title ao seu arquivo de layout.

<!DOCTYPE html>
<html lang="<%= I18n.locale %>" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title><%= page_title %></title>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

Nada como bibliotecas pequenas para evitar a duplicação de código entre projetos diferentes.