TxClient.rb 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. require 'json'
  2. require 'net/http'
  3. require 'uri'
  4. require 'openssl'
  5. class TxClient
  6. TX_BASE = 'https://www.transifex.com/api/2/project/%s'
  7. STATS_URL = '/resource/%s/stats'
  8. TRANSLATION_URL = '/resource/strings/translation/%s'
  9. CONTENT_URL = '/resource/%s/content'
  10. attr_reader :language_exceptions
  11. def initialize(project, resource, user, password)
  12. @project, @resource, @user, @password = project, resource, user, password
  13. end
  14. def list_translations(completion_percent = 75)
  15. get_request(stats_url).select do |lang, stats|
  16. stats['translated_entities'].fdiv(stats['translated_entities'] + stats['untranslated_entities']) * 100 > completion_percent
  17. end.keys
  18. end
  19. def download_translation(language, dest)
  20. content = get_request(translation_url(language))["content"]
  21. File.open(dest, 'w') do |f|
  22. f.write(content)
  23. end
  24. end
  25. def upload_source(source)
  26. put_request(content_url, JSON.generate({ 'content' => source }))
  27. end
  28. private
  29. def stats_url
  30. sprintf(TX_BASE, @project) + sprintf(STATS_URL, @resource)
  31. end
  32. def translation_url(language)
  33. sprintf(TX_BASE, @project) + sprintf(TRANSLATION_URL, language)
  34. end
  35. def content_url
  36. sprintf(TX_BASE, @project) + sprintf(CONTENT_URL, @resource)
  37. end
  38. def get_request(url)
  39. uri = URI.parse(url)
  40. start_http(uri) do |http|
  41. request = Net::HTTP::Get.new(uri.request_uri)
  42. request.basic_auth(@user, @password)
  43. response = http.request(request)
  44. JSON.parse(response.body)
  45. end
  46. end
  47. def put_request(url, body)
  48. uri = URI.parse(url)
  49. start_http(uri) do |http|
  50. request = Net::HTTP::Put.new(uri.request_uri)
  51. request['Content-Type'] = 'application/json'
  52. request.basic_auth(@user, @password)
  53. request.body = body
  54. response = http.request(request)
  55. JSON.parse(response.body)
  56. end
  57. end
  58. def start_http(uri)
  59. options = uri.scheme == 'https' ? { :use_ssl => true, :verify_mode => OpenSSL::SSL::VERIFY_NONE } : {}
  60. Net::HTTP.start(uri.host, uri.port, options) do |http|
  61. yield http
  62. end
  63. end
  64. end