fix(subtitles): remember search language

close #1002
This commit is contained in:
edde746
2026-05-11 02:40:50 +02:00
parent f185ebd554
commit cd31b2e2e6
4 changed files with 51 additions and 6 deletions
+2
View File
@@ -271,6 +271,7 @@ class SettingsService extends BaseSharedPreferencesService {
static const sleepTimerDuration = IntPref('sleep_timer_duration', defaultValue: 30);
static const audioSyncOffset = IntPref('audio_sync_offset');
static const subtitleSyncOffset = IntPref('subtitle_sync_offset');
static const subtitleSearchLanguage = NullableStringPref('subtitle_search_language');
static const volume = DoublePref('volume', defaultValue: 100.0);
static const rotationLocked = BoolPref('rotation_locked', defaultValue: true);
static const subtitleFontSize = IntPref('subtitle_font_size', defaultValue: 38);
@@ -655,6 +656,7 @@ class SettingsService extends BaseSharedPreferencesService {
sleepTimerDuration,
audioSyncOffset,
subtitleSyncOffset,
subtitleSearchLanguage,
volume,
maxVolume,
subtitleFontSize,
+6
View File
@@ -25,6 +25,12 @@ class LanguageCodes {
return variations.toList();
}
static String? getIso6391Code(String code) {
final normalized = code.toLowerCase().trim().split(RegExp('[-_]')).first;
if (normalized.isEmpty) return null;
return _resolve(normalized)?.code1;
}
/// Get a display name for a language/locale code.
/// Handles plain codes ("en" → "English") and locale codes ("en-US" → "English",
/// "en-AU" → "English (Australia)").
@@ -10,6 +10,7 @@ import '../../../i18n/strings.g.dart';
import '../../../mixins/controller_disposer_mixin.dart';
import '../../../models/plex/plex_subtitle_search_result.dart';
import '../../../services/plex_client.dart';
import '../../../services/settings_service.dart';
import '../../../utils/language_codes.dart';
import '../../../utils/provider_extensions.dart';
import '../../../utils/snackbar_helper.dart';
@@ -20,6 +21,13 @@ import '../../../widgets/pill_input_decoration.dart';
import 'base_video_control_sheet.dart';
import '../../loading_indicator_box.dart';
@visibleForTesting
String resolveSubtitleSearchLanguageCode({String? savedLanguageCode, required Locale systemLocale}) {
return LanguageCodes.getIso6391Code(savedLanguageCode ?? '') ??
LanguageCodes.getIso6391Code(systemLocale.languageCode) ??
'en';
}
class SubtitleSearchSheet extends StatefulWidget {
final String ratingKey;
final String serverId;
@@ -62,13 +70,14 @@ class _SubtitleSearchSheetState extends State<SubtitleSearchSheet> with Controll
}
void _initDefaultLanguage() {
final locale = WidgetsBinding.instance.platformDispatcher.locale;
final code = locale.languageCode;
final code = resolveSubtitleSearchLanguageCode(
savedLanguageCode: SettingsService.instanceOrNull?.read(SettingsService.subtitleSearchLanguage),
systemLocale: WidgetsBinding.instance.platformDispatcher.locale,
);
final name = LanguageCodes.getLanguageName(code);
if (name != null) {
_languageCode = code;
_languageName = name;
}
if (name == null) return;
_languageCode = code;
_languageName = name;
}
@override
@@ -153,6 +162,10 @@ class _SubtitleSearchSheetState extends State<SubtitleSearchSheet> with Controll
_languageName = name;
_showLanguagePicker = false;
});
final settings = SettingsService.instanceOrNull;
if (settings != null) {
unawaited(settings.write(SettingsService.subtitleSearchLanguage, code));
}
OverlaySheetController.of(context).refocus();
_search();
}