Merge pull request #740 from pangeachat/more-l2s

More-l2s
pull/1423/head
ggurdin 1 year ago committed by GitHub
commit f6248b73f1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -4233,5 +4233,9 @@
"reportContentIssueTitle": "Report content issue", "reportContentIssueTitle": "Report content issue",
"feedback": "Optional feedback", "feedback": "Optional feedback",
"reportContentIssueDescription": "Uh oh! AI can faciliate personalized learning experiences but... also hallucinates. Please provide any feedback you have and we'll try again.", "reportContentIssueDescription": "Uh oh! AI can faciliate personalized learning experiences but... also hallucinates. Please provide any feedback you have and we'll try again.",
"clickTheWordAgainToDeselect": "Click the selected word to deselect it." "clickTheWordAgainToDeselect": "Click the selected word to deselect it.",
"l2SupportNa": "Not Available",
"l2SupportAlpha": "Alpha",
"l2SupportBeta": "Beta",
"l2SupportFull": "Full"
} }

@ -27,7 +27,9 @@ class PangeaLanguage {
static Future<void> initialize() async { static Future<void> initialize() async {
try { try {
_langList = await _getCachedFlags(); _langList = await _getCachedFlags();
if (await _shouldFetch || _langList.isEmpty) { if (await _shouldFetch ||
_langList.isEmpty ||
_langList.every((lang) => !lang.l2)) {
_langList = await LanguageRepo.fetchLanguages(); _langList = await LanguageRepo.fetchLanguages();
await _saveFlags(_langList); await _saveFlags(_langList);

@ -0,0 +1,98 @@
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart';
enum L2SupportEnum {
na,
alpha,
beta,
full,
}
extension L2SupportEnumExtension on L2SupportEnum {
String get storageString {
switch (this) {
case L2SupportEnum.na:
return 'na';
case L2SupportEnum.alpha:
return 'alpha';
case L2SupportEnum.beta:
return 'beta';
case L2SupportEnum.full:
return 'full';
}
}
L2SupportEnum fromStorageString(String storageString) {
switch (storageString) {
case 'na':
case 'L2SupportEnum.na':
return L2SupportEnum.na;
case 'alpha':
case 'L2SupportEnum.alpha':
return L2SupportEnum.alpha;
case 'beta':
case 'L2SupportEnum.beta':
return L2SupportEnum.beta;
case 'full':
case 'L2SupportEnum.full':
return L2SupportEnum.full;
default:
throw Exception('Unknown L2SupportEnum storage string: $storageString');
}
}
String toLocalizedString(BuildContext context) {
final l10n = L10n.of(context)!;
switch (this) {
case L2SupportEnum.na:
return l10n.l2SupportNa;
case L2SupportEnum.alpha:
return l10n.l2SupportAlpha;
case L2SupportEnum.beta:
return l10n.l2SupportBeta;
case L2SupportEnum.full:
return l10n.l2SupportFull;
}
}
Badge toBadge(BuildContext context) {
final theme = Theme.of(context);
Color color;
String label;
switch (this) {
case L2SupportEnum.na:
color = theme.colorScheme.onSurface.withOpacity(0.4); // Muted grey
label = toLocalizedString(context);
break;
case L2SupportEnum.alpha:
color = theme.colorScheme.primary.withOpacity(0.4); // Subtle primary
label = toLocalizedString(context);
break;
case L2SupportEnum.beta:
color =
theme.colorScheme.secondary.withOpacity(0.4); // Subtle secondary
label = toLocalizedString(context);
break;
case L2SupportEnum.full:
color = theme.colorScheme.tertiary.withOpacity(0.4); // Subtle tertiary
label = toLocalizedString(context);
break;
}
return Badge(
label: Text(
label,
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.onSurface.withOpacity(0.8), // Dimmed text
fontWeight: FontWeight.w500,
),
),
backgroundColor: color,
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
smallSize: 20, // A smaller badge for subtlety
);
}
}

@ -1,6 +1,7 @@
import 'dart:developer'; import 'dart:developer';
import 'package:fluffychat/pangea/constants/language_constants.dart'; import 'package:fluffychat/pangea/constants/language_constants.dart';
import 'package:fluffychat/pangea/enum/l2_support_enum.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
@ -12,15 +13,15 @@ class LanguageModel {
final String languageFlag; final String languageFlag;
final String displayName; final String displayName;
final String? languageEmoji; final String? languageEmoji;
final bool l2;
final bool l1; final bool l1;
final L2SupportEnum l2Support;
LanguageModel({ LanguageModel({
required this.langCode, required this.langCode,
required this.languageFlag, required this.languageFlag,
required this.displayName, required this.displayName,
required this.l2,
required this.l1, required this.l1,
this.l2Support = L2SupportEnum.na,
this.languageEmoji, this.languageEmoji,
}); });
@ -37,9 +38,11 @@ class LanguageModel {
displayName: _LanguageLocal.getDisplayName( displayName: _LanguageLocal.getDisplayName(
code != LanguageKeys.unknownLanguage ? code : json['language_name'], code != LanguageKeys.unknownLanguage ? code : json['language_name'],
), ),
l2: json["l2"] ?? code.contains("es") || code.contains("en"),
l1: json["l1"] ?? !code.contains("es") && !code.contains("en"), l1: json["l1"] ?? !code.contains("es") && !code.contains("en"),
languageEmoji: json['language_emoji'], languageEmoji: json['language_emoji'],
l2Support: json['l2_support'] != null
? L2SupportEnum.na.fromStorageString(json['l2_support'])
: L2SupportEnum.na,
); );
} }
@ -47,11 +50,13 @@ class LanguageModel {
'language_code': langCode, 'language_code': langCode,
'language_name': displayName, 'language_name': displayName,
'language_flag': languageFlag, 'language_flag': languageFlag,
'l2': l2,
'l1': l1, 'l1': l1,
'language_emoji': languageEmoji, 'language_emoji': languageEmoji,
'l2_support': l2Support.storageString,
}; };
bool get l2 => l2Support != L2SupportEnum.na;
// Discuss with Jordan - adding langCode field to language objects as separate from displayName // Discuss with Jordan - adding langCode field to language objects as separate from displayName
static String codeFromNameOrCode(String codeOrName, [String? url]) { static String codeFromNameOrCode(String codeOrName, [String? url]) {
if (codeOrName.isEmpty) return LanguageKeys.unknownLanguage; if (codeOrName.isEmpty) return LanguageKeys.unknownLanguage;
@ -73,7 +78,6 @@ class LanguageModel {
langCode: LanguageKeys.unknownLanguage, langCode: LanguageKeys.unknownLanguage,
languageFlag: "", languageFlag: "",
displayName: "Unknown", displayName: "Unknown",
l2: false,
l1: false, l1: false,
); );
@ -81,16 +85,12 @@ class LanguageModel {
displayName: context != null displayName: context != null
? L10n.of(context)!.multiLingualSpace ? L10n.of(context)!.multiLingualSpace
: "Multilingual Space", : "Multilingual Space",
l2: false,
l1: false, l1: false,
langCode: LanguageKeys.multiLanguage, langCode: LanguageKeys.multiLanguage,
languageFlag: 'assets/colors.png', languageFlag: 'assets/colors.png',
languageEmoji: "🌎", languageEmoji: "🌎",
); );
// Discuss with Jordan
bool get hasContextualDefinitionSupport => l2;
String? getDisplayName(BuildContext context) { String? getDisplayName(BuildContext context) {
switch (langCode) { switch (langCode) {
case 'ab': case 'ab':

@ -234,6 +234,7 @@ class LanguageSelectionRow extends StatelessWidget {
targetLanguage: isSource ? null : language, targetLanguage: isSource ? null : language,
); );
}, },
isL2List: !isSource,
initialLanguage: isSource initialLanguage: isSource
? controller.sourceLanguageSearch ? controller.sourceLanguageSearch
: controller.targetLanguageSearch, : controller.targetLanguageSearch,

@ -231,6 +231,10 @@ class MessagePracticeActivityCardState extends State<PracticeActivityCard> {
return; return;
} }
// clear the current activity and record
currentActivity = null;
currentCompletionRecord = null;
_fetchNewActivity( _fetchNewActivity(
ActivityQualityFeedback( ActivityQualityFeedback(
feedbackText: feedback, feedbackText: feedback,

@ -63,6 +63,7 @@ Future<void> pLanguageDialog(
setState(() => selectedSourceLanguage = p0), setState(() => selectedSourceLanguage = p0),
initialLanguage: selectedSourceLanguage, initialLanguage: selectedSourceLanguage,
languages: pangeaController.pLanguageStore.baseOptions, languages: pangeaController.pLanguageStore.baseOptions,
isL2List: false,
), ),
PQuestionContainer( PQuestionContainer(
title: L10n.of(parentContext)!.whatLanguageYouWantToLearn, title: L10n.of(parentContext)!.whatLanguageYouWantToLearn,
@ -72,6 +73,7 @@ Future<void> pLanguageDialog(
setState(() => selectedTargetLanguage = p0), setState(() => selectedTargetLanguage = p0),
initialLanguage: selectedTargetLanguage, initialLanguage: selectedTargetLanguage,
languages: pangeaController.pLanguageStore.targetOptions, languages: pangeaController.pLanguageStore.targetOptions,
isL2List: true,
), ),
], ],
), ),

@ -1,5 +1,6 @@
// Flutter imports: // Flutter imports:
import 'package:fluffychat/pangea/enum/l2_support_enum.dart';
import 'package:fluffychat/pangea/models/language_model.dart'; import 'package:fluffychat/pangea/models/language_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -10,6 +11,7 @@ class PLanguageDropdown extends StatefulWidget {
final LanguageModel initialLanguage; final LanguageModel initialLanguage;
final Function(LanguageModel) onChange; final Function(LanguageModel) onChange;
final bool showMultilingual; final bool showMultilingual;
final bool isL2List;
const PLanguageDropdown({ const PLanguageDropdown({
super.key, super.key,
@ -17,6 +19,7 @@ class PLanguageDropdown extends StatefulWidget {
required this.onChange, required this.onChange,
required this.initialLanguage, required this.initialLanguage,
this.showMultilingual = false, this.showMultilingual = false,
required this.isL2List,
}); });
@override @override
@ -98,6 +101,7 @@ class _PLanguageDropdownState extends State<PLanguageDropdown> {
value: LanguageModel.multiLingual(context), value: LanguageModel.multiLingual(context),
child: LanguageDropDownEntry( child: LanguageDropDownEntry(
languageModel: LanguageModel.multiLingual(context), languageModel: LanguageModel.multiLingual(context),
isL2List: widget.isL2List,
), ),
), ),
...sortedLanguages.map( ...sortedLanguages.map(
@ -105,6 +109,7 @@ class _PLanguageDropdownState extends State<PLanguageDropdown> {
value: languageModel, value: languageModel,
child: LanguageDropDownEntry( child: LanguageDropDownEntry(
languageModel: languageModel, languageModel: languageModel,
isL2List: widget.isL2List,
), ),
), ),
), ),
@ -118,9 +123,11 @@ class _PLanguageDropdownState extends State<PLanguageDropdown> {
class LanguageDropDownEntry extends StatelessWidget { class LanguageDropDownEntry extends StatelessWidget {
final LanguageModel languageModel; final LanguageModel languageModel;
final bool isL2List;
const LanguageDropDownEntry({ const LanguageDropDownEntry({
super.key, super.key,
required this.languageModel, required this.languageModel,
required this.isL2List,
}); });
@override @override
@ -144,6 +151,9 @@ class LanguageDropDownEntry extends StatelessWidget {
overflow: TextOverflow.clip, overflow: TextOverflow.clip,
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
const SizedBox(width: 10),
if (isL2List && languageModel.l2Support != L2SupportEnum.full)
languageModel.l2Support.toBadge(context),
], ],
), ),
); );

@ -6,7 +6,7 @@ description: Learn a language while texting your friends.
# Pangea# # Pangea#
publish_to: none publish_to: none
# On version bump also increase the build number for F-Droid # On version bump also increase the build number for F-Droid
version: 1.21.4+3539 version: 1.21.4+3540
environment: environment:
sdk: ">=3.0.0 <4.0.0" sdk: ">=3.0.0 <4.0.0"

Loading…
Cancel
Save