Module deepl_api.cli

Unix-style commandline application for integrating the DeepL API into toolchains without any programming effort.

If you are looking for the deepl-api API library, please refer to its documentation instead.

Requirements

You need to have a valid DeepL Pro Developer account with an associated API key. This key must be made available to the application, e. g. via environment variable:

export DEEPL_API_KEY=YOUR_KEY

Examples

Overview

To get an overview of the available commands, just invoke the program.

shell> deepl
Usage: deepl [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  languages
  translate
  usage-information

You can call deepl translate --help to get a detailed reference for the various options of the translate command, for example.

Translating Text

By default, deepl reads from STDIN and writes to STDOUT, which means that you can integrate it nicely into toolchains.

shell> echo "Please go home." | deepl translate --source-language EN --target-language DE | cat -
Bitte gehen Sie nach Hause.

By providing the options --input-file and / or --output-file, you can tell deepl to read from / write to files, rather than STDIN / STDOUT.

Retrieving Account Usage & Limits

shell> deepl usage-information
Available characters per billing period: 250000
Characters already translated in the current billing period: 3317

Retrieving Available Languages

shell> deepl languages
DeepL can translate from the following source languages:
  DE    (German)
  EN    (English)
  ES    (Spanish)
  ...

DeepL can translate to the following target languages:
  DE    (German)
  EN-GB (English (British))
  EN-US (English (American))
  ES    (Spanish)
  ...
Expand source code
"""
Unix-style commandline application for integrating the
[DeepL API](https://www.deepl.com/docs-api/) into toolchains without any programming effort.

*If you are looking for the `deepl-api` API library, please refer
to [its documentation](../deepl_api/index.html) instead.*

.. include:: ./doc_cli.md
"""

import click
import sys
import os
import pathlib

import deepl_api


@click.group()
def run():
    pass


@run.command()
def usage_information():
    try:
        deepl = _get_instance()
        usage = deepl.usage_information()

        print(f"Available characters per billing period: {usage.character_limit}")
        print(
            f"Characters already translated in the current billing period: {usage.character_count}"
        )

    except Exception as e:
        sys.stderr.write(f"Error: {e}\n")
        sys.exit(1)


@run.command()
def languages():
    try:
        deepl = _get_instance()
        source_langs = deepl.source_languages()
        target_langs = deepl.target_languages()

        print("DeepL can translate from the following source languages:")
        for language, name in source_langs.items():
            print(f"  {language.ljust(5)} ({name})")

        print()
        print("DeepL can translate to the following target languages:")
        for language, name in target_langs.items():
            print(f"  {language.ljust(5)} ({name})")

    except Exception as e:
        sys.stderr.write(f"Error: {e}\n")
        sys.exit(1)


@run.command()
@click.option("-s", "--source-language", required=False)
@click.option("-t", "--target-language", required=True)
@click.option("-i", "--input-file", required=False)
@click.option("-o", "--output-file", required=False)
@click.option("-p", "--preserve-formatting", default=None, is_flag=True)
@click.option("-m", "--formality-more", default=None, is_flag=True)
@click.option("-l", "--formality-less", default=None, is_flag=True)
@click.option("-x", "--handle-xml", default=None, is_flag=True)
def translate(
    source_language,
    target_language,
    input_file,
    output_file,
    preserve_formatting,
    formality_more,
    formality_less,
    handle_xml,
):
    try:
        deepl = _get_instance()

        if input_file != None:
            text = pathlib.Path(input_file).read_text()
        else:
            text = sys.stdin.read()

        formality = deepl_api.Formality.DEFAULT
        if formality_less:
            formality = deepl_api.Formality.LESS
        if formality_more:
            formality = deepl_api.Formality.MORE

        translations = deepl.translate(
            source_language=source_language,
            target_language=target_language,
            preserve_formatting=preserve_formatting,
            formality=formality,
            handle_xml=handle_xml,
            texts=[text],
        )

        translated_text = "\n".join([entry["text"] for entry in translations])

        if output_file != None:
            pathlib.Path(output_file).write_text(translated_text)
        else:
            print(translated_text)

    except Exception as e:
        sys.stderr.write(f"Error: {e}\n")
        sys.exit(1)


def _get_instance():
    api_key = os.getenv("DEEPL_API_KEY", "")
    if not len(api_key):
        sys.stderr.write(
            "Error: no DEEPL_API_KEY found. Please provide your API key in this environment variable.\n"
        )
        sys.exit(1)
    return deepl_api.DeepL(api_key)


if __name__ == "__main__":
    run()