rack-r18n 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.textile +1 -1
- data/lib/rack-r18n.rb +45 -12
- data/test/setup.rb +15 -0
- data/test/suite/lib/rack-r18n.rb +29 -0
- metadata +5 -3
data/README.textile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
h1. Rack-R18n
|
2
2
|
|
3
3
|
A small Rack middleware taking care of setting up your R18n locales.
|
4
|
-
You may pass @:default@ for a default locale and @:
|
4
|
+
You may pass @:default@ for a default locale and @:place@ for translation place,
|
5
5
|
defaults to "i18n".
|
data/lib/rack-r18n.rb
CHANGED
@@ -5,29 +5,62 @@ module Rack
|
|
5
5
|
class R18n
|
6
6
|
# Avaible options:
|
7
7
|
# :default => en
|
8
|
-
# :
|
9
|
-
|
8
|
+
# :place => "i18n"
|
9
|
+
# Note: This is relative to #root
|
10
|
+
attr_reader :options, :place
|
10
11
|
def initialize(app, options = {})
|
11
12
|
@app = app
|
12
13
|
@options = options
|
13
14
|
|
14
15
|
::R18n::I18n.default = @options[:default] || "en"
|
15
|
-
@options[:
|
16
|
-
@
|
17
|
-
(Pathname(
|
16
|
+
@options[:place] ||= "i18n"
|
17
|
+
@place = Array(@options[:place]).map do |dir|
|
18
|
+
(Pathname(self.class.root) + dir).expand_path
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
def call(env)
|
22
|
-
|
23
|
-
|
23
|
+
@env = env
|
24
|
+
::R18n.thread_set {generate_r18n}
|
25
|
+
@app.call(@env)
|
24
26
|
end
|
25
27
|
|
26
|
-
def
|
27
|
-
request = Rack::Request.new(env)
|
28
|
-
locales = ::R18n::I18n.parse_http(env['HTTP_ACCEPT_LANGUAGE'])
|
29
|
-
|
30
|
-
|
28
|
+
def generate_r18n
|
29
|
+
request = Rack::Request.new(@env)
|
30
|
+
locales = ::R18n::I18n.parse_http(@env['HTTP_ACCEPT_LANGUAGE'])
|
31
|
+
if locale = session_locale(@env['rack.session'], locales, request.params[:locale])
|
32
|
+
locale.insert(0, locale)
|
33
|
+
end
|
34
|
+
::R18n::I18n.new(locales, @place)
|
35
|
+
end
|
36
|
+
|
37
|
+
def session_locale(session, locales, locale=nil)
|
38
|
+
if locale
|
39
|
+
if session
|
40
|
+
session[:locale] = locale
|
41
|
+
end
|
42
|
+
elsif session && session[:locale]
|
43
|
+
locale = session[:locale]
|
44
|
+
end
|
45
|
+
locale
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.root
|
49
|
+
@@root ||= if defined? Merb
|
50
|
+
Merb.root
|
51
|
+
elsif defined? Sinatra
|
52
|
+
Sinatra.root
|
53
|
+
elsif defined? Rails
|
54
|
+
Rails.root
|
55
|
+
elsif defined? Rango
|
56
|
+
Rango.root
|
57
|
+
else
|
58
|
+
Dir.pwd
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.root=(root)
|
63
|
+
@@root = root
|
31
64
|
end
|
32
65
|
|
33
66
|
end
|
data/test/setup.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# Add PROJECT/lib to $LOAD_PATH
|
2
|
+
$LOAD_PATH.unshift(File.expand_path("#{__FILE__}/../../lib"))
|
3
|
+
|
4
|
+
# Ensure baretest is required
|
5
|
+
require 'baretest'
|
6
|
+
|
7
|
+
require 'rack-r18n'
|
8
|
+
|
9
|
+
# Some defaults on BareTest (see Kernel#BareTest)
|
10
|
+
BareTest do
|
11
|
+
require_baretest "0.4.0" # minimum baretest version to run these tests
|
12
|
+
require_ruby "1.9.1" # minimum ruby version to run these tests
|
13
|
+
use :support # Use :support in all suites
|
14
|
+
use :rack_test
|
15
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
BareTest.suite "rack-r18n" do
|
2
|
+
suite "#session_locale" do
|
3
|
+
setup do
|
4
|
+
@locales = Object.new
|
5
|
+
@r18n = Rack::R18n.new(proc {})
|
6
|
+
end
|
7
|
+
suite "setting a locale" do
|
8
|
+
suite "if a locale is given" do
|
9
|
+
assert "it gets written to the session" do
|
10
|
+
@r18n.session_locale(@session = {}, @locales, "en")
|
11
|
+
equal("en", @session[:locale])
|
12
|
+
end
|
13
|
+
assert "it doesn't bail if there's no session" do
|
14
|
+
equal("en", @r18n.session_locale(nil, @locales, "en"))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
suite "if no locale is given" do
|
18
|
+
assert "it takes the one from session of avaible" do
|
19
|
+
equal("en", @r18n.session_locale({:locale => "en"}, @locales, nil))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
suite "not setting a locale" do
|
24
|
+
assert "nothing is set" do
|
25
|
+
equal(nil, @r18n.session_locale(nil, @locales, nil))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -5,15 +5,15 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Simon Hafner aka Tass
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain:
|
16
|
-
date: 2010-03
|
16
|
+
date: 2010-05-03 00:00:00 +02:00
|
17
17
|
default_executable:
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
@@ -50,6 +50,8 @@ extra_rdoc_files: []
|
|
50
50
|
|
51
51
|
files:
|
52
52
|
- lib/rack-r18n.rb
|
53
|
+
- test/setup.rb
|
54
|
+
- test/suite/lib/rack-r18n.rb
|
53
55
|
- LICENSE
|
54
56
|
- README.textile
|
55
57
|
has_rdoc: true
|