DEV Community

kojix2
kojix2

Posted on

Calling Deepl's API from the Crystal language

As the title suggests, recently, ChatGPT is becoming popular. However, ChatGPT is more accurate in responding when asked in English rather than in Japanese. Therefore, there are times when you want to quickly translate from Japanese to English to ask questions to ChatGPT.

Snippet to call DeepL translation from Crystsal language

By giving reference code and reference documents to ChatGPT from Crystal language, a language to call DeepL's API was written. An API Key is required for use.

require "http/client"
require "json"

module Deepl
  class ApiKeyError < Exception; end
  class RequestError < Exception; end

  class Translator
    API_ENDPOINT = "https://api-free.deepl.com/v2/translate"

    @http_headers : HTTP::Headers

    def initialize
      @http_headers = build_http_headers
    end

    def build_http_headers
      HTTP::Headers{
        "Authorization" => "DeepL-Auth-Key #{get_api_key}",
        "Content-Type"  => "application/x-www-form-urlencoded",
      }
    end

    def get_api_key
      if ENV.has_key?("DEEPL_API_KEY")
        ENV["DEEPL_API_KEY"]
      else
        raise ApiKeyError.new
      end
    end

    def request_translation(text : String, target_lang : String)
      request_payload = "text=#{URI.encode_www_form(text)}&target_lang=#{URI.encode_www_form(target_lang)}"
      send_post_request(request_payload)
    end

    def send_post_request(request_data : String)
      HTTP::Client.post(API_ENDPOINT, body: request_data, headers: @http_headers)
    rescue error
      raise RequestError.new("Error: #{error} #{error.message}")
    end

    def translate(text, target_lang)
      response = request_translation(text, target_lang)
      parsed_response = JSON.parse(response.body)
      parsed_response.dig("translations", 0, "text")
    end
  end
end
Enter fullscreen mode Exit fullscreen mode

The Example Response looks like this:

{
  "translations": [
    {
      "detected_source_language": "EN",
      "text": "Hallo, Welt!"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

You can use it like this:

input_text = ARGV[0]
target_lang = "ZH"

translator = Deepl::Translator.new
translated_text = translator.translate(input_text, target_lang)

puts translated_text
Enter fullscreen mode Exit fullscreen mode
./deepl Hello.
你好。
Enter fullscreen mode Exit fullscreen mode

That's all. Have a nice day.

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more →

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up