g11n 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in g11n.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Fernando Via
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,85 @@
1
+ # G11n is Globalization
2
+
3
+ Globalization (g11n) is a Ruby Gem for easy language file handling aimed at internationalized projects.
4
+
5
+ The developers of g11n are well aware of the existence of both i18n and r18n Ruby Gems, but wanted a new approach (specially in terms of simplicity) and this is the answer.
6
+
7
+ ## Usage
8
+
9
+ G11n assumes you will have a series of language files written in YAML in an accessible folder to your project, named after each language's locale and followed by the YAML extension. Both `.yaml` and `.yml` extensions are recognized.
10
+
11
+ The default path for that folder is `translations/`. So, for example, if you have a file named `translations/it.yaml` that reads as...
12
+
13
+ # ./translations/it.yaml
14
+ home:
15
+ title: La pasta di la nonna
16
+ menu:
17
+ preparation: Comme farla
18
+ eating: Comme si mangia
19
+ wine: Con che si accompagna
20
+
21
+ ... you can, in your project, insert the following code and get the internationalized strings:
22
+
23
+ # .script.rb
24
+ require "g11n"
25
+
26
+ G11n.locale :it # Configures G11n to use italian. Default is "en"
27
+
28
+ G11n.t.home.title # => "La pasta di la nonna"
29
+ G11n.t.home.menu.wine # => "Con che si accompagna"
30
+
31
+ ## Installation
32
+
33
+ $ gem install g11n
34
+
35
+ ### Or when using Bundler
36
+
37
+ Add this line to your application's Gemfile:
38
+
39
+ gem 'g11n'
40
+
41
+ And then execute:
42
+
43
+ $ bundle
44
+
45
+ ## Configuring
46
+
47
+ Configuration is straight forward. You are using another directory for your language files? Just `G11n.path "your/path"`. You want to change the locale? `G11n.locale :yours`.
48
+
49
+ # ./translations/ru.yml
50
+ home:
51
+ land: Российская Федерация
52
+
53
+ require "g11n"
54
+
55
+ G11n.path "i18ns"
56
+ G11n.locale :ru
57
+
58
+ G11n.t.home.land # => "Российская Федерация"
59
+
60
+ Also, the `G11n::DSL` module can be included in any object of class you want to use the `#t` method more confortably.
61
+
62
+ > **Note**: g11n is planned to soon be made a Sinatra extension
63
+
64
+ ## Testing
65
+
66
+ Cucumber features and RSpec specs are provided to check functionality.
67
+
68
+ An exception is the G11n::Dictionary class, which is just a subclass of SymbolTable that recursively converts all hashes passed as argument to the initializer into Dictionaries. This is really handy.
69
+
70
+ ## License
71
+
72
+ Copyright (C) 2012 Fetcher
73
+
74
+ This program is free software: you can redistribute it and/or modify
75
+ it under the terms of the GNU General Public License as published by
76
+ the Free Software Foundation, either version 3 of the License, or
77
+ (at your option) any later version.
78
+
79
+ This program is distributed in the hope that it will be useful,
80
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
81
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82
+ GNU General Public License for more details.
83
+
84
+ You should have received a copy of the GNU General Public License
85
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,16 @@
1
+ Feature: Domain Specific Language
2
+ In order to use the g11n engine easily
3
+ As a developer
4
+ I want to have a DSL in a Façade object
5
+
6
+ @rollback
7
+ Scenario: Setup the translations path, the locale and get a translation
8
+ Given a source file "i18n/uy.yaml" with:
9
+ """
10
+ bebida:
11
+ nacional: Mate
12
+ """
13
+ When I send :path "i18n" to the configuration DSL
14
+ And I send :locale :uy to the configuration DSL
15
+ And I run "bebida.nacional" on the :t method
16
+ Then I should see "Mate"
@@ -0,0 +1,56 @@
1
+ Feature: Get a translation
2
+ In order to get a translation of an identifier
3
+ As a developer of an internationalized app
4
+ I want to have a simple syntax
5
+
6
+ @rollback
7
+ Scenario: Simple example and simple translation
8
+ Given a source file "translations/en.yaml" with:
9
+ """
10
+ hello: Hello World!
11
+ """
12
+ When I have the locale setted as "en"
13
+ And I write "hello" in the translation engine
14
+ Then I should see "Hello World!"
15
+
16
+ @rollback
17
+ Scenario: Not so simple, more interesting case
18
+ Given a source file "translations/ru.yml" with:
19
+ """
20
+ home:
21
+ country: Российская Федерация
22
+ """
23
+ When I have the locale setted as "ru"
24
+ And I write "home.country" in the translation engine
25
+ Then I should see "Российская Федерация"
26
+
27
+ @rollback
28
+ Scenario: With several languages and changing language on the fly
29
+ Given a source file "translations/es-ar.yaml" with:
30
+ """
31
+ home:
32
+ country:
33
+ legal_name: República Argentina
34
+ """
35
+ And a source file "translations/ja.yml" with:
36
+ """
37
+ home:
38
+ country:
39
+ legal_name: 日本国
40
+ """
41
+ When I have the locale setted as "es-ar"
42
+ And I write "home.country.legal_name" in the translation engine
43
+ Then I should see "República Argentina"
44
+ When I have the locale setted as "ja"
45
+ And I write "home.country.legal_name" in the translation engine
46
+ Then I should see "日本国"
47
+
48
+ @rollback
49
+ Scenario: Locale left default
50
+ Given a source file "translations/en.yaml" with:
51
+ """
52
+ comes:
53
+ from: USA
54
+ """
55
+ When I write "comes.from" in the translation engine
56
+ Then I should see "USA"
@@ -0,0 +1,28 @@
1
+ #Scenario: Setup the translations path, the locale and get a translation
2
+ # Given a source file "i18n/uy.yaml" with:
3
+ # """
4
+ # bebida:
5
+ # nacional: Mate
6
+ # """
7
+ # When I send :path "i18n" to the DSL
8
+ # And I send :locale :uy to the DSL
9
+ # And I run "bebida.nacional" on the :t method
10
+ # Then I should see "Mate"
11
+
12
+ When /^I send :(\w+) "(.+?)" to the configuration DSL$/ do |message, argument|
13
+ o = Object.new
14
+ o.extend G11n::Configuration
15
+ o.send message.to_sym, argument
16
+ end
17
+
18
+ And /^I send :(\w+) :(\w+) to the configuration DSL$/ do |message, argument|
19
+ o = Object.new
20
+ o.extend G11n::Configuration
21
+ o.send message.to_sym, argument
22
+ end
23
+
24
+ And /^I run "(.*?)" on the :(\w+) method$/ do |argument, message|
25
+ o = Object.new
26
+ o.extend G11n::DSL
27
+ @the_translation = eval "o.#{message}.#{argument}"
28
+ end
@@ -0,0 +1,24 @@
1
+ #Scenario: Simple example and simple translation
2
+ # Given a source file "translations/en.yaml" with:
3
+ # """
4
+ # hello: Hello World!
5
+ # """
6
+ # When I have the locale setted as "en"
7
+ # And I write "hello" in the translation engine
8
+ # Then I should see "Hello World!"
9
+
10
+ Given /^a source file "(.*?)" with:$/ do |file, content|
11
+ Fast.file.write file, content
12
+ end
13
+
14
+ When /^I have the locale setted as "(.*?)"$/ do |locale|
15
+ G11n::Translator.instance.locale = locale.to_sym
16
+ end
17
+
18
+ And /^I write "(.*?)" in the translation engine$/ do |identifier|
19
+ @the_translation = eval "G11n::Translator.instance.translate.#{identifier}"
20
+ end
21
+
22
+ Then /^I should see "(.*?)"$/ do |text|
23
+ @the_translation.should == text
24
+ end
@@ -0,0 +1,7 @@
1
+ require "fast/fast"
2
+ require "pry"
3
+
4
+ $LOAD_PATH << File.expand_path("../../../../lib", __FILE__)
5
+ require "g11n"
6
+
7
+ World Fast
@@ -0,0 +1,12 @@
1
+ # The translations/ folder should be removed after use
2
+ After "@rollback" do
3
+ Fast.dir.delete! :translations, :i18n
4
+
5
+ class << G11n::Translator.instance
6
+ def cleanup
7
+ reset
8
+ end
9
+ end
10
+
11
+ G11n::Translator.instance.cleanup
12
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/g11n/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Xavier Via"]
6
+ gem.email = ["xavier.via.canel@gmail.com"]
7
+ gem.description = %q{Internationalization library focused in simplicity of implementation}
8
+ gem.summary = %q{Internationalization library focused in simplicity of implementation}
9
+ gem.homepage = "http://github.com/Fetcher/g11n"
10
+
11
+ gem.add_dependency "symboltable"
12
+
13
+ gem.add_development_dependency "rspec"
14
+ gem.add_development_dependency "cucumber"
15
+ gem.add_development_dependency "fast"
16
+ gem.add_development_dependency "pry"
17
+
18
+ gem.files = `git ls-files`.split($\)
19
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
20
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
21
+ gem.name = "g11n"
22
+ gem.require_paths = ["lib"]
23
+ gem.version = G11n::VERSION
24
+ end
@@ -0,0 +1,20 @@
1
+ # Core
2
+ require "singleton"
3
+
4
+ # Third-party
5
+ require "symboltable"
6
+
7
+ # Local
8
+ require "g11n/version"
9
+ require "g11n/translator"
10
+ require "g11n/dictionary"
11
+ require "g11n/exceptions"
12
+ require "g11n/dsl"
13
+ require "g11n/configuration"
14
+
15
+ module G11n
16
+ class << self
17
+ include DSL
18
+ include Configuration
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module G11n
2
+ # DSL for the configuration of G11n
3
+ module Configuration
4
+ # Sets the translations path
5
+ def path the_path
6
+ Translator.instance.translations_path = the_path + "/"
7
+ end
8
+
9
+ # Sets the locale
10
+ def locale the_locale
11
+ Translator.instance.locale = the_locale
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ # Stupid but really useful class:
2
+ # Inherits from SymbolTable (https://github.com/mjijackson/symboltable), but when it is initialized
3
+ # it simply... well, recursively converts all Hashes into dictionaries
4
+ module G11n
5
+ class Dictionary < SymbolTable
6
+
7
+ def initialize *args
8
+ super *args
9
+ _symbolize!
10
+ end
11
+
12
+ private
13
+ def _symbolize!
14
+ each_key do |key|
15
+ if self[key].instance_of? Hash
16
+ self[key] = Dictionary.new self[key]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,13 @@
1
+ module G11n
2
+
3
+ # The Facade so the g11n library gets used by humans!
4
+ module DSL
5
+
6
+ # Makes the translations. Nice, isn't it? Also, a bonus :translate alias
7
+ def t
8
+ Translator.instance.translate
9
+ end
10
+
11
+ alias :translate :t
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module G11n
2
+ class NoTranslationAvailable < StandardError; end
3
+ end
@@ -0,0 +1,54 @@
1
+ module G11n
2
+ # Manages the configuration of the G11n library
3
+ class Translator
4
+ include Singleton
5
+
6
+ def initialize
7
+ reset
8
+ end
9
+
10
+ # Sets the locale. Fails if the locale matches no available file
11
+ def locale= the_locale
12
+ unless locale_file_exists_for? the_locale
13
+ raise NoTranslationAvailable, "There is no translation file available for the '#{the_locale}' locale, check the tranlations source directory configuration"
14
+ end
15
+ @locale = the_locale
16
+ end
17
+
18
+ # Sets the path where translations will be looked for
19
+ def translations_path= the_path
20
+ @translations_path = the_path
21
+ end
22
+
23
+ # Forwards the method call to the right "dictionary" (a SymbolTable object)
24
+ # http://mjijackson.com/2010/04/config-revisited
25
+ # What it truely does the #translate method is to retrieve the right SymbolTable object from the
26
+ # dictionary
27
+ def translate
28
+ dictionary_for @locale
29
+ end
30
+
31
+ # Looks and returns the right dictionary for the given locale
32
+ def dictionary_for the_locale
33
+ return @dictionaries[the_locale] if @dictionaries.has_key? the_locale # In case is already loaded
34
+ if File.exists? "#{@translations_path}#{the_locale}.yaml"
35
+ @dictionaries[the_locale] = Dictionary.new YAML.load_file "#{@translations_path}#{the_locale}.yaml"
36
+ elsif File.exists? "#{@translations_path}#{the_locale}.yml"
37
+ @dictionaries[the_locale] = Dictionary.new YAML.load_file "#{@translations_path}#{the_locale}.yml"
38
+ else
39
+ raise NoTranslationAvailable, "There is no translation file available for the '#{the_locale}' locale, check the tranlations source directory configuration"
40
+ end
41
+ end
42
+
43
+ private
44
+ def locale_file_exists_for? the_locale
45
+ File.exists?("#{@translations_path}#{the_locale}.yaml") || File.exists?("#{@translations_path}#{the_locale}.yml")
46
+ end
47
+
48
+ def reset
49
+ @translations_path = "translations/"
50
+ @dictionaries = {}
51
+ @locale = :en
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,3 @@
1
+ module G11n
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,109 @@
1
+ require "g11n"
2
+ require "fast/fast"
3
+ require "pry"
4
+
5
+ def low_level_deconfigurate!
6
+ Fast.dir.delete! :translations
7
+
8
+ class << G11n::Translator.instance
9
+ def cleanup
10
+ reset
11
+ end
12
+ end
13
+
14
+ G11n::Translator.instance.cleanup
15
+ end
16
+
17
+ describe G11n::Translator do
18
+ after :each do
19
+ low_level_deconfigurate!
20
+ end
21
+
22
+ describe "#locale=" do
23
+ context "there is no available file for that locale" do
24
+ it "should raise a relevant error" do
25
+ expect { G11n::Translator.instance.locale = :ru
26
+ }.to raise_error G11n::NoTranslationAvailable,
27
+ "There is no translation file available for the 'ru' locale, check the tranlations source directory configuration"
28
+ end
29
+ end
30
+
31
+ context "there is a file available for that locale" do
32
+ before { Fast.file.write "translations/en.yaml", "text: Hello" }
33
+
34
+ it "should set the locale as the given argument" do
35
+ G11n::Translator.instance.locale = :en
36
+ class << G11n::Translator.instance
37
+ def test_me
38
+ @locale.should == :en
39
+ end
40
+ end
41
+ G11n::Translator.instance.test_me
42
+ end
43
+ end
44
+ end
45
+
46
+ describe "#translations_path=" do
47
+ it "sets the translations path" do
48
+ G11n::Translator.instance.translations_path = "other_path"
49
+ class << G11n::Translator.instance
50
+ def test_me
51
+ @translations_path.should == "other_path"
52
+ end
53
+ end
54
+ G11n::Translator.instance.test_me
55
+ end
56
+ end
57
+
58
+ describe "#dictionary_for" do
59
+ context "there is in fact a dictionary for the locale" do
60
+ before do
61
+ Fast.file.write "translations/en.yaml", { :hello => "Text", :nested => { :is => "good" } }.to_yaml
62
+ end
63
+
64
+ it "should return the G11n::Dictionary object with the information from the YAML file" do
65
+ dictionary = G11n::Translator.instance.dictionary_for :en
66
+ dictionary.should be_a G11n::Dictionary
67
+ dictionary.should have_key :hello
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "#translate" do
73
+ context "there is a file usable for translation" do
74
+ before do
75
+ Fast.file.write "translations/en.yaml", { :text => "Hello" }.to_yaml
76
+ end
77
+
78
+ it "should return the translated string" do
79
+ G11n::Translator.instance.translate.text.should == "Hello"
80
+ end
81
+ end
82
+ end
83
+
84
+ # PRIVATE methods
85
+ describe "#locale_file_exists_for?" do
86
+ context "the file in deed exists" do
87
+ before { Fast.file.touch "translations/en.yaml" }
88
+ it "should return true" do
89
+ class << G11n::Translator.instance
90
+ def test_me
91
+ locale_file_exists_for?(:en).should == true
92
+ end
93
+ end
94
+ G11n::Translator.instance.test_me
95
+ end
96
+ end
97
+
98
+ context "there's no such file" do
99
+ it "should return false" do
100
+ class << G11n::Translator.instance
101
+ def test_me
102
+ locale_file_exists_for?(:en).should == false
103
+ end
104
+ end
105
+ G11n::Translator.instance.test_me
106
+ end
107
+ end
108
+ end
109
+ end
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: g11n
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Xavier Via
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2012-07-24 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: symboltable
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ type: :development
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: cucumber
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ type: :development
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: fast
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ type: :development
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ name: pry
78
+ prerelease: false
79
+ requirement: &id005 !ruby/object:Gem::Requirement
80
+ none: false
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ type: :development
89
+ version_requirements: *id005
90
+ description: Internationalization library focused in simplicity of implementation
91
+ email:
92
+ - xavier.via.canel@gmail.com
93
+ executables: []
94
+
95
+ extensions: []
96
+
97
+ extra_rdoc_files: []
98
+
99
+ files:
100
+ - .gitignore
101
+ - Gemfile
102
+ - LICENSE
103
+ - README.md
104
+ - Rakefile
105
+ - features/domain_specific_language.feature
106
+ - features/get_a_translation.feature
107
+ - features/stepdefs/domain_specific_language/setup_the_translations_path_the_locale_and_get_a_translation.rb
108
+ - features/stepdefs/get_a_translation/simple_example_and_simple_translation.rb
109
+ - features/support/env.rb
110
+ - features/support/hooks.rb
111
+ - g11n.gemspec
112
+ - lib/g11n.rb
113
+ - lib/g11n/configuration.rb
114
+ - lib/g11n/dictionary.rb
115
+ - lib/g11n/dsl.rb
116
+ - lib/g11n/exceptions.rb
117
+ - lib/g11n/translator.rb
118
+ - lib/g11n/version.rb
119
+ - spec/g11n/translator_spec.rb
120
+ homepage: http://github.com/Fetcher/g11n
121
+ licenses: []
122
+
123
+ post_install_message:
124
+ rdoc_options: []
125
+
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ hash: 3
134
+ segments:
135
+ - 0
136
+ version: "0"
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ hash: 3
143
+ segments:
144
+ - 0
145
+ version: "0"
146
+ requirements: []
147
+
148
+ rubyforge_project:
149
+ rubygems_version: 1.8.24
150
+ signing_key:
151
+ specification_version: 3
152
+ summary: Internationalization library focused in simplicity of implementation
153
+ test_files:
154
+ - features/domain_specific_language.feature
155
+ - features/get_a_translation.feature
156
+ - features/stepdefs/domain_specific_language/setup_the_translations_path_the_locale_and_get_a_translation.rb
157
+ - features/stepdefs/get_a_translation/simple_example_and_simple_translation.rb
158
+ - features/support/env.rb
159
+ - features/support/hooks.rb
160
+ - spec/g11n/translator_spec.rb
161
+ has_rdoc: