Class: Wovnrb::Lang

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

Constant Summary collapse

LANG =
{
  '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-CN' => { name: '简体中文(中国)',         code: 'zh-CN',      en: 'Simp Chinese (China)' },
  'zh-CHS' => { name: '简体中文',                 code: 'zh-CHS',     en: 'Simp Chinese' },
  'zh-Hant-HK' => { name: '繁體中文(香港)',         code: 'zh-Hant-HK', en: 'Trad Chinese (Hong Kong)' },
  'zh-Hant-TW' => { name: '繁體中文(台湾)',         code: 'zh-Hant-TW', en: 'Trad Chinese (Taiwan)' },
  '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' },
  'en-AU' => { name: 'English (Australia)',      code: 'en-AU',      en: 'English (Australia)' },
  'en-CA' => { name: 'English (Canada)',         code: 'en-CA',      en: 'English (Canada)' },
  'en-IN' => { name: 'English (India)',          code: 'en-IN',      en: 'English (India)' },
  'en-NZ' => { name: 'English (New Zealand)',    code: 'en-NZ',      en: 'English (New Zealand)' },
  'en-ZA' => { name: 'English (South Africa)',   code: 'en-ZA',      en: 'English (South Africa)' },
  'en-GB' => { name: 'English (United Kingdom)', code: 'en-GB',      en: 'English (United Kingdom)' },
  'en-SG' => { name: 'English (Singapore)',      code: 'en-SG',      en: 'English (Singapore)' },
  'en-US' => { name: 'English (United States)',  code: 'en-US',      en: 'English (United States)' },
  'fi' => { name: 'Suomi',                    code: 'fi',         en: 'Finnish' },
  'fr' => { name: 'Français',                 code: 'fr',         en: 'French' },
  'fr-CA' => { name: 'Français (Canada)',        code: 'fr-CA',      en: 'French (Canada)' },
  'fr-FR' => { name: 'Français (France)',        code: 'fr-FR',      en: 'French (France)' },
  'fr-CH' => { name: 'Français (Suisse)',        code: 'fr-CH',      en: 'French (Switzerland)' },
  'gl' => { name: 'Galego',                   code: 'gl',         en: 'Galician' },
  'de' => { name: 'Deutsch',                  code: 'de',         en: 'German' },
  'de-AT' => { name: 'Deutsch (Österreich)',     code: 'de-AT',      en: 'German (Austria)' },
  'de-DE' => { name: 'Deutsch (Deutschland)',    code: 'de-DE',      en: 'German (Germany)' },
  'de-LI' => { name: 'Deutsch (Liechtenstien)',  code: 'de-LI',      en: 'German (Liechtenstien)' },
  'de-CH' => { name: 'Deutsch (Schweiz)',        code: 'de-CH',      en: 'German (Switzerland)' },
  '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' },
  'it-IT' => { name: 'Italiano (Italia)',        code: 'it-IT',      en: 'Italian (Italy)' },
  'it-CH' => { name: 'Italiano (Svizzera)',      code: 'it-CH',      en: 'Italian (Switzerland)' },
  'ja' => { name: '日本語',                   code: 'ja',         en: 'Japanese' },
  'ko' => { name: '한국어',                    code: 'ko',         en: 'Korean' },
  'lv' => { name: 'Latviešu',                 code: 'lv',         en: 'Latvian' },
  'mn' => { name: 'монгол',            code: 'mn',         en: 'Mongolian' },
  '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' },
  'fa' => { name: 'زبان_فارسی',                code: 'fa',         en: 'Persian' },
  'pl' => { name: 'Polski',                   code: 'pl',         en: 'Polish' },
  'pt' => { name: 'Português',                code: 'pt',         en: 'Portuguese' },
  'pt-BR' => { name: 'Português (Brasil)',       code: 'pt-BR',      en: 'Portuguese (Brazil)' },
  'pt-PT' => { name: 'Português (Portugal)',     code: 'pt-PT',      en: 'Portuguese (Portugal)' },
  'ru' => { name: 'Русский',                  code: 'ru',         en: 'Russian' },
  'es' => { name: 'Español',                  code: 'es',         en: 'Spanish' },
  'es-AR' => { name: 'Español (Argentina)',      code: 'es-AR',      en: 'Spanish (Argentina)' },
  'es-CL' => { name: 'Español (Chile)',          code: 'es-CL',      en: 'Spanish (Chile)' },
  'es-CO' => { name: 'Español (Colombia)',       code: 'es-CO',      en: 'Spanish (Colombia)' },
  'es-CR' => { name: 'Español (Costa Rica)',     code: 'es-CR',      en: 'Spanish (Costa Rica)' },
  'es-HN' => { name: 'Español (Honduras)',       code: 'es-HN',      en: 'Spanish (Honduras)' },
  'es-419' => { name: 'Español (Latinoamérica)',  code: 'es-419',     en: 'Spanish (Latin America)' },
  'es-MX' => { name: 'Español (México)',         code: 'es-MX',      en: 'Spanish (Mexico)' },
  'es-PE' => { name: 'Español (Perú)',           code: 'es-PE',      en: 'Spanish (Peru)' },
  'es-ES' => { name: 'Español (España)',         code: 'es-ES',      en: 'Spanish (Spain)' },
  'es-US' => { name: 'Español (Estados Unidos)', code: 'es-US',      en: 'Spanish (United States)' },
  'es-UY' => { name: 'Español (Uruguay)',        code: 'es-UY',      en: 'Spanish (Uruguay)' },
  'es-VE' => { name: 'Español (Venezuela)',      code: 'es-VE',      en: 'Spanish (Venezuela)' },
  'sw' => { name: 'Kiswahili',                code: 'sw',         en: 'Swahili' },
  'sv' => { name: 'Svensk',                   code: 'sv',         en: 'Swedish' },
  'tl' => { name: 'Tagalog',                  code: 'tl',         en: 'Tagalog' },
  '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' },
  'uz' => { name: 'Oʻzbekcha',                      code: 'uz',         en: 'Uzbek' },
  'vi' => { name: 'Tiếng Việt',               code: 'vi',         en: 'Vietnamese' },
  'km' => { name: 'ភាសាខ្មែរ',               code: 'km',         en: 'Khmer' },
  'ta' => { name: 'தமிழ்',               code: 'ta',         en: 'Tamil' },
  'si' => { name: 'සිංහල',               code: 'si',         en: 'Sinhala' }
}.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.



116
117
118
# File 'lib/wovnrb/lang.rb', line 116

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.



120
121
122
# File 'lib/wovnrb/lang.rb', line 120

def lang_code
  @lang_code
end

Class Method Details

.get_code(lang_name) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/wovnrb/lang.rb', line 97

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



111
112
113
114
# File 'lib/wovnrb/lang.rb', line 111

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.



93
94
95
# File 'lib/wovnrb/lang.rb', line 93

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.



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
158
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
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/wovnrb/lang.rb', line 130

def add_lang_code(href, pattern, headers)
  return href if /^(#.*)?$/.match?(href)

  settings = Store.instance.settings
  code_to_add = settings['custom_lang_aliases'][@lang_code] || @lang_code
  lang_param_name = settings['lang_param_name']
  # 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, lang_param_name)
      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 = case href
                 when /^\.\..*$/
                   # ../path
                   "#{lang_url}/#{href.gsub(/^\.\.\//, '')}"
                 when /^\..*$/
                   # ./path
                   "#{lang_url}#{current_dir}/#{href.gsub(/^\.\//, '')}"
                 when /^\/.*$/
                   # /path
                   lang_url + href
                 else
                   # path
                   "#{lang_url}#{current_dir}/#{href}"
                 end
    when 'query'
      new_href = add_query_lang_code(href, code_to_add, lang_param_name)
    else # path
      if /^\//.match?(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