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'},
  'my' => { name: 'ဗမာစာ',             code: 'my',     en: 'Burmese' },
  'ne' => {name: 'नेपाली भाषा',            code: 'ne',     en: 'Nepali'},
  '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.



67
68
69
# File 'lib/wovnrb/lang.rb', line 67

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

Class Method Details

.get_code(lang_name) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/wovnrb/lang.rb', line 48

def self.get_code(lang_name)
  return nil if lang_name.nil?
  return lang_name if LANG[lang_name]
  custom_lang_aliases = Store.instance.settings['custom_lang_aliases']
  custom_lang = LANG[custom_lang_aliases.invert[lang_name]]
  return custom_lang[:code] if custom_lang
  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



62
63
64
65
# File 'lib/wovnrb/lang.rb', line 62

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

.iso_639_1_normalization(lang_code) ⇒ String

Provides the ISO639-1 code for a given lang code. Source: support.google.com/webmasters/answer/189077?hl=en

Parameters:

  • lang_code (String)

    lang_code Code of the language.

Returns:

  • (String)

    The ISO639-1 code of the language.



44
45
46
# File 'lib/wovnrb/lang.rb', line 44

def self.iso_639_1_normalization(lang_code)
  return lang_code.sub(/zh-CHT/i, 'zh-Hant').sub(/zh-CHS/i, 'zh-Hans')
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.



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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/wovnrb/lang.rb', line 83

def add_lang_code(href, pattern, headers)
  return href if href =~ /^(#.*)?$/
  code_to_add = Store.instance.settings['custom_lang_aliases'][@lang_code] || @lang_code
  # 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 == code_to_add.downcase
            new_href = href.sub(Regexp.new(code_to_add, 'i'), code_to_add.downcase)
          else
            new_href = href.sub(/(\/\/)([^\.]*)/, '\1' + code_to_add.downcase + '.' + '\2')
          end
        when 'query'
          new_href = href =~ /\?/ ? href + '&wovn=' + code_to_add : href + '?wovn=' + code_to_add
        else # path
          new_href = href.sub(/([^\.]*\.[^\/]*)(\/|$)/, '\1/' + code_to_add + '/')
      end
    end
  elsif href
    case pattern
      when 'subdomain'
        lang_url = headers.protocol + '://' + code_to_add.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=' + code_to_add : href + '?wovn=' + code_to_add
      else # path
        if href =~ /^\//
          new_href = '/' + code_to_add + href
        else
          current_dir = headers.pathname.sub(/[^\/]*\.[^\.]{2,6}$/, '')
          current_dir = '/' if current_dir == ''
          new_href = '/' + code_to_add + current_dir + href
        end
    end
  end
  new_href
end

#lang_codeObject



71
72
73
# File 'lib/wovnrb/lang.rb', line 71

def lang_code
  @lang_code
end

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



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/wovnrb/lang.rb', line 147

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'] = Lang::iso_639_1_normalization(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