Skip to content

Commit dc17787

Browse files
Add function to retrieve supported glossary languages
1 parent abefd6e commit dc17787

File tree

5 files changed

+80
-16
lines changed

5 files changed

+80
-16
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99
### Added
10+
* Add `Translator.get_glossary_languages()` to query language pairs supported for glossaries.
1011
### Changed
1112
### Deprecated
1213
### Removed

deepl/__main__.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,26 @@ def action_usage(translator: deepl.Translator):
2323
print(usage_result)
2424

2525

26-
def action_languages(translator: deepl.Translator):
26+
def action_languages(translator: deepl.Translator, glossary: bool):
2727
"""Action function for the languages command."""
28-
source_languages = translator.get_source_languages()
29-
target_languages = translator.get_target_languages()
30-
31-
print("Source languages available:")
32-
for language in source_languages:
33-
print(f"{language.code}: {language.name}")
34-
print("Target languages available:")
35-
for language in target_languages:
36-
print(
37-
f"{language.code}: {language.name}{' (supports formality)' if language.supports_formality else ''}"
38-
)
28+
if glossary:
29+
glossary_languages = translator.get_glossary_languages()
30+
print("Language pairs supported for glossaries: (source, target)")
31+
for language_pair in glossary_languages:
32+
print(f"{language_pair.source_lang}, {language_pair.target_lang}")
33+
else:
34+
source_languages = translator.get_source_languages()
35+
target_languages = translator.get_target_languages()
36+
37+
print("Source languages available:")
38+
for language in source_languages:
39+
print(f"{language.code}: {language.name}")
40+
print("Target languages available:")
41+
for language in target_languages:
42+
if language.supports_formality:
43+
print(f"{language.code}: {language.name} (supports formality)")
44+
else:
45+
print(f"{language.code}: {language.name}")
3946

4047

4148
def action_document(
@@ -327,9 +334,14 @@ def add_common_arguments(subparser: argparse.ArgumentParser):
327334

328335
# create the parser for the "languages" command
329336
languages_help_str = "print available languages"
330-
subparsers.add_parser(
337+
parser_languages = subparsers.add_parser(
331338
"languages", help=languages_help_str, description=languages_help_str
332339
)
340+
parser_languages.add_argument(
341+
"--glossary",
342+
help="list language pairs supported for glossaries.",
343+
action="store_true",
344+
)
333345

334346
# create the parser for the "glossary" command
335347
parser_glossary = subparsers.add_parser(

deepl/translator.py

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,28 @@ def check_supported_glossary_languages(source_lang: str, target_lang: str):
318318
)
319319

320320

321+
class GlossaryLanguagePair:
322+
"""Information about a pair of languages supported for DeepL glossaries.
323+
324+
:param source_lang: The code of the source language.
325+
:param target_lang: The code of the target language.
326+
"""
327+
328+
def __init__(self, source_lang: str, target_lang: str):
329+
self._source_lang = source_lang
330+
self._target_lang = target_lang
331+
332+
@property
333+
def source_lang(self) -> str:
334+
"""Returns the code of the source language."""
335+
return self._source_lang
336+
337+
@property
338+
def target_lang(self) -> str:
339+
"""Returns the code of the target language."""
340+
return self._target_lang
341+
342+
321343
class Formality(Enum):
322344
"""Options for formality parameter."""
323345

@@ -937,6 +959,21 @@ def get_target_languages(self, skip_cache=False) -> List[Language]:
937959
)
938960
return self._target_languages_cached
939961

962+
def get_glossary_languages(self) -> List[GlossaryLanguagePair]:
963+
"""Request the list of language pairs supported for glossaries."""
964+
status, content, json = self._api_call(
965+
"v2/glossary-language-pairs", method="GET"
966+
)
967+
968+
self._raise_for_status(status, content, json)
969+
970+
return [
971+
GlossaryLanguagePair(
972+
language_pair["source_lang"], language_pair["target_lang"]
973+
)
974+
for language_pair in json["supported_languages"]
975+
]
976+
940977
def get_usage(self) -> Usage:
941978
"""Requests the current API usage."""
942979
status, content, json = self._api_call("v2/usage")
@@ -956,9 +993,10 @@ def create_glossary(
956993
languages, containing the entries in dictionary. The glossary may be
957994
used in the translate_text functions.
958995
959-
Only the following language pairs are supported: EN<->DE, EN<->FR, and
960-
EN<->ES. A glossary with target language EN may be used to translate
961-
texts into both EN-US and EN-GB.
996+
Only certain language pairs are supported, currently the following:
997+
EN<->DE, EN<->FR, and EN<->ES. The available language pairs can be
998+
queried using get_glossary_languages(). A glossary with target language
999+
EN may be used to translate texts into both EN-US and EN-GB.
9621000
9631001
:param name: user-defined name to attach to glossary.
9641002
:param source_lang: Language of source terms.

tests/test_cli.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ def test_languages(runner):
7474
assert "DE: German" in result.output
7575
assert "EN: English" in result.output
7676

77+
result = runner.invoke(deepl.__main__, "languages --glossary")
78+
assert result.exit_code == 0, f"exit: {result.exit_code}\n {result.output}"
79+
assert "supported for glossaries" in result.output
80+
assert "de, en" in result.output
81+
7782

7883
def test_text(runner):
7984
result = runner.invoke(

tests/test_general.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ def test_language(translator):
6060
assert target_language.supports_formality is not None
6161

6262

63+
def test_glossary_languages(translator):
64+
glossary_languages = translator.get_glossary_languages()
65+
assert len(glossary_languages) > 0
66+
for language_pair in glossary_languages:
67+
assert len(language_pair.source_lang) > 0
68+
assert len(language_pair.target_lang) > 0
69+
70+
6371
def test_server_url_selected_based_on_auth_key(server):
6472
translator_normal = deepl.Translator("ABCD")
6573
translator_free = deepl.Translator("ABCD:fx")

0 commit comments

Comments
 (0)