Class: Wovnrb::UrlLanguageSwitcher
- Inherits:
-
Object
- Object
- Wovnrb::UrlLanguageSwitcher
- Defined in:
- lib/wovnrb/url_language_switcher.rb
Overview
URL Language switching helper, ported from html-swapper
Instance Method Summary collapse
-
#add_lang_code(href, to_lang_code, headers) ⇒ Object
Adds language code to URL in “href” variable by “pattern” variable and own lang_code.
-
#initialize(store) ⇒ UrlLanguageSwitcher
constructor
A new instance of UrlLanguageSwitcher.
-
#remove_lang_from_uri_component(uri, lang, headers = nil) ⇒ String
Removes language code from a URI component (path, hostname, query etc), and returns it.
Constructor Details
#initialize(store) ⇒ UrlLanguageSwitcher
Returns a new instance of UrlLanguageSwitcher.
7 8 9 |
# File 'lib/wovnrb/url_language_switcher.rb', line 7 def initialize(store) @store = store end |
Instance Method Details
#add_lang_code(href, to_lang_code, headers) ⇒ Object
Adds language code to URL in “href” variable by “pattern” variable and own lang_code.
When lang_code is 'ja', add_lang_code('https://wovn.io', 'path', url) returns 'https://wovn.io/ja/'.
15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/wovnrb/url_language_switcher.rb', line 15 def add_lang_code(href, to_lang_code, headers) return nil if href.nil? return href if href.match?(/^(#.*)?$/) href_scheme = href[/^[A-Za-z][A-Za-z0-9+\-.]*(?=:)/] return href if !href_scheme.nil? && href_scheme != 'http' && href_scheme != 'https' code_to_add = @store.custom_lang_aliases[to_lang_code] || to_lang_code if Wovnrb::URL.absolute_url?(href) add_lang_code_absolute_url(href, code_to_add, headers) else add_lang_code_relative_url(href, code_to_add, headers) end end |
#remove_lang_from_uri_component(uri, lang, headers = nil) ⇒ String
Removes language code from a URI component (path, hostname, query etc), and returns it.
36 37 38 39 40 41 42 43 44 45 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 |
# File 'lib/wovnrb/url_language_switcher.rb', line 36 def remove_lang_from_uri_component(uri, lang, headers = nil) lang_code = @store.settings['custom_lang_aliases'][lang] || lang return uri if lang_code.blank? case @store.settings['url_pattern'] when 'query' lang_param_name = @store.settings['lang_param_name'] uri.sub(/(^|\?|&)#{lang_param_name}=#{lang_code}(&|$)/, '\1').gsub(/(\?|&)$/, '') when 'subdomain' rp = Regexp.new("(^|(//))#{lang_code}\\.", 'i') uri.sub(rp, '\1') when 'path' # ^(.*://|//)? 1: schema (optional) like https:// # ([^/]*/)? 2: host (optional) like wovn.io, with trailing '/' (mandatory) # (/|$) 3: path or end-of-string lang_code_pattern = %r{^(.*://|//)?([^/]*/)?#{lang_code}(/|$)} uri.sub(lang_code_pattern, '\1\2') when 'custom_domain' custom_domain_langs = @store.custom_domain_langs custom_domain_lang_to_remove = custom_domain_langs.custom_domain_lang_by_lang(lang_code) default_custom_domain_lang = custom_domain_langs.custom_domain_lang_by_lang(@store.default_lang) new_uri = uri if Wovnrb::URL.absolute_url?(uri) new_uri = CustomDomainLangUrlHandler.change_to_new_custom_domain_lang(uri, custom_domain_lang_to_remove, default_custom_domain_lang) elsif Wovnrb::URL.absolute_path?(uri) absolute_url = "#{headers.protocol}://#{headers.unmasked_host}#{uri}" absolute_url_with_lang = CustomDomainLangUrlHandler.change_to_new_custom_domain_lang(absolute_url, custom_domain_lang_to_remove, default_custom_domain_lang) segments = make_segments_from_absolute_url(absolute_url_with_lang) new_uri = segments['others'] elsif uri == custom_domain_lang_to_remove.host absolute_url = "#{headers.protocol}://#{uri}#{headers.unmasked_pathname}" absolute_url_with_lang = CustomDomainLangUrlHandler.change_to_new_custom_domain_lang(absolute_url, custom_domain_lang_to_remove, default_custom_domain_lang) segments = make_segments_from_absolute_url(absolute_url_with_lang) new_uri = segments['host'] end new_uri else raise RuntimeError("Invalid URL pattern: #{@store.settings['url_pattern']}") end end |