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' }
}.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(lang_name) ⇒ Lang

Returns a new instance of Lang.



77
78
79
# File 'lib/wovnrb/lang.rb', line 77

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

Instance Attribute Details

#lang_codeObject (readonly)

Returns the value of attribute lang_code.



81
82
83
# File 'lib/wovnrb/lang.rb', line 81

def lang_code
  @lang_code
end

Class Method Details

.get_code(lang_name) ⇒ Object



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

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|
    return l[:code] if lang_name.casecmp(l[:name]).zero? || lang_name.casecmp(l[:en]).zero? || lang_name.casecmp(l[:code]).zero?
  end
  nil
end

.get_lang(lang) ⇒ Object



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

def self.get_lang(lang)
  lang_code = get_code(lang)
  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.



54
55
56
# File 'lib/wovnrb/lang.rb', line 54

def self.iso_639_1_normalization(lang_code)
  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.



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

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)
        new_href = if sub_code && sub_code.casecmp(code_to_add).zero?
                     href.sub(Regexp.new(code_to_add, 'i'), code_to_add.downcase)
                   else
                     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}$/, '')
      new_href = if href =~ /^\.\..*$/
                   # ../path
                   lang_url + '/' + href.gsub(/^\.\.\//, '')
                 elsif href =~ /^\..*$/
                   # ./path
                   lang_url + current_dir + '/' + href.gsub(/^\.\//, '')
                 elsif href =~ /^\/.*$/
                   # /path
                   lang_url + href
                 else
                   # path
                   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