class TranslationIO::Client::BaseOperation::SaveSpecialYamlFilesStep

Public Class Methods

new(source_locale, target_locales, yaml_locales_path, yaml_file_paths) click to toggle source
# File lib/translation_io/client/base_operation/save_special_yaml_files_step.rb, line 6
def initialize(source_locale, target_locales, yaml_locales_path, yaml_file_paths)
  @source_locale     = source_locale
  @target_locales    = target_locales
  @yaml_locales_path = yaml_locales_path
  @yaml_file_paths   = yaml_file_paths
end
top_comment() click to toggle source
# File lib/translation_io/client/base_operation/save_special_yaml_files_step.rb, line 78
        def self.top_comment
          <<-EOS
# THIS FILE CONTAINS LOCALIZATION KEYS : date and number formats, number precisions,
# number separators and all non-textual values depending on the language.
# These values must not reach the translator, so they are separated in this file.
#
# More info here: https://translation.io/blog/gettext-is-better-than-rails-i18n#localization
#
# You can edit and/or add new localization keys here, they won't be touched by Translation.io.
#
# If you want to add a new localization key prefix, use the option described here:
# https://github.com/translation/rails#custom-localization-key-prefixes
#
EOS
        end

Public Instance Methods

run() click to toggle source
# File lib/translation_io/client/base_operation/save_special_yaml_files_step.rb, line 13
def run
  TranslationIO.info "Saving new localization YAML files (with non-string values)."
  all_flat_translations = {}

  @yaml_file_paths.each do |file_path|
    all_flat_translations.merge!(
      YAMLConversion.get_flat_translations_for_yaml_file(file_path)
    )
  end

  all_flat_special_translations = all_flat_translations.select do |key, value|
    YamlEntry.localization?(key, value)
  end

  params = {}

  @target_locales.each do |target_locale|
    yaml_path = File.join(@yaml_locales_path, "localization.#{target_locale}.yml")

    TranslationIO.info yaml_path, 2, 2

    target_flat_special_translations = all_flat_special_translations.select do |key|
      YamlEntry.from_locale?(key, target_locale) && !YamlEntry.ignored?(key)
    end

    yaml_data = YAMLConversion.get_yaml_data_from_flat_translations(target_flat_special_translations, **{
      :force_keep_empty_keys => true # We want to keep empty keys from localization.xx.yml files (sometimes needed for delimiters!)
    })

    params["yaml_data_#{target_locale}"] = yaml_data

    # To have a localization.xx.yml file during tests (without call to backend)
    if TranslationIO.config.test
      if YAML::load(yaml_data).present?
        File.open(yaml_path, 'wb') do |file|
          file.write(self.class.top_comment)
          file.write(yaml_data)
        end
      end
    end
  end

  TranslationIO.info "Collecting YAML localization entries from server."

  # To have a localization.xx.yml file with call to backend
  if !TranslationIO.config.test
    uri             = URI("#{TranslationIO.client.endpoint}/projects/#{TranslationIO.client.api_key}/fill_yaml_localizations")
    parsed_response = BaseOperation.perform_request(uri, params)

    if !parsed_response.nil?
      @target_locales.each do |target_locale|
        yaml_path = File.join(@yaml_locales_path, "localization.#{target_locale}.yml")
        yaml_data = parsed_response["yaml_data_#{target_locale}"]

        if yaml_data.present? && YAML::load(yaml_data).present?
          File.open(yaml_path, 'wb') do |file|
            file.write(self.class.top_comment)
            file.write(yaml_data)
          end
        end
      end
    end
  end
end