Module: Emoninja::I18n

Defined in:
lib/emoninja/i18n.rb

Overview

Utility to translate emoji names to different languages

Constant Summary collapse

FAIL_AFTER =

attempts

10
LOCAL_I18N =
File.join(__dir__, '..', '..', 'data', 'translations', '%{lang}.yml').freeze
YT_CONFIG =
File.join(__dir__, '..', '..', 'config', 'yandex_translate.yml').freeze

Class Method Summary collapse

Class Method Details

.key(term, lang) ⇒ Object Also known as: []



46
47
48
# File 'lib/emoninja/i18n.rb', line 46

def key term, lang
  !lang.nil? && lang.to_s != 'en' && reversed_translations(lang)[term.downcase] || term
end

.reversed_translations(lang) ⇒ Object



35
36
37
# File 'lib/emoninja/i18n.rb', line 35

def reversed_translations lang
  (@reversed_translations ||= {})[lang] ||= translations(lang).invert.map { |k, v| [k.downcase, v.downcase] }.to_h
end

.translations(lang) ⇒ Object

Parameters:

  • lang (String)

    the language to build a dictionary

  • the (Array | Hash)

    array of words



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/emoninja/i18n.rb', line 13

def translations lang
  file = LOCAL_I18N % { lang: lang }
  (@translations ||= {})[lang] ||= preload file
  keys = [Data.vocabulary, Data.argo].map(&:keys).reduce(:|) - @translations[lang].keys
  return @translations[lang] if keys.empty?

  require 'yandex-api'
  Yandex::API::Translate.load YT_CONFIG
  errors_count = 0

  @translations[lang].merge!(
    keys.each_with_object({}) do |k, memo|
      begin
        result = Yandex::API::Translate.do(k, lang)
        memo[k] = result['text'].is_a?(Array) ? result['text'].join(' ') : result['text'] if result['code'] == 200
      rescue
        break memo if (errors_count += 1) >= FAIL_AFTER
      end
    end
  ).tap { |data| File.write(file, data.to_yaml) }
end