fix: Applying learn UAT comments

This commit is contained in:
BisratHailu 2026-05-25 12:36:25 +03:00
parent 855aa25bc3
commit 8af2b879a5
39 changed files with 350 additions and 107 deletions

View File

@ -119,7 +119,53 @@
"telegram_support": "የቴሌግራም ድጋፍ",
"chat_via_telegram": "በቴሌግራም በፍጥነት ይወያዩ",
"call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ",
"tap_to_call": "ለመደወል ይንኩ"
"tap_to_call": "ለመደወል ይንኩ",
"join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ",
"connect_with_support_team": "ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።",
"open_in_telegram": "በቴሌግራም ይክፈቱ",
"search_for": "ፈልጉት",
"current_level": "የአሁኑ ደረጃ",
"keep_up_the_great_work": "በጣም ጥሩ እየሰራህ ነው! ቀጥልበት፣ አስደናቂ ነህ።",
"no_practice_available": "ምንም ልምምድ አልተገኘም!",
"begin_module_practice": "የሞጁሉን ልምምድ ጀምር",
"lets_practice_lesson": "እንለማመድ",
"lets_quickly_review": "በዚህ ሞጁል ውስጥ የተማርከውን በፍጥነት እንከልስ!",
"lets_practice_module": "አሁን የተማርከውን እንለማመድ!",
"ask_you_few_actions": "ጥቂት ጥያቄዎችን እጠይቅሃለሁ፣ አንተም በተፈጥሮ መልስ ልትሰጥ ትችላለህ።",
"begin_level_practice": "የደረጃ ልምምድን ጀምር",
"lets_practice_course": "የኮርሱን ልምምድ እንለማመድ",
"lets_quick_practice": "በዚህ ደረጃ የተማርከውን በፍጥነት እንከልስ!",
"speaking": "እየተናገረ ነው",
"you_have_finished_practice": "ልምምድህን አጠናቀቅህ",
"view_results": "ውጤቶቼን እይ",
"sample_answer": "ናሙና መልስ",
"your_answer": "መልስህ",
"sound_confident": "በዚህ ጊዜ የበለጠ እምነት ያለህ ይመስላል — በጣም ጥሩ መሻሻል ነው!",
"you_have_completed": "አያይ! አጠናቀቅህ",
"yes": "አዎ",
"no": "አይ",
"want_to_quit": "ለመውጣት እርግጠኛ ነህ?",
"required_field": "ይህ መስክ ያስፈልጋል",
"enter_full_name": "ሙሉ ስምህን አስገባ",
"invalid_email": "የማይሰራ የኢሜይል ቅርጸት",
"phone_must_start_with": "የስልክ ቁጥር በ251 መጀመር አለበት",
"phone_must_be": "የስልክ ቁጥር 12 አሃዞች መሆን አለበት",
"what_should_we_call_you": "ምን ብለን እንጠራህ?",
"use_for_personalization": "በመማር ጉዞህ ውስጥ ለግል ለማድረግ ስምህን እንጠቀማለን።"
}

View File

@ -73,7 +73,7 @@
"reply": "Reply",
"cancel": "Cancel",
"you_are_speaking": "You're speaking",
"practice_completed": "Practice completed",
"practice_completed": "Practice completed!",
"great_improvement": "You sound more confident this time, great improvement",
"practice_again": "Practice again",
"conversation_review": "Conversation review",
@ -119,6 +119,38 @@
"telegram_support": "Telegram support",
"chat_via_telegram" :"Chat instantly via Telegram",
"call_our_support": "Call our support team between 9 AM - 6 PM",
"tap_to_call": "Tap to call"
"tap_to_call": "Tap to call",
"join_telegram": "Join Yimaru Academy on Telegram",
"connect_with_support_team": "Connect with our support team instantly on Telegram for quick assistance and community updates",
"open_in_telegram": "Open in Telegram",
"search_for": "Search for",
"current_level": "Current Level",
"keep_up_the_great_work": "Keep up the great work! You\\'re doing amazing.",
"no_practice_available": "No practice available!",
"begin_module_practice": "Begin Module Practice",
"lets_practice_lesson": "Lets Practice",
"lets_quickly_review": "Lets quickly review what youve learned in this module!",
"lets_practice_module": "Let's practice what you just learnt!",
"ask_you_few_actions": "Ill ask you a few questions, and you can respond naturally.",
"begin_level_practice": "Begin Level Practice",
"lets_practice_course": "Lets Practice Course",
"lets_quick_review": "Lets quickly review what youve learned in this level!",
"speaking": "is speaking...",
"you_have_finished_practice": "You have finished your practice",
"view_results": "View My Results",
"sample_answer": "Sample Answer",
"your_answer": "Your Answer",
"sound_confident": "You sound more confident this time - great improvement!",
"you_have_completed": "Yay, youve completed",
"yes": "Yes",
"no": "No",
"want_to_quit": "Are you sure you want to quit?",
"required_field": "The field is required",
"enter_full_name": "Enter your full name",
"invalid_email": "Invalid email format",
"phone_must_start_with": "Phone number must start with 251",
"phone_must_be": "Phone number must be 12 digits",
"what_should_we_call_you": "What should we call you?",
"use_for_personalization": "Well use your name to personalize your learning journey."
}

View File

@ -1,9 +1,15 @@
import 'package:battery_plus/battery_plus.dart';
import 'package:flutter/services.dart';
import 'package:in_app_update/in_app_update.dart';
import 'package:stacked_services/stacked_services.dart';
import 'package:storage_info/storage_info.dart';
import 'package:yimaru_app/app/app.locator.dart';
import '../ui/common/ui_helpers.dart';
class InAppUpdateService {
final _navigationService = locator<NavigationService>();
Future<int> getBatteryLevel() async {
final battery = Battery();
final batteryLevel = await battery.batteryLevel;
@ -43,7 +49,11 @@ class InAppUpdateService {
try {
final info = await InAppUpdate.checkForUpdate();
if (info.updateAvailability == UpdateAvailability.updateAvailable) {
await InAppUpdate.completeFlexibleUpdate();
AppUpdateResult result = await InAppUpdate.performImmediateUpdate();
if (result == AppUpdateResult.userDeniedUpdate) {
showErrorToast('An update is required to continue using this app.');
_navigationService.back();
}
}
// ... rest of your update logic ...

View File

@ -135,7 +135,39 @@ class CodegenLoader extends AssetLoader{
"telegram_support": "የቴሌግራም ድጋፍ",
"chat_via_telegram": "በቴሌግራም በፍጥነት ይወያዩ",
"call_our_support": "ከ3 ጠዋት እስከ 12 ማታ ድረስ የድጋፍ ቡድናችንን ይደውሉ",
"tap_to_call": "ለመደወል ይንኩ"
"tap_to_call": "ለመደወል ይንኩ",
"join_telegram": "በቴሌግራም የይማሩ አካዳሚን ይቀላቀሉ",
"connect_with_support_team": "ለፈጣን እርዳታ እና የማህበረሰብ ዝማኔዎች፣ በቴሌግራም ከድጋፍ ቡድናችን ጋር ወዲያውኑ ይገናኙ።",
"open_in_telegram": "በቴሌግራም ይክፈቱ",
"search_for": "ፈልጉት",
"current_level": "የአሁኑ ደረጃ",
"keep_up_the_great_work": "በጣም ጥሩ እየሰራህ ነው! ቀጥልበት፣ አስደናቂ ነህ።",
"no_practice_available": "ምንም ልምምድ አልተገኘም!",
"begin_module_practice": "የሞጁሉን ልምምድ ጀምር",
"lets_practice_lesson": "እንለማመድ",
"lets_quickly_review": "በዚህ ሞጁል ውስጥ የተማርከውን በፍጥነት እንከልስ!",
"lets_practice_module": "አሁን የተማርከውን እንለማመድ!",
"ask_you_few_actions": "ጥቂት ጥያቄዎችን እጠይቅሃለሁ፣ አንተም በተፈጥሮ መልስ ልትሰጥ ትችላለህ።",
"begin_level_practice": "የደረጃ ልምምድን ጀምር",
"lets_practice_course": "የኮርሱን ልምምድ እንለማመድ",
"lets_quick_practice": "በዚህ ደረጃ የተማርከውን በፍጥነት እንከልስ!",
"speaking": "እየተናገረ ነው",
"you_have_finished_practice": "ልምምድህን አጠናቀቅህ",
"view_results": "ውጤቶቼን እይ",
"sample_answer": "ናሙና መልስ",
"your_answer": "መልስህ",
"sound_confident": "በዚህ ጊዜ የበለጠ እምነት ያለህ ይመስላል — በጣም ጥሩ መሻሻል ነው!",
"you_have_completed": "አያይ! አጠናቀቅህ",
"yes": "አዎ",
"no": "አይ",
"want_to_quit": "ለመውጣት እርግጠኛ ነህ?",
"required_field": "ይህ መስክ ያስፈልጋል",
"enter_full_name": "ሙሉ ስምህን አስገባ",
"invalid_email": "የማይሰራ የኢሜይል ቅርጸት",
"phone_must_start_with": "የስልክ ቁጥር በ251 መጀመር አለበት",
"phone_must_be": "የስልክ ቁጥር 12 አሃዞች መሆን አለበት",
"what_should_we_call_you": "ምን ብለን እንጠራህ?",
"use_for_personalization": "በመማር ጉዞህ ውስጥ ለግል ለማድረግ ስምህን እንጠቀማለን።"
};
static const Map<String,dynamic> _en = {
"loading": "Loading",
@ -212,7 +244,7 @@ static const Map<String,dynamic> _en = {
"reply": "Reply",
"cancel": "Cancel",
"you_are_speaking": "You're speaking",
"practice_completed": "Practice completed",
"practice_completed": "Practice completed!",
"great_improvement": "You sound more confident this time, great improvement",
"practice_again": "Practice again",
"conversation_review": "Conversation review",
@ -258,7 +290,39 @@ static const Map<String,dynamic> _en = {
"telegram_support": "Telegram support",
"chat_via_telegram": "Chat instantly via Telegram",
"call_our_support": "Call our support team between 9 AM - 6 PM",
"tap_to_call": "Tap to call"
"tap_to_call": "Tap to call",
"join_telegram": "Join Yimaru Academy on Telegram",
"connect_with_support_team": "Connect with our support team instantly on Telegram for quick assistance and community updates",
"open_in_telegram": "Open in Telegram",
"search_for": "Search for",
"current_level": "Current Level",
"keep_up_the_great_work": "Keep up the great work! You\\'re doing amazing.",
"no_practice_available": "No practice available!",
"begin_module_practice": "Begin Module Practice",
"lets_practice_lesson": "Lets Practice",
"lets_quickly_review": "Lets quickly review what youve learned in this module!",
"lets_practice_module": "Let's practice what you just learnt!",
"ask_you_few_actions": "Ill ask you a few questions, and you can respond naturally.",
"begin_level_practice": "Begin Level Practice",
"lets_practice_course": "Lets Practice Course",
"lets_quick_review": "Lets quickly review what youve learned in this level!",
"speaking": "is speaking...",
"you_have_finished_practice": "You have finished your practice",
"view_results": "View My Results",
"sample_answer": "Sample Answer",
"your_answer": "Your Answer",
"sound_confident": "You sound more confident this time - great improvement!",
"you_have_completed": "Yay, youve completed",
"yes": "Yes",
"no": "No",
"want_to_quit": "Are you sure you want to quit?",
"required_field": "The field is required",
"enter_full_name": "Enter your full name",
"invalid_email": "Invalid email format",
"phone_must_start_with": "Phone number must start with 251",
"phone_must_be": "Phone number must be 12 digits",
"what_should_we_call_you": "What should we call you?",
"use_for_personalization": "Well use your name to personalize your learning journey."
};
static const Map<String, Map<String,dynamic>> mapLocales = {"am": _am, "en": _en};
}

View File

@ -122,5 +122,37 @@ abstract class LocaleKeys {
static const chat_via_telegram = 'chat_via_telegram';
static const call_our_support = 'call_our_support';
static const tap_to_call = 'tap_to_call';
static const join_telegram = 'join_telegram';
static const connect_with_support_team = 'connect_with_support_team';
static const open_in_telegram = 'open_in_telegram';
static const search_for = 'search_for';
static const current_level = 'current_level';
static const keep_up_the_great_work = 'keep_up_the_great_work';
static const no_practice_available = 'no_practice_available';
static const begin_module_practice = 'begin_module_practice';
static const lets_practice_lesson = 'lets_practice_lesson';
static const lets_quickly_review = 'lets_quickly_review';
static const lets_practice_module = 'lets_practice_module';
static const ask_you_few_actions = 'ask_you_few_actions';
static const begin_level_practice = 'begin_level_practice';
static const lets_practice_course = 'lets_practice_course';
static const lets_quick_practice = 'lets_quick_practice';
static const speaking = 'speaking';
static const you_have_finished_practice = 'you_have_finished_practice';
static const view_results = 'view_results';
static const sample_answer = 'sample_answer';
static const your_answer = 'your_answer';
static const sound_confident = 'sound_confident';
static const you_have_completed = 'you_have_completed';
static const yes = 'yes';
static const no = 'no';
static const want_to_quit = 'want_to_quit';
static const required_field = 'required_field';
static const enter_full_name = 'enter_full_name';
static const invalid_email = 'invalid_email';
static const phone_must_start_with = 'phone_must_start_with';
static const phone_must_be = 'phone_must_be';
static const what_should_we_call_you = 'what_should_we_call_you';
static const use_for_personalization = 'use_for_personalization';
}

View File

@ -1,4 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:email_validator/email_validator.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
class FormValidator {
// Form validator
@ -8,7 +10,7 @@ class FormValidator {
}
if (value.isEmpty) {
return 'The field is required';
return LocaleKeys.required_field.tr();
}
return null;
@ -21,12 +23,12 @@ class FormValidator {
}
if (value.isEmpty) {
return 'The field is required';
return LocaleKeys.required_field.tr();
}
final regex = RegExp(r'^\S+\s+\S+.*$');
if (!regex.hasMatch(value.trim())) {
return "Enter your full name";
return LocaleKeys.enter_full_name.tr();
}
return null;
}
@ -38,11 +40,11 @@ class FormValidator {
}
if (value.isEmpty) {
return 'The field is required';
return LocaleKeys.required_field.tr();
}
if (!EmailValidator.validate(value)) {
return 'Invalid email format';
return LocaleKeys.invalid_email.tr();
}
return null;
@ -55,7 +57,7 @@ class FormValidator {
}
if (value.isEmpty) {
return 'The field is required';
return LocaleKeys.required_field.tr();
}
return null;
}
@ -67,19 +69,19 @@ class FormValidator {
}
if (value.isEmpty) {
return 'The field is required';
return LocaleKeys.required_field.tr();
}
// Regex validation
final regex = RegExp(r'^251');
if (!regex.hasMatch(value)) {
return 'Phone number must start with 251';
return LocaleKeys.phone_must_start_with.tr();
}
// Length check first (optional but recommended)
if (value.length != 12) {
return 'Phone number must be 12 digits';
return LocaleKeys.phone_must_be.tr();
}
return null;
}

View File

@ -6,6 +6,7 @@ import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_program/learn_program_view.dart';
import 'package:yimaru_app/ui/views/profile/profile_view.dart';
import '../../widgets/coming_soon.dart';
import '../course/course_view.dart';
import 'home_viewmodel.dart';
@ -71,7 +72,7 @@ class HomeView extends StackedView<HomeViewModel> {
case 0:
return const LearnProgramView();
case 1:
return const CourseView();
return const ComingSoon();
default:
return const ProfileView();

View File

@ -1,3 +1,4 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'package:yimaru_app/app/app.router.dart';
@ -7,6 +8,7 @@ import '../../../models/learn_course.dart';
import '../../../services/learn_service.dart';
import '../../../services/status_checker_service.dart';
import '../../common/enmus.dart';
import '../../common/translations/locale_keys.g.dart';
class LearnCourseViewModel extends ReactiveViewModel {
// Dependency injection
@ -35,10 +37,10 @@ class LearnCourseViewModel extends ReactiveViewModel {
await _navigationService.navigateToLearnPracticeView(
id: id,
level: level,
label: 'Begin Level Practice',
practice: LearnPractices.course,
title: 'Lets Practice Course $level',
subtitle: 'Lets quickly review what youve learned in this level!',
label: LocaleKeys.begin_level_practice.tr(),
subtitle: LocaleKeys.lets_quick_practice.tr(),
title: '${LocaleKeys.lets_practice_course.tr()} $level',
);
// Remote api call

View File

@ -1,8 +1,10 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/models/learn_lesson.dart';
import 'package:yimaru_app/models/learn_module.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/widgets/learn_lesson_tile.dart';
import 'package:yimaru_app/ui/widgets/module_progress.dart';
import 'package:yimaru_app/ui/widgets/motivation_card.dart';
@ -150,7 +152,7 @@ class LearnLessonView extends StackedView<LearnLessonViewModel> {
Widget _buildMotivationCard() => const MotivationCard();
Widget _buildHeader() => Text(
'Lessons in this module',
LocaleKeys.lessons_in_module.tr(),
style: style18DG700,
);

View File

@ -1,8 +1,10 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'package:yimaru_app/app/app.router.dart';
import 'package:yimaru_app/models/learn_lesson.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import '../../../app/app.locator.dart';
import '../../../models/learn_module.dart';
@ -31,11 +33,10 @@ class LearnLessonViewModel extends ReactiveViewModel {
Future<void> navigateToLearnPractice(int id) async =>
await _navigationService.navigateToLearnPracticeView(
id: id,
label: 'Start Practice',
practice: LearnPractices.lesson,
title: 'Let\'s practice what you just learnt!',
subtitle:
'Ill ask you a few questions, and you can respond naturally.',
label:LocaleKeys.start_practice.tr(),
title: LocaleKeys.lets_practice_module.tr(),
subtitle:LocaleKeys.ask_you_few_actions.tr(),
);
Future<void> navigateToLearnLessonDetail(

View File

@ -1,8 +1,10 @@
import 'package:chewie/chewie.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/models/learn_lesson.dart';
import 'package:yimaru_app/models/learn_module.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import '../../common/app_colors.dart';
import '../../common/enmus.dart';
@ -188,9 +190,9 @@ class LearnLessonDetailView extends StackedView<LearnLessonDetailViewModel> {
CustomElevatedButton(
height: 55,
borderRadius: 12,
text: 'Take Practice',
foregroundColor: kcWhite,
backgroundColor: kcPrimaryColor,
text:LocaleKeys.take_practice.tr() ,
onTap: () async => await _navigate(viewModel),
);
}

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/models/learn_module.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/widgets/learn_module_tile.dart';
import 'package:yimaru_app/ui/widgets/overall_progress.dart';
@ -97,7 +99,7 @@ class LearnModuleView extends StackedView<LearnModuleViewModel> {
);
Widget _buildSubtitle() => Text(
'Your Current Level',
LocaleKeys.your_current_level.tr(),
style: style14P400,
);

View File

@ -1,7 +1,9 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'package:yimaru_app/app/app.router.dart';
import 'package:yimaru_app/models/learn_module.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import '../../../app/app.locator.dart';
import '../../../services/learn_service.dart';
@ -36,10 +38,10 @@ class LearnModuleViewModel extends ReactiveViewModel {
{required int id, required String module}) async =>
await _navigationService.navigateToLearnPracticeView(
id: id,
label: 'Begin Module Practice',
practice: LearnPractices.module,
title: 'Lets Practice $module',
subtitle: 'Lets quickly review what youve learned in this module! ',
label: LocaleKeys.begin_module_practice.tr(),
subtitle: LocaleKeys.lets_quickly_review.tr(),
title: '${LocaleKeys.lets_practice_module.tr()} $module',
);
// Remote api call

View File

@ -1,4 +1,5 @@
import 'package:audioplayers/audioplayers.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:stacked/stacked.dart';
@ -12,6 +13,7 @@ import 'package:yimaru_app/ui/widgets/wave_wrapper.dart';
import '../../../../models/learn_question.dart';
import '../../../common/app_colors.dart';
import '../../../common/enmus.dart';
import '../../../common/translations/locale_keys.g.dart';
import '../../../common/ui_helpers.dart';
import '../../../widgets/custom_column_button.dart';
import '../../../widgets/small_app_bar.dart';
@ -125,7 +127,7 @@ class InteractLearnPracticeScreen
showBackButton: true,
onPop: () async =>
await _showSheet(context: context, viewModel: viewModel),
title: 'Practice Speaking ($index/${viewModel.questions.length})');
title: '${LocaleKeys.practice_speaking.tr()} ($index/${viewModel.questions.length})');
Widget _buildSpeakingIndicatorWrapper(LearnPracticeViewModel viewModel) =>
Column(
@ -152,13 +154,13 @@ class InteractLearnPracticeScreen
: const SizedBox(height: 20);
Widget _buildListeningLabel() => Text(
'Daniel is speaking...',
'Daniel ${LocaleKeys.speaking.tr()}',
style: style14P400,
textAlign: TextAlign.center,
);
Widget _buildSpeakingLabel() => Text(
'You\'re speaking...',
'${ LocaleKeys.you_are_speaking.tr()}...',
style: style14P400,
textAlign: TextAlign.center,
);
@ -237,7 +239,7 @@ class InteractLearnPracticeScreen
];
Widget _buildActionLabel() => Text(
'Tap the microphone to speak',
LocaleKeys.tap_microphone.tr(),
style: style14DG400,
textAlign: TextAlign.center,
);
@ -288,7 +290,7 @@ class InteractLearnPracticeScreen
Widget _buildReplyButton(LearnPracticeViewModel viewModel) =>
CustomColumnButton(
icon: Icons.replay,
label: 'Reply',
label: LocaleKeys.reply.tr(),
color: viewModel.recordingState == VoiceRecordingState.pending &&
viewModel.player.state != PlayerState.playing
? kcPrimaryColor
@ -356,8 +358,8 @@ class InteractLearnPracticeScreen
required LearnPracticeViewModel viewModel}) =>
CustomColumnButton(
color: kcRed,
label: 'Cancel',
icon: Icons.close,
label:LocaleKeys.cancel.tr() ,
onTap: () async =>
await _showSheet(context: context, viewModel: viewModel),
);

View File

@ -1,9 +1,11 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:yimaru_app/ui/widgets/no_data_indicator.dart';
import 'package:yimaru_app/ui/widgets/page_loading_indicator.dart';
import 'package:yimaru_app/ui/widgets/small_app_bar.dart';
import '../../../common/app_colors.dart';
import '../../../common/translations/locale_keys.g.dart';
import '../../../common/ui_helpers.dart';
class LearnLoadingScreen extends StatelessWidget {
@ -65,7 +67,7 @@ class LearnLoadingScreen extends StatelessWidget {
Align(alignment: Alignment.center, child: _buildRefreshButton());
Widget _buildRefreshButton() => NoDataIndicator(
title: 'No practice available!',
onTap: onTap,
onTap: onTap,
title: LocaleKeys.no_practice_available.tr(),
);
}

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import '../../../common/app_colors.dart';
@ -131,13 +133,13 @@ class LearnPracticeAppreciationScreen
Widget _buildIcon() => SvgPicture.asset('assets/icons/success.svg');
Widget _buildTitle(LearnPracticeViewModel viewModel) => Text(
'Great work, ${viewModel.user?.firstName}',
'${LocaleKeys.great_work.tr()}, ${viewModel.user?.firstName}',
style: style25DG600,
textAlign: TextAlign.center,
);
Widget _buildSubtitle() => Text(
'You have finished your practice',
LocaleKeys.you_have_finished_practice.tr(),
style: style14DG400,
textAlign: TextAlign.center,
);
@ -152,9 +154,10 @@ class LearnPracticeAppreciationScreen
CustomElevatedButton(
height: 55,
borderRadius: 12,
text: 'View My Results',
foregroundColor: kcWhite,
onTap: () => viewModel.goTo(4),
backgroundColor: kcPrimaryColor,
text: LocaleKeys.view_results.tr(),
);
}

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import '../../../common/app_colors.dart';
@ -61,7 +63,7 @@ class LearnPracticeCompletionScreen
);
Widget _buildTitle() => Text(
'Yay, youve completed $level ',
'${LocaleKeys.you_have_completed.tr()} $level ',
style: style25DG600,
textAlign: TextAlign.center,
);
@ -81,9 +83,9 @@ class LearnPracticeCompletionScreen
CustomElevatedButton(
height: 55,
borderRadius: 12,
text: 'Continue',
onTap: viewModel.pop,
foregroundColor: kcWhite,
text: LocaleKeys.cont.tr(),
backgroundColor: kcPrimaryColor,
);
}

View File

@ -1,10 +1,12 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/helper_functions.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import '../../../common/app_colors.dart';
import '../../../common/translations/locale_keys.g.dart';
import '../../../common/ui_helpers.dart';
import '../../../widgets/cancel_learn_practice_sheet.dart';
import '../../../widgets/custom_elevated_button.dart';
@ -175,9 +177,9 @@ class LearnPracticeDescriptionScreen
CustomElevatedButton(
height: 55,
borderRadius: 12,
text: 'Start Practice',
foregroundColor: kcWhite,
onTap: () => viewModel.goTo(2),
backgroundColor: kcPrimaryColor,
text: LocaleKeys.start_practice.tr() ,
);
}

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import '../../../common/app_colors.dart';
@ -59,7 +61,7 @@ class LearnPracticeFinishScreen
Widget _buildAppBar(LearnPracticeViewModel viewModel) => SmallAppBar(
showBackButton: true,
onPop: viewModel.goBack,
title: 'Practice Speaking',
title:LocaleKeys.practice_speaking.tr(),
);
Widget _buildSpeakingIndicatorWrapper(LearnPracticeViewModel viewModel) =>
@ -79,13 +81,13 @@ class LearnPracticeFinishScreen
Widget _buildIcon() => SvgPicture.asset('assets/icons/success.svg');
Widget _buildTitle() => Text(
'Practice Completed!',
LocaleKeys.practice_completed.tr(),
style: style25DG600,
textAlign: TextAlign.center,
);
Widget _buildSubtitle() => Text(
'You sound more confident this time - great improvement!',
LocaleKeys.sound_confident.tr() ,
style: style14DG400,
textAlign: TextAlign.center,
);
@ -117,18 +119,18 @@ class LearnPracticeFinishScreen
borderRadius: 12,
onTap: viewModel.pop,
foregroundColor: kcWhite,
text: 'Continue Practice',
backgroundColor: kcPrimaryColor,
text: LocaleKeys.continue_practice.tr() ,
);
Widget _buildPracticeAgainButton(LearnPracticeViewModel viewModel) =>
CustomElevatedButton(
height: 55,
borderRadius: 12,
text: 'Practice Again',
backgroundColor: kcWhite,
borderColor: kcPrimaryColor,
foregroundColor: kcPrimaryColor,
text: LocaleKeys.practice_again.tr(),
onTap: () async => await _reset(viewModel),
);
}

View File

@ -1,5 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import '../../../common/app_colors.dart';
@ -174,7 +176,7 @@ class LearnPracticeIntroScreen extends ViewModelWidget<LearnPracticeViewModel> {
Widget _buildPartnerName() => Text.rich(
TextSpan(text: 'Daniel', style: style14DG600, children: [
TextSpan(
text: ' - Your Speaking Partner',
text: ' - ${LocaleKeys.speaking_partner.tr()}',
style: style14MG400,
)
]),

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/learn_practice_tip_section.dart';
import 'package:yimaru_app/ui/widgets/learn_practice_results_wrapper.dart';
@ -112,8 +114,8 @@ class LearnPracticeResultScreen
{required BuildContext context,
required LearnPracticeViewModel viewModel}) =>
SmallAppBar(
title: 'Result',
showBackButton: true,
title:LocaleKeys.result.tr(),
onPop: () async =>
await _showSheet(context: context, viewModel: viewModel),
);
@ -172,9 +174,9 @@ class LearnPracticeResultScreen
Widget _buildContinueButton(LearnPracticeViewModel viewModel) =>
CustomElevatedButton(
height: 55,
text: 'Continue',
borderRadius: 12,
foregroundColor: kcWhite,
text:LocaleKeys.cont.tr(),
backgroundColor: kcPrimaryColor,
onTap: () async => await _navigate(viewModel),
);
@ -182,10 +184,10 @@ class LearnPracticeResultScreen
Widget _buildPracticeAgainButton(LearnPracticeViewModel viewModel) =>
CustomElevatedButton(
height: 55,
text: 'Retry',
borderRadius: 12,
backgroundColor: kcWhite,
borderColor: kcPrimaryColor,
text: LocaleKeys.retry.tr(),
foregroundColor: kcPrimaryColor,
onTap: () async => await _retry(viewModel),
);

View File

@ -1,5 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/custom_column_button.dart';
@ -106,7 +108,8 @@ class StartLearnPracticeScreen extends ViewModelWidget<LearnPracticeViewModel> {
showBackButton: true,
onPop: () async =>
await _showSheet(context: context, viewModel: viewModel),
title: 'Practice Speaking ($index/${viewModel.questions.length})');
title:
'${LocaleKeys.practice_speaking.tr()} ($index/${viewModel.questions.length})');
Widget _buildSheet(LearnPracticeViewModel viewModel) =>
CancelLearnPracticeSheet(
@ -167,7 +170,7 @@ class StartLearnPracticeScreen extends ViewModelWidget<LearnPracticeViewModel> {
);
Widget _buildStartText() => Text(
'Start',
LocaleKeys.start.tr(),
style: style25W600,
);
@ -193,7 +196,7 @@ class StartLearnPracticeScreen extends ViewModelWidget<LearnPracticeViewModel> {
];
Widget _buildActionLabel() => Text(
'Tap the start button to listen',
LocaleKeys.tap_start_to_listen.tr() ,
style: style14DG400,
textAlign: TextAlign.center,
);
@ -212,8 +215,8 @@ class StartLearnPracticeScreen extends ViewModelWidget<LearnPracticeViewModel> {
Widget _buildReplyButtonWrapper() => Expanded(child: _buildReplyButton());
Widget _buildReplyButton() => const CustomColumnButton(
icon: Icons.replay, label: 'Reply', color: kcLightGrey);
Widget _buildReplyButton() => CustomColumnButton(
icon: Icons.replay, label:LocaleKeys.reply.tr() , color: kcLightGrey);
Widget _buildMicButtonWrapper(LearnPracticeViewModel viewModel) =>
Expanded(child: _buildMicButton(viewModel));

View File

@ -1,7 +1,9 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_colors.dart';
import 'package:yimaru_app/ui/common/helper_functions.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/widgets/custom_elevated_button.dart';
import 'package:yimaru_app/ui/views/onboarding/onboarding_viewmodel.dart';
@ -92,18 +94,14 @@ class FullNameFormScreen extends ViewModelWidget<OnboardingViewModel> {
onLanguage: () async => await viewModel.navigateToLanguage(),
);
Widget _buildTitle() => const Text(
'What should we call you? 😊',
style: TextStyle(
fontSize: 25,
color: kcDarkGrey,
fontWeight: FontWeight.w600,
),
Widget _buildTitle() => Text(
'${LocaleKeys.what_should_we_call_you.tr()} 😊',
style:style25DG600,
);
Widget _buildSubtitle() => const Text(
'Well use your name to personalize your learning journey.',
style: TextStyle(color: kcMediumGrey),
Widget _buildSubtitle() => Text(
LocaleKeys.use_for_personalization.tr(),
style:style14MG400,
);
Widget _buildFullNameFormField(OnboardingViewModel viewModel) =>
@ -111,8 +109,8 @@ class FullNameFormScreen extends ViewModelWidget<OnboardingViewModel> {
controller: fullNameController,
onTap: viewModel.setFullNameFocus,
decoration: inputDecoration(
hint: 'Enter Your Name',
focus: viewModel.focusFullName,
hint: LocaleKeys.enter_full_name.tr(),
filled: fullNameController.text.isNotEmpty),
);
@ -134,9 +132,9 @@ class FullNameFormScreen extends ViewModelWidget<OnboardingViewModel> {
Widget _buildContinueButton(OnboardingViewModel viewModel) =>
CustomElevatedButton(
height: 55,
text: 'Continue',
borderRadius: 12,
foregroundColor: kcWhite,
text: LocaleKeys.cont.tr(),
backgroundColor: fullNameController.text.isNotEmpty &&
!viewModel.hasFullNameValidationMessage
? kcPrimaryColor

View File

@ -158,7 +158,7 @@ class ProfileView extends StackedView<ProfileViewModel> {
List<Widget> _buildSettingsChildren(ProfileViewModel viewModel) => [
// _buildDownloadsCard(viewModel),
_buildProgressCard(viewModel),
// _buildProgressCard(viewModel),
_buildAccountCard(viewModel),
_buildSupportCard(viewModel)
];
@ -174,7 +174,7 @@ class ProfileView extends StackedView<ProfileViewModel> {
icon: Icons.stacked_bar_chart,
title: LocaleKeys.my_progress.tr(),
subtitle: LocaleKeys.track_your_achievement.tr(),
// onTap: () async => await viewModel.navigateToProgress(),
onTap: () async => await viewModel.navigateToProgress(),
);
Widget _buildAccountCard(ProfileViewModel viewModel) => ProfileCard(

View File

@ -1,8 +1,10 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
import 'package:yimaru_app/app/app.router.dart';
import 'package:yimaru_app/services/image_picker_service.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import '../../../app/app.locator.dart';
import '../../../models/user.dart';
@ -64,13 +66,13 @@ class ProfileViewModel extends ReactiveViewModel {
// Dialog
Future<bool?> showAbortDialog() async {
DialogResponse? response = await _dialogService.showDialog(
title: 'Logout',
cancelTitle: 'No',
buttonTitle: 'Yes',
barrierDismissible: true,
cancelTitleColor: kcDarkGrey,
buttonTitleColor: kcPrimaryColor,
description: 'Are you sure you want to quit?',
title: LocaleKeys.logout.tr(),
cancelTitle: LocaleKeys.no.tr(),
buttonTitle: LocaleKeys.yes.tr(),
description: LocaleKeys.want_to_quit.tr(),
);
return response?.confirmed;
}

View File

@ -1,7 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked/stacked_annotations.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_constants.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/widgets/circular_icon.dart';
import '../../common/app_colors.dart';
@ -52,7 +54,7 @@ class TelegramSupportView extends StackedView<TelegramSupportViewModel> {
Widget _buildAppbar(TelegramSupportViewModel viewModel) => SmallAppBar(
onPop: viewModel.pop,
showBackButton: true,
title: 'Telegram Support',
title: LocaleKeys.telegram_support.tr(),
);
Widget _buildExpandedColumn(TelegramSupportViewModel viewModel) =>
@ -93,13 +95,13 @@ class TelegramSupportView extends StackedView<TelegramSupportViewModel> {
const CircularIcon(icon: Icons.telegram, size: 50, color: kcSkyBlue);
Widget _buildTitle() => Text(
'Join Yimaru Academy on Telegram',
LocaleKeys.join_telegram.tr(),
style: style25DG600,
textAlign: TextAlign.center,
);
Widget _buildSubtitle() => Text(
'Connect with our support team instantly on Telegram for quick assistance and community updates',
LocaleKeys.connect_with_support_team.tr(),
style: style14MG400,
textAlign: TextAlign.center,
);
@ -123,17 +125,17 @@ class TelegramSupportView extends StackedView<TelegramSupportViewModel> {
CustomElevatedButton(
height: 55,
borderRadius: 12,
text: 'Open in Telegram',
foregroundColor: kcWhite,
leadingIcon: Icons.telegram,
backgroundColor: kcPrimaryColor,
text: LocaleKeys.open_in_telegram.tr(),
onTap: () async => await viewModel.launchTelegram(),
);
Widget _buildOptionTextDivider() => const OptionTextDivider();
Widget _buildSearchText() => Text.rich(
TextSpan(text: 'Search for', style: style14DG500, children: [
TextSpan(text: LocaleKeys.search_for.tr(), style: style14DG500, children: [
TextSpan(
style: style14P600,
text: ' $kTelegramSupport',

View File

@ -1,4 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/widgets/speaking_partner_image.dart';
import '../common/app_colors.dart';
@ -51,8 +53,11 @@ class CancelLearnPracticeSheet extends StatelessWidget {
);
Widget _buildMessage() => Text.rich(
TextSpan(text: 'Youre almost there,', style: style18DG700, children: [
TextSpan(
TextSpan(
text: '${LocaleKeys.almost_there.tr()},',
style: style18DG700,
children: [
TextSpan(
text: ' $user',
style: style18P600,
)
@ -60,7 +65,7 @@ class CancelLearnPracticeSheet extends StatelessWidget {
);
Widget _buildSubtitle() => Text(
'Finish this session to see your progress.',
LocaleKeys.finish_session.tr(),
style: style14DG400,
textAlign: TextAlign.center,
);
@ -70,17 +75,17 @@ class CancelLearnPracticeSheet extends StatelessWidget {
onTap: onContinue,
borderRadius: 12,
foregroundColor: kcWhite,
text: 'Continue Practice',
backgroundColor: kcPrimaryColor,
text: LocaleKeys.continue_practice.tr(),
);
Widget _buildEndButton() => CustomElevatedButton(
height: 55,
onTap: onCancel,
borderRadius: 12,
text: 'End Session',
backgroundColor: kcWhite,
borderColor: kcPrimaryColor,
foregroundColor: kcPrimaryColor,
text: LocaleKeys.end_session.tr(),
);
}

View File

@ -1,5 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/widgets/progress_status.dart';
import '../../models/learn_course.dart';
@ -107,9 +109,9 @@ class LearnCourseTile extends ViewModelWidget<LearnCourseViewModel> {
? _buildProgressStatus()
: Container();
Widget _buildProgressStatus() => const ProgressStatus(
Widget _buildProgressStatus() => ProgressStatus(
color: kcPrimaryColor,
status: 'Current Level',
status: LocaleKeys.current_level.tr(),
);
Widget _buildContent() => Text(
@ -143,9 +145,9 @@ class LearnCourseTile extends ViewModelWidget<LearnCourseViewModel> {
height: 15,
borderRadius: 12,
onTap: onViewTap,
text: 'View Course',
foregroundColor: kcWhite,
backgroundColor: kcPrimaryColor,
text:LocaleKeys.view_course.tr(),
);
Widget _buildPracticeButtonWrapper(LearnCourseViewModel viewModel) =>
@ -158,9 +160,9 @@ class LearnCourseTile extends ViewModelWidget<LearnCourseViewModel> {
height: 15,
borderRadius: 12,
onTap: onPracticeTap,
text: 'Take Practice',
backgroundColor: kcWhite,
borderColor: kcPrimaryColor,
foregroundColor: kcPrimaryColor,
text:LocaleKeys.take_practice.tr() ,
);
}

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/models/learn_lesson.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_lesson/learn_lesson_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/mini_thumbnail.dart';
@ -128,7 +130,7 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
);
Widget _buildProgressText() => Text(
(lesson.access?.isCompleted ?? false) ? 'Completed' : 'In Progress',
(lesson.access?.isCompleted ?? false) ?LocaleKeys.completed.tr() : LocaleKeys.in_progress.tr() ,
style: style14P600,
);
@ -158,13 +160,13 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget _buildPracticeButton(LearnLessonViewModel viewModel) =>
CustomElevatedButton(
height: 15,
text: 'Practice',
borderRadius: 12,
onTap: onPracticeTap,
trailingIcon: Icons.mic,
width: double.maxFinite,
backgroundColor: kcWhite,
borderColor: kcPrimaryColor,
text:LocaleKeys.practice.tr() ,
foregroundColor: kcPrimaryColor,
);
@ -176,11 +178,11 @@ class LearnLessonTile extends ViewModelWidget<LearnLessonViewModel> {
Widget _buildLessonButton(LearnLessonViewModel viewModel) =>
CustomElevatedButton(
height: 15,
text: 'Start',
borderRadius: 12,
onTap: onLessonTap,
width: double.maxFinite,
foregroundColor: kcWhite,
text:LocaleKeys.start.tr() ,
trailingIcon: Icons.play_arrow,
backgroundColor: kcPrimaryColor,
);

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/models/learn_module.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/views/learn_module/learn_module_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/custom_container_shader.dart';
import 'package:yimaru_app/ui/widgets/custom_linear_progress_indicator.dart';
@ -191,9 +193,9 @@ class LearnModuleTile extends ViewModelWidget<LearnModuleViewModel> {
height: 15,
borderRadius: 12,
onTap: onModuleTap,
text: 'View Module',
foregroundColor: kcWhite,
backgroundColor: kcPrimaryColor,
text: LocaleKeys.view_module.tr(),
);
Widget _buildPracticeButtonWrapper(LearnModuleViewModel viewModel) =>
@ -206,10 +208,10 @@ class LearnModuleTile extends ViewModelWidget<LearnModuleViewModel> {
height: 15,
borderRadius: 12,
onTap: onPracticeTap,
text: 'Take Practices',
backgroundColor: kcWhite,
borderColor: kcPrimaryColor,
foregroundColor: kcPrimaryColor,
text:LocaleKeys.take_practice.tr(),
// onTap: () async => await viewModel.navigateToLearnPractice(practices),
);

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/enmus.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/learn_practice_answer_card.dart';
@ -51,7 +53,7 @@ class LearnPracticeResultCard extends ViewModelWidget<LearnPracticeViewModel> {
Widget _buildSampleResponse() => LearnPracticeAnswerCard(
answer: answer,
voice: Voice.sample,
title: 'Sample Answer',
title:LocaleKeys.sample_answer.tr() ,
);
Widget _buildActualResponseWrapper() =>
@ -59,7 +61,8 @@ class LearnPracticeResultCard extends ViewModelWidget<LearnPracticeViewModel> {
Widget _buildActualResponse() => LearnPracticeAnswerCard(
answer: answer,
title: 'Your Answer',
voice: Voice.recorded,
);
title: LocaleKeys.your_answer.tr(),
);
}

View File

@ -1,5 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
import 'package:yimaru_app/ui/widgets/learn_practice_result_card.dart';
@ -33,7 +35,7 @@ class LearnPracticeResultsWrapper
[_buildTitle(), verticalSpaceSmall, _buildResults(viewModel)];
Widget _buildTitle() => Text(
'Conversation Review',
LocaleKeys.conversation_review.tr(),
style: style16DG600,
textAlign: TextAlign.center,
);

View File

@ -1,6 +1,8 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:stacked/stacked.dart';
import 'package:yimaru_app/ui/common/app_colors.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/views/learn_practice/learn_practice_viewmodel.dart';
@ -39,7 +41,7 @@ class LearnPracticeTipSection extends ViewModelWidget<LearnPracticeViewModel> {
);
Widget _buildTitle() => Text(
'Quick Tip',
LocaleKeys.quick_tip.tr(),
style: style16B600,
);

View File

@ -24,7 +24,7 @@ class LearnProgramTile extends ViewModelWidget<LearnProgramViewModel> {
Widget _buildExpansionTileCardWrapper(LearnProgramViewModel viewModel) =>
GestureDetector(
onTap: !(program.access?.isAccessible ?? false) ? onLockTap : null,
// onTap: !(program.access?.isAccessible ?? false) ? onLockTap : null,
child: _buildExpansionTileCard(viewModel),
);

View File

@ -1,4 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import '../common/app_colors.dart';
import '../common/ui_helpers.dart';
@ -44,7 +46,7 @@ class ModuleProgress extends StatelessWidget {
[_buildProgressInfo(), _buildProgress()];
Widget _buildProgressInfo() => Text(
'$progress% Progress',
'$progress% ${LocaleKeys.progress.tr()}',
style: style16DG400,
);

View File

@ -1,4 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import '../common/app_colors.dart';
@ -31,7 +33,7 @@ class MotivationCard extends StatelessWidget {
Widget _buildText() => Expanded(
child: Text(
'Lets keep going — youre more than halfway there!',
LocaleKeys.keep_going.tr(),
maxLines: 2,
style: style14DG400,
),

View File

@ -1,5 +1,7 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:yimaru_app/ui/common/app_colors.dart';
import 'package:yimaru_app/ui/common/translations/locale_keys.g.dart';
import 'package:yimaru_app/ui/common/ui_helpers.dart';
import 'package:yimaru_app/ui/widgets/custom_linear_progress_indicator.dart';
@ -48,7 +50,7 @@ class OverallProgress extends StatelessWidget {
[_buildProgressInfo(), _buildProgress()];
Widget _buildProgressInfo() => Text(
'Overall Progress',
LocaleKeys.overall_progress.tr(),
style: style16DG600,
);
@ -64,7 +66,7 @@ class OverallProgress extends StatelessWidget {
);
Widget _buildSubtitle() => Text(
'Keep up the great work! You\'re doing amazing.',
LocaleKeys.keep_up_the_great_work.tr(),
style: style14DG500,
);
}

View File

@ -1,5 +1,5 @@
name: yimaru_app
version: 0.1.18+20
version: 0.1.19+21
publish_to: 'none'
description: A new Flutter project.