From b65e16000c6e4264d34e579da748e6683416aeb9 Mon Sep 17 00:00:00 2001 From: jonasgaudian <43753916+jonasgaudian@users.noreply.github.com> Date: Sat, 14 Feb 2026 01:12:10 +0100 Subject: [PATCH] update `DictionaryService` to use `englishName`, refine `ExampleSentenceRequest` prompt, and fix example sentence generation logic in `VocabularyViewModel` --- .../translator/utils/ApiRequestTemplates.kt | 17 ++++++++++++---- .../utils/dictionary/DictionaryService.kt | 20 +++++++++---------- .../viewmodel/VocabularyViewModel.kt | 10 +++++----- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/gaudian/translator/utils/ApiRequestTemplates.kt b/app/src/main/java/eu/gaudian/translator/utils/ApiRequestTemplates.kt index 0c4b4b8..3e8e442 100644 --- a/app/src/main/java/eu/gaudian/translator/utils/ApiRequestTemplates.kt +++ b/app/src/main/java/eu/gaudian/translator/utils/ApiRequestTemplates.kt @@ -109,10 +109,19 @@ class ExampleSentenceRequest( override val requiredFields = listOf("word", "sourceSentence", "targetSentence") init { - promptBuilder.basePrompt = "Provide one short, simple and clear example sentence for the word '$word' in $languageFirst and fully translate the sentence to $languageSecond, using $wordTranslation as a translation." - addDetail("Structure: { 'word': string, 'sourceSentence': string, 'targetSentence': string }.") - addDetail("Only include the fields above. Keep sentences concise and clear. Do not include any explanations or additional text.") - withJsonResponse("a JSON object with 'word' (the original word), 'sourceSentence' (the example sentence in the source language), and 'targetSentence' (the translation in the target language). Ensure all values are properly quoted strings.") + promptBuilder.basePrompt = """ + Task: Create a short, concise natural example sentence in $languageFirst for the word '$word'. + + Rules: + 1. The 'sourceSentence' must be entirely in $languageFirst. + 2. Do NOT use the word '$wordTranslation' in the 'sourceSentence'. + 3. The 'targetSentence' must be the $languageSecond translation of the 'sourceSentence'. + 4. In the 'targetSentence', use the word '$wordTranslation'. + """.trimIndent() + + addDetail("Constraint: Ensure 'sourceSentence' contains ONLY $languageFirst and 'targetSentence' contains ONLY $languageSecond.") + addDetail("Structure: { 'word': '$word', 'sourceSentence': string, 'targetSentence': string }.") + withJsonResponse("a JSON object. Ensure no mixed-language sentences occur.") } } diff --git a/app/src/main/java/eu/gaudian/translator/utils/dictionary/DictionaryService.kt b/app/src/main/java/eu/gaudian/translator/utils/dictionary/DictionaryService.kt index 9b0d483..2529b52 100644 --- a/app/src/main/java/eu/gaudian/translator/utils/dictionary/DictionaryService.kt +++ b/app/src/main/java/eu/gaudian/translator/utils/dictionary/DictionaryService.kt @@ -90,14 +90,14 @@ class DictionaryService(context: Context) { @OptIn(ExperimentalTime::class) suspend fun searchDefinition(query: String, language: Language): Result = withContext(Dispatchers.IO) { try { - Log.i("DictionaryService", "Searching definition for word: $query in language: ${language.name}") + Log.i("DictionaryService", "Searching definition for word: $query in language: ${language.englishName}") val requestedParts = getActivatedDictionaryOptions() Log.d("DictionaryService", "Requested dictionary parts: $requestedParts") val template = DictionaryDefinitionRequest( word = query, - language = language.name, + language = language.englishName, requestedParts = requestedParts ) @@ -110,7 +110,7 @@ class DictionaryService(context: Context) { word = apiResponse.word, definition = apiResponse.parts, languageCode = language.nameResId, - languageName = language.name, + languageName = language.englishName, createdAt = Clock.System.now() ) }.onFailure { exception -> @@ -127,13 +127,13 @@ class DictionaryService(context: Context) { */ suspend fun getExampleSentence(word: String, wordTranslation: String, languageFirst: Language, languageSecond: Language): Result> = withContext(Dispatchers.IO) { try { - Log.i("DictionaryService", "Getting example sentence for word: $word (${languageFirst.name} -> ${languageSecond.name})") + Log.i("DictionaryService", "Getting example sentence for word: $word (${languageFirst.englishName} -> ${languageSecond.englishName})") val template = ExampleSentenceRequest( word = word, wordTranslation = wordTranslation, - languageFirst = languageFirst.name, - languageSecond = languageSecond.name + languageFirst = languageFirst.englishName, + languageSecond = languageSecond.englishName ) val result = apiRequestHandler.executeRequest(template) @@ -179,7 +179,7 @@ class DictionaryService(context: Context) { } } - Log.i("DictionaryService", "Generating new word of the day for: $todayString in language: ${language.name}") + Log.i("DictionaryService", "Generating new word of the day for: $todayString in language: ${language.englishName}") val topics = listOf( "science", "literature", "history", "technology", "nature", @@ -192,7 +192,7 @@ class DictionaryService(context: Context) { Log.d("DictionaryService", "Selected topic for word of the day: $randomTopic") val template = WordOfTheDayRequest( - language = language.name, + language = language.englishName, category = randomTopic ) @@ -205,7 +205,7 @@ class DictionaryService(context: Context) { word = apiResponse.word, definition = apiResponse.parts, languageCode = language.nameResId, - languageName = language.name, + languageName = language.englishName, createdAt = today ) dictionaryRepository.saveWordOfTheDay(newEntry) @@ -225,7 +225,7 @@ class DictionaryService(context: Context) { suspend fun getEtymology(query: String, language: Language): Result = withContext(Dispatchers.IO) { try { - Log.i("DictionaryService", "Getting etymology for word: $query in language: ${language.name}") + Log.i("DictionaryService", "Getting etymology for word: $query in language: ${language.englishName}") val template = EtymologyRequest( word = query, diff --git a/app/src/main/java/eu/gaudian/translator/viewmodel/VocabularyViewModel.kt b/app/src/main/java/eu/gaudian/translator/viewmodel/VocabularyViewModel.kt index 4be4730..9f19a71 100644 --- a/app/src/main/java/eu/gaudian/translator/viewmodel/VocabularyViewModel.kt +++ b/app/src/main/java/eu/gaudian/translator/viewmodel/VocabularyViewModel.kt @@ -986,15 +986,15 @@ class VocabularyViewModel @Inject constructor( } suspend fun getExampleForItem(itemId: Int, isFirstWord: Boolean, languageFirst: Language?, languageSecond: Language?): Pair? { - Log.d(TAG, "Fetching example for item ID $itemId") val item = getVocabularyItemById(itemId) ?: return null - val word = if (isFirstWord) item.wordFirst else item.wordSecond - val wordTranslation = if (!isFirstWord) item.wordFirst else item.wordSecond - if (languageFirst == null || languageSecond == null) return null - return dictionaryService.getExampleSentence(word, wordTranslation, languageFirst, languageSecond).getOrNull() + return if (isFirstWord) { + dictionaryService.getExampleSentence(item.wordFirst , item.wordSecond, languageFirst, languageSecond).getOrNull() + } else { + dictionaryService.getExampleSentence(item.wordSecond, item.wordFirst , languageSecond, languageFirst).getOrNull() + } } suspend fun fetchAndUpdateZipfFrequency(item: VocabularyItem): VocabularyItem {