class ReactOnRails::Locales::Base

Public Class Methods

new() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 39
def initialize
  return if i18n_dir.nil?
  return unless obsolete?

  @translations, @defaults = generate_translations
  convert
end

Private Instance Methods

convert() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 101
def convert
  file_names.each do |name|
    template = send(:"template_#{name}")
    path = file(name)
    generate_file(template, path)
  end
end
default_locale() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 97
def default_locale
  @default_locale ||= I18n.default_locale.to_s || "en"
end
exist_files() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 57
def exist_files
  @exist_files ||= files.select { |file| File.exist?(file) }
end
file(name) click to toggle source
# File lib/react_on_rails/locales/base.rb, line 75
def file(name)
  "#{i18n_dir}/#{name}.#{file_format}"
end
file_format() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 49
def file_format; end
file_names() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 67
def file_names
  %w[translations default]
end
files() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 71
def files
  @files ||= file_names.map { |n| file(n) }
end
files_are_outdated() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 61
def files_are_outdated
  latest_yml = locale_files.map { |file| File.mtime(file) }.max
  earliest = exist_files.map { |file| File.mtime(file) }.min
  latest_yml > earliest
end
flatten(translations) click to toggle source
# File lib/react_on_rails/locales/base.rb, line 138
def flatten(translations)
  translations.each_with_object({}) do |(k, v), h|
    if v.is_a? Hash
      flatten(v).map { |hk, hv| h[:"#{k}.#{hk}"] = hv }
    elsif v.is_a?(String)
      h[k] = v.gsub("%{", "{")
    elsif !v.is_a?(Array)
      h[k] = v
    end
  end
end
flatten_defaults(val) click to toggle source
# File lib/react_on_rails/locales/base.rb, line 131
def flatten_defaults(val)
  flatten(val).each_with_object({}) do |(k, v), h|
    key = format(k)
    h[key] = { id: k, defaultMessage: v }
  end
end
format(input) click to toggle source
# File lib/react_on_rails/locales/base.rb, line 127
def format(input)
  input.to_s.tr(".", "_").camelize(:lower).to_sym
end
generate_file(template, path) click to toggle source
# File lib/react_on_rails/locales/base.rb, line 109
def generate_file(template, path)
  result = ERB.new(template).result
  File.write(path, result)
end
generate_translations() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 114
def generate_translations
  translations = {}
  defaults = {}
  locale_files.each do |f|
    translation = YAML.safe_load(File.open(f))
    key = translation.keys[0]
    val = flatten(translation[key])
    translations = translations.deep_merge(key => val)
    defaults = defaults.deep_merge(flatten_defaults(val)) if key == default_locale
  end
  [translations.to_json, defaults.to_json]
end
i18n_dir() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 89
def i18n_dir
  @i18n_dir ||= ReactOnRails.configuration.i18n_dir
end
i18n_yml_dir() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 93
def i18n_yml_dir
  @i18n_yml_dir ||= ReactOnRails.configuration.i18n_yml_dir
end
locale_files() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 79
def locale_files
  @locale_files ||= if i18n_yml_dir.present?
                      Dir["#{i18n_yml_dir}/**/*.yml"]
                    else
                      ReactOnRails::Utils.truthy_presence(
                        Rails.application && Rails.application.config.i18n.load_path
                      ).presence
                    end
end
obsolete?() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 51
def obsolete?
  return true if exist_files.empty?

  files_are_outdated
end
template_default() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 156
      def template_default
        <<-JS.strip_heredoc
          import { defineMessages } from 'react-intl';

          const defaultLocale = '#{default_locale}';

          const defaultMessages = defineMessages(#{@defaults});

          export { defaultMessages, defaultLocale };
        JS
      end
template_translations() click to toggle source
# File lib/react_on_rails/locales/base.rb, line 150
      def template_translations
        <<-JS.strip_heredoc
          export const translations = #{@translations};
        JS
      end