localite 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ task :default => :test
2
+
3
+ task :test do
4
+ sh "ruby test/test.rb"
5
+ end
6
+
7
+ task :rcov do
8
+ sh "cd test; rcov -o ../coverage -x ruby/.*/gems -x ^test.rb test.rb"
9
+ end
10
+
11
+ task :rdoc do
12
+ sh "rdoc -o doc/rdoc"
13
+ end
14
+
15
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1
@@ -0,0 +1,5 @@
1
+ #
2
+ # require all dependent gems
3
+ # require "nokogiri"
4
+
5
+ require "i18n"
data/config/gem.yml ADDED
@@ -0,0 +1,7 @@
1
+ description: An easy to use localization gem.
2
+ url: http://github.com/pboy/localite
3
+ author: pboy
4
+ email: eno-pboy@open-lab.org
5
+ ignore_pattern:
6
+ - "tmp/*"
7
+ - "**/.*"
data/init.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "rubygems"
2
+
3
+ gem_root = File.expand_path(File.dirname(__FILE__))
4
+
5
+ load "#{gem_root}/config/dependencies.rb"
6
+ load "#{gem_root}/lib/#{File.basename(gem_root)}.rb"
7
+
8
+ module Localite; end
9
+
10
+ require "#{gem_root}/lib/localite"
11
+ Localite.init
data/lib/localite.rb ADDED
@@ -0,0 +1,204 @@
1
+ require "logger"
2
+
3
+ #
4
+ # This is a *really* simple template and translation engine.
5
+ #
6
+ # TODO: Use erubis instead of this simple engine...
7
+
8
+ module Localite; end
9
+
10
+ file_dir = File.expand_path(File.dirname(__FILE__))
11
+
12
+ # require "#{file_dir}/localite/missing_translation"
13
+ require "#{file_dir}/localite/scope"
14
+ require "#{file_dir}/localite/settings"
15
+ require "#{file_dir}/localite/translate"
16
+ require "#{file_dir}/localite/template"
17
+
18
+ module Localite
19
+ #
20
+ # Add the Localite adapters for Strings ad Symbols.
21
+ def self.init
22
+ String.send :include, StringAdapter
23
+ Symbol.send :include, SymbolAdapter
24
+ end
25
+
26
+ #
27
+ # a logger
28
+ def self.logger
29
+ klass = defined?(ActiveSupport) ? ActiveSupport::BufferedLogger : Logger
30
+
31
+ @logger ||= klass.new("log/localite.log")
32
+ end
33
+
34
+ extend Settings
35
+ extend Translate
36
+ extend Scope
37
+
38
+ public
39
+
40
+ #
41
+ # Translating a string:
42
+ #
43
+ # If no translation is found we try to translate the string in the base
44
+ # language. If there is no base language translation we return the
45
+ # string, assuming a base language string.
46
+ module StringAdapter
47
+ def t(*args)
48
+ translated = Localite.translate(self, :no_raise) || self
49
+ Localite.template translated, *args
50
+ end
51
+ end
52
+
53
+ #
54
+ # Translating a string:
55
+ #
56
+ # If no translation is found we try to translate the string in the base
57
+ # language. If there is no base language translation we raise areturn the
58
+ # string, assuming a base language string.
59
+ module SymbolAdapter
60
+ def t(*args)
61
+ translated = Localite.translate(self, :do_raise)
62
+ Localite.template translated, *args
63
+ end
64
+
65
+ # returns nil, if there is no translation.
66
+ def t?(*args)
67
+ translated = Localite.translate(self, :no_raise)
68
+ Localite.template translated, *args if translated
69
+ end
70
+ end
71
+
72
+ def self.template(template, *args)
73
+ Template.run mode, template, *args
74
+ end
75
+ end
76
+
77
+ module Localite::Etest
78
+
79
+ #
80
+ # make sure .t actually runs the Template engine
81
+ def test_tmpl
82
+ assert_equal "xyz", "xyz".t(:xyz => "abc")
83
+ assert_equal "abc", "{*xyz*}".t(:xyz => "abc")
84
+ end
85
+
86
+ def test_base_lookup
87
+ assert !I18n.load_path.empty?
88
+
89
+ assert_equal("en.t", "t".t)
90
+ Localite.in("en") {
91
+ assert_equal("en.t", "t".t )
92
+ }
93
+
94
+ Localite.in("de") {
95
+ assert_equal("de.t", "t".t )
96
+ }
97
+
98
+ assert_equal("de.t", Localite.in("de") { "t".t })
99
+ end
100
+
101
+ def test_lookup_de
102
+ Localite.in("de") do
103
+ # flat translation
104
+ assert_equal "de.t", "t".t
105
+
106
+ Localite.scope(:outer, :inner) do
107
+ assert_equal("de/outer/inner/x1", "x1".t)
108
+ end
109
+
110
+ # Miss "x1", and don't translate missing entries
111
+ assert_equal("x1", "x1".t)
112
+ end
113
+ end
114
+
115
+ def test_lookup_in_base
116
+ Localite.in("en") do
117
+ # lookup "base" in base translation
118
+ assert_equal "en_only", "base".t
119
+ end
120
+
121
+ Localite.in("de") do
122
+ # lookup "base" in base (i.e. en) translation
123
+ assert_equal "en_only", "base".t
124
+ end
125
+ end
126
+
127
+ def test_lookup_en
128
+ Localite.in("en") do
129
+
130
+ # flat translation
131
+ assert_equal "en.t", "t".t
132
+
133
+ Localite.scope(:outer, :inner, :x1) do
134
+ assert_equal("en/outer/inner/x1", "x1".t)
135
+ end
136
+
137
+ # Miss "x1", and don't translate missing entries
138
+ assert_equal("x1", "x1".t)
139
+ end
140
+ end
141
+
142
+ def test_lookup_no_specific_lang
143
+ # flat translation
144
+ assert_equal "en.t", "t".t
145
+
146
+ Localite.scope(:outer, :inner, :x1) do
147
+ assert_equal("en/outer/inner/x1", "x1".t)
148
+ end
149
+
150
+ # Miss "x1", and don't translate missing entries
151
+ assert_equal("x1", "x1".t)
152
+ end
153
+
154
+ def test_lookup_symbols
155
+ assert :base.t?
156
+
157
+ assert_equal "en_only", :base.t
158
+
159
+ Localite.in("en") do
160
+ assert_equal "en_only", :base.t
161
+ end
162
+
163
+ Localite.in("de") do
164
+ assert_equal "en_only", :base.t
165
+ end
166
+ end
167
+
168
+ def test_missing_lookup_symbols
169
+ assert !:missing.t?
170
+ assert_raise(Localite::Translate::Missing) {
171
+ assert_equal "en_only", :missing.t
172
+ }
173
+
174
+ Localite.in("en") do
175
+ assert_raise(Localite::Translate::Missing) {
176
+ :missing.t
177
+ }
178
+ end
179
+
180
+ Localite.in("de") do
181
+ assert_raise(Localite::Translate::Missing) {
182
+ :missing.t
183
+ }
184
+ end
185
+
186
+ begin
187
+ :missing.t
188
+ rescue Localite::Translate::Missing
189
+ assert_kind_of(String, $!.to_s)
190
+ end
191
+ end
192
+
193
+ # def test_html
194
+ # assert_equal ">", "{*'>'*}".t(:xyz => [1, 2, 3], :fl => [1.0])
195
+ # assert_equal ">", "{*'>'*}".t(:html, :xyz => [1, 2, 3], :fl => [1.0])
196
+ # assert_equal "3 Fixnums > 1 Float", "{*pl xyz*} > {*pl fl*}".t(:xyz => [1, 2, 3], :fl => [1.0])
197
+ # assert_equal "3 Fixnums > 1 Float", "{*pl xyz*} > {*pl fl*}".t(:html, :xyz => [1, 2, 3], :fl => [1.0])
198
+ # end
199
+ #
200
+ # def test_tmpl
201
+ # # assert_equal "3 chars", "{*len*} chars".t(:len => 3)
202
+ # assert_equal "3 chars", "{*length*} chars".t(:length => 3)
203
+ # end
204
+ end
@@ -0,0 +1,35 @@
1
+ module Localite::RailsFilter
2
+ def self.filter(controller, &block)
3
+ #
4
+ # get the current locale
5
+ locale = begin
6
+ controller.send(:current_locale)
7
+ rescue NoMethodError
8
+ end
9
+
10
+ #
11
+ # get the current locale
12
+ begin
13
+ scope = controller.send(:localite_scope)
14
+ scope = [ scope ] if scope && !scope.is_a?(Array)
15
+ rescue NoMethodError
16
+ end
17
+
18
+ #
19
+ # set up localite for this action.
20
+ Localite.html do
21
+ Localite.in(locale) do
22
+ Localite.scope(*scope, &block)
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ #
30
+ # override this method to adjust localite parameters
31
+ def current_locale
32
+ return params[:locale] if params[:locale] && params[:locale] =~ /^[a-z][a-z]$/
33
+ return params[:lang] if params[:lang] && params[:lang] =~ /^[a-z][a-z]$/
34
+ end
35
+ end
@@ -0,0 +1,140 @@
1
+ module Localite::Scope
2
+ #
3
+ # scope allows to set a scope around a translation. A scoped translation
4
+ #
5
+ # Localite.scope("scope") do
6
+ # "msg".t
7
+ # end
8
+ #
9
+ # will look up "scope.msg" and "msg", in that order, and return the first
10
+ # matching translation in the current locale. Scopes can be stacked; looking
11
+ # up a scoped translation
12
+ # Localite.scope("outer") do
13
+ # Localite.scope("scope") do
14
+ # "msg".t
15
+ # end
16
+ # end
17
+ #
18
+ # will look up "outer.scope.msg", "scope.msg", "msg".
19
+ #
20
+ # If no translation will be found we look up the same entries in the base
21
+ # locale.
22
+ def scope(*args, &block)
23
+ return yield if args.empty?
24
+
25
+ scopes.exec(args.shift) do
26
+ scope *args, &block
27
+ end
28
+ end
29
+
30
+ def scopes
31
+ Thread.current[:"localite:scopes"] ||= Scopes.new
32
+ end
33
+
34
+ #
35
+ # The mode setting defines how the template engine deals with its
36
+ # parameters. In :html mode all parameters will be subject to HTML
37
+ # escaping, while in :text mode the parameters remain unchanged.
38
+ def html(&block)
39
+ in_mode :html, &block
40
+ end
41
+
42
+ def text(&block)
43
+ in_mode :text, &block
44
+ end
45
+
46
+ def mode
47
+ Thread.current[:"localite:mode"] || :text
48
+ end
49
+
50
+ private
51
+
52
+ def in_mode(mode, &block)
53
+ old = Thread.current[:"localite:mode"]
54
+ Thread.current[:"localite:mode"] = mode
55
+ yield
56
+ ensure
57
+ Thread.current[:"localite:mode"] = old
58
+ end
59
+
60
+
61
+ class Scopes < Array
62
+ def exec(s, &block)
63
+ s = "#{last}.#{s}" if last
64
+ push s
65
+
66
+ yield
67
+ ensure
68
+ pop
69
+ end
70
+
71
+ def each(s)
72
+ reverse_each do |entry|
73
+ yield "#{entry}.#{s}"
74
+ end
75
+
76
+ yield s
77
+ end
78
+
79
+ def first(s)
80
+ each(s) do |entry|
81
+ return entry
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ module Localite::Scope::Etest
88
+ Scopes = Localite::Scope::Scopes
89
+
90
+ def test_scope
91
+ scope = Scopes.new
92
+ scope.exec("a") do
93
+ scope.exec("b") do
94
+ scope.exec("b") do
95
+ r = []
96
+ scope.each("str") do |scoped|
97
+ r << scoped
98
+ end
99
+ assert_equal %w(a.b.b.str a.b.str a.str str), r
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ def test_more_scopes
106
+ Localite.scope("a", :b, "b") do
107
+ r = []
108
+ Localite.scopes.each("str") do |scoped|
109
+ r << scoped
110
+ end
111
+ assert_equal %w(a.b.b.str a.b.str a.str str), r
112
+ end
113
+ end
114
+
115
+ def test_more_scopes_w_dots
116
+ Localite.scope("a", :b, "b.c.d") do
117
+ r = []
118
+ Localite.scopes.each("str.y") do |scoped|
119
+ r << scoped
120
+ end
121
+ assert_equal %w(a.b.b.c.d.str.y a.b.str.y a.str.y str.y), r
122
+ end
123
+ end
124
+
125
+ def test_empty_scopes
126
+ r = []
127
+ Localite.scopes.each("str.y") do |scoped|
128
+ r << scoped
129
+ end
130
+ assert_equal %w(str.y), r
131
+ end
132
+
133
+ def test_modi
134
+ assert_equal "abc", "param".t(:xxx => "abc")
135
+ assert_equal "a > c", "param".t(:xxx => "a > c")
136
+ assert_equal "a > c", Localite.text { "param".t(:xxx => "a > c") }
137
+ assert_equal "a &gt; c", Localite.html { "param".t(:xxx => "a > c") }
138
+ assert_equal "a > c", "param".t(:xxx => "a > c")
139
+ end
140
+ end
@@ -0,0 +1,37 @@
1
+ module Localite::Settings
2
+ #
3
+ # Returns the base locale; e.g. :en
4
+ def base
5
+ I18n.default_locale
6
+ end
7
+
8
+ #
9
+ # returns the current locale; defaults to the base locale
10
+ def locale
11
+ @locale || base
12
+ end
13
+
14
+ #
15
+ # is a specific locale available?
16
+ def available?(locale)
17
+ locale && I18n.backend.available_locales.include?(locale.to_sym)
18
+ end
19
+
20
+ #
21
+ # sets the current locale. If the locale is not available it changes
22
+ # the locale to the default locale.
23
+ def locale=(locale)
24
+ locale = locale.to_sym
25
+ @locale = available?(locale) ? locale : base
26
+ end
27
+
28
+ #
29
+ # runs a block in the changed locale
30
+ def in(locale, &block)
31
+ old = self.locale
32
+ self.locale = locale if locale
33
+ yield
34
+ ensure
35
+ self.locale = old
36
+ end
37
+ end
@@ -0,0 +1,126 @@
1
+ require "cgi"
2
+
3
+ class Localite::Template < String
4
+ def self.run(mode, template, opts = {})
5
+ new(template).run(mode, opts)
6
+ end
7
+
8
+ #
9
+ # the environment during run
10
+ class Env
11
+ module Helpers
12
+ # def html(s)
13
+ # CGI.escapeHTML s
14
+ # end
15
+ #
16
+ # def hi(s)
17
+ # "&ldquo;" + CGI.escapeHTML(s) + "&rdquo;"
18
+ # end
19
+
20
+ #
21
+ # pluralize something and add count
22
+ # pl("apple", 1) -> "1 apple"
23
+ # pl("apple", 2) -> "2 apples"
24
+ #
25
+ # Note a special case on arrays:
26
+ # pl(%w(apple peach cherry)) -> "3 Strings"
27
+ def pl(name, count=nil)
28
+ if count
29
+ "#{count} #{count != 1 ? name.pluralize : name.singularize}"
30
+ elsif name.respond_to?(:first) && !name.is_a?(String)
31
+ pl name.first.class.name, name.length # special case, see above.
32
+ else
33
+ name.pluralize
34
+ end
35
+ end
36
+ end
37
+
38
+ def method_missing(sym, *args, &block)
39
+ begin
40
+ return @host.fetch(sym.to_sym)
41
+ rescue IndexError
42
+ :void
43
+ end
44
+
45
+ begin
46
+ return @host.fetch(sym.to_s)
47
+ rescue IndexError
48
+ :void
49
+ end
50
+
51
+ super
52
+ end
53
+
54
+ def initialize(host)
55
+ @host = host
56
+ extend Helpers
57
+ end
58
+
59
+ def [](code)
60
+ eval(code).to_s
61
+ end
62
+ end
63
+
64
+ def run(mode, opts = {})
65
+ #
66
+ env = Env.new(opts)
67
+
68
+ #
69
+ # get all --> {* code *} <-- parts from the template strings and send
70
+ # them thru the environment.
71
+ gsub(/\{\*([^\}]+?)\*\}/) do |_|
72
+ Modi.send mode, env[$1]
73
+ end
74
+ end
75
+
76
+ module Modi
77
+ def self.text(s); s; end
78
+ def self.html(s); CGI.escapeHTML(s); end
79
+ end
80
+ end
81
+
82
+ module Localite::Template::Etest
83
+ Template = Localite::Template
84
+
85
+ def test_templates
86
+ assert_equal "abc", Template.run(:text, "{*xyz*}", :xyz => "abc")
87
+ assert_equal "3 items", Template.run(:text, "{*pl 'item', xyz.length*}", :xyz => "abc")
88
+ assert_equal "xyz", Template.run(:text, "xyz", :xyz => "abc")
89
+ assert_equal "abc", Template.run(:text, "{*xyz*}", :xyz => "abc")
90
+ assert_equal "3", Template.run(:text, "{*xyz.length*}", :xyz => "abc")
91
+ assert_equal "3", Template.run(:text, "{*xyz.length*}", :xyz => "abc")
92
+ assert_equal "3 Fixnums", Template.run(:text, "{*pl xyz*}", :xyz => [1, 2, 3])
93
+ assert_equal "3 Fixnums and 1 Float", Template.run(:text, "{*pl xyz*} and {*pl fl*}", :xyz => [1, 2, 3], :fl => [1.0])
94
+ end
95
+
96
+ def test_pl
97
+ h = Object.new.extend(Localite::Template::Env::Helpers)
98
+ assert_equal "1 apple", h.pl("apple", 1)
99
+ assert_equal "2 apples", h.pl("apple", 2)
100
+ assert_equal "1 apple", h.pl("apples", 1)
101
+ assert_equal "2 apples", h.pl("apples", 2)
102
+
103
+ assert_equal "apples", h.pl("apples")
104
+ assert_equal "apples", h.pl("apple")
105
+
106
+ assert_equal "3 Strings", h.pl(%w(apple peach cherry))
107
+ end
108
+
109
+ def test_html_env
110
+ assert_equal "a>c", Template.run(:text, "{*xyz*}", :xyz => "a>c")
111
+ assert_equal "a&gt;c", Template.run(:html, "{*xyz*}", :xyz => "a>c")
112
+ assert_equal "> a>c", Template.run(:text, "> {*xyz*}", :xyz => "a>c")
113
+ assert_equal "> a&gt;c", Template.run(:html, "> {*xyz*}", :xyz => "a>c")
114
+ end
115
+
116
+ def test_template_hash
117
+ assert_equal "a>c", Template.run(:text, "{*xyz*}", :xyz => "a>c")
118
+ assert_equal "a>c", Template.run(:text, "{*xyz*}", "xyz" => "a>c")
119
+ end
120
+
121
+ def test_template_hash_missing
122
+ assert_raise(NameError) {
123
+ Template.run(:text, "{*abc*}", :xyz => "a>c")
124
+ }
125
+ end
126
+ end
@@ -0,0 +1,65 @@
1
+ require "set"
2
+
3
+ module Localite::Translate
4
+ #
5
+ # translate a string
6
+ #
7
+ # returns the translated string in the current locale.
8
+ # If no translation is found try the base locale.
9
+ # If still no translation is found, return nil
10
+ #
11
+ def translate(s, raise_mode)
12
+ r = do_translate(locale, s)
13
+ return r if r
14
+
15
+ r = do_translate(base, s) if base != locale
16
+ return r if r
17
+
18
+ raise Missing, [locale, s] if raise_mode != :no_raise
19
+ end
20
+
21
+ private
22
+
23
+ def do_translate(locale, s)
24
+ scopes.each(s) do |scoped_string|
25
+ tr = Localite::Translate.translate_via_i18n locale, scoped_string
26
+ return tr if tr
27
+ end
28
+
29
+ record_missing locale, scopes.first(s)
30
+ nil
31
+ end
32
+
33
+ def self.translate_via_i18n(locale, s)
34
+ locale = base unless I18n.backend.available_locales.include?(locale)
35
+ I18n.locale = locale
36
+ I18n.translate(s, :raise => true)
37
+ rescue I18n::MissingTranslationData
38
+ nil
39
+ end
40
+
41
+ #
42
+ # log a missing translation and raise an exception
43
+ def record_missing(locale, s)
44
+ @missing_translations ||= Set.new
45
+ entry = [ locale, s ]
46
+ return if @missing_translations.include?(entry)
47
+ @missing_translations << entry
48
+ logger.warn "Missing translation: [#{locale}] #{s.inspect}"
49
+ end
50
+
51
+ public
52
+
53
+ class Missing < RuntimeError
54
+ attr :locale
55
+ attr :string
56
+
57
+ def initialize(opts)
58
+ @locale, @string = *opts
59
+ end
60
+
61
+ def to_s
62
+ "Missing translation: [#{locale}] #{string.inspect}"
63
+ end
64
+ end
65
+ end
data/localite.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{localite}
5
+ s.version = "0.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["pboy"]
9
+ s.date = %q{2010-05-11}
10
+ s.description = %q{An easy to use localization gem.}
11
+ s.email = %q{eno-pboy@open-lab.org}
12
+ s.extra_rdoc_files = ["lib/localite.rb", "lib/localite/rails_filter.rb", "lib/localite/scope.rb", "lib/localite/settings.rb", "lib/localite/template.rb", "lib/localite/translate.rb", "tasks/echoe.rake"]
13
+ s.files = ["Manifest", "Rakefile", "VERSION", "config/dependencies.rb", "config/gem.yml", "init.rb", "lib/localite.rb", "lib/localite/rails_filter.rb", "lib/localite/scope.rb", "lib/localite/settings.rb", "lib/localite/template.rb", "lib/localite/translate.rb", "localite.tmproj", "script/console", "script/rebuild", "tasks/echoe.rake", "test/i18n/de.yml", "test/initializers/fake_rails.rb", "test/test.rb", "localite.gemspec"]
14
+ s.homepage = %q{http://github.com/pboy/localite}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Localite"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{localite}
18
+ s.rubygems_version = %q{1.3.6}
19
+ s.summary = %q{An easy to use localization gem.}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<i18n>, [">= 0"])
27
+ else
28
+ s.add_dependency(%q<i18n>, [">= 0"])
29
+ end
30
+ else
31
+ s.add_dependency(%q<i18n>, [">= 0"])
32
+ end
33
+ end
data/localite.tmproj ADDED
@@ -0,0 +1,27 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>documents</key>
6
+ <array>
7
+ <dict>
8
+ <key>expanded</key>
9
+ <true/>
10
+ <key>name</key>
11
+ <string>localite</string>
12
+ <key>regexFolderFilter</key>
13
+ <string>!.*/(\.[^/]*|CVS|localite|_darcs|_MTN|\{arch\}|blib|.*~\.nib|.*\.(framework|app|pbproj|pbxproj|xcode(proj)?|bundle))$</string>
14
+ <key>sourceDirectory</key>
15
+ <string></string>
16
+ </dict>
17
+ </array>
18
+ <key>fileHierarchyDrawerWidth</key>
19
+ <integer>339</integer>
20
+ <key>metaData</key>
21
+ <dict/>
22
+ <key>showFileHierarchyDrawer</key>
23
+ <true/>
24
+ <key>windowFrame</key>
25
+ <string>{{10, 0}, {924, 778}}</string>
26
+ </dict>
27
+ </plist>
data/script/console ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Start a console that initializes the gem
4
+ #
5
+ require "irb"
6
+ require "rubygems"
7
+
8
+ begin
9
+ require 'wirble'
10
+ Wirble.init
11
+ Wirble.colorize
12
+ rescue LoadError
13
+ STDERR.puts "To enable colorized and tab completed run 'gem install wirble'"
14
+ end
15
+
16
+ $: << "#{File.dirname(__FILE__)}/../lib"
17
+ load "#{File.dirname(__FILE__)}/../init.rb"
18
+
19
+ I18n.load_path += Dir["#{File.dirname(__FILE__)}/../test/i18n/*.yml"]
20
+
21
+ IRB.start
data/script/rebuild ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/sh
2
+ rake default build_gemspec package || exit 1
3
+ echo "============================================="
4
+ echo "I built the gem for you. To upload, run "
5
+ echo
6
+ echo "gem push $(ls -d pkg/*.gem | tail -n 1)"
7
+
data/tasks/echoe.rake ADDED
@@ -0,0 +1,48 @@
1
+ #
2
+ # GEM settings
3
+ #
4
+ GEM_ROOT = File.expand_path("#{File.dirname(__FILE__)}/..")
5
+
6
+ if gem_config = YAML.load(File.read("#{GEM_ROOT}/config/gem.yml"))
7
+ require 'echoe'
8
+
9
+ #
10
+ # a dependency reader
11
+ module Dependency
12
+ @@dependencies = []
13
+
14
+ def self.require(file)
15
+ @@dependencies << file
16
+ end
17
+
18
+ def self.load
19
+ eval File.read("#{GEM_ROOT}/config/dependencies.rb"), binding
20
+ @@dependencies
21
+ end
22
+ end
23
+
24
+ Echoe.new(File.basename(GEM_ROOT), File.read("#{GEM_ROOT}/VERSION")) do |p|
25
+ gem_config.each do |k,v|
26
+ p.send "#{k}=",v
27
+ end
28
+
29
+ p.runtime_dependencies = Dependency.load
30
+ end
31
+
32
+ desc "Rebuild and install the gem"
33
+ task :rebuild => %w(manifest default build_gemspec package) do
34
+ gem = Dir.glob("pkg/*.gem").sort_by do |filename|
35
+ File.new(filename).mtime
36
+ end.last
37
+
38
+ puts "============================================="
39
+ puts "Installing gem..."
40
+
41
+ system "gem install #{gem} > /dev/null 2>&1"
42
+
43
+ puts ""
44
+ puts "I built and installed the gem for you. To upload, run "
45
+ puts
46
+ puts " gem push #{gem}"
47
+ end
48
+ end
data/test/i18n/de.yml ADDED
@@ -0,0 +1,15 @@
1
+ #
2
+ # Some translation "fixtures"
3
+ de:
4
+ t: "de.t"
5
+ outer:
6
+ inner:
7
+ x1: "de/outer/inner/x1"
8
+
9
+ en:
10
+ param: "{* xxx *}"
11
+ base: "en_only"
12
+ t: "en.t"
13
+ outer:
14
+ inner:
15
+ x1: "en/outer/inner/x1"
@@ -0,0 +1,20 @@
1
+ #
2
+ # set up fake rails
3
+
4
+ require "active_record"
5
+ require "fileutils"
6
+
7
+ LOGFILE = "log/test.log"
8
+ SQLITE_FILE = ":memory:"
9
+
10
+ #
11
+ # -- set up fake rails ------------------------------------------------
12
+
13
+ RAILS_ENV="test"
14
+ RAILS_ROOT="#{DIRNAME}"
15
+
16
+ if !defined?(RAILS_DEFAULT_LOGGER)
17
+ FileUtils.mkdir_p File.dirname(LOGFILE)
18
+ RAILS_DEFAULT_LOGGER = Logger.new(LOGFILE)
19
+ RAILS_DEFAULT_LOGGER.level = Logger::DEBUG
20
+ end
data/test/test.rb ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ DIRNAME = File.expand_path File.dirname(__FILE__)
3
+ Dir.chdir(DIRNAME)
4
+
5
+ #
6
+ # initialize the gem and the test runner
7
+ require '../init'
8
+
9
+ require 'logger'
10
+ require 'ruby-debug'
11
+
12
+ require "#{DIRNAME}/initializers/fake_rails.rb"
13
+
14
+ I18n.load_path += Dir["#{DIRNAME}/i18n/*.yml"]
15
+
16
+ # ---------------------------------------------------------------------
17
+
18
+ begin
19
+ require 'minitest-rg'
20
+ rescue MissingSourceFile
21
+ STDERR.puts "'gem install minitest-rg' gives you redgreen minitests"
22
+ require 'minitest/unit'
23
+ end
24
+
25
+ #
26
+ # run tests
27
+
28
+ require "etest"
29
+
30
+ Etest.autorun
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: localite
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ version: "0.1"
9
+ platform: ruby
10
+ authors:
11
+ - pboy
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2010-05-11 00:00:00 +02:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: i18n
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ segments:
27
+ - 0
28
+ version: "0"
29
+ type: :runtime
30
+ version_requirements: *id001
31
+ description: An easy to use localization gem.
32
+ email: eno-pboy@open-lab.org
33
+ executables: []
34
+
35
+ extensions: []
36
+
37
+ extra_rdoc_files:
38
+ - lib/localite.rb
39
+ - lib/localite/rails_filter.rb
40
+ - lib/localite/scope.rb
41
+ - lib/localite/settings.rb
42
+ - lib/localite/template.rb
43
+ - lib/localite/translate.rb
44
+ - tasks/echoe.rake
45
+ files:
46
+ - Manifest
47
+ - Rakefile
48
+ - VERSION
49
+ - config/dependencies.rb
50
+ - config/gem.yml
51
+ - init.rb
52
+ - lib/localite.rb
53
+ - lib/localite/rails_filter.rb
54
+ - lib/localite/scope.rb
55
+ - lib/localite/settings.rb
56
+ - lib/localite/template.rb
57
+ - lib/localite/translate.rb
58
+ - localite.tmproj
59
+ - script/console
60
+ - script/rebuild
61
+ - tasks/echoe.rake
62
+ - test/i18n/de.yml
63
+ - test/initializers/fake_rails.rb
64
+ - test/test.rb
65
+ - localite.gemspec
66
+ has_rdoc: true
67
+ homepage: http://github.com/pboy/localite
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options:
72
+ - --line-numbers
73
+ - --inline-source
74
+ - --title
75
+ - Localite
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ segments:
83
+ - 0
84
+ version: "0"
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ segments:
90
+ - 1
91
+ - 2
92
+ version: "1.2"
93
+ requirements: []
94
+
95
+ rubyforge_project: localite
96
+ rubygems_version: 1.3.6
97
+ signing_key:
98
+ specification_version: 3
99
+ summary: An easy to use localization gem.
100
+ test_files: []
101
+