Skip to content

Commit 16178cf

Browse files
Daniel Jonesclaude
andcommitted
chore(v3-languages): vend API responses as JSON
Adds data/v3-languages/ with verbatim responses from /v3/languages and /v3/languages/resources fetched against api.deepl.com using ?include=beta&include=external. Adds scripts/fetch_v3_languages.py to regenerate the files from DEEPL_AUTH_KEY. These files become the single source of truth for repo tooling that needs to know which languages and features the API supports. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent a8c6cf8 commit 16178cf

10 files changed

Lines changed: 4914 additions & 0 deletions

File tree

‎.mintignore‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
reviews/*
22
api-reference/openapi.json
33
api-reference/voice/voice.asyncapi.json
4+
data/*
5+
scripts/*

‎data/v3-languages/README.md‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Vended `/v3/languages` responses
2+
3+
This directory holds verbatim JSON responses from the DeepL `/v3/languages` endpoints, fetched against `https://api.deepl.com`. Other tooling in this repo (e.g. generated docs and snippets) reads these files instead of calling the API directly.
4+
5+
## Files
6+
7+
| File | Endpoint |
8+
|---|---|
9+
| `resources.json` | `GET /v3/languages/resources` |
10+
| `translate_text.json` | `GET /v3/languages?resource=translate_text&include=beta&include=external` |
11+
| `translate_document.json` | `GET /v3/languages?resource=translate_document&include=beta&include=external` |
12+
| `voice.json` | `GET /v3/languages?resource=voice&include=beta&include=external` |
13+
| `write.json` | `GET /v3/languages?resource=write&include=beta&include=external` |
14+
| `glossary.json` | `GET /v3/languages?resource=glossary&include=beta&include=external` |
15+
| `style_rules.json` | `GET /v3/languages?resource=style_rules&include=beta&include=external` |
16+
17+
Each per-resource file requests `include=beta&include=external` so the vended data is the full superset. Consumers filter on the `status` and per-feature `external` fields when they want a narrower view.
18+
19+
## Refreshing
20+
21+
Set `DEEPL_AUTH_KEY` in your environment, then run:
22+
23+
```sh
24+
python3 scripts/fetch_v3_languages.py
25+
```
26+
27+
Flags:
28+
29+
- `--free` — hit `https://api-free.deepl.com` instead of the Pro endpoint.
30+
- `--base-url <url>` — point at any other host (staging, mock, local server). Also configurable via the `DEEPL_API_BASE_URL` environment variable.
31+
32+
The script overwrites every file in this directory.
33+
34+
A scheduled GitHub Action refreshes these files automatically and opens a pull request when the responses change; manual runs are only needed for local testing.

‎data/v3-languages/glossary.json‎

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
[
2+
{
3+
"lang": "ar",
4+
"name": "Arabic",
5+
"status": "stable",
6+
"usable_as_source": true,
7+
"usable_as_target": true,
8+
"features": {}
9+
},
10+
{
11+
"lang": "bg",
12+
"name": "Bulgarian",
13+
"status": "stable",
14+
"usable_as_source": true,
15+
"usable_as_target": true,
16+
"features": {}
17+
},
18+
{
19+
"lang": "cs",
20+
"name": "Czech",
21+
"status": "stable",
22+
"usable_as_source": true,
23+
"usable_as_target": true,
24+
"features": {}
25+
},
26+
{
27+
"lang": "da",
28+
"name": "Danish",
29+
"status": "stable",
30+
"usable_as_source": true,
31+
"usable_as_target": true,
32+
"features": {}
33+
},
34+
{
35+
"lang": "de",
36+
"name": "German",
37+
"status": "stable",
38+
"usable_as_source": true,
39+
"usable_as_target": true,
40+
"features": {}
41+
},
42+
{
43+
"lang": "el",
44+
"name": "Greek",
45+
"status": "stable",
46+
"usable_as_source": true,
47+
"usable_as_target": true,
48+
"features": {}
49+
},
50+
{
51+
"lang": "en",
52+
"name": "English",
53+
"status": "stable",
54+
"usable_as_source": true,
55+
"usable_as_target": true,
56+
"features": {}
57+
},
58+
{
59+
"lang": "es",
60+
"name": "Spanish",
61+
"status": "stable",
62+
"usable_as_source": true,
63+
"usable_as_target": true,
64+
"features": {}
65+
},
66+
{
67+
"lang": "et",
68+
"name": "Estonian",
69+
"status": "stable",
70+
"usable_as_source": true,
71+
"usable_as_target": true,
72+
"features": {}
73+
},
74+
{
75+
"lang": "fi",
76+
"name": "Finnish",
77+
"status": "stable",
78+
"usable_as_source": true,
79+
"usable_as_target": true,
80+
"features": {}
81+
},
82+
{
83+
"lang": "fr",
84+
"name": "French",
85+
"status": "stable",
86+
"usable_as_source": true,
87+
"usable_as_target": true,
88+
"features": {}
89+
},
90+
{
91+
"lang": "he",
92+
"name": "Hebrew",
93+
"status": "stable",
94+
"usable_as_source": true,
95+
"usable_as_target": true,
96+
"features": {}
97+
},
98+
{
99+
"lang": "hu",
100+
"name": "Hungarian",
101+
"status": "stable",
102+
"usable_as_source": true,
103+
"usable_as_target": true,
104+
"features": {}
105+
},
106+
{
107+
"lang": "id",
108+
"name": "Indonesian",
109+
"status": "stable",
110+
"usable_as_source": true,
111+
"usable_as_target": true,
112+
"features": {}
113+
},
114+
{
115+
"lang": "it",
116+
"name": "Italian",
117+
"status": "stable",
118+
"usable_as_source": true,
119+
"usable_as_target": true,
120+
"features": {}
121+
},
122+
{
123+
"lang": "ja",
124+
"name": "Japanese",
125+
"status": "stable",
126+
"usable_as_source": true,
127+
"usable_as_target": true,
128+
"features": {}
129+
},
130+
{
131+
"lang": "ko",
132+
"name": "Korean",
133+
"status": "stable",
134+
"usable_as_source": true,
135+
"usable_as_target": true,
136+
"features": {}
137+
},
138+
{
139+
"lang": "lt",
140+
"name": "Lithuanian",
141+
"status": "stable",
142+
"usable_as_source": true,
143+
"usable_as_target": true,
144+
"features": {}
145+
},
146+
{
147+
"lang": "lv",
148+
"name": "Latvian",
149+
"status": "stable",
150+
"usable_as_source": true,
151+
"usable_as_target": true,
152+
"features": {}
153+
},
154+
{
155+
"lang": "nb",
156+
"name": "Norwegian (bokmål)",
157+
"status": "stable",
158+
"usable_as_source": true,
159+
"usable_as_target": true,
160+
"features": {}
161+
},
162+
{
163+
"lang": "nl",
164+
"name": "Dutch",
165+
"status": "stable",
166+
"usable_as_source": true,
167+
"usable_as_target": true,
168+
"features": {}
169+
},
170+
{
171+
"lang": "pl",
172+
"name": "Polish",
173+
"status": "stable",
174+
"usable_as_source": true,
175+
"usable_as_target": true,
176+
"features": {}
177+
},
178+
{
179+
"lang": "pt",
180+
"name": "Portuguese",
181+
"status": "stable",
182+
"usable_as_source": true,
183+
"usable_as_target": true,
184+
"features": {}
185+
},
186+
{
187+
"lang": "ro",
188+
"name": "Romanian",
189+
"status": "stable",
190+
"usable_as_source": true,
191+
"usable_as_target": true,
192+
"features": {}
193+
},
194+
{
195+
"lang": "ru",
196+
"name": "Russian",
197+
"status": "stable",
198+
"usable_as_source": true,
199+
"usable_as_target": true,
200+
"features": {}
201+
},
202+
{
203+
"lang": "sk",
204+
"name": "Slovak",
205+
"status": "stable",
206+
"usable_as_source": true,
207+
"usable_as_target": true,
208+
"features": {}
209+
},
210+
{
211+
"lang": "sl",
212+
"name": "Slovenian",
213+
"status": "stable",
214+
"usable_as_source": true,
215+
"usable_as_target": true,
216+
"features": {}
217+
},
218+
{
219+
"lang": "sv",
220+
"name": "Swedish",
221+
"status": "stable",
222+
"usable_as_source": true,
223+
"usable_as_target": true,
224+
"features": {}
225+
},
226+
{
227+
"lang": "tr",
228+
"name": "Turkish",
229+
"status": "stable",
230+
"usable_as_source": true,
231+
"usable_as_target": true,
232+
"features": {}
233+
},
234+
{
235+
"lang": "uk",
236+
"name": "Ukrainian",
237+
"status": "stable",
238+
"usable_as_source": true,
239+
"usable_as_target": true,
240+
"features": {}
241+
},
242+
{
243+
"lang": "vi",
244+
"name": "Vietnamese",
245+
"status": "stable",
246+
"usable_as_source": true,
247+
"usable_as_target": true,
248+
"features": {}
249+
},
250+
{
251+
"lang": "zh",
252+
"name": "Chinese",
253+
"status": "stable",
254+
"usable_as_source": true,
255+
"usable_as_target": true,
256+
"features": {}
257+
}
258+
]

‎data/v3-languages/resources.json‎

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
[
2+
{
3+
"name": "translate_text",
4+
"features": [
5+
{
6+
"name": "auto_detection",
7+
"needs_source_support": true
8+
},
9+
{
10+
"name": "formality",
11+
"needs_target_support": true
12+
},
13+
{
14+
"name": "glossary",
15+
"needs_source_support": true,
16+
"needs_target_support": true
17+
},
18+
{
19+
"name": "style_rules",
20+
"needs_target_support": true
21+
},
22+
{
23+
"name": "tag_handling",
24+
"needs_source_support": true,
25+
"needs_target_support": true
26+
}
27+
]
28+
},
29+
{
30+
"name": "translate_document",
31+
"features": [
32+
{
33+
"name": "auto_detection",
34+
"needs_source_support": true
35+
},
36+
{
37+
"name": "formality",
38+
"needs_target_support": true
39+
},
40+
{
41+
"name": "glossary",
42+
"needs_source_support": true,
43+
"needs_target_support": true
44+
}
45+
]
46+
},
47+
{
48+
"name": "glossary",
49+
"features": []
50+
},
51+
{
52+
"name": "style_rules",
53+
"features": []
54+
},
55+
{
56+
"name": "voice",
57+
"features": [
58+
{
59+
"name": "auto_detection",
60+
"needs_source_support": true
61+
},
62+
{
63+
"name": "formality",
64+
"needs_target_support": true
65+
},
66+
{
67+
"name": "glossary",
68+
"needs_source_support": true,
69+
"needs_target_support": true
70+
},
71+
{
72+
"name": "transcription",
73+
"needs_source_support": true
74+
},
75+
{
76+
"name": "translated_speech",
77+
"needs_target_support": true
78+
}
79+
]
80+
},
81+
{
82+
"name": "write",
83+
"features": [
84+
{
85+
"name": "auto_detection",
86+
"needs_source_support": true
87+
},
88+
{
89+
"name": "tone",
90+
"needs_target_support": true
91+
},
92+
{
93+
"name": "writing_style",
94+
"needs_target_support": true
95+
}
96+
]
97+
}
98+
]

0 commit comments

Comments
 (0)