diff --git a/docs/getting-started/supported-languages.mdx b/docs/getting-started/supported-languages.mdx index 494c2e7..aef0a7b 100644 --- a/docs/getting-started/supported-languages.mdx +++ b/docs/getting-started/supported-languages.mdx @@ -18,8 +18,3 @@ The DeepL API supports the following languages. These can also be retrieved prog Currently, characters translated into beta languages are not billed. See [Alpha and beta features](/docs/resources/alpha-and-beta-features) for more information. -Style rules are supported for the following target languages: - - - -For more details, see the [Style Rules API documentation](/api-reference/style-rules). Writing style and tone availability for `/write/rephrase` can also be retrieved via [`GET /v3/languages?resource=write`](/api-reference/languages/retrieve-supported-languages-by-resource). diff --git a/snippets/supported-languages.jsx b/snippets/supported-languages.jsx index 084a336..bbc1102 100644 --- a/snippets/supported-languages.jsx +++ b/snippets/supported-languages.jsx @@ -83,13 +83,32 @@ export const SupportedLanguages = ({ const [searchTerm, setSearchTerm] = useState('') const [sortBy, setSortBy] = useState('name') const [sortOrder, setSortOrder] = useState('asc') - const [featureFilters, setFeatureFilters] = useState({ - translation: false, + // Quick "hide noisy entries" toggles that supplement the resource + + // feature checkboxes below. + const [hideBeta, setHideBeta] = useState(false) + const [hideExternal, setHideExternal] = useState(false) + // Filter checkboxes split into two groups: one per /v3/languages + // resource (does the resource list this lang?), one per API feature + // key (does any resource report this feature for the lang?). Keys + // match the API exactly so it is obvious which slice each filter + // selects. + const [resourceFilters, setResourceFilters] = useState({ + translate_text: false, + translate_document: false, + voice: false, + write: false, glossary: false, - tagHandling: false, - textImprovement: false, - translationMemory: false, - styleRules: false + style_rules: false, + translation_memory: false, + }) + const [featureFilters, setFeatureFilters] = useState({ + auto_detection: false, + formality: false, + tag_handling: false, + writing_style: false, + tone: false, + transcription: false, + translated_speech: false, }) // The RESOURCES object below is the inlined output of running @@ -143,126 +162,126 @@ export const SupportedLanguages = ({ {"lang": "zh", "name": "Chinese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, ], "translate_document": [ - {"lang": "ace", "name": "Acehnese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "af", "name": "Afrikaans", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "an", "name": "Aragonese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "ace", "name": "Acehnese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "af", "name": "Afrikaans", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "an", "name": "Aragonese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "ar", "name": "Arabic", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "as", "name": "Assamese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ay", "name": "Aymara", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "az", "name": "Azerbaijani", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ba", "name": "Bashkir", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "be", "name": "Belarusian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "as", "name": "Assamese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ay", "name": "Aymara", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "az", "name": "Azerbaijani", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ba", "name": "Bashkir", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "be", "name": "Belarusian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "bg", "name": "Bulgarian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "bho", "name": "Bhojpuri", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "bn", "name": "Bengali", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "br", "name": "Breton", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "bs", "name": "Bosnian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ca", "name": "Catalan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ceb", "name": "Cebuano", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ckb", "name": "Kurdish (Sorani)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "bho", "name": "Bhojpuri", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "bn", "name": "Bengali", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "br", "name": "Breton", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "bs", "name": "Bosnian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ca", "name": "Catalan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ceb", "name": "Cebuano", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ckb", "name": "Kurdish (Sorani)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "cs", "name": "Czech", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "cy", "name": "Welsh", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "cy", "name": "Welsh", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "da", "name": "Danish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "de", "name": "German", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "el", "name": "Greek", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "en", "name": "English", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "en-GB", "name": "English (British)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}}}, {"lang": "en-US", "name": "English (American)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}}}, - {"lang": "eo", "name": "Esperanto", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "eo", "name": "Esperanto", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "es", "name": "Spanish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "es-419", "name": "Spanish (Latin American)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "et", "name": "Estonian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "eu", "name": "Basque", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "fa", "name": "Persian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "eu", "name": "Basque", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "fa", "name": "Persian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "fi", "name": "Finnish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "fr", "name": "French", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "ga", "name": "Irish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "gl", "name": "Galician", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "gn", "name": "Guarani", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "gom", "name": "Konkani", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "gu", "name": "Gujarati", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ha", "name": "Hausa", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "ga", "name": "Irish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "gl", "name": "Galician", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "gn", "name": "Guarani", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "gom", "name": "Konkani", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "gu", "name": "Gujarati", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ha", "name": "Hausa", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "he", "name": "Hebrew", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "hi", "name": "Hindi", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "hr", "name": "Croatian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ht", "name": "Haitian Creole", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "hi", "name": "Hindi", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "hr", "name": "Croatian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ht", "name": "Haitian Creole", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "hu", "name": "Hungarian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "hy", "name": "Armenian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "hy", "name": "Armenian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "id", "name": "Indonesian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "ig", "name": "Igbo", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "is", "name": "Icelandic", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "ig", "name": "Igbo", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "is", "name": "Icelandic", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "it", "name": "Italian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "ja", "name": "Japanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "jv", "name": "Javanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ka", "name": "Georgian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "kk", "name": "Kazakh", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "kmr", "name": "Kurdish (Kurmanji)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "jv", "name": "Javanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ka", "name": "Georgian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "kk", "name": "Kazakh", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "kmr", "name": "Kurdish (Kurmanji)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "ko", "name": "Korean", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "ky", "name": "Kyrgyz", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "la", "name": "Latin", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "lb", "name": "Luxembourgish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "lmo", "name": "Lombard", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ln", "name": "Lingala", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "ky", "name": "Kyrgyz", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "la", "name": "Latin", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "lb", "name": "Luxembourgish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "lmo", "name": "Lombard", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ln", "name": "Lingala", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "lt", "name": "Lithuanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "lv", "name": "Latvian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "mai", "name": "Maithili", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "mg", "name": "Malagasy", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "mi", "name": "Maori", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "mk", "name": "Macedonian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ml", "name": "Malayalam", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "mn", "name": "Mongolian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "mr", "name": "Marathi", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ms", "name": "Malay", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "mt", "name": "Maltese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "my", "name": "Burmese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "mai", "name": "Maithili", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "mg", "name": "Malagasy", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "mi", "name": "Maori", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "mk", "name": "Macedonian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ml", "name": "Malayalam", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "mn", "name": "Mongolian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "mr", "name": "Marathi", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ms", "name": "Malay", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "mt", "name": "Maltese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "my", "name": "Burmese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "nb", "name": "Norwegian (bokmål)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "ne", "name": "Nepali", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "ne", "name": "Nepali", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "nl", "name": "Dutch", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "oc", "name": "Occitan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "om", "name": "Oromo", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "pa", "name": "Punjabi", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "pag", "name": "Pangasinan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "pam", "name": "Kapampangan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "oc", "name": "Occitan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "om", "name": "Oromo", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "pa", "name": "Punjabi", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "pag", "name": "Pangasinan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "pam", "name": "Kapampangan", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "pl", "name": "Polish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "prs", "name": "Dari", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ps", "name": "Pashto", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "prs", "name": "Dari", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ps", "name": "Pashto", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "pt", "name": "Portuguese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "pt-BR", "name": "Portuguese (Brazilian)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "pt-PT", "name": "Portuguese (European)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "qu", "name": "Quechua", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "qu", "name": "Quechua", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "ro", "name": "Romanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "ru", "name": "Russian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "sa", "name": "Sanskrit", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "scn", "name": "Sicilian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "sa", "name": "Sanskrit", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "scn", "name": "Sicilian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "sk", "name": "Slovak", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "sl", "name": "Slovenian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "sq", "name": "Albanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "sr", "name": "Serbian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "st", "name": "Sesotho", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "su", "name": "Sundanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "sq", "name": "Albanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "sr", "name": "Serbian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "st", "name": "Sesotho", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "su", "name": "Sundanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "sv", "name": "Swedish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "sw", "name": "Swahili", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "ta", "name": "Tamil", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "te", "name": "Telugu", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "tg", "name": "Tajik", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "th", "name": "Thai", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "tk", "name": "Turkmen", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "tl", "name": "Tagalog", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "tn", "name": "Tswana", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "sw", "name": "Swahili", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "ta", "name": "Tamil", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "te", "name": "Telugu", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "tg", "name": "Tajik", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "th", "name": "Thai", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "tk", "name": "Turkmen", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "tl", "name": "Tagalog", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "tn", "name": "Tswana", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "tr", "name": "Turkish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "tt", "name": "Tatar", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "tt", "name": "Tatar", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "uk", "name": "Ukrainian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "ur", "name": "Urdu", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "uz", "name": "Uzbek", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "ur", "name": "Urdu", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "uz", "name": "Uzbek", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "vi", "name": "Vietnamese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, - {"lang": "wo", "name": "Wolof", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "xh", "name": "Xhosa", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "yi", "name": "Yiddish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, - {"lang": "yue", "name": "Cantonese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "wo", "name": "Wolof", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "xh", "name": "Xhosa", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "yi", "name": "Yiddish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, + {"lang": "yue", "name": "Cantonese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, {"lang": "zh", "name": "Chinese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}}}, {"lang": "zh-Hans", "name": "Chinese (simplified)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}}}, {"lang": "zh-Hant", "name": "Chinese (traditional)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}}}, - {"lang": "zu", "name": "Zulu", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {}}, + {"lang": "zu", "name": "Zulu", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}}}, ], "translate_text": [ {"lang": "ace", "name": "Acehnese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "tag_handling": {"status": "stable"}}}, @@ -406,50 +425,50 @@ export const SupportedLanguages = ({ {"lang": "zh-Hans", "name": "Chinese (simplified)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {}}, ], "voice": [ - {"lang": "ar", "name": "Arabic", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "bg", "name": "Bulgarian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, + {"lang": "ar", "name": "Arabic", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "bg", "name": "Bulgarian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, {"lang": "bn", "name": "Bengali", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"transcription": {"status": "stable", "external": true}}}, - {"lang": "cs", "name": "Czech", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "da", "name": "Danish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "de", "name": "German", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "el", "name": "Greek", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "en", "name": "English", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "en-GB", "name": "English (British)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "en-US", "name": "English (American)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "es", "name": "Spanish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, + {"lang": "cs", "name": "Czech", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "da", "name": "Danish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "de", "name": "German", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "el", "name": "Greek", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "en", "name": "English", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "en-GB", "name": "English (British)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "en-US", "name": "English (American)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "es", "name": "Spanish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, {"lang": "et", "name": "Estonian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}}}, - {"lang": "fi", "name": "Finnish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "fr", "name": "French", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, + {"lang": "fi", "name": "Finnish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "fr", "name": "French", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, {"lang": "ga", "name": "Irish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"transcription": {"status": "stable", "external": true}}}, {"lang": "he", "name": "Hebrew", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}}}, {"lang": "hr", "name": "Croatian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"transcription": {"status": "stable", "external": true}}}, - {"lang": "hu", "name": "Hungarian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "id", "name": "Indonesian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "it", "name": "Italian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "ja", "name": "Japanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "ko", "name": "Korean", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, + {"lang": "hu", "name": "Hungarian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "id", "name": "Indonesian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "it", "name": "Italian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "ja", "name": "Japanese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "ko", "name": "Korean", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, {"lang": "lt", "name": "Lithuanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}}}, {"lang": "lv", "name": "Latvian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}}}, {"lang": "mt", "name": "Maltese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"transcription": {"status": "stable", "external": true}}}, - {"lang": "nb", "name": "Norwegian (bokmål)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "nl", "name": "Dutch", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "pl", "name": "Polish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "pt", "name": "Portuguese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "pt-BR", "name": "Portuguese (Brazilian)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "pt-PT", "name": "Portuguese (European)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "ro", "name": "Romanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "ru", "name": "Russian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "sk", "name": "Slovak", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, + {"lang": "nb", "name": "Norwegian (bokmål)", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "nl", "name": "Dutch", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "pl", "name": "Polish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "pt", "name": "Portuguese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "pt-BR", "name": "Portuguese (Brazilian)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "pt-PT", "name": "Portuguese (European)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"formality": {"status": "stable"}, "glossary": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "ro", "name": "Romanian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "ru", "name": "Russian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "formality": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "sk", "name": "Slovak", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, {"lang": "sl", "name": "Slovenian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}}}, - {"lang": "sv", "name": "Swedish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, + {"lang": "sv", "name": "Swedish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, {"lang": "th", "name": "Thai", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"transcription": {"status": "stable", "external": true}}}, {"lang": "tl", "name": "Tagalog", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"transcription": {"status": "stable", "external": true}}}, - {"lang": "tr", "name": "Turkish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "uk", "name": "Ukrainian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "vi", "name": "Vietnamese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "stable", "external": true}}}, - {"lang": "zh", "name": "Chinese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "zh-Hans", "name": "Chinese (simplified)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, - {"lang": "zh-Hant", "name": "Chinese (traditional)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "stable"}}}, + {"lang": "tr", "name": "Turkish", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "uk", "name": "Ukrainian", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "vi", "name": "Vietnamese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "transcription": {"status": "stable", "external": true}, "translated_speech": {"status": "beta", "external": true}}}, + {"lang": "zh", "name": "Chinese", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "glossary": {"status": "stable"}, "spoken_terms": {"status": "beta"}, "transcription": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "zh-Hans", "name": "Chinese (simplified)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, + {"lang": "zh-Hant", "name": "Chinese (traditional)", "status": "stable", "usable_as_source": false, "usable_as_target": true, "features": {"glossary": {"status": "stable"}, "translated_speech": {"status": "beta"}}}, ], "write": [ {"lang": "de", "name": "German", "status": "stable", "usable_as_source": true, "usable_as_target": true, "features": {"auto_detection": {"status": "stable"}, "tone": {"status": "stable"}, "writing_style": {"status": "stable"}}}, @@ -492,22 +511,45 @@ export const SupportedLanguages = ({ // ------------------------------------------------------------------ const tableRows = useMemo(() => { const tt = RESOURCES.translate_text || [] - const writeSet = new Set((RESOURCES.write || []).map(e => e.lang)) - const glossarySet = new Set((RESOURCES.glossary || []).map(e => e.lang)) - const tmSet = new Set((RESOURCES.translation_memory || []).map(e => e.lang)) + const resourceNames = Object.keys(RESOURCES) + // For each resource, the set of langs it includes. + const langsByResource = {} + for (const r of resourceNames) { + langsByResource[r] = new Set((RESOURCES[r] || []).map(e => e.lang)) + } + // For each lang, the union of features across every resource it + // appears in. We keep `status` and `external` per feature so the + // table can flag beta / external-provider features in the UI. + // If the same feature key appears in multiple resources, prefer + // the more "interesting" signal (non-stable status, external=true + // sticks) so the badge surfaces the caveat rather than hiding it. + const featuresByLang = {} + for (const r of resourceNames) { + for (const e of (RESOURCES[r] || [])) { + const slot = featuresByLang[e.lang] || (featuresByLang[e.lang] = {}) + for (const [k, v] of Object.entries(e.features || {})) { + const prev = slot[k] || { has: true, status: 'stable', external: false } + slot[k] = { + has: true, + status: v?.status !== 'stable' ? (v?.status || 'stable') : prev.status, + external: Boolean(v?.external) || prev.external, + } + } + } + } + const rows = tt.map(entry => { - const features = entry.features || {} + const resources = {} + for (const r of resourceNames) { + resources[r] = langsByResource[r].has(entry.lang) + } return { code: entry.lang.toUpperCase(), name: entry.name, - translation: true, isVariant: !entry.usable_as_source && entry.usable_as_target, isBeta: entry.status !== 'stable', - glossary: glossarySet.has(entry.lang), - tagHandling: Boolean(features.tag_handling), - textImprovement: writeSet.has(entry.lang), - translationMemory: tmSet.has(entry.lang), - styleRules: Boolean(features.style_rules), + resources, + features: featuresByLang[entry.lang] || {}, } }) rows.sort((a, b) => { @@ -518,14 +560,34 @@ export const SupportedLanguages = ({ }, []) const filteredData = useMemo(() => { + const anyResource = Object.values(resourceFilters).some(Boolean) let filtered = tableRows.filter(lang => { const matchesSearch = lang.name.toLowerCase().includes(searchTerm.toLowerCase()) || lang.code.toLowerCase().includes(searchTerm.toLowerCase()) - const matchesFeatureFilters = Object.keys(featureFilters).every(key => { + const matchesResourceFilters = Object.keys(resourceFilters).every(key => { + if (!resourceFilters[key]) return true + // Customization keys can be sourced from either a resource + // (glossary/style_rules/translation_memory) or a feature + // (spoken_terms). langHasCustomization() handles both. + const present = Boolean(lang.resources[key]) || Boolean(lang.features[key]?.has) + if (!present) return false + if (hideBeta && lang.isBeta) return false + return true + }) + // Feature filters only apply when at least one resource filter is + // active, so an unrelated feature checkbox left toggled does not + // silently exclude everything. When hide-external / hide-beta + // is on, treat the corresponding features as unsupported here + // too so the filter agrees with what the tick shows. + const matchesFeatureFilters = !anyResource || Object.keys(featureFilters).every(key => { if (!featureFilters[key]) return true - return lang[key] === true + const info = lang.features[key] + if (!info?.has) return false + if (hideExternal && info.external) return false + if (hideBeta && (info.status !== 'stable' || lang.isBeta)) return false + return true }) - return matchesSearch && matchesFeatureFilters + return matchesSearch && matchesResourceFilters && matchesFeatureFilters }) filtered.sort((a, b) => { let aValue, bValue @@ -542,7 +604,7 @@ export const SupportedLanguages = ({ return aValue > bValue ? -1 : aValue < bValue ? 1 : 0 }) return filtered - }, [tableRows, searchTerm, sortBy, sortOrder, featureFilters]) + }, [tableRows, searchTerm, sortBy, sortOrder, resourceFilters, featureFilters, hideBeta, hideExternal]) if (mode !== 'table') { if (mode === 'bullets') { @@ -581,23 +643,55 @@ export const SupportedLanguages = ({ } } - const handleFeatureFilterChange = (key) => { - setFeatureFilters(prev => ({ - ...prev, - [key]: !prev[key] - })) + const toggleResourceFilter = (key) => { + // Resource is single-select (one product at a time); customization + // is multi-select. After any change, drop customizations that are + // not compatible with the currently-selected resource (no language + // is in both), matching the "available" rule used by the filter UI. + const RESOURCE_KEYS = RESOURCE_OPTIONS.map(o => o.key) + const CUSTOMIZATION_KEYS = CUSTOMIZATION_OPTIONS.map(o => o.key) + const inResources = RESOURCE_KEYS.includes(key) + const inCustomizations = CUSTOMIZATION_KEYS.includes(key) + const turningOff = resourceFilters[key] + const next = { ...resourceFilters } + if (inResources) { + for (const k of RESOURCE_KEYS) next[k] = false + if (!turningOff) next[key] = true + } else if (inCustomizations) { + next[key] = !turningOff + } + const r = RESOURCE_KEYS.find(k => next[k]) + if (r) { + for (const c of CUSTOMIZATION_KEYS) { + if (next[c] && !customizationResources(c).has(r)) { + next[c] = false + } + } + } + setResourceFilters(next) + // Voice is meaningful only with transcription support, so force + // the transcription feature filter on as long as voice is the + // active resource and clear it again when leaving voice. + if (r === 'voice') { + setFeatureFilters(prev => prev.transcription ? prev : { ...prev, transcription: true }) + } else { + setFeatureFilters(prev => prev.transcription ? { ...prev, transcription: false } : prev) + } + } + const toggleFeatureFilter = (key) => { + setFeatureFilters(prev => ({ ...prev, [key]: !prev[key] })) + } + const clearMap = (setter, current) => { + const cleared = {} + for (const k of Object.keys(current)) cleared[k] = false + setter(cleared) } - const clearAllFilters = () => { setSearchTerm('') - setFeatureFilters({ - translation: false, - glossary: false, - tagHandling: false, - textImprovement: false, - translationMemory: false, - styleRules: false - }) + clearMap(setResourceFilters, resourceFilters) + clearMap(setFeatureFilters, featureFilters) + setHideBeta(false) + setHideExternal(false) } const SortIcon = ({ column }) => { @@ -607,52 +701,249 @@ export const SupportedLanguages = ({ return {sortOrder === 'asc' ? '↑' : '↓'} } - const FeatureBadges = ({ lang }) => { - const features = [ - { key: 'translation', label: 'Translation', variant: lang.isVariant }, - { key: 'glossary', label: 'Glossaries' }, - { key: 'tagHandling', label: 'Tag Handling' }, - { key: 'textImprovement', label: 'Text Improvement' }, - { key: 'translationMemory', label: 'Translation Memory' }, - { key: 'styleRules', label: 'Style Rules' }, - ] + // Compact voice-style ticks for the table cells. + // ✓ stable, provided by DeepL + // ⎋ provided by an external service partner (voice.mdx legend) + // β superscript on either symbol when the feature's status is not stable + // — not available + const ResourceTick = ({ on, beta }) => { + // Treat beta as unsupported when the "hide beta" toggle is on. + if (!on || (beta && hideBeta)) { + return + } return ( -
- {lang.isBeta && ( - - Beta - - )} - {features.map(f => { - if (f.variant) { - return ( - - Translation: Target Only - - ) - } - if (lang[f.key]) { - return ( - - {f.label} - - ) - } - return null + + ✓{beta && β} + + ) + } + const FeatureTick = ({ info, langBeta }) => { + if (!info || !info.has) { + return + } + const beta = info.status !== 'stable' || langBeta + // Mask externally-provided or beta features when the matching + // "hide" toggle is on so the user can quickly see "what does + // DeepL itself support, with no external partner / no beta?". + if ((info.external && hideExternal) || (beta && hideBeta)) { + return + } + const cls = info.external + ? 'text-amber-700 dark:text-amber-300' + : 'text-green-700 dark:text-green-400' + const titleParts = [info.external ? 'Provided by an external service partner' : 'Provided by DeepL'] + if (beta) titleParts.push(info.status) + return ( + + {info.external ? '⎋' : '✓'} + {beta && β} + + ) + } + + const activeResourceCount = Object.values(resourceFilters).filter(Boolean).length + const activeFeatureCount = Object.values(featureFilters).filter(Boolean).length + const activeFiltersCount = activeResourceCount + activeFeatureCount + (hideBeta ? 1 : 0) + (hideExternal ? 1 : 0) + const hasAnyFilter = activeFiltersCount > 0 || searchTerm.length > 0 + + // `label` is the long form used in the filter UI; `short` is what the + // table column header shows. + const RESOURCE_OPTIONS = [ + { key: 'translate_text', label: 'Text translation', short: 'Text', link: '/api-reference/translate' }, + { key: 'translate_document', label: 'Document translation', short: 'Documents', link: '/api-reference/document' }, + { key: 'voice', label: 'Voice', short: 'Voice', link: '/api-reference/voice' }, + { key: 'write', label: 'Text improvement (Write)', short: 'Write', link: '/api-reference/improve-text' }, + ] + const CUSTOMIZATION_OPTIONS = [ + { key: 'glossary', label: 'Glossaries', short: 'Glossaries', link: '/api-reference/multilingual-glossaries' }, + { key: 'style_rules', label: 'Style rules', short: 'Style rules', link: '/api-reference/style-rules' }, + { key: 'translation_memory', label: 'Translation memory', short: 'Translation memory', link: '/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories' }, + { key: 'spoken_terms', label: 'Spoken terms', short: 'Spoken terms', link: 'api-reference/voice#customization' }, + ] + // `glossary` and `style_rules` features are intentionally absent here + // because the matching customization columns already cover them. + const FEATURE_OPTIONS = [ + { key: 'auto_detection', label: 'Auto-detection' }, + { key: 'transcription', label: 'Transcription' }, + { key: 'tag_handling', label: 'Tag handling', link: '/docs/xml-and-html-handling/xml' }, + { key: 'translated_speech', label: 'Translated speech' }, + { key: 'formality', label: 'Formality' }, + { key: 'tone', label: 'Tone' }, + { key: 'writing_style', label: 'Writing style' }, + ] + // Which features each /v3/languages resource may report. Computed from + // the inlined RESOURCES so it stays accurate without a hand-maintained + // mapping; if the API adds a new feature to a resource the table picks + // it up on the next refresh. + const featuresByResource = useMemo(() => { + const out = {} + for (const [resource, entries] of Object.entries(RESOURCES)) { + const set = new Set() + for (const e of (entries || [])) { + for (const k of Object.keys(e.features || {})) set.add(k) + } + out[resource] = set + } + return out + }, []) + + // Feature filters are only meaningful for an explicitly selected + // Resource is single-select; customization is multi-select. Both + // groups are independent — picking a customization does not clear + // the active resource and vice versa. + const selectedResource = RESOURCE_OPTIONS.find(o => resourceFilters[o.key]) || null + const selectedCustomizationKeys = CUSTOMIZATION_OPTIONS + .filter(o => resourceFilters[o.key]) + .map(o => o.key) + const anyResourceSelected = !!selectedResource + // Which resources surface each customization. For glossary and + // style_rules this is derivable from /v3/languages (the feature key + // appears on the resource). translation_memory is not yet exposed as + // a feature, so its applicable resources are listed explicitly until + // the API catches up. + const CUSTOMIZATION_APPLIES_TO_OVERRIDE = { + translation_memory: new Set(['translate_text']), + } + const customizationResources = (key) => { + const explicit = CUSTOMIZATION_APPLIES_TO_OVERRIDE[key] + if (explicit) return explicit + const set = new Set() + for (const o of RESOURCE_OPTIONS) { + if (featuresByResource[o.key]?.has(key)) set.add(o.key) + } + return set + } + // A customization is "available" when no resource is selected (the + // table answers "what does each customization touch?") or when the + // selected resource lists it as a feature (the table answers "which + // langs work with this customization for this resource?"). + const customizationAvailable = (key) => { + if (!selectedResource) return true + return customizationResources(key).has(selectedResource.key) + } + // Whether a language is touched by a customization. Most + // customizations are themselves /v3/languages resources, so we read + // `lang.resources[key]`. `spoken_terms` is currently only exposed as + // a feature on the voice resource, so we also check the feature map + // as a fallback. The two channels are mutually exclusive in practice. + const langHasCustomization = (lang, key) => + Boolean(lang.resources[key]) || Boolean(lang.features[key]?.has) + // Feature filters are only meaningful when an actual product resource + // is selected (customizations have no feature object of their own). + const featureAvailable = (key) => { + if (!selectedResource) return false + return Boolean(featuresByResource[selectedResource.key]?.has(key)) + } + // Voice ⇒ transcription is required, so the checkbox is forced on + // and not togglable. The filter logic still treats it as a normal + // feature filter; this only locks the UI control. + const featureLocked = (key) => + selectedResource?.key === 'voice' && key === 'transcription' + // Features to display in the table's "Features" column for the + // currently-active resource. Empty when no resource is selected. + const visibleFeatureKeys = selectedResource + ? FEATURE_OPTIONS.filter(o => featureAvailable(o.key)).map(o => o.key) + : [] + const showFeaturesColumn = !!selectedResource + // Selecting a resource collapses the resource columns to just the + // selected one; same for customization. The two groups are + // independent so picking a customization does not hide the resource + // columns and vice versa — except that picking only a customization + // (with no resource) hides the resource columns altogether, because + // the user has already narrowed the question to that customization. + const visibleResourceOptions = selectedResource + ? [selectedResource] + : (selectedCustomizationKeys.length > 0 ? [] : RESOURCE_OPTIONS) + const visibleCustomizationOptions = selectedCustomizationKeys.length > 0 + ? CUSTOMIZATION_OPTIONS.filter(o => selectedCustomizationKeys.includes(o.key)) + : (selectedResource + ? CUSTOMIZATION_OPTIONS.filter(o => customizationAvailable(o.key)) + : CUSTOMIZATION_OPTIONS) + + const renderResourceCellItems = (options) => (lang) => ( +
+ {options.map(({ key, label }) => ( + + {label} + + + ))} +
+ ) + const ResourceCell = renderResourceCellItems(RESOURCE_OPTIONS) + const CustomizationCell = renderResourceCellItems(CUSTOMIZATION_OPTIONS) + const FeaturesCell = (lang) => { + if (visibleFeatureKeys.length === 0) return null + return ( +
+ {visibleFeatureKeys.map(key => { + const opt = FEATURE_OPTIONS.find(o => o.key === key) + const label = opt ? opt.label : key + return ( + + {label} + + + ) })}
) } - const activeFiltersCount = Object.values(featureFilters).filter(Boolean).length - const hasAnyFilter = activeFiltersCount > 0 || searchTerm.length > 0 + const renderFilterCheckbox = (state, toggle, isEnabled = () => true, isLocked = () => false) => ({ key, label, link }) => { + const enabled = isEnabled(key) + const locked = isLocked(key) + const checked = locked ? true : (enabled && state[key]) + const interactive = enabled && !locked + return ( + + ) + } return (
@@ -668,67 +959,75 @@ export const SupportedLanguages = ({ />
-
-
- - Filter by feature - - {hasAnyFilter && ( - - )} -
- -
- {[ - { key: 'translation', label: 'Translation' }, - { key: 'glossary', label: 'Glossaries' }, - { key: 'tagHandling', label: 'Tag Handling', link: '/docs/xml-and-html-handling/xml' }, - { key: 'textImprovement', label: 'Text Improvement', link: '/api-reference/improve-text' }, - { key: 'translationMemory', label: 'Translation Memory', link: '/docs/learning-how-tos/examples-and-guides/how-to-use-translation-memories' }, - { key: 'styleRules', label: 'Style Rules', link: '/api-reference/style-rules' } - ].map(({ key, label, link }) => ( -