import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../estado/estado_idioma.dart'; import '../../l10n/gen/app_localizations.dart'; import '../../widgets/pluri_glass_surface.dart'; import '../../widgets/pluri_layout.dart'; import '../../widgets/pluri_push_scaffold.dart'; /// APLICACIÓN group · "Idioma" (design ADR-3). Body moved verbatim from the /// former `_SeccionIdioma` (+ `_IdiomaDisponible`) in `pantalla_ajustes.dart` /// — only the panel header's icon and title were removed (the pushed /// screen's title now carries them); every method and the language list /// below is unchanged. class PantallaAjustesIdioma extends StatelessWidget { const PantallaAjustesIdioma({super.key}); @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context); return PluriPushScaffold( title: l10n.languageSectionTitle, body: ListView( padding: PluriLayout.pageContentPadding, children: const [_CuerpoIdioma()], ), ); } } class _CuerpoIdioma extends StatelessWidget { const _CuerpoIdioma(); static const _codigoSistema = 'system'; static const _idiomas = [ _IdiomaDisponible(Locale('en'), 'English'), _IdiomaDisponible(Locale('es'), 'Español'), _IdiomaDisponible(Locale('zh'), '中文'), _IdiomaDisponible(Locale('hi'), 'हिन्दी'), _IdiomaDisponible(Locale('ar'), 'العربية'), _IdiomaDisponible(Locale('pt'), 'Português'), _IdiomaDisponible(Locale('fr'), 'Français'), _IdiomaDisponible(Locale('ru'), 'Русский'), _IdiomaDisponible(Locale('de'), 'Deutsch'), _IdiomaDisponible(Locale('ja'), '日本語'), _IdiomaDisponible(Locale('id'), 'Bahasa Indonesia'), _IdiomaDisponible(Locale('bn'), 'বাংলা'), _IdiomaDisponible(Locale('it'), 'Italiano'), ]; @override Widget build(BuildContext context) { final l10n = AppLocalizations.of(context); final estadoIdioma = context.watch(); final locale = estadoIdioma.localeSeleccionado; final valorActual = locale == null ? _codigoSistema : _codigoLocale(locale); return PluriGlassSurface( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 8), Text( l10n.languageSectionDescription, style: Theme.of(context).textTheme.bodySmall, ), const SizedBox(height: 12), DropdownButtonFormField( initialValue: valorActual, decoration: InputDecoration( labelText: l10n.languageSectionTitle, border: const OutlineInputBorder(), ), items: [ DropdownMenuItem( value: _codigoSistema, child: Text(l10n.languageSystemDefault), ), for (final idioma in _idiomas) DropdownMenuItem( value: _codigoLocale(idioma.locale), child: Text(idioma.nombreNativo), ), ], onChanged: (codigo) async { if (codigo == null) return; if (codigo == _codigoSistema) { await context.read().seleccionarSistema(); if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(l10n.languageUpdatedSystem)), ); return; } final idioma = _idiomas.firstWhere( (item) => _codigoLocale(item.locale) == codigo, orElse: () => _idiomas.first, ); await context.read().seleccionarLocale( idioma.locale, ); if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text(l10n.languageUpdated(idioma.nombreNativo)), ), ); }, ), ], ), ); } static String _codigoLocale(Locale locale) { final countryCode = locale.countryCode; if (countryCode == null || countryCode.isEmpty) { return locale.languageCode; } return '${locale.languageCode}_$countryCode'; } } class _IdiomaDisponible { const _IdiomaDisponible(this.locale, this.nombreNativo); final Locale locale; final String nombreNativo; }