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'},
  'eu' => {name: 'Euskara',           code: 'eu',     en: 'Basque'},
  'bn' => {name: 'বাংলা ভাষা',             code: 'bn',     en: 'Bengali'},
  'bg' => {name: 'Български',         code: 'bg',     en: 'Bulgarian'},
  'ca' => {name: 'Català',            code: 'ca',     en: 'Catalan'},
  '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'},
  'gl' => {name: 'Galego',            code: 'gl',     en: 'Galician'},
  'de' => {name: 'Deutsch',           code: 'de',     en: 'German'},
  'el' => {name: 'Ελληνικά',          code: 'el',     en: 'Greek'},
  'he' => {name: 'עברית',             code: 'he',     en: 'Hebrew'},
  'hu' => {name: 'Magyar',            code: 'hu',     en: 'Hungarian'},
  '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'},
  'lv' =>{name: 'Latviešu',          code: 'lv',     en: 'Latvian'},
  'ms' => {name: 'Bahasa Melayu',     code: 'ms',     en: 'Malay'},
  'my' => { name: 'ဗမာစာ',             code: 'my',     en: 'Burmese' },
  'ne' => {name: 'नेपाली भाषा',            code: 'ne',     en: 'Nepali'},
  'fa' => {name: 'زبان_فارسی',        code: 'fa',     en: 'Persian'},
  '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'},
  'sw' => {name: 'Kiswahili',         code: 'sw',     en: 'Swahili'},
  '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'},
  'ur' => {name: 'اردو',              code: 'ur',     en: 'Urdu'},
  '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.



79
80
81
# File 'lib/wovnrb/lang.rb', line 79

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

Class Method Details

.get_code(lang_name) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/wovnrb/lang.rb', line 60

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



74
75
76
77
# File 'lib/wovnrb/lang.rb', line 74

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.



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

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.



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
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/wovnrb/lang.rb', line 95

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 = Addressable::URI.parse(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 = add_query_lang_code(href, 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 = add_query_lang_code(href, 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



83
84
85
# File 'lib/wovnrb/lang.rb', line 83

def lang_code
  @lang_code
end

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



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/wovnrb/lang.rb', line 159

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)
  all_langs = published_langs.add(store.settings['default_lang'])
  all_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::iso_639_1_normalization(@lang_code))
  end

  index_href = index_href_for_encoding_and_decoding(dom)
  # NOTE: when we use `#to_html` with nokogiri, nokogiri encode all href.
  #       but we want to keep original href as much as possible.
  #       That's why we replace href with original href which added lang info by wovnrb like this after we used `to_html`
  dom.to_html.gsub(/href="([^"]*)"/) { |m| "href=\"#{index_href[$1] || $1}\"" }
end