commit
f6248b73f1
9 changed files with 133 additions and 12 deletions
|
|
@ -4233,5 +4233,9 @@
|
|||
"reportContentIssueTitle": "Report content issue",
|
||||
"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.",
|
||||
"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 {
|
||||
try {
|
||||
_langList = await _getCachedFlags();
|
||||
if (await _shouldFetch || _langList.isEmpty) {
|
||||
if (await _shouldFetch ||
|
||||
_langList.isEmpty ||
|
||||
_langList.every((lang) => !lang.l2)) {
|
||||
_langList = await LanguageRepo.fetchLanguages();
|
||||
|
||||
await _saveFlags(_langList);
|
||||
|
|
|
|||
98
lib/pangea/enum/l2_support_enum.dart
Normal file
98
lib/pangea/enum/l2_support_enum.dart
Normal file
|
|
@ -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 'package:fluffychat/pangea/constants/language_constants.dart';
|
||||
import 'package:fluffychat/pangea/enum/l2_support_enum.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
|
@ -12,15 +13,15 @@ class LanguageModel {
|
|||
final String languageFlag;
|
||||
final String displayName;
|
||||
final String? languageEmoji;
|
||||
final bool l2;
|
||||
final bool l1;
|
||||
final L2SupportEnum l2Support;
|
||||
|
||||
LanguageModel({
|
||||
required this.langCode,
|
||||
required this.languageFlag,
|
||||
required this.displayName,
|
||||
required this.l2,
|
||||
required this.l1,
|
||||
this.l2Support = L2SupportEnum.na,
|
||||
this.languageEmoji,
|
||||
});
|
||||
|
||||
|
|
@ -37,9 +38,11 @@ class LanguageModel {
|
|||
displayName: _LanguageLocal.getDisplayName(
|
||||
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"),
|
||||
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_name': displayName,
|
||||
'language_flag': languageFlag,
|
||||
'l2': l2,
|
||||
'l1': l1,
|
||||
'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
|
||||
static String codeFromNameOrCode(String codeOrName, [String? url]) {
|
||||
if (codeOrName.isEmpty) return LanguageKeys.unknownLanguage;
|
||||
|
|
@ -73,7 +78,6 @@ class LanguageModel {
|
|||
langCode: LanguageKeys.unknownLanguage,
|
||||
languageFlag: "",
|
||||
displayName: "Unknown",
|
||||
l2: false,
|
||||
l1: false,
|
||||
);
|
||||
|
||||
|
|
@ -81,16 +85,12 @@ class LanguageModel {
|
|||
displayName: context != null
|
||||
? L10n.of(context)!.multiLingualSpace
|
||||
: "Multilingual Space",
|
||||
l2: false,
|
||||
l1: false,
|
||||
langCode: LanguageKeys.multiLanguage,
|
||||
languageFlag: 'assets/colors.png',
|
||||
languageEmoji: "🌎",
|
||||
);
|
||||
|
||||
// Discuss with Jordan
|
||||
bool get hasContextualDefinitionSupport => l2;
|
||||
|
||||
String? getDisplayName(BuildContext context) {
|
||||
switch (langCode) {
|
||||
case 'ab':
|
||||
|
|
|
|||
|
|
@ -234,6 +234,7 @@ class LanguageSelectionRow extends StatelessWidget {
|
|||
targetLanguage: isSource ? null : language,
|
||||
);
|
||||
},
|
||||
isL2List: !isSource,
|
||||
initialLanguage: isSource
|
||||
? controller.sourceLanguageSearch
|
||||
: controller.targetLanguageSearch,
|
||||
|
|
|
|||
|
|
@ -231,6 +231,10 @@ class MessagePracticeActivityCardState extends State<PracticeActivityCard> {
|
|||
return;
|
||||
}
|
||||
|
||||
// clear the current activity and record
|
||||
currentActivity = null;
|
||||
currentCompletionRecord = null;
|
||||
|
||||
_fetchNewActivity(
|
||||
ActivityQualityFeedback(
|
||||
feedbackText: feedback,
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ Future<void> pLanguageDialog(
|
|||
setState(() => selectedSourceLanguage = p0),
|
||||
initialLanguage: selectedSourceLanguage,
|
||||
languages: pangeaController.pLanguageStore.baseOptions,
|
||||
isL2List: false,
|
||||
),
|
||||
PQuestionContainer(
|
||||
title: L10n.of(parentContext)!.whatLanguageYouWantToLearn,
|
||||
|
|
@ -72,6 +73,7 @@ Future<void> pLanguageDialog(
|
|||
setState(() => selectedTargetLanguage = p0),
|
||||
initialLanguage: selectedTargetLanguage,
|
||||
languages: pangeaController.pLanguageStore.targetOptions,
|
||||
isL2List: true,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
// Flutter imports:
|
||||
|
||||
import 'package:fluffychat/pangea/enum/l2_support_enum.dart';
|
||||
import 'package:fluffychat/pangea/models/language_model.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
|
|
@ -10,6 +11,7 @@ class PLanguageDropdown extends StatefulWidget {
|
|||
final LanguageModel initialLanguage;
|
||||
final Function(LanguageModel) onChange;
|
||||
final bool showMultilingual;
|
||||
final bool isL2List;
|
||||
|
||||
const PLanguageDropdown({
|
||||
super.key,
|
||||
|
|
@ -17,6 +19,7 @@ class PLanguageDropdown extends StatefulWidget {
|
|||
required this.onChange,
|
||||
required this.initialLanguage,
|
||||
this.showMultilingual = false,
|
||||
required this.isL2List,
|
||||
});
|
||||
|
||||
@override
|
||||
|
|
@ -98,6 +101,7 @@ class _PLanguageDropdownState extends State<PLanguageDropdown> {
|
|||
value: LanguageModel.multiLingual(context),
|
||||
child: LanguageDropDownEntry(
|
||||
languageModel: LanguageModel.multiLingual(context),
|
||||
isL2List: widget.isL2List,
|
||||
),
|
||||
),
|
||||
...sortedLanguages.map(
|
||||
|
|
@ -105,6 +109,7 @@ class _PLanguageDropdownState extends State<PLanguageDropdown> {
|
|||
value: languageModel,
|
||||
child: LanguageDropDownEntry(
|
||||
languageModel: languageModel,
|
||||
isL2List: widget.isL2List,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
@ -118,9 +123,11 @@ class _PLanguageDropdownState extends State<PLanguageDropdown> {
|
|||
|
||||
class LanguageDropDownEntry extends StatelessWidget {
|
||||
final LanguageModel languageModel;
|
||||
final bool isL2List;
|
||||
const LanguageDropDownEntry({
|
||||
super.key,
|
||||
required this.languageModel,
|
||||
required this.isL2List,
|
||||
});
|
||||
|
||||
@override
|
||||
|
|
@ -144,6 +151,9 @@ class LanguageDropDownEntry extends StatelessWidget {
|
|||
overflow: TextOverflow.clip,
|
||||
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#
|
||||
publish_to: none
|
||||
# On version bump also increase the build number for F-Droid
|
||||
version: 1.21.4+3539
|
||||
version: 1.21.4+3540
|
||||
|
||||
environment:
|
||||
sdk: ">=3.0.0 <4.0.0"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue