Class: Utopia::Middleware::Localization

Inherits:
Object
  • Object
show all
Defined in:
lib/utopia/middleware/localization.rb,
lib/utopia/middleware/localization/name.rb

Defined Under Namespace

Modules: Name

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Localization

Returns a new instance of Localization.



28
29
30
31
32
33
# File 'lib/utopia/middleware/localization.rb', line 28

def initialize(app, options = {})
	@app = app

	@default_locale = options[:default] || "en"
	@all_locales = options[:all] || ["en"]
end

Instance Attribute Details

#all_localesObject (readonly)

Returns the value of attribute all_locales.



43
44
45
# File 'lib/utopia/middleware/localization.rb', line 43

def all_locales
  @all_locales
end

#default_localeObject (readonly)

Returns the value of attribute default_locale.



44
45
46
# File 'lib/utopia/middleware/localization.rb', line 44

def default_locale
  @default_locale
end

Instance Method Details

#call(env) ⇒ Object



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
# File 'lib/utopia/middleware/localization.rb', line 46

def call(env)
	path = Path.create(env["PATH_INFO"])

	request_locale = current_locale(env, path.basename)
	resource_name = Name.nonlocalized(path.basename, @all_locales).join(".")

	env["utopia.current_locale"] = request_locale
	env["utopia.localization"] = self

	localized_name = Name.localized(resource_name, request_locale, @all_locales).join(".")

	localization_probe = env.dup
	localization_probe["REQUEST_METHOD"] = "HEAD"
	localization_probe["PATH_INFO"] = (path.dirname + localized_name).to_s

	response = @app.call(localization_probe)

	if response[0] < 300
		if path.basename == localized_name
			return @app.call(env)
		else
			return [307, {"Location" => localization_probe["PATH_INFO"]}, []]
		end
	elsif response[0] < 400
		return response
	else
		if path.basename == resource_name
			return @app.call(env)
		else
			return [307, {"Location" => (path.dirname + resource_name).to_s}, []]
		end
	end
end

#current_locale(env, resource_name) ⇒ Object



39
40
41
# File 'lib/utopia/middleware/localization.rb', line 39

def current_locale(env, resource_name)
	Rack::Request.new(env).GET["locale"] || named_locale(resource_name) || @default_locale
end

#named_locale(resource_name) ⇒ Object



35
36
37
# File 'lib/utopia/middleware/localization.rb', line 35

def named_locale(resource_name)
	Name.extract_locale(resource_name, @all_locales)
end