Du är här

Balabolka

Informations

Creator Meddelanden
VolkerFroehlich Anonymous

Warning

This installer is a beta script. It means that it might not work as expected

Informations

Platforms:
Downloads: 273
Wine: System

Feedbacks

Description

Balabolka is a Text-To-Speech (TTS) program.  All computer voices installed on your system are available to Balabolka. The on-screen text can be saved as an audio file. The program can read the clipboard content, extract text from documents, customize font and background colour, control reading from the system tray or by the global hotkeys. Balabolka supports text file formats: AZW, AZW3, CHM, DjVu, DOC, DOCX, EML, EPUB, FB2, FB3, HTML, LIT, MD, MOBI, ODP, ODS, ODT, PDB, PRC, PDF, PPT, PPTX, RTF, TCR, WPD, XLS, XLSX. Website.

Screenshots

Miniature

Source code

#!/usr/bin/env playonlinux-bash
[ "$PLAYONLINUX" = "" ] && exit 0
source "$PLAYONLINUX/lib/sources"
######################
# created So 14. Feb 16:14:27 CET 2021
######################
# global parameters
TITLE="Balabolka"
PREFIX="balabolka"
AUTHOR="Volker Fröhlich"
EDITOR="Ilya Morozov"
EDITOR_URL="http://balabolka.site/balabolka.htm"
FILE="balabolka.zip"
MD5=""
DOWNLOAD_PATH="http://www.cross-plus-a.com"
######################
# FUNCTIONS
# ==============================================================
get_unpack_install()
# --------------------------------------------------------------
# select/download <installer file>
# if file extension is .zip unpack and use installer "setup.exe"
# run <installer>
# --------------------------------------------------------------
# input parameters
# 1: EXEC_SCRIPT - "OK" execute script, else return 
# 2: PATH_DOWNLD - installer download path (.zip, .exe or .msi)
# 3: PRG_DISPLAY - display name for user interaction
# 4: PATH_VERIFY - path to a component confirming installation success if found
# 5: INST_METHOD - LOCAL, DOWNLOAD
# ==============================================================
{
# -------------------------------
# validate input parameters
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
POL_Debug_Message "# PREFIX: $PREFIX"
POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
EXEC_SCRIPT="$1"
PATH_DOWNLD="$2"
PRG_DISPLAY="$3"
PATH_VERIFY="$4"
INST_METHOD="$5"
POL_Debug_Message "# EXEC_SCRIPT=$EXEC_SCRIPT"
POL_Debug_Message "# PATH_DOWNLD=$PATH_DOWNLD"
POL_Debug_Message "# PRG_DISPLAY=$PRG_DISPLAY"
POL_Debug_Message "# PATH_VERIFY=$PATH_VERIFY"
POL_Debug_Message "# INST_METHOD=$INST_METHOD"
[[ -z "$EXEC_SCRIPT" || ! "$EXEC_SCRIPT" = "OK" ]] && POL_Debug_Message "# skipping install ($PRG_DISPLAY)!" && return 0
[ -z "$PATH_DOWNLD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_DOWNLD empty" && return -1
[ -z "$PRG_DISPLAY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PRG_DISPLAY empty" && return -1
[ -z "$PATH_VERIFY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_VERIFY empty" && return -1
[ -z "$INST_METHOD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() INST_METHOD empty" && return -1
# -------------------------------
# if already installed ask user 
[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
LOCAL_TITLE="$TITLE ($PRG_DISPLAY)"
if [ "$ALREADY_INSTALLED" = 1 ];then
        POL_Debug_Message "# already installed: >$PATH_VERIFY<"
        MSG="This component is already installed - overwrite?"
        POL_SetupWindow_question "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
        [ ! "$APP_ANSWER" = "TRUE" ] && return 0
fi
# -------------------------------
# select/download <installer>
DOWNLOAD_FULLPATH="$PATH_DOWNLD"
if [ "$INST_METHOD" = "LOCAL" ]; then
        #---------------------
        # user selects installer
        POL_SetupWindow_browse \
                "$(eval_gettext 'Please select the setup file for $LOCAL_TITLE.')" \
                "$TITLE"
        INSTALLER="$APP_ANSWER"
elif [ "$INST_METHOD" = "DOWNLOAD" ]; then
        #---------------------
        # download installer
        INSTALLER=""
        DOWNLOAD_FULLPATH="$PATH_DOWNLD"
        POL_Debug_Message "# download installer"
        DOWNLOAD_LINK=$DOWNLOAD_FULLPATH
        DOWNLOAD_FILE=$(basename "$DOWNLOAD_FULLPATH")
        POL_Debug_Message "# DOWNLOAD_LINK=$DOWNLOAD_LINK"
        POL_Debug_Message "# MD5=$MD5"
        POL_Download "$DOWNLOAD_LINK" "$MD5"
        INSTALLER="$POL_System_TmpDir/$DOWNLOAD_FILE"
fi
if [[ -z "$INSTALLER" || ! -f "$INSTALLER" ]];then 
        MSG="ERROR: cannot locate installer >$INSTALLER< for $LOCAL_TITLE."
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
fi
# -------------------------------
# unpack <installer>.zip
FIL_NAM=$(basename "$INSTALLER")
FIL_EXT="${FIL_NAM##*.}"
if [ "$FIL_EXT" = "zip" ];then
        INSTALLER_ZIP="$INSTALLER"
        POL_Debug_Message "# Extracting the archive... >$INSTALLER_ZIP<"
        MSG="Extracting the archive..."
        POL_SetupWindow_wait_next_signal "$(eval_gettext '$MSG')" "$TITLE"
        POL_System_unzip "$INSTALLER_ZIP" -d "$POL_System_TmpDir"
        INSTALLER="$POL_System_TmpDir/setup.exe"
        if [ ! -f "$INSTALLER" ];then 
                MSG="ERROR: cannot locate unzipped installer >$INSTALLER<"
                POL_Debug_Message "# $MSG"
                POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
        fi
fi
if [ ! -f "$INSTALLER" ];then 
        MSG="ERROR: cannot locate selected/downloaded installer >$INSTALLER<"
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_message "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
        POL_Debug_Fatal "# $MSG"
        return -1
fi
# -------------------
# Run Wine installation
FIL_NAM=$(basename "$INSTALLER")
FIL_EXT="${FIL_NAM##*.}"
if [ -f "$INSTALLER" ]; then
        MSG="Installation in progress ($FIL_NAM)."
        POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
        POL_Wine_WaitBefore "$LOCAL_TITLE"
        if [ "$FIL_EXT" = "msi" ];then 
                POL_Wine msiexec /i "$INSTALLER"
        else
                POL_Wine "$INSTALLER"
        fi
        POL_Wine_WaitExit "$LOCAL_TITLE"
fi
# ---------------------
# confirm installation exists
[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
if [ "$PATH_VERIFY" = "TBD" ];then
        ALREADY_INSTALLED=1
        ## this is for script developer, if we do not know yet how to 
        ## verify the installation success for a module, we pass 
        ## PATH_VERIFY='TBD' and do assume correct installation
        MSG="WARNING: PATH_VERIFY was set to 'TBD' and needs to be identified."
        POL_Debug_Message "# $MSG"
fi

if [ "$ALREADY_INSTALLED" = 0 ];then
        MSG="ERROR: cannot verify installed component >$PATH_VERIFY<"
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
        POL_SetupWindow_Close
        return -1
fi
return 0
}
# ==============================================================
create_POL_shortcut()
# --------------------------------------------------------------
# 1. get installed Balabolka version
# 2. remove previous desktop starter
# 3. remove previous POL shortcut
# 4. add shortcut with version info
# ==============================================================
{
# -------------------
POL_Debug_Message "# get installed Balabolka version"
VERSION_INSTALLED=""
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
VERSION_FILE="$WINEPREFIX/system.reg"
POL_Debug_Message "# VERSION_FILE=$VERSION_FILE"
[ ! -f "$VERSION_FILE" ] && POL_Debug_Message "file not found $VERSION_FILE"
[ -f "$VERSION_FILE" ] && VERSION_INSTALLED=`grep -A 1 '"DisplayName"="Balabolka"' $VERSION_FILE | grep '"DisplayVersion"' | cut -d '"' -f 4`
POL_Debug_Message "# VERSION_INSTALLED: $VERSION_INSTALLED"
LAUNCHER="$TITLE"
[ ! -z "$VERSION_INSTALLED" ] && LAUNCHER="$TITLE-v$VERSION_INSTALLED"
POL_Debug_Message "# LAUNCHER: $LAUNCHER"
# -------------------
PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$LAUNCHER"
if [ ! -f "$PATH_SHORTCUT" ];then
        # -------------------
        POL_Debug_Message "# remove previous desktop starter"
        LINUX_DESKTOP=`xdg-user-dir DESKTOP`
        PATH_SHORTCUT="$LINUX_DESKTOP/Balabolka"
        rm -r "$PATH_SHORTCUT"* 2>/dev/null;
        # -------------------
        POL_Debug_Message "# remove previous POL shortcut"
        PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$TITLE"
        rm -r "$PATH_SHORTCUT"* 2>/dev/null;
        # -------------------
        POL_Debug_Message "# create POL shortcut"
        POL_Shortcut "balabolka.exe" "$LAUNCHER" "" "" "AudioVideo;Audio;AudioVideoEditing;Music;"
fi
[ -f "$PATH_SHORTCUT" ] && MSG="$LAUNCHER installation ok" && POL_Debug_Message "# $MSG"
return 0
}
######################
# MAIN
IMAGE_TOP="http://balabolka.site/data/balabolka_japan.jpg"
IMAGE_LEFT="https://cdn.lo4d.com/t/icon/128/balabolka.png"
POL_GetSetupImages --force  "$IMAGE_TOP" "$IMAGE_LEFT" "$TITLE"
POL_SetupWindow_Init
POL_Debug_Init
POL_Debug_Message "# show POL Window"
POL_SetupWindow_presentation "$TITLE" "$EDITOR" "$EDITOR_URL" "$AUTHOR" "$PREFIX"
# ---------------------
POL_Debug_Message "# create PREFIX environment"
POL_Wine_SelectPrefix "$PREFIX"
POL_System_SetArch "x86"
POL_Wine_PrefixCreate
Set_OS "win7"
POL_System_TmpCreate "$PREFIX"
PWD_OLD=`pwd`
cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
POL_Debug_Message "# PREFIX: $PREFIX"
POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
POL_Debug_Message "# POL_HOME : $POL_HOME"
POL_Debug_Message "# POL_USER_HOME: $POL_USER_HOME"
# ===================
POL_Debug_Message "# fill arrays"
# Balabolka, MS Speech Runtime & LANGS
# Download of Microsoft installer is available
MSSPEECH="http://www.cross-plus-a.com/msspeech"
MS_VOICE="$MSSPEECH/MSSpeech_TTS_"
PATH_SPEECH_BASE="$WINEPREFIX/drive_c/Program Files/Common Files/Microsoft Shared/Speech/"
PATH_SPEAKER="$PATH_SPEECH_BASE/Tokens/TTS_MS_"
#
typeset -i i=0 
aExecChoice[$i]="Balabolka-Program"
aDownldInst[$i]="http://www.cross-plus-a.com/balabolka.zip"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="$WINEPREFIX/drive_c/Program Files/Balabolka/balabolka.exe"
#
((i=i+1))
aExecChoice[$i]="MS Speech Platform Runtime"
aDownldInst[$i]="$MSSPEECH/SpeechPlatformRuntime.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="$PATH_SPEECH_BASE/Platform/v11.0/mssps.dll"
#
((i=i+1))
aExecChoice[$i]="Catalán"
aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-China"
aDownldInst[$i]="${MS_VOICE}zh-CN_HuiHui.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-CN_HuiHui_11.0/MSTTSLoczhCN.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-HongKong"
aDownldInst[$i]="${MS_VOICE}zh-HK_HunYee.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-HK_HunYee_11.0/MSTTSLoczhHK.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-Taiwan"
aDownldInst[$i]="${MS_VOICE}zh-TW_HanHan.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-TW_HanHan_11.0/MSTTSLoczhTW.dat"
#
((i=i+1))
aExecChoice[$i]="Danish"
aDownldInst[$i]="${MS_VOICE}da-DK_Helle.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}da-DK_Helle_11.0/MSTTSLocdaDK.dat"
#
((i=i+1))
aExecChoice[$i]="Deutsche Sprache"
aDownldInst[$i]="${MS_VOICE}de-DE_Hedda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}de-DE_Hedda_11.0/MSTTSLocdeDE.dat"
#
((i=i+1))
aExecChoice[$i]="English-Australia"
aDownldInst[$i]="${MS_VOICE}en-AU_Hayley.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-AU_Hayley_11.0/MSTTSLocenAU.dat"
#
((i=i+1))
aExecChoice[$i]="English-India"
aDownldInst[$i]="${MS_VOICE}en-IN_Heera.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-IN_Heera_11.0/MSTTSLocenIN.dat"
#
((i=i+1))
aExecChoice[$i]="English-UK"
aDownldInst[$i]="${MS_VOICE}en-GB_Hazel.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-GB_Hazel_11.0/MSTTSLocenGB.dat"
#
((i=i+1))
aExecChoice[$i]="English-US"
aDownldInst[$i]="${MS_VOICE}en-US_Helen.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-US_Helen_11.0/MSTTSLocenUS.dat"
#
((i=i+1))
aExecChoice[$i]="Español-Canadá"
aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
#
((i=i+1))
aExecChoice[$i]="Español-España"
aDownldInst[$i]="${MS_VOICE}es-ES_Helena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}es-ES_Helena_11.0/MSTTSLocesES.dat"
#
((i=i+1))
aExecChoice[$i]="Español-Mexico"
aDownldInst[$i]="${MS_VOICE}es-MX_Hilda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}es-MX_Hilda_11.0/MSTTSLocesMX.dat"
#
((i=i+1))
aExecChoice[$i]="Finnish"
aDownldInst[$i]="${MS_VOICE}fi-FI_Heidi.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fi-FI_Heidi_11.0/MSTTSLocfiFI.dat"
#
((i=i+1))
aExecChoice[$i]="Français-Canada"
aDownldInst[$i]="${MS_VOICE}fr-CA_Harmonie.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fr-CA_Harmonie_11.0/MSTTSLocfrCA.dat"
#
((i=i+1))
aExecChoice[$i]="Français-France"
aDownldInst[$i]="${MS_VOICE}fr-FR_Hortense.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fr-FR_Hortense_11.0/MSTTSLocfrFR.dat"
#
((i=i+1))
aExecChoice[$i]="Italiano"
aDownldInst[$i]="${MS_VOICE}it-IT_Lucia.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}it-IT_Lucia_11.0/MSTTSLocitIT.dat"
#
((i=i+1))
aExecChoice[$i]="Japanese"
aDownldInst[$i]="${MS_VOICE}ja-JP_Haruka.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ja-JP_Haruka_11.0/MSTTSLocjaJP.dat"
#
((i=i+1))
aExecChoice[$i]="Korean"
aDownldInst[$i]="${MS_VOICE}ko-KR_Heami.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ko-KR_Heami_11.0/MSTTSLockoKR.dat"
#
((i=i+1))
aExecChoice[$i]="Nederlands"
aDownldInst[$i]="${MS_VOICE}nl-NL_Hanna.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}nl-NL_Hanna_11.0/MSTTSLocnlNL.dat"
#
((i=i+1))
aExecChoice[$i]="Norwegian"
aDownldInst[$i]="${MS_VOICE}nb-NO_Hulda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}nb-NO_Hulda_11.0/MSTTSLocnbNO.dat"
#
((i=i+1))
aExecChoice[$i]="Polski"
aDownldInst[$i]="${MS_VOICE}pl-PL_Paulina.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pl-PL_Paulina_11.0/MSTTSLocplPL.dat"
#
((i=i+1))
aExecChoice[$i]="Portugês-Portugal"
aDownldInst[$i]="${MS_VOICE}pt-PT_Helia.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pt-PT_Helia_11.0/MSTTSLocptPT.dat"
#
((i=i+1))
aExecChoice[$i]="Portugês-Brasil"
aDownldInst[$i]="${MS_VOICE}pt-BR_Heloisa.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pt-BR_Heloisa_11.0/MSTTSLocptBR.dat"
#
((i=i+1))
aExecChoice[$i]="Russian"
aDownldInst[$i]="${MS_VOICE}ru-RU_Elena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ru-RU_Elena_11.0/MSTTSLocruRU.dat"
#
((i=i+1))
aExecChoice[$i]="Swedish"
aDownldInst[$i]="${MS_VOICE}sv-SE_Hedvig.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}sv-SE_Hedvig_11.0/MSTTSLocsvSE.dat"
#
# ===================
# USER CHOICE: select languages to be installed
typeset -i j=2 max=${#aExecChoice[*]} # start at 3rd entry, after Balboka, MS Runtime
SEPERATOR="~"
CHOICE=""
while (( j < max ))
do
   [ -z "${CHOICE}" ] && CHOICE="${aExecChoice[j]}" || CHOICE="${CHOICE}${SEPERATOR}${aExecChoice[$j]}"
   j=j+1
done

POL_Debug_Message "# CHOICE : ${CHOICE} #"

MSG="Please select components to install"
POL_SetupWindow_checkbox_list "$(eval_gettext '$MSG')" "$TITLE" "$CHOICE" "$SEPERATOR"
POL_Debug_Message "# APP_ANSWER : >$APP_ANSWER<"
if [ -z "$APP_ANSWER" ];then
        MSG="No language component has been selected.\nDo you want to overwrite an existing Installation ("${aPrgDisplay[0]}", "${aPrgDisplay[1]}")?"
        POL_SetupWindow_question "$(eval_gettext '$MSG')" "$TITLE"
        if [ ! "$APP_ANSWER" = "TRUE" ];then
                 cd $PWD_OLD 
                 POL_SetupWindow_Close 
                 exit 0
        fi
fi
j=2
while (( j < max ))
do
   [ "$(echo $APP_ANSWER | grep -o "${aExecChoice[$j]}")" != "" ] && aExecChoice[$j]="OK" || aExecChoice[$j]=""
   j=j+1
done
aExecChoice[0]="OK" # we always need main program
aExecChoice[1]="OK" # we always need MS Speech Runtime
# ===================
# USER CHOICE: LOCAL,DOWNLOAD
POL_SetupWindow_InstallMethod "LOCAL,DOWNLOAD"
POL_Debug_Message "# INSTALL_METHOD : >$INSTALL_METHOD<"
[ "$INSTALL_METHOD" = "False" ] && cd $PWD_OLD && POL_SetupWindow_Close && exit 0
# ---------------------
# install component
i=0
while (( i < max ))
do
   get_unpack_install \
           "${aExecChoice[$i]}" \
           "${aDownldInst[$i]}" \
           "${aPrgDisplay[$i]}" \
           "${aPathVerify[$i]}" \
           "$INSTALL_METHOD"
   RET_VAL="$?"
   POL_Debug_Message \
           "# get_unpack_install ($i, ${aPrgDisplay[$i]}) returned $RET_VAL" 
   [ ! "$RET_VAL" -eq 0 ] && exit -1
   [ "$i" = 0 ] && create_POL_shortcut
   i=i+1
done
######################
# Close POL
cd $PWD_OLD
POL_System_TmpDelete
POL_SetupWindow_Close
exit

Contributions

Filters:

Contribute
Member Meddelanden
VolkerFroehlich Tuesday 16 February 2021 at 10:47
VolkerFroehlich Anonymous

Information

This update has been approved by the team.

Meddelanden

as per below comment - use `xdg-user-dir DESKTOP` to identify Linux desktop path

Differences

@@ -133,7 +133,10 @@
 [ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
 if [ "$PATH_VERIFY" = "TBD" ];then
 	ALREADY_INSTALLED=1
-	MSG="ACHTUNG: PATH_VERIFY ist TBD, muss noch ermittelt werden."
+	## this is for script developer, if we do not know yet how to 
+	## verify the installation success for a module, we pass 
+	## PATH_VERIFY='TBD' and do assume correct installation
+	MSG="WARNING: PATH_VERIFY was set to 'TBD' and needs to be identified."
 	POL_Debug_Message "# $MSG"
 fi
 
@@ -172,7 +175,7 @@
 if [ ! -f "$PATH_SHORTCUT" ];then
 	# -------------------
 	POL_Debug_Message "# remove previous desktop starter"
-	LINUX_DESKTOP=/home/benutzer1/Schreibtisch
+	LINUX_DESKTOP=`xdg-user-dir DESKTOP`
 	PATH_SHORTCUT="$LINUX_DESKTOP/Balabolka"
 	rm -r "$PATH_SHORTCUT"* 2>/dev/null;
 	# -------------------
@@ -333,7 +336,7 @@
 aPathVerify[$i]="${PATH_SPEAKER}it-IT_Lucia_11.0/MSTTSLocitIT.dat"
 #
 ((i=i+1))
-aExecChoice[$i]="???? (Japanese)"
+aExecChoice[$i]="Japanese"
 aDownldInst[$i]="${MS_VOICE}ja-JP_Haruka.msi"
 aPrgDisplay[$i]=${aExecChoice[$i]}
 aPathVerify[$i]="${PATH_SPEAKER}ja-JP_Haruka_11.0/MSTTSLocjaJP.dat"
@@ -375,7 +378,7 @@
 aPathVerify[$i]="${PATH_SPEAKER}pt-BR_Heloisa_11.0/MSTTSLocptBR.dat"
 #
 ((i=i+1))
-aExecChoice[$i]="???????????"
+aExecChoice[$i]="Russian"
 aDownldInst[$i]="${MS_VOICE}ru-RU_Elena.msi"
 aPrgDisplay[$i]=${aExecChoice[$i]}
 aPathVerify[$i]="${PATH_SPEAKER}ru-RU_Elena_11.0/MSTTSLocruRU.dat"

New source code

#!/usr/bin/env playonlinux-bash
[ "$PLAYONLINUX" = "" ] && exit 0
source "$PLAYONLINUX/lib/sources"
######################
# created So 14. Feb 16:14:27 CET 2021
######################
# global parameters
TITLE="Balabolka"
PREFIX="balabolka"
AUTHOR="Volker Fröhlich"
EDITOR="Ilya Morozov"
EDITOR_URL="http://balabolka.site/balabolka.htm"
FILE="balabolka.zip"
MD5=""
DOWNLOAD_PATH="http://www.cross-plus-a.com"
######################
# FUNCTIONS
# ==============================================================
get_unpack_install()
# --------------------------------------------------------------
# select/download <installer file>
# if file extension is .zip unpack and use installer "setup.exe"
# run <installer>
# --------------------------------------------------------------
# input parameters
# 1: EXEC_SCRIPT - "OK" execute script, else return 
# 2: PATH_DOWNLD - installer download path (.zip, .exe or .msi)
# 3: PRG_DISPLAY - display name for user interaction
# 4: PATH_VERIFY - path to a component confirming installation success if found
# 5: INST_METHOD - LOCAL, DOWNLOAD
# ==============================================================
{
# -------------------------------
# validate input parameters
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
POL_Debug_Message "# PREFIX: $PREFIX"
POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
EXEC_SCRIPT="$1"
PATH_DOWNLD="$2"
PRG_DISPLAY="$3"
PATH_VERIFY="$4"
INST_METHOD="$5"
POL_Debug_Message "# EXEC_SCRIPT=$EXEC_SCRIPT"
POL_Debug_Message "# PATH_DOWNLD=$PATH_DOWNLD"
POL_Debug_Message "# PRG_DISPLAY=$PRG_DISPLAY"
POL_Debug_Message "# PATH_VERIFY=$PATH_VERIFY"
POL_Debug_Message "# INST_METHOD=$INST_METHOD"
[[ -z "$EXEC_SCRIPT" || ! "$EXEC_SCRIPT" = "OK" ]] && POL_Debug_Message "# skipping install ($PRG_DISPLAY)!" && return 0
[ -z "$PATH_DOWNLD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_DOWNLD empty" && return -1
[ -z "$PRG_DISPLAY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PRG_DISPLAY empty" && return -1
[ -z "$PATH_VERIFY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_VERIFY empty" && return -1
[ -z "$INST_METHOD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() INST_METHOD empty" && return -1
# -------------------------------
# if already installed ask user 
[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
LOCAL_TITLE="$TITLE ($PRG_DISPLAY)"
if [ "$ALREADY_INSTALLED" = 1 ];then
        POL_Debug_Message "# already installed: >$PATH_VERIFY<"
        MSG="This component is already installed - overwrite?"
        POL_SetupWindow_question "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
        [ ! "$APP_ANSWER" = "TRUE" ] && return 0
fi
# -------------------------------
# select/download <installer>
DOWNLOAD_FULLPATH="$PATH_DOWNLD"
if [ "$INST_METHOD" = "LOCAL" ]; then
        #---------------------
        # user selects installer
        POL_SetupWindow_browse \
                "$(eval_gettext 'Please select the setup file for $LOCAL_TITLE.')" \
                "$TITLE"
        INSTALLER="$APP_ANSWER"
elif [ "$INST_METHOD" = "DOWNLOAD" ]; then
        #---------------------
        # download installer
        INSTALLER=""
        DOWNLOAD_FULLPATH="$PATH_DOWNLD"
        POL_Debug_Message "# download installer"
        DOWNLOAD_LINK=$DOWNLOAD_FULLPATH
        DOWNLOAD_FILE=$(basename "$DOWNLOAD_FULLPATH")
        POL_Debug_Message "# DOWNLOAD_LINK=$DOWNLOAD_LINK"
        POL_Debug_Message "# MD5=$MD5"
        POL_Download "$DOWNLOAD_LINK" "$MD5"
        INSTALLER="$POL_System_TmpDir/$DOWNLOAD_FILE"
fi
if [[ -z "$INSTALLER" || ! -f "$INSTALLER" ]];then 
        MSG="ERROR: cannot locate installer >$INSTALLER< for $LOCAL_TITLE."
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
fi
# -------------------------------
# unpack <installer>.zip
FIL_NAM=$(basename "$INSTALLER")
FIL_EXT="${FIL_NAM##*.}"
if [ "$FIL_EXT" = "zip" ];then
        INSTALLER_ZIP="$INSTALLER"
        POL_Debug_Message "# Extracting the archive... >$INSTALLER_ZIP<"
        MSG="Extracting the archive..."
        POL_SetupWindow_wait_next_signal "$(eval_gettext '$MSG')" "$TITLE"
        POL_System_unzip "$INSTALLER_ZIP" -d "$POL_System_TmpDir"
        INSTALLER="$POL_System_TmpDir/setup.exe"
        if [ ! -f "$INSTALLER" ];then 
                MSG="ERROR: cannot locate unzipped installer >$INSTALLER<"
                POL_Debug_Message "# $MSG"
                POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
        fi
fi
if [ ! -f "$INSTALLER" ];then 
        MSG="ERROR: cannot locate selected/downloaded installer >$INSTALLER<"
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_message "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
        POL_Debug_Fatal "# $MSG"
        return -1
fi
# -------------------
# Run Wine installation
FIL_NAM=$(basename "$INSTALLER")
FIL_EXT="${FIL_NAM##*.}"
if [ -f "$INSTALLER" ]; then
        MSG="Installation in progress ($FIL_NAM)."
        POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
        POL_Wine_WaitBefore "$LOCAL_TITLE"
        if [ "$FIL_EXT" = "msi" ];then 
                POL_Wine msiexec /i "$INSTALLER"
        else
                POL_Wine "$INSTALLER"
        fi
        POL_Wine_WaitExit "$LOCAL_TITLE"
fi
# ---------------------
# confirm installation exists
[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
if [ "$PATH_VERIFY" = "TBD" ];then
        ALREADY_INSTALLED=1
        ## this is for script developer, if we do not know yet how to 
        ## verify the installation success for a module, we pass 
        ## PATH_VERIFY='TBD' and do assume correct installation
        MSG="WARNING: PATH_VERIFY was set to 'TBD' and needs to be identified."
        POL_Debug_Message "# $MSG"
fi

if [ "$ALREADY_INSTALLED" = 0 ];then
        MSG="ERROR: cannot verify installed component >$PATH_VERIFY<"
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
        POL_SetupWindow_Close
        return -1
fi
return 0
}
# ==============================================================
create_POL_shortcut()
# --------------------------------------------------------------
# 1. get installed Balabolka version
# 2. remove previous desktop starter
# 3. remove previous POL shortcut
# 4. add shortcut with version info
# ==============================================================
{
# -------------------
POL_Debug_Message "# get installed Balabolka version"
VERSION_INSTALLED=""
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
VERSION_FILE="$WINEPREFIX/system.reg"
POL_Debug_Message "# VERSION_FILE=$VERSION_FILE"
[ ! -f "$VERSION_FILE" ] && POL_Debug_Message "file not found $VERSION_FILE"
[ -f "$VERSION_FILE" ] && VERSION_INSTALLED=`grep -A 1 '"DisplayName"="Balabolka"' $VERSION_FILE | grep '"DisplayVersion"' | cut -d '"' -f 4`
POL_Debug_Message "# VERSION_INSTALLED: $VERSION_INSTALLED"
LAUNCHER="$TITLE"
[ ! -z "$VERSION_INSTALLED" ] && LAUNCHER="$TITLE-v$VERSION_INSTALLED"
POL_Debug_Message "# LAUNCHER: $LAUNCHER"
# -------------------
PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$LAUNCHER"
if [ ! -f "$PATH_SHORTCUT" ];then
        # -------------------
        POL_Debug_Message "# remove previous desktop starter"
        LINUX_DESKTOP=`xdg-user-dir DESKTOP`
        PATH_SHORTCUT="$LINUX_DESKTOP/Balabolka"
        rm -r "$PATH_SHORTCUT"* 2>/dev/null;
        # -------------------
        POL_Debug_Message "# remove previous POL shortcut"
        PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$TITLE"
        rm -r "$PATH_SHORTCUT"* 2>/dev/null;
        # -------------------
        POL_Debug_Message "# create POL shortcut"
        POL_Shortcut "balabolka.exe" "$LAUNCHER" "" "" "AudioVideo;Audio;AudioVideoEditing;Music;"
fi
[ -f "$PATH_SHORTCUT" ] && MSG="$LAUNCHER installation ok" && POL_Debug_Message "# $MSG"
return 0
}
######################
# MAIN
IMAGE_TOP="http://balabolka.site/data/balabolka_japan.jpg"
IMAGE_LEFT="https://cdn.lo4d.com/t/icon/128/balabolka.png"
POL_GetSetupImages --force  "$IMAGE_TOP" "$IMAGE_LEFT" "$TITLE"
POL_SetupWindow_Init
POL_Debug_Init
POL_Debug_Message "# show POL Window"
POL_SetupWindow_presentation "$TITLE" "$EDITOR" "$EDITOR_URL" "$AUTHOR" "$PREFIX"
# ---------------------
POL_Debug_Message "# create PREFIX environment"
POL_Wine_SelectPrefix "$PREFIX"
POL_System_SetArch "x86"
POL_Wine_PrefixCreate
Set_OS "win7"
POL_System_TmpCreate "$PREFIX"
PWD_OLD=`pwd`
cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
POL_Debug_Message "# PREFIX: $PREFIX"
POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
POL_Debug_Message "# POL_HOME : $POL_HOME"
POL_Debug_Message "# POL_USER_HOME: $POL_USER_HOME"
# ===================
POL_Debug_Message "# fill arrays"
# Balabolka, MS Speech Runtime & LANGS
# Download of Microsoft installer is available
MSSPEECH="http://www.cross-plus-a.com/msspeech"
MS_VOICE="$MSSPEECH/MSSpeech_TTS_"
PATH_SPEECH_BASE="$WINEPREFIX/drive_c/Program Files/Common Files/Microsoft Shared/Speech/"
PATH_SPEAKER="$PATH_SPEECH_BASE/Tokens/TTS_MS_"
#
typeset -i i=0 
aExecChoice[$i]="Balabolka-Program"
aDownldInst[$i]="http://www.cross-plus-a.com/balabolka.zip"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="$WINEPREFIX/drive_c/Program Files/Balabolka/balabolka.exe"
#
((i=i+1))
aExecChoice[$i]="MS Speech Platform Runtime"
aDownldInst[$i]="$MSSPEECH/SpeechPlatformRuntime.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="$PATH_SPEECH_BASE/Platform/v11.0/mssps.dll"
#
((i=i+1))
aExecChoice[$i]="Catalán"
aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-China"
aDownldInst[$i]="${MS_VOICE}zh-CN_HuiHui.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-CN_HuiHui_11.0/MSTTSLoczhCN.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-HongKong"
aDownldInst[$i]="${MS_VOICE}zh-HK_HunYee.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-HK_HunYee_11.0/MSTTSLoczhHK.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-Taiwan"
aDownldInst[$i]="${MS_VOICE}zh-TW_HanHan.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-TW_HanHan_11.0/MSTTSLoczhTW.dat"
#
((i=i+1))
aExecChoice[$i]="Danish"
aDownldInst[$i]="${MS_VOICE}da-DK_Helle.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}da-DK_Helle_11.0/MSTTSLocdaDK.dat"
#
((i=i+1))
aExecChoice[$i]="Deutsche Sprache"
aDownldInst[$i]="${MS_VOICE}de-DE_Hedda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}de-DE_Hedda_11.0/MSTTSLocdeDE.dat"
#
((i=i+1))
aExecChoice[$i]="English-Australia"
aDownldInst[$i]="${MS_VOICE}en-AU_Hayley.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-AU_Hayley_11.0/MSTTSLocenAU.dat"
#
((i=i+1))
aExecChoice[$i]="English-India"
aDownldInst[$i]="${MS_VOICE}en-IN_Heera.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-IN_Heera_11.0/MSTTSLocenIN.dat"
#
((i=i+1))
aExecChoice[$i]="English-UK"
aDownldInst[$i]="${MS_VOICE}en-GB_Hazel.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-GB_Hazel_11.0/MSTTSLocenGB.dat"
#
((i=i+1))
aExecChoice[$i]="English-US"
aDownldInst[$i]="${MS_VOICE}en-US_Helen.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-US_Helen_11.0/MSTTSLocenUS.dat"
#
((i=i+1))
aExecChoice[$i]="Español-Canadá"
aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
#
((i=i+1))
aExecChoice[$i]="Español-España"
aDownldInst[$i]="${MS_VOICE}es-ES_Helena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}es-ES_Helena_11.0/MSTTSLocesES.dat"
#
((i=i+1))
aExecChoice[$i]="Español-Mexico"
aDownldInst[$i]="${MS_VOICE}es-MX_Hilda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}es-MX_Hilda_11.0/MSTTSLocesMX.dat"
#
((i=i+1))
aExecChoice[$i]="Finnish"
aDownldInst[$i]="${MS_VOICE}fi-FI_Heidi.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fi-FI_Heidi_11.0/MSTTSLocfiFI.dat"
#
((i=i+1))
aExecChoice[$i]="Français-Canada"
aDownldInst[$i]="${MS_VOICE}fr-CA_Harmonie.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fr-CA_Harmonie_11.0/MSTTSLocfrCA.dat"
#
((i=i+1))
aExecChoice[$i]="Français-France"
aDownldInst[$i]="${MS_VOICE}fr-FR_Hortense.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fr-FR_Hortense_11.0/MSTTSLocfrFR.dat"
#
((i=i+1))
aExecChoice[$i]="Italiano"
aDownldInst[$i]="${MS_VOICE}it-IT_Lucia.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}it-IT_Lucia_11.0/MSTTSLocitIT.dat"
#
((i=i+1))
aExecChoice[$i]="Japanese"
aDownldInst[$i]="${MS_VOICE}ja-JP_Haruka.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ja-JP_Haruka_11.0/MSTTSLocjaJP.dat"
#
((i=i+1))
aExecChoice[$i]="Korean"
aDownldInst[$i]="${MS_VOICE}ko-KR_Heami.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ko-KR_Heami_11.0/MSTTSLockoKR.dat"
#
((i=i+1))
aExecChoice[$i]="Nederlands"
aDownldInst[$i]="${MS_VOICE}nl-NL_Hanna.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}nl-NL_Hanna_11.0/MSTTSLocnlNL.dat"
#
((i=i+1))
aExecChoice[$i]="Norwegian"
aDownldInst[$i]="${MS_VOICE}nb-NO_Hulda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}nb-NO_Hulda_11.0/MSTTSLocnbNO.dat"
#
((i=i+1))
aExecChoice[$i]="Polski"
aDownldInst[$i]="${MS_VOICE}pl-PL_Paulina.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pl-PL_Paulina_11.0/MSTTSLocplPL.dat"
#
((i=i+1))
aExecChoice[$i]="Portugês-Portugal"
aDownldInst[$i]="${MS_VOICE}pt-PT_Helia.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pt-PT_Helia_11.0/MSTTSLocptPT.dat"
#
((i=i+1))
aExecChoice[$i]="Portugês-Brasil"
aDownldInst[$i]="${MS_VOICE}pt-BR_Heloisa.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pt-BR_Heloisa_11.0/MSTTSLocptBR.dat"
#
((i=i+1))
aExecChoice[$i]="Russian"
aDownldInst[$i]="${MS_VOICE}ru-RU_Elena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ru-RU_Elena_11.0/MSTTSLocruRU.dat"
#
((i=i+1))
aExecChoice[$i]="Swedish"
aDownldInst[$i]="${MS_VOICE}sv-SE_Hedvig.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}sv-SE_Hedvig_11.0/MSTTSLocsvSE.dat"
#
# ===================
# USER CHOICE: select languages to be installed
typeset -i j=2 max=${#aExecChoice[*]} # start at 3rd entry, after Balboka, MS Runtime
SEPERATOR="~"
CHOICE=""
while (( j < max ))
do
   [ -z "${CHOICE}" ] && CHOICE="${aExecChoice[j]}" || CHOICE="${CHOICE}${SEPERATOR}${aExecChoice[$j]}"
   j=j+1
done

POL_Debug_Message "# CHOICE : ${CHOICE} #"

MSG="Please select components to install"
POL_SetupWindow_checkbox_list "$(eval_gettext '$MSG')" "$TITLE" "$CHOICE" "$SEPERATOR"
POL_Debug_Message "# APP_ANSWER : >$APP_ANSWER<"
if [ -z "$APP_ANSWER" ];then
        MSG="No language component has been selected.\nDo you want to overwrite an existing Installation ("${aPrgDisplay[0]}", "${aPrgDisplay[1]}")?"
        POL_SetupWindow_question "$(eval_gettext '$MSG')" "$TITLE"
        if [ ! "$APP_ANSWER" = "TRUE" ];then
                 cd $PWD_OLD 
                 POL_SetupWindow_Close 
                 exit 0
        fi
fi
j=2
while (( j < max ))
do
   [ "$(echo $APP_ANSWER | grep -o "${aExecChoice[$j]}")" != "" ] && aExecChoice[$j]="OK" || aExecChoice[$j]=""
   j=j+1
done
aExecChoice[0]="OK" # we always need main program
aExecChoice[1]="OK" # we always need MS Speech Runtime
# ===================
# USER CHOICE: LOCAL,DOWNLOAD
POL_SetupWindow_InstallMethod "LOCAL,DOWNLOAD"
POL_Debug_Message "# INSTALL_METHOD : >$INSTALL_METHOD<"
[ "$INSTALL_METHOD" = "False" ] && cd $PWD_OLD && POL_SetupWindow_Close && exit 0
# ---------------------
# install component
i=0
while (( i < max ))
do
   get_unpack_install \
           "${aExecChoice[$i]}" \
           "${aDownldInst[$i]}" \
           "${aPrgDisplay[$i]}" \
           "${aPathVerify[$i]}" \
           "$INSTALL_METHOD"
   RET_VAL="$?"
   POL_Debug_Message \
           "# get_unpack_install ($i, ${aPrgDisplay[$i]}) returned $RET_VAL" 
   [ ! "$RET_VAL" -eq 0 ] && exit -1
   [ "$i" = 0 ] && create_POL_shortcut
   i=i+1
done
######################
# Close POL
cd $PWD_OLD
POL_System_TmpDelete
POL_SetupWindow_Close
exit

Svar

Thursday 25 March 2021 at 15:21
Script approved.

Ändrat av VolkerFroehlich

VolkerFroehlich Monday 8 February 2021 at 23:50
VolkerFroehlich Anonymous

Warning

This update has not been approved yet by the team.
Use it at your own risk

Meddelanden

The above post did not allow me to enter the source code. So I add it here.

Balabolka is able to save any text as a WAV file - very cool. Í have in vain searched on Linux for anything comparable.

In addtion to the Balabolka main program we install the Microsoft Speech Runtime and the Speaker(s) for the language(s) of your choice.

You can select installation files either locally on your computer or else automatically download all set-up files from the web.

In order to improve readability I have grouped some part of the code in functions.

Have Fun!
Volker Fröhlich

Differences

@@ -0,0 +1,450 @@
+#!/usr/bin/env playonlinux-bash
+[ "$PLAYONLINUX" = "" ] && exit 0
+source "$PLAYONLINUX/lib/sources"
+######################
+# created So 14. Feb 16:14:27 CET 2021
+######################
+# global parameters
+TITLE="Balabolka"
+PREFIX="balabolka"
+AUTHOR="Volker Fröhlich"
+EDITOR="Ilya Morozov"
+EDITOR_URL="http://balabolka.site/balabolka.htm"
+FILE="balabolka.zip"
+MD5=""
+DOWNLOAD_PATH="http://www.cross-plus-a.com"
+######################
+# FUNCTIONS
+# ==============================================================
+get_unpack_install()
+# --------------------------------------------------------------
+# select/download <installer file>
+# if file extension is .zip unpack and use installer "setup.exe"
+# run <installer>
+# --------------------------------------------------------------
+# input parameters
+# 1: EXEC_SCRIPT - "OK" execute script, else return 
+# 2: PATH_DOWNLD - installer download path (.zip, .exe or .msi)
+# 3: PRG_DISPLAY - display name for user interaction
+# 4: PATH_VERIFY - path to a component confirming installation success if found
+# 5: INST_METHOD - LOCAL, DOWNLOAD
+# ==============================================================
+{
+# -------------------------------
+# validate input parameters
+POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
+POL_Debug_Message "# PREFIX: $PREFIX"
+POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
+cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
+EXEC_SCRIPT="$1"
+PATH_DOWNLD="$2"
+PRG_DISPLAY="$3"
+PATH_VERIFY="$4"
+INST_METHOD="$5"
+POL_Debug_Message "# EXEC_SCRIPT=$EXEC_SCRIPT"
+POL_Debug_Message "# PATH_DOWNLD=$PATH_DOWNLD"
+POL_Debug_Message "# PRG_DISPLAY=$PRG_DISPLAY"
+POL_Debug_Message "# PATH_VERIFY=$PATH_VERIFY"
+POL_Debug_Message "# INST_METHOD=$INST_METHOD"
+[[ -z "$EXEC_SCRIPT" || ! "$EXEC_SCRIPT" = "OK" ]] && POL_Debug_Message "# skipping install ($PRG_DISPLAY)!" && return 0
+[ -z "$PATH_DOWNLD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_DOWNLD empty" && return -1
+[ -z "$PRG_DISPLAY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PRG_DISPLAY empty" && return -1
+[ -z "$PATH_VERIFY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_VERIFY empty" && return -1
+[ -z "$INST_METHOD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() INST_METHOD empty" && return -1
+# -------------------------------
+# if already installed ask user 
+[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
+LOCAL_TITLE="$TITLE ($PRG_DISPLAY)"
+if [ "$ALREADY_INSTALLED" = 1 ];then
+	POL_Debug_Message "# already installed: >$PATH_VERIFY<"
+	MSG="This component is already installed - overwrite?"
+	POL_SetupWindow_question "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
+	[ ! "$APP_ANSWER" = "TRUE" ] && return 0
+fi
+# -------------------------------
+# select/download <installer>
+DOWNLOAD_FULLPATH="$PATH_DOWNLD"
+if [ "$INST_METHOD" = "LOCAL" ]; then
+	#---------------------
+	# user selects installer
+	POL_SetupWindow_browse \
+		"$(eval_gettext 'Please select the setup file for $LOCAL_TITLE.')" \
+		"$TITLE"
+	INSTALLER="$APP_ANSWER"
+elif [ "$INST_METHOD" = "DOWNLOAD" ]; then
+	#---------------------
+	# download installer
+	INSTALLER=""
+	DOWNLOAD_FULLPATH="$PATH_DOWNLD"
+	POL_Debug_Message "# download installer"
+	DOWNLOAD_LINK=$DOWNLOAD_FULLPATH
+	DOWNLOAD_FILE=$(basename "$DOWNLOAD_FULLPATH")
+	POL_Debug_Message "# DOWNLOAD_LINK=$DOWNLOAD_LINK"
+	POL_Debug_Message "# MD5=$MD5"
+	POL_Download "$DOWNLOAD_LINK" "$MD5"
+	INSTALLER="$POL_System_TmpDir/$DOWNLOAD_FILE"
+fi
+if [[ -z "$INSTALLER" || ! -f "$INSTALLER" ]];then 
+	MSG="ERROR: cannot locate installer >$INSTALLER< for $LOCAL_TITLE."
+	POL_Debug_Message "# $MSG"
+	POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
+fi
+# -------------------------------
+# unpack <installer>.zip
+FIL_NAM=$(basename "$INSTALLER")
+FIL_EXT="${FIL_NAM##*.}"
+if [ "$FIL_EXT" = "zip" ];then
+	INSTALLER_ZIP="$INSTALLER"
+	POL_Debug_Message "# Extracting the archive... >$INSTALLER_ZIP<"
+	MSG="Extracting the archive..."
+	POL_SetupWindow_wait_next_signal "$(eval_gettext '$MSG')" "$TITLE"
+	POL_System_unzip "$INSTALLER_ZIP" -d "$POL_System_TmpDir"
+	INSTALLER="$POL_System_TmpDir/setup.exe"
+	if [ ! -f "$INSTALLER" ];then 
+		MSG="ERROR: cannot locate unzipped installer >$INSTALLER<"
+		POL_Debug_Message "# $MSG"
+		POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
+	fi
+fi
+if [ ! -f "$INSTALLER" ];then 
+	MSG="ERROR: cannot locate selected/downloaded installer >$INSTALLER<"
+	POL_Debug_Message "# $MSG"
+	POL_SetupWindow_message "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
+	POL_Debug_Fatal "# $MSG"
+	return -1
+fi
+# -------------------
+# Run Wine installation
+FIL_NAM=$(basename "$INSTALLER")
+FIL_EXT="${FIL_NAM##*.}"
+if [ -f "$INSTALLER" ]; then
+	MSG="Installation in progress ($FIL_NAM)."
+	POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
+	POL_Wine_WaitBefore "$LOCAL_TITLE"
+	if [ "$FIL_EXT" = "msi" ];then 
+		POL_Wine msiexec /i "$INSTALLER"
+	else
+		POL_Wine "$INSTALLER"
+	fi
+	POL_Wine_WaitExit "$LOCAL_TITLE"
+fi
+# ---------------------
+# confirm installation exists
+[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
+if [ "$PATH_VERIFY" = "TBD" ];then
+	ALREADY_INSTALLED=1
+	MSG="ACHTUNG: PATH_VERIFY ist TBD, muss noch ermittelt werden."
+	POL_Debug_Message "# $MSG"
+fi
+
+if [ "$ALREADY_INSTALLED" = 0 ];then
+	MSG="ERROR: cannot verify installed component >$PATH_VERIFY<"
+	POL_Debug_Message "# $MSG"
+	POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
+	POL_SetupWindow_Close
+	return -1
+fi
+return 0
+}
+# ==============================================================
+create_POL_shortcut()
+# --------------------------------------------------------------
+# 1. get installed Balabolka version
+# 2. remove previous desktop starter
+# 3. remove previous POL shortcut
+# 4. add shortcut with version info
+# ==============================================================
+{
+# -------------------
+POL_Debug_Message "# get installed Balabolka version"
+VERSION_INSTALLED=""
+POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
+VERSION_FILE="$WINEPREFIX/system.reg"
+POL_Debug_Message "# VERSION_FILE=$VERSION_FILE"
+[ ! -f "$VERSION_FILE" ] && POL_Debug_Message "file not found $VERSION_FILE"
+[ -f "$VERSION_FILE" ] && VERSION_INSTALLED=`grep -A 1 '"DisplayName"="Balabolka"' $VERSION_FILE | grep '"DisplayVersion"' | cut -d '"' -f 4`
+POL_Debug_Message "# VERSION_INSTALLED: $VERSION_INSTALLED"
+LAUNCHER="$TITLE"
+[ ! -z "$VERSION_INSTALLED" ] && LAUNCHER="$TITLE-v$VERSION_INSTALLED"
+POL_Debug_Message "# LAUNCHER: $LAUNCHER"
+# -------------------
+PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$LAUNCHER"
+if [ ! -f "$PATH_SHORTCUT" ];then
+	# -------------------
+	POL_Debug_Message "# remove previous desktop starter"
+	LINUX_DESKTOP=/home/benutzer1/Schreibtisch
+	PATH_SHORTCUT="$LINUX_DESKTOP/Balabolka"
+	rm -r "$PATH_SHORTCUT"* 2>/dev/null;
+	# -------------------
+	POL_Debug_Message "# remove previous POL shortcut"
+	PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$TITLE"
+	rm -r "$PATH_SHORTCUT"* 2>/dev/null;
+	# -------------------
+	POL_Debug_Message "# create POL shortcut"
+	POL_Shortcut "balabolka.exe" "$LAUNCHER" "" "" "AudioVideo;Audio;AudioVideoEditing;Music;"
+fi
+[ -f "$PATH_SHORTCUT" ] && MSG="$LAUNCHER installation ok" && POL_Debug_Message "# $MSG"
+return 0
+}
+######################
+# MAIN
+IMAGE_TOP="http://balabolka.site/data/balabolka_japan.jpg"
+IMAGE_LEFT="https://cdn.lo4d.com/t/icon/128/balabolka.png"
+POL_GetSetupImages --force  "$IMAGE_TOP" "$IMAGE_LEFT" "$TITLE"
+POL_SetupWindow_Init
+POL_Debug_Init
+POL_Debug_Message "# show POL Window"
+POL_SetupWindow_presentation "$TITLE" "$EDITOR" "$EDITOR_URL" "$AUTHOR" "$PREFIX"
+# ---------------------
+POL_Debug_Message "# create PREFIX environment"
+POL_Wine_SelectPrefix "$PREFIX"
+POL_System_SetArch "x86"
+POL_Wine_PrefixCreate
+Set_OS "win7"
+POL_System_TmpCreate "$PREFIX"
+PWD_OLD=`pwd`
+cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
+POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
+POL_Debug_Message "# PREFIX: $PREFIX"
+POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
+POL_Debug_Message "# POL_HOME : $POL_HOME"
+POL_Debug_Message "# POL_USER_HOME: $POL_USER_HOME"
+# ===================
+POL_Debug_Message "# fill arrays"
+# Balabolka, MS Speech Runtime & LANGS
+# Download of Microsoft installer is available
+MSSPEECH="http://www.cross-plus-a.com/msspeech"
+MS_VOICE="$MSSPEECH/MSSpeech_TTS_"
+PATH_SPEECH_BASE="$WINEPREFIX/drive_c/Program Files/Common Files/Microsoft Shared/Speech/"
+PATH_SPEAKER="$PATH_SPEECH_BASE/Tokens/TTS_MS_"
+#
+typeset -i i=0 
+aExecChoice[$i]="Balabolka-Program"
+aDownldInst[$i]="http://www.cross-plus-a.com/balabolka.zip"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="$WINEPREFIX/drive_c/Program Files/Balabolka/balabolka.exe"
+#
+((i=i+1))
+aExecChoice[$i]="MS Speech Platform Runtime"
+aDownldInst[$i]="$MSSPEECH/SpeechPlatformRuntime.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="$PATH_SPEECH_BASE/Platform/v11.0/mssps.dll"
+#
+((i=i+1))
+aExecChoice[$i]="Catalán"
+aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Chinese-China"
+aDownldInst[$i]="${MS_VOICE}zh-CN_HuiHui.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}zh-CN_HuiHui_11.0/MSTTSLoczhCN.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Chinese-HongKong"
+aDownldInst[$i]="${MS_VOICE}zh-HK_HunYee.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}zh-HK_HunYee_11.0/MSTTSLoczhHK.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Chinese-Taiwan"
+aDownldInst[$i]="${MS_VOICE}zh-TW_HanHan.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}zh-TW_HanHan_11.0/MSTTSLoczhTW.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Danish"
+aDownldInst[$i]="${MS_VOICE}da-DK_Helle.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}da-DK_Helle_11.0/MSTTSLocdaDK.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Deutsche Sprache"
+aDownldInst[$i]="${MS_VOICE}de-DE_Hedda.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}de-DE_Hedda_11.0/MSTTSLocdeDE.dat"
+#
+((i=i+1))
+aExecChoice[$i]="English-Australia"
+aDownldInst[$i]="${MS_VOICE}en-AU_Hayley.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}en-AU_Hayley_11.0/MSTTSLocenAU.dat"
+#
+((i=i+1))
+aExecChoice[$i]="English-India"
+aDownldInst[$i]="${MS_VOICE}en-IN_Heera.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}en-IN_Heera_11.0/MSTTSLocenIN.dat"
+#
+((i=i+1))
+aExecChoice[$i]="English-UK"
+aDownldInst[$i]="${MS_VOICE}en-GB_Hazel.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}en-GB_Hazel_11.0/MSTTSLocenGB.dat"
+#
+((i=i+1))
+aExecChoice[$i]="English-US"
+aDownldInst[$i]="${MS_VOICE}en-US_Helen.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}en-US_Helen_11.0/MSTTSLocenUS.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Español-Canadá"
+aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Español-España"
+aDownldInst[$i]="${MS_VOICE}es-ES_Helena.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}es-ES_Helena_11.0/MSTTSLocesES.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Español-Mexico"
+aDownldInst[$i]="${MS_VOICE}es-MX_Hilda.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}es-MX_Hilda_11.0/MSTTSLocesMX.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Finnish"
+aDownldInst[$i]="${MS_VOICE}fi-FI_Heidi.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}fi-FI_Heidi_11.0/MSTTSLocfiFI.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Français-Canada"
+aDownldInst[$i]="${MS_VOICE}fr-CA_Harmonie.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}fr-CA_Harmonie_11.0/MSTTSLocfrCA.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Français-France"
+aDownldInst[$i]="${MS_VOICE}fr-FR_Hortense.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}fr-FR_Hortense_11.0/MSTTSLocfrFR.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Italiano"
+aDownldInst[$i]="${MS_VOICE}it-IT_Lucia.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}it-IT_Lucia_11.0/MSTTSLocitIT.dat"
+#
+((i=i+1))
+aExecChoice[$i]="???? (Japanese)"
+aDownldInst[$i]="${MS_VOICE}ja-JP_Haruka.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}ja-JP_Haruka_11.0/MSTTSLocjaJP.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Korean"
+aDownldInst[$i]="${MS_VOICE}ko-KR_Heami.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}ko-KR_Heami_11.0/MSTTSLockoKR.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Nederlands"
+aDownldInst[$i]="${MS_VOICE}nl-NL_Hanna.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}nl-NL_Hanna_11.0/MSTTSLocnlNL.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Norwegian"
+aDownldInst[$i]="${MS_VOICE}nb-NO_Hulda.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}nb-NO_Hulda_11.0/MSTTSLocnbNO.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Polski"
+aDownldInst[$i]="${MS_VOICE}pl-PL_Paulina.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}pl-PL_Paulina_11.0/MSTTSLocplPL.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Portugês-Portugal"
+aDownldInst[$i]="${MS_VOICE}pt-PT_Helia.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}pt-PT_Helia_11.0/MSTTSLocptPT.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Portugês-Brasil"
+aDownldInst[$i]="${MS_VOICE}pt-BR_Heloisa.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}pt-BR_Heloisa_11.0/MSTTSLocptBR.dat"
+#
+((i=i+1))
+aExecChoice[$i]="???????????"
+aDownldInst[$i]="${MS_VOICE}ru-RU_Elena.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}ru-RU_Elena_11.0/MSTTSLocruRU.dat"
+#
+((i=i+1))
+aExecChoice[$i]="Swedish"
+aDownldInst[$i]="${MS_VOICE}sv-SE_Hedvig.msi"
+aPrgDisplay[$i]=${aExecChoice[$i]}
+aPathVerify[$i]="${PATH_SPEAKER}sv-SE_Hedvig_11.0/MSTTSLocsvSE.dat"
+#
+# ===================
+# USER CHOICE: select languages to be installed
+typeset -i j=2 max=${#aExecChoice[*]} # start at 3rd entry, after Balboka, MS Runtime
+SEPERATOR="~"
+CHOICE=""
+while (( j < max ))
+do
+   [ -z "${CHOICE}" ] && CHOICE="${aExecChoice[j]}" || CHOICE="${CHOICE}${SEPERATOR}${aExecChoice[$j]}"
+   j=j+1
+done
+
+POL_Debug_Message "# CHOICE : ${CHOICE} #"
+
+MSG="Please select components to install"
+POL_SetupWindow_checkbox_list "$(eval_gettext '$MSG')" "$TITLE" "$CHOICE" "$SEPERATOR"
+POL_Debug_Message "# APP_ANSWER : >$APP_ANSWER<"
+if [ -z "$APP_ANSWER" ];then
+	MSG="No language component has been selected.\nDo you want to overwrite an existing Installation ("${aPrgDisplay[0]}", "${aPrgDisplay[1]}")?"
+	POL_SetupWindow_question "$(eval_gettext '$MSG')" "$TITLE"
+	if [ ! "$APP_ANSWER" = "TRUE" ];then
+	 	cd $PWD_OLD 
+	 	POL_SetupWindow_Close 
+	 	exit 0
+	fi
+fi
+j=2
+while (( j < max ))
+do
+   [ "$(echo $APP_ANSWER | grep -o "${aExecChoice[$j]}")" != "" ] && aExecChoice[$j]="OK" || aExecChoice[$j]=""
+   j=j+1
+done
+aExecChoice[0]="OK" # we always need main program
+aExecChoice[1]="OK" # we always need MS Speech Runtime
+# ===================
+# USER CHOICE: LOCAL,DOWNLOAD
+POL_SetupWindow_InstallMethod "LOCAL,DOWNLOAD"
+POL_Debug_Message "# INSTALL_METHOD : >$INSTALL_METHOD<"
+[ "$INSTALL_METHOD" = "False" ] && cd $PWD_OLD && POL_SetupWindow_Close && exit 0
+# ---------------------
+# install component
+i=0
+while (( i < max ))
+do
+   get_unpack_install \
+   	"${aExecChoice[$i]}" \
+   	"${aDownldInst[$i]}" \
+   	"${aPrgDisplay[$i]}" \
+   	"${aPathVerify[$i]}" \
+   	"$INSTALL_METHOD"
+   RET_VAL="$?"
+   POL_Debug_Message \
+   	"# get_unpack_install ($i, ${aPrgDisplay[$i]}) returned $RET_VAL" 
+   [ ! "$RET_VAL" -eq 0 ] && exit -1
+   [ "$i" = 0 ] && create_POL_shortcut
+   i=i+1
+done
+######################
+# Close POL
+cd $PWD_OLD
+POL_System_TmpDelete
+POL_SetupWindow_Close
+exit
\ No newline at end of file

New source code

#!/usr/bin/env playonlinux-bash
[ "$PLAYONLINUX" = "" ] && exit 0
source "$PLAYONLINUX/lib/sources"
######################
# created So 14. Feb 16:14:27 CET 2021
######################
# global parameters
TITLE="Balabolka"
PREFIX="balabolka"
AUTHOR="Volker Fröhlich"
EDITOR="Ilya Morozov"
EDITOR_URL="http://balabolka.site/balabolka.htm"
FILE="balabolka.zip"
MD5=""
DOWNLOAD_PATH="http://www.cross-plus-a.com"
######################
# FUNCTIONS
# ==============================================================
get_unpack_install()
# --------------------------------------------------------------
# select/download <installer file>
# if file extension is .zip unpack and use installer "setup.exe"
# run <installer>
# --------------------------------------------------------------
# input parameters
# 1: EXEC_SCRIPT - "OK" execute script, else return 
# 2: PATH_DOWNLD - installer download path (.zip, .exe or .msi)
# 3: PRG_DISPLAY - display name for user interaction
# 4: PATH_VERIFY - path to a component confirming installation success if found
# 5: INST_METHOD - LOCAL, DOWNLOAD
# ==============================================================
{
# -------------------------------
# validate input parameters
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
POL_Debug_Message "# PREFIX: $PREFIX"
POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
EXEC_SCRIPT="$1"
PATH_DOWNLD="$2"
PRG_DISPLAY="$3"
PATH_VERIFY="$4"
INST_METHOD="$5"
POL_Debug_Message "# EXEC_SCRIPT=$EXEC_SCRIPT"
POL_Debug_Message "# PATH_DOWNLD=$PATH_DOWNLD"
POL_Debug_Message "# PRG_DISPLAY=$PRG_DISPLAY"
POL_Debug_Message "# PATH_VERIFY=$PATH_VERIFY"
POL_Debug_Message "# INST_METHOD=$INST_METHOD"
[[ -z "$EXEC_SCRIPT" || ! "$EXEC_SCRIPT" = "OK" ]] && POL_Debug_Message "# skipping install ($PRG_DISPLAY)!" && return 0
[ -z "$PATH_DOWNLD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_DOWNLD empty" && return -1
[ -z "$PRG_DISPLAY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PRG_DISPLAY empty" && return -1
[ -z "$PATH_VERIFY" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() PATH_VERIFY empty" && return -1
[ -z "$INST_METHOD" ] && POL_Debug_Fatal "# ERROR: get_unpack_install() INST_METHOD empty" && return -1
# -------------------------------
# if already installed ask user 
[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
LOCAL_TITLE="$TITLE ($PRG_DISPLAY)"
if [ "$ALREADY_INSTALLED" = 1 ];then
        POL_Debug_Message "# already installed: >$PATH_VERIFY<"
        MSG="This component is already installed - overwrite?"
        POL_SetupWindow_question "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
        [ ! "$APP_ANSWER" = "TRUE" ] && return 0
fi
# -------------------------------
# select/download <installer>
DOWNLOAD_FULLPATH="$PATH_DOWNLD"
if [ "$INST_METHOD" = "LOCAL" ]; then
        #---------------------
        # user selects installer
        POL_SetupWindow_browse \
                "$(eval_gettext 'Please select the setup file for $LOCAL_TITLE.')" \
                "$TITLE"
        INSTALLER="$APP_ANSWER"
elif [ "$INST_METHOD" = "DOWNLOAD" ]; then
        #---------------------
        # download installer
        INSTALLER=""
        DOWNLOAD_FULLPATH="$PATH_DOWNLD"
        POL_Debug_Message "# download installer"
        DOWNLOAD_LINK=$DOWNLOAD_FULLPATH
        DOWNLOAD_FILE=$(basename "$DOWNLOAD_FULLPATH")
        POL_Debug_Message "# DOWNLOAD_LINK=$DOWNLOAD_LINK"
        POL_Debug_Message "# MD5=$MD5"
        POL_Download "$DOWNLOAD_LINK" "$MD5"
        INSTALLER="$POL_System_TmpDir/$DOWNLOAD_FILE"
fi
if [[ -z "$INSTALLER" || ! -f "$INSTALLER" ]];then 
        MSG="ERROR: cannot locate installer >$INSTALLER< for $LOCAL_TITLE."
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
fi
# -------------------------------
# unpack <installer>.zip
FIL_NAM=$(basename "$INSTALLER")
FIL_EXT="${FIL_NAM##*.}"
if [ "$FIL_EXT" = "zip" ];then
        INSTALLER_ZIP="$INSTALLER"
        POL_Debug_Message "# Extracting the archive... >$INSTALLER_ZIP<"
        MSG="Extracting the archive..."
        POL_SetupWindow_wait_next_signal "$(eval_gettext '$MSG')" "$TITLE"
        POL_System_unzip "$INSTALLER_ZIP" -d "$POL_System_TmpDir"
        INSTALLER="$POL_System_TmpDir/setup.exe"
        if [ ! -f "$INSTALLER" ];then 
                MSG="ERROR: cannot locate unzipped installer >$INSTALLER<"
                POL_Debug_Message "# $MSG"
                POL_SetupWindow_message "$(eval_gettext '$MSG')" "$TITLE"
        fi
fi
if [ ! -f "$INSTALLER" ];then 
        MSG="ERROR: cannot locate selected/downloaded installer >$INSTALLER<"
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_message "$(eval_gettext '$MSG')" "$LOCAL_TITLE"
        POL_Debug_Fatal "# $MSG"
        return -1
fi
# -------------------
# Run Wine installation
FIL_NAM=$(basename "$INSTALLER")
FIL_EXT="${FIL_NAM##*.}"
if [ -f "$INSTALLER" ]; then
        MSG="Installation in progress ($FIL_NAM)."
        POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
        POL_Wine_WaitBefore "$LOCAL_TITLE"
        if [ "$FIL_EXT" = "msi" ];then 
                POL_Wine msiexec /i "$INSTALLER"
        else
                POL_Wine "$INSTALLER"
        fi
        POL_Wine_WaitExit "$LOCAL_TITLE"
fi
# ---------------------
# confirm installation exists
[ -f "$PATH_VERIFY" ] && ALREADY_INSTALLED=1 || ALREADY_INSTALLED=0
if [ "$PATH_VERIFY" = "TBD" ];then
        ALREADY_INSTALLED=1
        MSG="ACHTUNG: PATH_VERIFY ist TBD, muss noch ermittelt werden."
        POL_Debug_Message "# $MSG"
fi

if [ "$ALREADY_INSTALLED" = 0 ];then
        MSG="ERROR: cannot verify installed component >$PATH_VERIFY<"
        POL_Debug_Message "# $MSG"
        POL_SetupWindow_wait "$(eval_gettext '$MSG')" "$TITLE"
        POL_SetupWindow_Close
        return -1
fi
return 0
}
# ==============================================================
create_POL_shortcut()
# --------------------------------------------------------------
# 1. get installed Balabolka version
# 2. remove previous desktop starter
# 3. remove previous POL shortcut
# 4. add shortcut with version info
# ==============================================================
{
# -------------------
POL_Debug_Message "# get installed Balabolka version"
VERSION_INSTALLED=""
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
VERSION_FILE="$WINEPREFIX/system.reg"
POL_Debug_Message "# VERSION_FILE=$VERSION_FILE"
[ ! -f "$VERSION_FILE" ] && POL_Debug_Message "file not found $VERSION_FILE"
[ -f "$VERSION_FILE" ] && VERSION_INSTALLED=`grep -A 1 '"DisplayName"="Balabolka"' $VERSION_FILE | grep '"DisplayVersion"' | cut -d '"' -f 4`
POL_Debug_Message "# VERSION_INSTALLED: $VERSION_INSTALLED"
LAUNCHER="$TITLE"
[ ! -z "$VERSION_INSTALLED" ] && LAUNCHER="$TITLE-v$VERSION_INSTALLED"
POL_Debug_Message "# LAUNCHER: $LAUNCHER"
# -------------------
PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$LAUNCHER"
if [ ! -f "$PATH_SHORTCUT" ];then
        # -------------------
        POL_Debug_Message "# remove previous desktop starter"
        LINUX_DESKTOP=/home/benutzer1/Schreibtisch
        PATH_SHORTCUT="$LINUX_DESKTOP/Balabolka"
        rm -r "$PATH_SHORTCUT"* 2>/dev/null;
        # -------------------
        POL_Debug_Message "# remove previous POL shortcut"
        PATH_SHORTCUT="$POL_USER_ROOT/shortcuts/$TITLE"
        rm -r "$PATH_SHORTCUT"* 2>/dev/null;
        # -------------------
        POL_Debug_Message "# create POL shortcut"
        POL_Shortcut "balabolka.exe" "$LAUNCHER" "" "" "AudioVideo;Audio;AudioVideoEditing;Music;"
fi
[ -f "$PATH_SHORTCUT" ] && MSG="$LAUNCHER installation ok" && POL_Debug_Message "# $MSG"
return 0
}
######################
# MAIN
IMAGE_TOP="http://balabolka.site/data/balabolka_japan.jpg"
IMAGE_LEFT="https://cdn.lo4d.com/t/icon/128/balabolka.png"
POL_GetSetupImages --force  "$IMAGE_TOP" "$IMAGE_LEFT" "$TITLE"
POL_SetupWindow_Init
POL_Debug_Init
POL_Debug_Message "# show POL Window"
POL_SetupWindow_presentation "$TITLE" "$EDITOR" "$EDITOR_URL" "$AUTHOR" "$PREFIX"
# ---------------------
POL_Debug_Message "# create PREFIX environment"
POL_Wine_SelectPrefix "$PREFIX"
POL_System_SetArch "x86"
POL_Wine_PrefixCreate
Set_OS "win7"
POL_System_TmpCreate "$PREFIX"
PWD_OLD=`pwd`
cd "$POL_System_TmpDir" || POL_Debug_Fatal "Unable to change directory"
POL_Debug_Message "# WINEPREFIX: $WINEPREFIX"
POL_Debug_Message "# PREFIX: $PREFIX"
POL_Debug_Message "# POL_System_TmpDir: $POL_System_TmpDir"
POL_Debug_Message "# POL_HOME : $POL_HOME"
POL_Debug_Message "# POL_USER_HOME: $POL_USER_HOME"
# ===================
POL_Debug_Message "# fill arrays"
# Balabolka, MS Speech Runtime & LANGS
# Download of Microsoft installer is available
MSSPEECH="http://www.cross-plus-a.com/msspeech"
MS_VOICE="$MSSPEECH/MSSpeech_TTS_"
PATH_SPEECH_BASE="$WINEPREFIX/drive_c/Program Files/Common Files/Microsoft Shared/Speech/"
PATH_SPEAKER="$PATH_SPEECH_BASE/Tokens/TTS_MS_"
#
typeset -i i=0 
aExecChoice[$i]="Balabolka-Program"
aDownldInst[$i]="http://www.cross-plus-a.com/balabolka.zip"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="$WINEPREFIX/drive_c/Program Files/Balabolka/balabolka.exe"
#
((i=i+1))
aExecChoice[$i]="MS Speech Platform Runtime"
aDownldInst[$i]="$MSSPEECH/SpeechPlatformRuntime.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="$PATH_SPEECH_BASE/Platform/v11.0/mssps.dll"
#
((i=i+1))
aExecChoice[$i]="Catalán"
aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-China"
aDownldInst[$i]="${MS_VOICE}zh-CN_HuiHui.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-CN_HuiHui_11.0/MSTTSLoczhCN.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-HongKong"
aDownldInst[$i]="${MS_VOICE}zh-HK_HunYee.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-HK_HunYee_11.0/MSTTSLoczhHK.dat"
#
((i=i+1))
aExecChoice[$i]="Chinese-Taiwan"
aDownldInst[$i]="${MS_VOICE}zh-TW_HanHan.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}zh-TW_HanHan_11.0/MSTTSLoczhTW.dat"
#
((i=i+1))
aExecChoice[$i]="Danish"
aDownldInst[$i]="${MS_VOICE}da-DK_Helle.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}da-DK_Helle_11.0/MSTTSLocdaDK.dat"
#
((i=i+1))
aExecChoice[$i]="Deutsche Sprache"
aDownldInst[$i]="${MS_VOICE}de-DE_Hedda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}de-DE_Hedda_11.0/MSTTSLocdeDE.dat"
#
((i=i+1))
aExecChoice[$i]="English-Australia"
aDownldInst[$i]="${MS_VOICE}en-AU_Hayley.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-AU_Hayley_11.0/MSTTSLocenAU.dat"
#
((i=i+1))
aExecChoice[$i]="English-India"
aDownldInst[$i]="${MS_VOICE}en-IN_Heera.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-IN_Heera_11.0/MSTTSLocenIN.dat"
#
((i=i+1))
aExecChoice[$i]="English-UK"
aDownldInst[$i]="${MS_VOICE}en-GB_Hazel.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-GB_Hazel_11.0/MSTTSLocenGB.dat"
#
((i=i+1))
aExecChoice[$i]="English-US"
aDownldInst[$i]="${MS_VOICE}en-US_Helen.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}en-US_Helen_11.0/MSTTSLocenUS.dat"
#
((i=i+1))
aExecChoice[$i]="Español-Canadá"
aDownldInst[$i]="${MS_VOICE}ca-ES_Herena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ca-ES_Herena_11.0/MSTTSLoccaES.dat"
#
((i=i+1))
aExecChoice[$i]="Español-España"
aDownldInst[$i]="${MS_VOICE}es-ES_Helena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}es-ES_Helena_11.0/MSTTSLocesES.dat"
#
((i=i+1))
aExecChoice[$i]="Español-Mexico"
aDownldInst[$i]="${MS_VOICE}es-MX_Hilda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}es-MX_Hilda_11.0/MSTTSLocesMX.dat"
#
((i=i+1))
aExecChoice[$i]="Finnish"
aDownldInst[$i]="${MS_VOICE}fi-FI_Heidi.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fi-FI_Heidi_11.0/MSTTSLocfiFI.dat"
#
((i=i+1))
aExecChoice[$i]="Français-Canada"
aDownldInst[$i]="${MS_VOICE}fr-CA_Harmonie.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fr-CA_Harmonie_11.0/MSTTSLocfrCA.dat"
#
((i=i+1))
aExecChoice[$i]="Français-France"
aDownldInst[$i]="${MS_VOICE}fr-FR_Hortense.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}fr-FR_Hortense_11.0/MSTTSLocfrFR.dat"
#
((i=i+1))
aExecChoice[$i]="Italiano"
aDownldInst[$i]="${MS_VOICE}it-IT_Lucia.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}it-IT_Lucia_11.0/MSTTSLocitIT.dat"
#
((i=i+1))
aExecChoice[$i]="???? (Japanese)"
aDownldInst[$i]="${MS_VOICE}ja-JP_Haruka.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ja-JP_Haruka_11.0/MSTTSLocjaJP.dat"
#
((i=i+1))
aExecChoice[$i]="Korean"
aDownldInst[$i]="${MS_VOICE}ko-KR_Heami.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ko-KR_Heami_11.0/MSTTSLockoKR.dat"
#
((i=i+1))
aExecChoice[$i]="Nederlands"
aDownldInst[$i]="${MS_VOICE}nl-NL_Hanna.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}nl-NL_Hanna_11.0/MSTTSLocnlNL.dat"
#
((i=i+1))
aExecChoice[$i]="Norwegian"
aDownldInst[$i]="${MS_VOICE}nb-NO_Hulda.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}nb-NO_Hulda_11.0/MSTTSLocnbNO.dat"
#
((i=i+1))
aExecChoice[$i]="Polski"
aDownldInst[$i]="${MS_VOICE}pl-PL_Paulina.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pl-PL_Paulina_11.0/MSTTSLocplPL.dat"
#
((i=i+1))
aExecChoice[$i]="Portugês-Portugal"
aDownldInst[$i]="${MS_VOICE}pt-PT_Helia.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pt-PT_Helia_11.0/MSTTSLocptPT.dat"
#
((i=i+1))
aExecChoice[$i]="Portugês-Brasil"
aDownldInst[$i]="${MS_VOICE}pt-BR_Heloisa.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}pt-BR_Heloisa_11.0/MSTTSLocptBR.dat"
#
((i=i+1))
aExecChoice[$i]="???????????"
aDownldInst[$i]="${MS_VOICE}ru-RU_Elena.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}ru-RU_Elena_11.0/MSTTSLocruRU.dat"
#
((i=i+1))
aExecChoice[$i]="Swedish"
aDownldInst[$i]="${MS_VOICE}sv-SE_Hedvig.msi"
aPrgDisplay[$i]=${aExecChoice[$i]}
aPathVerify[$i]="${PATH_SPEAKER}sv-SE_Hedvig_11.0/MSTTSLocsvSE.dat"
#
# ===================
# USER CHOICE: select languages to be installed
typeset -i j=2 max=${#aExecChoice[*]} # start at 3rd entry, after Balboka, MS Runtime
SEPERATOR="~"
CHOICE=""
while (( j < max ))
do
   [ -z "${CHOICE}" ] && CHOICE="${aExecChoice[j]}" || CHOICE="${CHOICE}${SEPERATOR}${aExecChoice[$j]}"
   j=j+1
done

POL_Debug_Message "# CHOICE : ${CHOICE} #"

MSG="Please select components to install"
POL_SetupWindow_checkbox_list "$(eval_gettext '$MSG')" "$TITLE" "$CHOICE" "$SEPERATOR"
POL_Debug_Message "# APP_ANSWER : >$APP_ANSWER<"
if [ -z "$APP_ANSWER" ];then
        MSG="No language component has been selected.\nDo you want to overwrite an existing Installation ("${aPrgDisplay[0]}", "${aPrgDisplay[1]}")?"
        POL_SetupWindow_question "$(eval_gettext '$MSG')" "$TITLE"
        if [ ! "$APP_ANSWER" = "TRUE" ];then
                 cd $PWD_OLD 
                 POL_SetupWindow_Close 
                 exit 0
        fi
fi
j=2
while (( j < max ))
do
   [ "$(echo $APP_ANSWER | grep -o "${aExecChoice[$j]}")" != "" ] && aExecChoice[$j]="OK" || aExecChoice[$j]=""
   j=j+1
done
aExecChoice[0]="OK" # we always need main program
aExecChoice[1]="OK" # we always need MS Speech Runtime
# ===================
# USER CHOICE: LOCAL,DOWNLOAD
POL_SetupWindow_InstallMethod "LOCAL,DOWNLOAD"
POL_Debug_Message "# INSTALL_METHOD : >$INSTALL_METHOD<"
[ "$INSTALL_METHOD" = "False" ] && cd $PWD_OLD && POL_SetupWindow_Close && exit 0
# ---------------------
# install component
i=0
while (( i < max ))
do
   get_unpack_install \
           "${aExecChoice[$i]}" \
           "${aDownldInst[$i]}" \
           "${aPrgDisplay[$i]}" \
           "${aPathVerify[$i]}" \
           "$INSTALL_METHOD"
   RET_VAL="$?"
   POL_Debug_Message \
           "# get_unpack_install ($i, ${aPrgDisplay[$i]}) returned $RET_VAL" 
   [ ! "$RET_VAL" -eq 0 ] && exit -1
   [ "$i" = 0 ] && create_POL_shortcut
   i=i+1
done
######################
# Close POL
cd $PWD_OLD
POL_System_TmpDelete
POL_SetupWindow_Close
exit

Svar

Tuesday 16 February 2021 at 9:09
script approved.
Anonymous
Tuesday 16 February 2021 at 10:40
Hi Dadu042 - I see, I have left some dependency in the code which needs to be removed: The Linux desktop path needs to be identified by `xdg-user-dir DESKTOP`, as else the Shortcut will not be created.
Also you have removed my kyrillic letters for the Russian language module and the Japanese ;-) and replaced it with "????????" instead.

Ändrat av VolkerFroehlich