public
Description: Dead simple Rails localization.
Homepage: http://errtheblog.com/posts/55-ya-talkin-gibberish
Clone URL: git://github.com/defunkt/gibberish.git
gibberish / README
100644 119 lines (85 sloc) 3.345 kb
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
= Gibberish
 
Yet another localization library. Maybe with the most agreeable API?
 
= Usage
 
It's simple. Your default language, by default, is English (:en).
 
  >> "Hey there!"[:hey]
  => "Hey there!"
 
Gibberish looks in RAILS_ROOT/lang/*.yml for translation files. Say you have RAILS_ROOT/lang/es.yml,
right? Gibberish will detect that you know about the :es language and will serve up translations
defined in that file if requested to do so.
 
Here's a real simple example file (it's just "key: translation"):
 
  $ cat lang/es.yml
  hey: ¡Hey allí!
 
And, as follows, a real simple example session:
 
  >> "Hey there!"[:hey]
  => "Hey there!"
  >> Gibberish.current_language
  => :en
  >> Gibberish.current_language = :es
  => :es
  >> "Hey there!"[:hey]
  => "¡Hey allí!"
  >> Gibberish.current_language = nil
  => nil
  >> "Hey there!"[:hey]
  => "Hey there!"
 
It even works with simple interpolation:
 
  >> "Hey, {name}!"[:hey_name, 'Chris']
  => "Hey, Chris!"
  >> "{name} is from {place}"[:hey_place, 'Chris', 'the Dreamworld']
  => "Chris is from the Dreamworld"
 
Notice we don't use hashes (#) like normal Ruby interpolation. Also, the names of the variables
in the brackets don't really mean much. Interpolation is done in order -- the first argument replaces
the first variable in brackets, the second the second, etc.
 
Interpolation can also be done via hash:
 
  >> "{name} is from {place}"[:hey_place, { :place => 'Gotham City', :name => 'Batman' }]
  => "Batman is from Gotham City"
 
This of course works with your translations:
 
  $ cat lang/es.yml
  hey: ¡Hey allí!
  hey_name: ¡Hola {name}!
 
  >> "Hey, {name}!"[:hey_name, 'Chris']
  => "Hey, Chris!"
  >> Gibberish.current_language = :es
  => :es
  >> "Hey, {name}!"[:hey_name, 'Cristóbal']
  => ¡Hola Cristóbal!
 
Neat. What other methods do we get?
 
The classic around_filter:
 
  class ApplicationController < ActionController::Base
    around_filter :set_language
 
  private
    def set_language
      Gibberish.use_language(session[:language]) { yield }
    end
  end
 
For the duration of the block, :es is set as the language of choice. After the block is run everything
returns to normal. Rad.
 
Finally, some checking methods, if you need them:
 
  >> Gibberish.default_language?
  => true
  >> Gibberish.current_language = :es
  => :es
  >> Gibberish.current_language
  => :es
  >> Gibberish.default_language?
  => false
 
Languages are loaded by default at Rails startup. In dev mode, language YAML files are reloaded when
modified. No need to reboot the server.
 
  >> Gibberish.load_languages!
  => [:es, :fr, :de, :kl]
  >> Gibberish.languages
  => [:es, :fr, :de, :kl]
 
More as it's needed.
 
= Warning
 
By default, Ruby returns nil when a symbol is passed to String's [] method. Some of Rails, it seems, depends
on this behavior. Yes, I am changing !!core Ruby behavior!! The humanity!
 
To deal with this assumption, Gibberish has a reserved_keys array. It, by default, contains :limit (so Rails
migrations don't explode on you.) To add to this array, just pass it more keys:
 
  >> Gibberish.add_reserved_key :another_key
  => [:limit, :another_key]
  >> Gibberish.add_reserved_keys :more, :keys
  => [:limit, :another_key, :more, :keys]
 
You've been warned. It really shouldn't affect you, though.
 
>> Chris Wanstrath
=> chris[at]ozmm[dot]org