Public/Get-DeeplSupportedLanguage.ps1

<#PSScriptInfo
 
.VERSION 1.3.0
 
.GUID c58c97a3-6664-4b38-af19-f12aca4715cc
 
.AUTHOR diko@admins-little-helper.de
 
.COMPANYNAME
 
.COPYRIGHT (c) 2022 All rights reserved.
 
.TAGS DeepL Translate Translation
 
.LICENSEURI https://github.com/admins-little-helper/DeeplTranslate/blob/main/LICENSE
 
.PROJECTURI https://github.com/admins-little-helper/DeeplTranslate
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    1.0.0
    Initial release
 
    1.0.1
    Fixed issue with empty Uri in verbose output.
 
    1.0.2
    Fixed issue with tab completion in case an ApiKey with an invalid format is specified.
 
    1.1.0
    Updated way to get DeepL Api Uri and Http Status codes.
 
    1.2.0
    Updated list of supported source and target languages.
 
    1.2.0
    Updated list of supported source and target languages.
#>



<#
 
.DESCRIPTION
    Contains a function to retrieve the supported source and target langueges for the DeepL Api.
    More information about the DeepL API can be found here: https://www.deepl.com/de/docs-api/introduction/.
 
    To use this PowerShell function, a DeepL ApiKey is needed which requires an account. To register for an account, go to www.deepl.com.
 
.LINK
    https://github.com/admins-little-helper/DeeplTranslate
 
.LINK
    https://www.deepl.com
 
.LINK
    https://www.deepl.com/de/docs-api/introduction/
 
#>



function Get-DeeplSupportedLanguage {
    <#
    .SYNOPSIS
        Retrieves the supported source and target langueges for the DeepL Api.
 
    .DESCRIPTION
        The 'Get-DeeplSupportedLanguage' function retrieves the supported source and target langueges of the DeepL Api.
 
    .PARAMETER ApiKey
        API authentication key. You need an authentication key to access the DeepL API. Refer to the DeepL API documentation for more information.
 
    .PARAMETER TargetLanguage
        If specified or set to $true, the functions returns the list of supported target languages.
        If ommitted or set to $false the functions returns the list of supported source languages.
 
    .EXAMPLE
        Get-DeeplSupportedLanguage -ApiKey "<MyApiKey>"
 
        language name
        -------- ----
        BG Bulgarian
        CS Czech
        DA Danish
        DE German
        EL Greek
        EN English
        ES Spanish
        ET Estonian
        FI Finnish
        FR French
        HU Hungarian
        ID Indonesian
        IT Italian
        JA Japanese
        KO Korean
        LT Lithuanian
        LV Latvian
        NB Norwegian
        NL Dutch
        PL Polish
        PT Portuguese
        RO Romanian
        RU Russian
        SK Slovak
        SL Slovenian
        SV Swedish
        TR Turkish
        UK Ukrainian
        ZH Chinese
 
        This example shows how to retrieve a list of supported source languages.
 
    .EXAMPLE
        Get-DeeplSupportedLanguage -ApiKey "<MyApiKey>" -TargetLanguage
 
        language name supports_formality
        -------- ---- ------------------
        BG Bulgarian False
        CS Czech False
        DA Danish False
        DE German True
        EL Greek False
        EN-GB English (British) False
        EN-US English (American) False
        ES Spanish True
        ET Estonian False
        FI Finnish False
        FR French True
        HU Hungarian False
        ID Indonesian False
        IT Italian True
        JA Japanese False
        KO Korean False
        LT Lithuanian False
        LV Latvian False
        NB Norwegian False
        NL Dutch True
        PL Polish True
        PT-BR Portuguese (Brazilian) True
        PT-PT Portuguese (European) True
        RO Romanian False
        RU Russian True
        SK Slovak False
        SL Slovenian False
        SV Swedish False
        TR Turkish False
        UK Ukrainian False
        ZH Chinese (simplified) False
 
        This example shows how to retrieve a list of supported target languages.
 
    .EXAMPLE
        Get-DeeplSupportedLanguage -ApiKey "<MyApiKey>" -TargetLanguage -Verbose
 
        VERBOSE: Provided ApiKey ends with ':fx'. Using DeepL Api Free service URI.
        VERBOSE: Parameter 'TargetLanguage' specified. Retrieving list of supported target languages.
        VERBOSE: Sending request.
        VERBOSE: GET with 0-byte payload
        VERBOSE: received 1871-byte response of content type application/json
        VERBOSE: Content encoding: utf-8
 
        language name supports_formality
        -------- ---- ------------------
        BG Bulgarian False
        CS Czech False
        DA Danish False
        DE German True
        EL Greek False
        EN-GB English (British) False
        EN-US English (American) False
        ES Spanish True
        ET Estonian False
        FI Finnish False
        FR French True
        HU Hungarian False
        ID Indonesian False
        IT Italian True
        JA Japanese False
        KO Korean False
        LT Lithuanian False
        LV Latvian False
        NB Norwegian False
        NL Dutch True
        PL Polish True
        PT-BR Portuguese (Brazilian) True
        PT-PT Portuguese (European) True
        RO Romanian False
        RU Russian True
        SK Slovak False
        SL Slovenian False
        SV Swedish False
        TR Turkish False
        UK Ukrainian False
        ZH Chinese (simplified) False
 
        This example shows how to retrieve a list of supported target languages and showing verbose output.
 
    .EXAMPLE
        "<MyApiKey>" | Get-DeeplSupportedLanguage
 
        language name
        -------- ----
        BG Bulgarian
        CS Czech
        DA Danish
        DE German
        EL Greek
        EN English
        ES Spanish
        ET Estonian
        FI Finnish
        FR French
        HU Hungarian
        ID Indonesian
        IT Italian
        JA Japanese
        KO Korean
        LT Lithuanian
        LV Latvian
        NB Norwegian
        NL Dutch
        PL Polish
        PT Portuguese
        RO Romanian
        RU Russian
        SK Slovak
        SL Slovenian
        SV Swedish
        TR Turkish
        UK Ukrainian
        ZH Chinese
 
        This example shows how to retrieve a list of supported source languages by piping the ApiKey.
 
    .INPUTS
        Nothing
 
    .OUTPUTS
        System.Management.Automation.PSCustomObject
 
    .NOTES
        Author: Dieter Koch
        Email: diko@admins-little-helper.de
 
    .LINK
        https://github.com/admins-little-helper/DeeplTranslate/blob/main/Help/Get-DeeplSupportedLanguage.txt
 
    #>


    [CmdletBinding()]
    [OutputType([System.Object[]])]
    param (
        [ValidateNotNullOrEmpty()]
        [string]
        $ApiKey,

        [switch]
        $TargetLanguage
    )

    # Set a default list of supported source languages to have something that this function will return in case
    # the Api call to retrieve the list of supported languages fails with an error.
    # This list is valid as of 2023-02-23.
    $SupportedSourceLanguage = @(
        [PSCustomObject]@{
            "language" = "BG"
            "name"     = "Bulgarian"
        }
        [PSCustomObject]@{
            "language" = "CS"
            "name"     = "Czech"
        }
        [PSCustomObject]@{
            "language" = "DA"
            "name"     = "Danish"
        }
        [PSCustomObject]@{
            "language" = "DE"
            "name"     = "German"
        }
        [PSCustomObject]@{
            "language" = "EL"
            "name"     = "Greek"
        }
        [PSCustomObject]@{
            "language" = "EN"
            "name"     = "English"
        }
        [PSCustomObject]@{
            "language" = "ES"
            "name"     = "Spanish"
        }
        [PSCustomObject]@{
            "language" = "ET"
            "name"     = "Estonian"
        }
        [PSCustomObject]@{
            "language" = "FI"
            "name"     = "Finnish"
        }
        [PSCustomObject]@{
            "language" = "FR"
            "name"     = "French"
        }
        [PSCustomObject]@{
            "language" = "HU"
            "name"     = "Hungarian"
        }
        [PSCustomObject]@{
            "language" = "ID"
            "name"     = "Indonesian"
        }
        [PSCustomObject]@{
            "language" = "IT"
            "name"     = "Italian"
        }
        [PSCustomObject]@{
            "language" = "JA"
            "name"     = "Japanese"
        }
        [PSCustomObject]@{
            "language" = "KO"
            "name"     = "Korean"
        }
        [PSCustomObject]@{
            "language" = "LT"
            "name"     = "Lithuanian"
        }
        [PSCustomObject]@{
            "language" = "LV"
            "name"     = "Latvian"
        }
        [PSCustomObject]@{
            "language" = "NB"
            "name"     = "Norwegian"
        }
        [PSCustomObject]@{
            "language" = "NL"
            "name"     = "Dutch"
        }
        [PSCustomObject]@{
            "language" = "PL"
            "name"     = "Polish"
        }
        [PSCustomObject]@{
            "language" = "PT"
            "name"     = "Portuguese"
        }
        [PSCustomObject]@{
            "language" = "RO"
            "name"     = "Romanian"
        }
        [PSCustomObject]@{
            "language" = "RU"
            "name"     = "Russian"
        }
        [PSCustomObject]@{
            "language" = "SK"
            "name"     = "Slovak"
        }
        [PSCustomObject]@{
            "language" = "SL"
            "name"     = "Slovenian"
        }
        [PSCustomObject]@{
            "language" = "SV"
            "name"     = "Swedish"
        }
        [PSCustomObject]@{
            "language" = "TR"
            "name"     = "Turkish"
        }
        [PSCustomObject]@{
            "language" = "UK"
            "name"     = "Ukrainian"
        }
        [PSCustomObject]@{
            "language" = "ZH"
            "name"     = "Chinese"
        }
    )

    # Set a default list of supported target languages to have something that this function will return in case
    # the Api call to retrieve the list of supported languages fails with an error.
    # This list is valid as of 2023-02-23.
    $SupportedTargetLanguage = @(
        [PSCustomObject]@{
            "language"           = "BG"
            "name"               = "Bulgarian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "CS"
            "name"               = "Czech"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "DA"
            "name"               = "Danish"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "DE"
            "name"               = "German"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "EL"
            "name"               = "Greek"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "EN-GB"
            "name"               = "English (British)"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "EN-US"
            "name"               = "English (American)"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "ES"
            "name"               = "Spanish"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "ET"
            "name"               = "Estonian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "FI"
            "name"               = "Finnish"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "FR"
            "name"               = "French"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "HU"
            "name"               = "Hungarian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "ID"
            "name"               = "Indonesian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "IT"
            "name"               = "Italian"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "JA"
            "name"               = "Japanese"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "KO"
            "name"               = "Korean"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "LT"
            "name"               = "Lithuanian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "LV"
            "name"               = "Latvian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "NB"
            "name"               = "Norwegian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "NL"
            "name"               = "Dutch"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "PL"
            "name"               = "Polish"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "PT-BR"
            "name"               = "Portuguese (Brazilian)"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "PT-PT"
            "name"               = "Portuguese (European)"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "RO"
            "name"               = "Romanian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "RU"
            "name"               = "Russian"
            "supports_formality" = $true
        }
        [PSCustomObject]@{
            "language"           = "SK"
            "name"               = "Slovak"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "SL"
            "name"               = "Slovenian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "SV"
            "name"               = "Swedish"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "TR"
            "name"               = "Turkish"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "UK"
            "name"               = "Ukrainian"
            "supports_formality" = $false
        }
        [PSCustomObject]@{
            "language"           = "ZH"
            "name"               = "Chinese (simplified)"
            "supports_formality" = $false
        }
    )

    # Test if an ApiKey was specified and if it's a valid GUID (without a trailing ':fx' 'DeepL API free' marker)
    if ([string]::IsNullOrEmpty($ApiKey) -or (-not (Test-IsGuid($ApiKey -replace "(:fx)$", "")))) {
        # Return the list of statically defined language pairs, in case no ApiKey was specified.
        Write-Verbose -Message "Returning statically defined list of supported languages because no or an invalid ApiKey was specified to query the DeepL Api service."

        if ($TargetLanguage.IsPresent) {
            $SupportedLanguages = $SupportedTargetLanguage
        }
        else {
            $SupportedLanguages = $SupportedSourceLanguage
        }

        $SupportedLanguages
    }
    else {
        $BaseUri = Get-DeeplApiUri -ApiKey $ApiKey

        if ($TargetLanguage.IsPresent) {
            # Set the type parameter to value 'target' to retrieve a list of supported target languages.
            Write-Verbose -Message "Parameter 'TargetLanguage' specified. Retrieving list of supported target languages."
            $Uri = "$BaseUri/languages?type=target"
        }
        else {
            # Set the type parameter to value 'source' to retrieve a list of supported source languages.
            # The parameter 'type' is optional. If omitted, it will return a list of supported source languages. But we specifically set it here.
            Write-Verbose -Message "Retrieving list of supported source languages."
            $Uri = "$BaseUri/languages"
        }

        try {
            # Set the authorization header.
            $Headers = @{ Authorization = "DeepL-Auth-Key $ApiKey" }

            # Set parameters for the Invoke-RestMethod cmdlet.
            $Params = @{
                Method  = 'GET'
                Uri     = $Uri
                Headers = $Headers
            }

            # Try to retrieve the list of supported source or target languages.
            Write-Verbose -Message "Calling Uri: $($Params.Uri)"
            $SupportedLanguages = Invoke-RestMethod @Params
            $SupportedLanguages
        }
        catch [Microsoft.PowerShell.Commands.HttpResponseException] {
            $ErrorMessage = Get-DeeplStatusCode -StatusCode $_.Exception.Response.StatusCode
            if ($null -ne $ErrorMessage) {
                Write-Error -Message $ErrorMessage
            }
            else {
                Write-Error -Message "Http Status Code: $_"
            }
        }
        catch {
            Write-Verbose -Message "An unknown error occured."
            $_
        }
    }
}


#region EndOfScript
<#
################################################################################
################################################################################
#
# ______ _ __ _____ _ _
# | ____| | | / _| / ____| (_) | |
# | |__ _ __ __| | ___ | |_ | (___ ___ _ __ _ _ __ | |_
# | __| | '_ \ / _` | / _ \| _| \___ \ / __| '__| | '_ \| __|
# | |____| | | | (_| | | (_) | | ____) | (__| | | | |_) | |_
# |______|_| |_|\__,_| \___/|_| |_____/ \___|_| |_| .__/ \__|
# | |
# |_|
################################################################################
################################################################################
# created with help of http://patorjk.com/software/taag/
#>

#endregion