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.



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

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.



55
56
57
# File 'lib/utopia/middleware/localization.rb', line 55

def all_locales
  @all_locales
end

#default_localeObject (readonly)

Returns the value of attribute default_locale.



56
57
58
# File 'lib/utopia/middleware/localization.rb', line 56

def default_locale
  @default_locale
end

Instance Method Details

#call(env) ⇒ Object



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

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



51
52
53
# File 'lib/utopia/middleware/localization.rb', line 51

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

#named_locale(resource_name) ⇒ Object



47
48
49
# File 'lib/utopia/middleware/localization.rb', line 47

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