No Ruby on Rails 2.2 existe o suporte para I18n, ou seja, criar aplicações para múltiplos idiomas.
Vou mostrar como habilitar isso no Ruby on Rails 2.2.
Primeiro pare a sua aplicação.
Abra o arquivo environment.rb localizado no diretório config, nesse arquivo procure pela seguinte linha:
1
| # config.i18n.default_locale = :de |
Ela está comentada e até esse momento o idioma padrão do projeto e o inglês.
Remove o comentário dessa linha e defina o idioma padrão para “pt-BR”:
1
2
3
4
| # The internationalization framework can be changed to have another default locale (standard is :en) or more load paths.
# All files from config/locales/*.rb,yml are added automatically.
# config.i18n.load_path << Dir[File.join(RAILS_ROOT, 'my', 'locales', '*.{rb,yml}')]
config.i18n.default_locale = "pt-BR" |
Agora precisamos criar um arquivo chamado pt-BR.yml, nesse arquivo irá ficar as traduções dos termos do projeto para o português.
Crie o arquivo pt-BR.yml no diretório config/locales, esse diretório config/locales é responsável por armazenar todos os arquivos de tradução do projeto.
Adicione o seguinte conteúdo no arquivo pt-BR.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
| pt-BR:
# formatos de data e hora
date:
formats:
default: "%d/%m/%Y"
short: "%d de %B"
long: "%d de %B de %Y"
only_day: "%d"
day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
order: [:day,:month,:year]
time:
formats:
default: "%A, %d de %B de %Y, %H:%M hs"
time: "%H:%M hs"
short: "%d/%m, %H:%M hs"
long: "%A, %d de %B de %Y, %H:%M hs"
only_second: "%S"
datetime:
formats:
default: "%Y-%m-%dT%H:%M:%S%Z"
am: ''
pm: ''
# date helper distanci em palavras
datetime:
distance_in_words:
half_a_minute: 'meio minuto'
less_than_x_seconds:
one: 'menos de 1 segundo'
other: 'menos de {{count}} segundos'
x_seconds:
one: '1 segundo'
other: '{{count}} segundos'
less_than_x_minutes:
one: 'menos de um minuto'
other: 'menos de {{count}} minutos'
x_minutes:
one: '1 minuto'
other: '{{count}} minutos'
about_x_hours:
one: 'aproximadamente 1 hora'
other: 'aproximadamente {{count}} horas'
x_days:
one: '1 dia'
other: '{{count}} dias'
about_x_months:
one: 'aproximadamente 1 mês'
other: 'aproximadamente {{count}} meses'
x_months:
one: '1 mês'
other: '{{count}} meses'
about_x_years:
one: 'aproximadamente 1 ano'
other: 'aproximadamente {{count}} anos'
over_x_years:
one: 'mais de 1 ano'
other: 'mais de {{count}} anos'
# numeros
number:
format:
precision: 3
separator: ','
delimiter: '.'
currency:
format:
unit: 'R$'
precision: 2
format: '%u %n'
separator: ','
delimiter: '.'
percentage:
format:
delimiter: '.'
precision:
format:
delimiter: '.'
human:
format:
precision: 1
delimiter: '.'
support:
array:
sentence_connector: "e"
skip_last_comma: true
# Active Record
activerecord:
errors:
template:
header:
one: "{{model}} não pôde ser salvo: 1 erro"
other: "{{model}} não pôde ser salvo: {{count}} erros."
body: "Por favor, cheque os seguintes campos:"
messages:
inclusion: "não está incluso na lista"
exclusion: "não está disponível"
invalid: "não é válido"
confirmation: "não bate com a confirmação"
accepted: "precisa ser aceito"
empty: "não pode ser vazio"
blank: "não pode ser vazio"
too_long: "é muito longo (não mais do que {{count}} caracteres)"
too_short: "é muito curto (não menos do que {{count}} caracteres)"
wrong_length: "não é do tamanho correto (precisa ter {{count}} caracteres)"
taken: "não está disponível"
not_a_number: "não é um número"
greater_than: "precisa ser maior do que {{count}}"
greater_than_or_equal_to: "precisa ser maior ou igual a {{count}}"
equal_to: "precisa ser igual a {{count}}"
less_than: "precisa ser menor do que {{count}}"
less_than_or_equal_to: "precisa ser menor ou igual a {{count}}"
odd: "precisa ser ímpar"
even: "precisa ser par" |
Esse arquivo pt-BR.yml foi retirado de: http://github.com/svenfuchs/rails-i18n/tree/master nesse endereço você poderá encontrar traduções para outros idiomas.
Pronto! Agora é só rodar a aplicação e ver as mensagens e o restante traduzido para o português.
Outro detalhe super importante e gera muitas perguntas nas listas e fóruns, é como traduzir os nomes dos atributos do model, por exemplo eu tenho um model com os seguintes atributos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class CreateHistories < ActiveRecord::Migration
def self.up
create_table :histories do |t|
t.string :title, :limit => 150, :null => false
t.string :permalink, :limit => 255
t.text :content, :null => false
t.timestamps
end
add_index(:histories, :permalink, :unique => true)
end
def self.down
drop_table :histories
end
end |
Eu tenho os atributos title, permalink e content, muitas pessoas como eu gostam de programar tudo em inglês.
O problema é quando é exibida as mensagens de validação, os nomes dos atributos vem todos em inglês, por exemplo:
1
2
3
4
5
6
| 2 erros para history
Foram detectados os seguintes erros:
* Title não pode ser vazio
* Content não pode ser vazio |
Para resolver esse problema e ser feliz, existe um outro plugin chamado activerecord_i18n_defaults que pode ser encontrado aqui: http://github.com/dcrec1/activerecord_i18n_defaults/tree/master.
Vamos usar ele.
Instalação
No diretório raiz do projeto digite:
1
| ruby script/plugin install git://github.com/dcrec1/activerecord_i18n_defaults.git |
Agora lembra do arquivo pt-BR.yml que criamos acima, vamos abrir ele e inserir novas traduções para os atributos do model.
Procure no arquivo pt-BR.yml por essa parte:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| ...
# Active Record
activerecord:
errors:
template:
header:
one: "model não pôde ser salvo: 1 erro"
other: "model não pôde ser salvo: count erros."
body: "Por favor, cheque os seguintes campos:"
messages:
inclusion: "não está incluso na lista"
exclusion: "não está disponível"
invalid: "não é válido"
confirmation: "não bate com a confirmação"
accepted: "precisa ser aceito"
empty: "não pode ser vazio"
blank: "não pode ser vazio"
too_long: "é muito longo (não mais do que count caracteres)"
too_short: "é muito curto (não menos do que count caracteres)"
wrong_length: "não é do tamanho correto (precisa ter count caracteres)"
taken: "não está disponível"
not_a_number: "não é um número"
greater_than: "precisa ser maior do que count"
greater_than_or_equal_to: "precisa ser maior ou igual a count"
equal_to: "precisa ser igual a count"
less_than: "precisa ser menor do que count"
less_than_or_equal_to: "precisa ser menor ou igual a count"
odd: "precisa ser ímpar"
even: "precisa ser par" |
Adicione o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| ...
# Active Record
activerecord:
attributes:
_all:
created_at: "Data de criação"
updated_at: "Data de atualização"
history:
title: "Título"
content: "Conteúdo"
errors:
template:
header:
one: "model não pôde ser salvo: 1 erro"
other: "model não pôde ser salvo: count erros."
body: "Por favor, cheque os seguintes campos:"
messages:
inclusion: "não está incluso na lista"
exclusion: "não está disponível"
invalid: "não é válido"
confirmation: "não bate com a confirmação"
accepted: "precisa ser aceito"
empty: "não pode ser vazio"
blank: "não pode ser vazio"
too_long: "é muito longo (não mais do que count caracteres)"
too_short: "é muito curto (não menos do que count caracteres)"
wrong_length: "não é do tamanho correto (precisa ter count caracteres)"
taken: "não está disponível"
not_a_number: "não é um número"
greater_than: "precisa ser maior do que count"
greater_than_or_equal_to: "precisa ser maior ou igual a count"
equal_to: "precisa ser igual a count"
less_than: "precisa ser menor do que count"
less_than_or_equal_to: "precisa ser menor ou igual a count"
odd: "precisa ser ímpar"
even: "precisa ser par" |
Ou seja, adicionei:
1
2
3
4
5
6
7
| attributes:
_all:
created_at: "Data de criação"
updated_at: "Data de atualização"
history:
title: "Título"
content: "Conteúdo" |
Tudo que fica abaixo do atributo _all, no caso created_at e updated_at são atributos do model comuns entre vários models, você define ali e todo mundo que tiver esses atributos já serão traduzidos.
E a parte abaixo são atributos específicos do model history:
1
2
3
| history:
title: "Título"
content: "Conteúdo" |
O bom de existir a parte com _all é que você não precisa ficar duplicando traduções, é o que as pessoas xaropes, manés e viciadas em acrónimos da informática chamam de DRY (o mundo seria bem melhor sem essas pessoas ;-)).
Eu percebi que a gem Brazilian Rails gera alguns conflitos nas mensagens de validações, por isso eu sugiro que você desabilite deixando o seu environment.rb assim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| ...
# Specify gems that this application depends on.
# They can then be installed with "rake gems:install" on new installations.
# You have to specify the :lib option for libraries, where the Gem name (sqlite3-ruby) differs from the file itself (sqlite3)
# config.gem "bj"
# config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
# config.gem "sqlite3-ruby", :lib => "sqlite3"
# config.gem "aws-s3", :lib => "aws/s3"
# config.gem "brazilian-rails", :version => '2.0.13'
config.gem "brcep", :version => '2.0.13'
config.gem "brcpfcnpj", :version => '2.0.13'
config.gem "brdata", :version => '2.0.13'
config.gem "brdinheiro", :version => '2.0.13'
config.gem "brhelper", :version => '2.0.13'
config.gem "brnumeros", :version => '2.0.13'
config.gem "brstring", :version => '2.0.13'
# config.gem "brtraducao", :version => '2.0.13'
... |
Mais informações: http://iain.nl/2008/09/translating-activerecord/.
Se você gostou desse texto e acha que ajudou você, me recomende:
.