class POEditor::Core

Attributes

configuration[RW]

@return [POEditor::Configuration] The configuration for export

Public Class Methods

new(configuration) click to toggle source

@param configuration [POEditor::Configuration]

# File lib/poeditor/core.rb, line 10
def initialize(configuration)
  unless configuration.is_a? Configuration
    raise POEditor::Exception.new \
      "`configuration` should be an `Configuration`"
  end
  @configuration = configuration
end

Public Instance Methods

api(action, api_token, options={}) click to toggle source

Request POEditor API

@param action [String] @param api_token [String] @param options [Hash{Sting => Object}]

@return [Net::HTTPResponse] The response object of API request

@see poeditor.com/api_reference/ POEditor API Reference

# File lib/poeditor/core.rb, line 27
def api(action, api_token, options={})
  uri = URI("https://api.poeditor.com/v2/#{action}")
  options["api_token"] = api_token
  return Net::HTTP.post_form(uri, options)
end
convert_to_poeditor_language(language) click to toggle source
# File lib/poeditor/core.rb, line 96
def convert_to_poeditor_language(language)
  if language.downcase.match(/zh.+(hans|cn)/)
    'zh-CN'
  elsif language.downcase.match(/zh.+(hant|tw)/)
    'zh-TW'
  else
    language
  end
end
export(api_key:, project_id:, language:, type:, tags:nil, filters:nil) click to toggle source

Export translation for specific language

@param api_key [String] @param project_jd [String] @param language [String] @param type [String] @param tags [Array<String>] @param filters [Array<String>]

@return Downloaded translation content

# File lib/poeditor/core.rb, line 64
def export(api_key:, project_id:, language:, type:, tags:nil, filters:nil)
  options = {
    "id" => project_id,
    "language" => convert_to_poeditor_language(language),
    "type" => type,
    "tags" => (tags || []).join(","),
    "filters" => (filters || []).join(","),
  }
  response = self.api("projects/export", api_key, options)
  data = JSON(response.body)
  unless data["response"]["status"] == "success"
    code = data["response"]["code"]
    message = data["response"]["message"]
    raise POEditor::Exception.new "#{message} (#{code})"
  end

  download_uri = URI(data["result"]["url"])
  content = Net::HTTP.get(download_uri)

  case type
  when "apple_strings"
    content.gsub!(/(%(\d+\$)?)s/, '\1@')  # %s -> %@
  when "android_strings"
    content.gsub!(/(%(\d+\$)?)@/, '\1s')  # %@ -> %s
  end

  unless content.end_with? "\n"
    content += "\n"
  end
  return content
end
path_for_language(language) click to toggle source
# File lib/poeditor/core.rb, line 116
def path_for_language(language)
  if @configuration.path_replace[language]
    @configuration.path_replace[language]
  else
    @configuration.path.gsub("{LANGUAGE}", language)
  end
end
pull() click to toggle source

Pull translations

# File lib/poeditor/core.rb, line 34
def pull()
  UI.puts "\nExport translations"
  for language in @configuration.languages
    UI.puts "  - Exporting '#{language}'"
    content = self.export(:api_key => @configuration.api_key,
                          :project_id => @configuration.project_id,
                          :language => language,
                          :type => @configuration.type,
                          :tags => @configuration.tags,
                          :filters => @configuration.filters)
    write(language, content)

    for alias_to, alias_from in @configuration.language_alias
      if language == alias_from
        write(alias_to, content)
      end
    end
  end
end
write(language, content) click to toggle source

Write translation file

# File lib/poeditor/core.rb, line 107
def write(language, content)
  path = path_for_language(language)
  unless File.exist?(path)
    raise POEditor::Exception.new "#{path} doesn't exist"
  end
  File.write(path, content)
  UI.puts "      #{"\xe2\x9c\x93".green} Saved at '#{path}'"
end