I am getting empty string returned when calling getTansalation() of my TranslateString which translates using Google mlkit language translator

Viewed 14

After initializing TranslateString in calling function getTranslation(), i am getting Default (which is returned when value is empty) as return, Which shouldn't be case as I have put translate under runBlocking{ }, Kindly tell what would be best way to get return from getTranslation after input String is translated.

Here is my TranslateString Util class

 class TranslateString(val inputString : String, val SourceLangCod : String, val TargetLangCode: String)  {

    private val SourceLangCode = SourceLangCod
    private val languageIdentifier = LanguageIdentification.getClient()
        private var translatedString: MutableLiveData<String>  = MutableLiveData("")
        private lateinit var englishGermanTranslator:
                Translator

        var LangCode= "1"

fun getTranslation(): String{
        runBlocking {
            findLanguage()
        }
     return if (translatedString.value.equals(""))
     "Default" else translatedString.value!!
    }


    private fun findLanguage() {
        if (SourceLangCode != "") {
            LangCode = SourceLangCode
        } else {
            languageIdentifier.identifyLanguage(inputString)
                .addOnSuccessListener { languageCode ->
                    if (languageCode != "und")
                        LangCode = languageCode
                    buidtranslation()
                }
        }
    }

// checking model is downloaded or not and downloading it

     private fun buidtranslation() {
            val conditions = DownloadConditions.Builder()
                .requireWifi()
                .build()

            val options = TranslatorOptions.Builder()
                .setSourceLanguage(LangCode
                )
                .setTargetLanguage(
                    TargetLangCode
                )
                .build()

            Log.e("from TranslateString", "langueageCode: $LangCode")
            englishGermanTranslator = Translation.getClient(options)
            var isDownloaded = false

            englishGermanTranslator.downloadModelIfNeeded(conditions)
                .addOnSuccessListener {
                    // Model downloaded successfully. Okay to start translating.
                    // (Set a flag, unhide the translation UI, etc.)
                    Log.e(TAG, "funIsModelDownloaded: model is downloaded")
                    isDownloaded = true
                    translate()
                }
                .addOnFailureListener { exception ->
                    // Model couldn’t be downloaded or other internal error.
                    isDownloaded = false
                    Log.e(TAG, "funIsModelDownloaded:" + exception.message)
                }

        }




        private fun translate(){
            englishGermanTranslator.translate(inputString)
                .addOnSuccessListener { translatedText ->
                    // Translation successful.
                    translatedString.postValue(translatedText)

                    Log.e(TAG, "translated Text: $translatedText")
                }
                .addOnFailureListener { exception ->
                    // Error.
                    // ...
                    Log.e(TAG, "Translation Error"+exception.message )

                }
        }

If i call value from getTranslation after putting delay of 3 sec then it returns translated value, also same while testing.

If possible i want to acheive desired result without using observable of LiveData.

0 Answers
Related