Class: Wovnrb::Lang

Inherits:
Object
  • Object
show all
Defined in:
lib/wovnrb/lang.rb

Constant Summary collapse

LANG =
{
  #http://msdn.microsoft.com/en-us/library/hh456380.aspx
  'ar' => {name: 'العربية',           code: 'ar',     en: 'Arabic'},
  'bg' => {name: 'Български',         code: 'bg',     en: 'Bulgarian'},
  'zh-CHS' => {name: '简体中文',      code: 'zh-CHS', en: 'Simp Chinese'},
  'zh-CHT' => {name: '繁體中文',      code: 'zh-CHT', en: 'Trad Chinese'},
  'da' => {name: 'Dansk',             code: 'da',     en: 'Danish'},
  'nl' => {name: 'Nederlands',        code: 'nl',     en: 'Dutch'},
  'en' => {name: 'English',           code: 'en',     en: 'English'},
  'fi' => {name: 'Suomi',             code: 'fi',     en: 'Finnish'},
  'fr' => {name: 'Français',          code: 'fr',     en: 'French'},
  'de' => {name: 'Deutsch',           code: 'de',     en: 'German'},
  'el' => {name: 'Ελληνικά',          code: 'el',     en: 'Greek'},
  'he' => {name: 'עברית',             code: 'he',     en: 'Hebrew'},
  'id' => {name: 'Bahasa Indonesia',  code: 'id',     en: 'Indonesian'},
  'it' => {name: 'Italiano',          code: 'it',     en: 'Italian'},
  'ja' => {name: '日本語',            code: 'ja',     en: 'Japanese'},
  'ko' => {name: '한국어',            code: 'ko',     en: 'Korean'},
  'ms' => {name: 'Bahasa Melayu',     code: 'ms',     en: 'Malay'},
  'no' => {name: 'Norsk',             code: 'no',     en: 'Norwegian'},
  'pl' => {name: 'Polski',            code: 'pl',     en: 'Polish'},
  'pt' => {name: 'Português',         code: 'pt',     en: 'Portuguese'},
  'ru' => {name: 'Русский',           code: 'ru',     en: 'Russian'},
  'es' => {name: 'Español',           code: 'es',     en: 'Spanish'},
  'sv' => {name: 'Svensk',            code: 'sv',     en: 'Swedish'},
  'th' => {name: 'ภาษาไทย',           code: 'th',     en: 'Thai'},
  'hi' => {name: 'हिन्दी',               code: 'hi',     en: 'Hindi'},
  'tr' => {name: 'Türkçe',            code: 'tr',     en: 'Turkish'},
  'uk' => {name: 'Українська',        code: 'uk',     en: 'Ukrainian'},
  'vi' => {name: 'Tiếng Việt',        code: 'vi',     en: 'Vietnamese'},
}

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(lang_name) ⇒ Lang

Returns a new instance of Lang.



52
53
54
# File 'lib/wovnrb/lang.rb', line 52

def initialize(lang_name)
  @lang_code = Lang.get_code(lang_name)
end

Class Method Details

.get_code(lang_name) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/wovnrb/lang.rb', line 36

def self.get_code(lang_name)
  return nil if lang_name.nil?
  return lang_name if LANG[lang_name]
  LANG.each do |k, l|
    if lang_name.downcase == l[:name].downcase || lang_name.downcase == l[:en].downcase || lang_name.downcase == l[:code].downcase
      return l[:code]
    end
  end
  return nil
end

.get_lang(lang) ⇒ Object



47
48
49
50
# File 'lib/wovnrb/lang.rb', line 47

def self.get_lang(lang)
  lang_code = get_code(lang)
  return LANG[lang_code]
end

Instance Method Details

#add_lang_code(href, pattern, headers) ⇒ String

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', headers) returns 'https://wovn.io/ja/'.

If you want to know more examples, see also test/lib/lang_test.rb.

Parameters:

  • href (String)

    original URL.

  • pattern (String)

    url_pattern of the settings. (‘path’, ‘subdomain’ or ‘query’)

  • headers (Wovnrb::Header)

    instance of Wovn::Header. It generates new env variable for original request.

Returns:

  • (String)

    URL added langauge code.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/wovnrb/lang.rb', line 68

def add_lang_code(href, pattern, headers)
  return href if href =~ /^(#.*)?$/
  # absolute links
  new_href = href
  if href && href =~ /^(https?:)?\/\//i
    # in the future, perhaps validate url rather than using begin rescue
    # "#{url =~ /\// ? 'http:' : ''}#{url}" =~ URI::regexp
    begin
      uri = URI(href)
    rescue
      return new_href
    end
    # only add lang if it's an internal link
    # DNS names are case insensitive
    if uri.host.downcase === headers.host.downcase
      case pattern
        when 'subdomain'
          sub_d = href.match(/\/\/([^\.]*)\./)[1]
          sub_code = Lang.get_code(sub_d)
          if sub_code && sub_code.downcase == @lang_code.downcase
            new_href = href.sub(Regexp.new(@lang_code, 'i'), @lang_code.downcase)
          else
            new_href = href.sub(/(\/\/)([^\.]*)/, '\1' + @lang_code.downcase + '.' + '\2')
          end
        when 'query'
          new_href = href =~ /\?/ ? href + '&wovn=' + @lang_code : href + '?wovn=' + @lang_code
        else # path
          new_href = href.sub(/([^\.]*\.[^\/]*)(\/|$)/, '\1/' + @lang_code + '/')
      end
    end
  elsif href
    case pattern
      when 'subdomain'
        lang_url = headers.protocol + '://' + @lang_code.downcase + '.' + headers.host
        current_dir = headers.pathname.sub(/[^\/]*\.[^\.]{2,6}$/, '')
        if href =~ /^\.\..*$/
          # ../path
          new_href = lang_url + '/' + href.gsub(/^\.\.\//, '')
        elsif href =~ /^\..*$/
          # ./path
          new_href = lang_url + current_dir + '/' + href.gsub(/^\.\//, '')
        elsif href =~ /^\/.*$/
          # /path
          new_href = lang_url + href
        else
          # path
          new_href = lang_url + current_dir + '/' + href
        end
      when 'query'
        new_href = href =~ /\?/ ? href + '&wovn=' + @lang_code : href + '?wovn=' + @lang_code
      else # path
        if href =~ /^\//
          new_href = '/' + @lang_code + href
        else
          current_dir = headers.pathname.sub(/[^\/]*\.[^\.]{2,6}$/, '')
          current_dir = '/' if current_dir == ''
          new_href = '/' + @lang_code + current_dir + href
        end
    end
  end
  new_href
end

#lang_codeObject



56
57
58
# File 'lib/wovnrb/lang.rb', line 56

def lang_code
  @lang_code
end

#switch_dom_lang(dom, store, values, url, headers) ⇒ Object



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/wovnrb/lang.rb', line 131

def switch_dom_lang(dom, store, values, url, headers)
  replace_dom_values(dom, values, store, url, headers)

  # INSERT LANGUAGE METALINKS
  parent_node = dom.at_css('head') || dom.at_css('body') || dom.at_css('html')
  published_langs = get_langs(values)
  published_langs.each do |l|
    insert_node = Nokogiri::XML::Node.new('link', dom)
    insert_node['rel'] = 'alternate'
    insert_node['hreflang'] = l
    insert_node['href'] = headers.redirect_location(l)
    parent_node.add_child(insert_node)
  end

  # set lang property on HTML tag
  if dom.at_css('html') || dom.at_css('HTML')
    (dom.at_css('html') || dom.at_css('HTML')).set_attribute('lang', @lang_code)
  end

  dom.to_html.gsub(/href="([^"]*)"/) { |m| "href=\"#{URI.decode($1)}\"" }
end