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.