feat(app): 客户端展示多语言并支持筛选分页

This commit is contained in:
Zhou Weidong committed 2026-10-24 17:20:24 +08:00
1 parent 8481611372
commit 8b50b5bd06
68 files changed
+2742 -1120

No files matched your search

@@ -8,8 +8,6 @@ import '../../../core/theme/app_dimens.dart';
import '../../../core/widgets/cover_play_count.dart';
import '../../../core/widgets/drama_cover_badge_ribbon.dart';
import '../../../core/widgets/remote_image.dart';
import '../../../l10n/app_localizations.dart';
import '../../home/widgets/home_drama_classification.dart';
final RegExp _tagSplitter = RegExp(r'[,/、·]');
@@ -27,7 +25,7 @@ class RecommendSectionCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final tagLabel = drama.localizedTag(Localizations.localeOf(context).languageCode);
return SizedBox(
width: AppDimens.recommendCardWidth,
child: InkWell(
@@ -52,14 +50,14 @@ class RecommendSectionCard extends StatelessWidget {
showFallbackIcon: true,
fallbackColor: AppColors.contentSurface,
),
if (isHotDrama(drama))
if (tagLabel.isNotEmpty)
Positioned(
top: 0,
right: 0,
child: DramaCoverBadgeRibbon(
label: l10n.homeBadgeHot,
color: AppColors.badgeHot,
keyPrefix: '$sectionKey-${drama.id}-hot',
label: tagLabel,
color: drama.tagRibbonColor(AppColors.badgeHot),
keyPrefix: '$sectionKey-${drama.id}-tag',
),
),
const Positioned(
@@ -82,7 +80,7 @@ class RecommendSectionCard extends StatelessWidget {
),
const SizedBox(height: AppDimens.cardCoverTitleGap),
Text(
drama.title,
drama.localizedTitle(Localizations.localeOf(context).languageCode),
key: Key('recommend-title-$sectionKey-${drama.id}'),
maxLines: 2,
overflow: TextOverflow.ellipsis,
@@ -94,25 +92,15 @@ class RecommendSectionCard extends StatelessWidget {
),
),
const SizedBox(height: AppDimens.cardTitleTagGap),
_tags(),
_tags(context),
],
),
),
);
}
List<String> _cardTags() {
final seen = <String>{};
return [drama.genre, drama.category]
.expand((value) => value.split(_tagSplitter))
.map((value) => value.trim())
.where((value) => value.isNotEmpty && seen.add(value))
.take(3)
.toList(growable: false);
}
Widget _tags() {
final tags = _cardTags();
Widget _tags(BuildContext context) {
final tags = _cardTags(context);
if (tags.isEmpty) return const SizedBox.shrink();
return Text(
tags.join(' | '),
@@ -126,4 +114,16 @@ class RecommendSectionCard extends StatelessWidget {
),
);
}
List<String> _cardTags(BuildContext context) {
final localized = drama.localizedTypeLabels(Localizations.localeOf(context).languageCode);
if (localized.isNotEmpty) return localized.take(3).toList(growable: false);
final seen = <String>{};
return [drama.genre, drama.category]
.expand((value) => value.split(_tagSplitter))
.map((value) => value.trim())
.where((value) => value.isNotEmpty && seen.add(value))
.take(3)
.toList(growable: false);
}
}