Skip to content

Commit a02d584

Browse files
cambio de lenguaje
1 parent 8309be2 commit a02d584

13 files changed

+311
-32
lines changed

l10n.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
arb-dir: lib/l10n
2+
template-arb-file: app_en.arb
3+
output-localization-file: app_localizations.dart
+9-7
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import 'package:flutter/material.dart';
22
import 'package:material_symbols_icons/symbols.dart';
33
import 'package:morazan/components/satelite_info_piece.dart';
4+
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; // Importa AppLocalizations
45

5-
class Precipitation extends StatelessWidget {
6-
final double _precipitation;
6+
class PrecipitationWidget extends StatelessWidget {
7+
final double precipitation;
78

8-
const Precipitation({super.key, required double precipitation})
9-
: _precipitation = precipitation;
9+
const PrecipitationWidget({super.key, required this.precipitation});
1010

1111
@override
1212
Widget build(BuildContext context) {
13+
final l10n = AppLocalizations.of(context)!; // Obtiene la instancia de AppLocalizations
14+
1315
return SateliteInfoPiece(
14-
title: 'Precipitacion',
15-
data: _precipitation,
16+
title: l10n.precipitacion, // Usa la traducción para el título
17+
data: precipitation,
1618
unit: "cm³",
1719
icon: Icon(
1820
Symbols.weather_mix,
@@ -22,4 +24,4 @@ class Precipitation extends StatelessWidget {
2224
),
2325
);
2426
}
25-
}
27+
}

lib/l10n/app_en.arb

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"testMedium": "Detalles de",
3+
"temperatura":"temperatura",
4+
"radiacion":"Radiacion Solar",
5+
"velocidad":"Velocidad del viento (SurEste)",
6+
"precipitacion":"Precipitacion"
7+
}

lib/l10n/app_es.arb

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"testMedium": "Details",
3+
"temperatura":"temperature",
4+
"radiacion":"Temperature",
5+
"velocidad":"Wind speed (Southeast)",
6+
"precipitacion":"Precipitation"
7+
}

lib/locale_bloc/locale_bloc.dart

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:morazan/util/language.dart';
4+
5+
part 'locale_event.dart';
6+
part 'locale_state.dart';
7+
8+
class LocaleBloc extends Bloc<LocaleEvent, LocaleState> {
9+
LocaleBloc() : super(LocaleInitial()) {
10+
on<ChangeLanguage>(_onChangeLanguage);
11+
}
12+
13+
_onChangeLanguage(ChangeLanguage event, Emitter<LocaleState> emit) {
14+
emit(LocaleChanged(language: event.selectedLanguage));
15+
}
16+
}

lib/locale_bloc/locale_event.dart

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
part of 'locale_bloc.dart';
2+
3+
sealed class LocaleEvent extends Equatable {
4+
const LocaleEvent();
5+
6+
@override
7+
List<Object> get props => [];
8+
}
9+
10+
class ChangeLanguage extends LocaleEvent {
11+
final Language selectedLanguage;
12+
13+
const ChangeLanguage(this.selectedLanguage);
14+
15+
@override
16+
List<Object> get props => [selectedLanguage];
17+
}

lib/locale_bloc/locale_state.dart

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
part of 'locale_bloc.dart';
2+
3+
sealed class LocaleState extends Equatable {
4+
final Language selectedLanguage;
5+
const LocaleState({Language? language})
6+
: selectedLanguage = language ?? Language.english;
7+
8+
@override
9+
List<Object> get props => [selectedLanguage];
10+
}
11+
12+
final class LocaleInitial extends LocaleState {}
13+
14+
final class LocaleChanged extends LocaleState {
15+
const LocaleChanged({super.language});
16+
}

lib/main.dart

+29
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,33 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
3+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
4+
import 'package:morazan/util/language.dart';
5+
import 'locale_bloc/locale_bloc.dart';
26
import 'package:morazan/pages/base/base_widget.dart';
37

48
void main() => runApp(const MorazanApp());
9+
10+
class MorazanApp extends StatelessWidget {
11+
const MorazanApp({super.key});
12+
13+
@override
14+
@override
15+
Widget build(BuildContext context) {
16+
return MultiBlocProvider(
17+
providers: [
18+
BlocProvider<LocaleBloc>(create: (_) => LocaleBloc()),
19+
],
20+
child: BlocBuilder<LocaleBloc, LocaleState>(
21+
builder: (context, state) {
22+
return MaterialApp(
23+
debugShowCheckedModeBanner: false,
24+
locale: state.selectedLanguage.localeValue,
25+
supportedLocales: AppLocalizations.supportedLocales,
26+
localizationsDelegates: AppLocalizations.localizationsDelegates,
27+
home: const BaseWidget(),
28+
);
29+
},
30+
),
31+
);
32+
}
33+
}

lib/pages/base/base_widget.dart

+94-20
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,41 @@
11
import 'package:flutter/material.dart';
2+
import 'package:flutter_bloc/flutter_bloc.dart';
23
import 'package:morazan/util/app_theme.dart';
34
import 'package:morazan/pages/satelites/satelites_widget.dart';
45
import 'package:morazan/util/constants.dart';
6+
import 'package:morazan/util/language.dart';
7+
58
import 'package:string_capitalize/string_capitalize.dart';
9+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
10+
import 'package:morazan/locale_bloc/locale_bloc.dart';
11+
612

7-
class MorazanApp extends StatefulWidget {
8-
const MorazanApp({Key? key}) : super(key: key);
13+
class BaseWidget extends StatefulWidget {
14+
const BaseWidget({Key? key}) : super(key: key);
915

1016
@override
11-
State<MorazanApp> createState() => _MorazanAppState();
17+
State<BaseWidget> createState() => _BaseWidgetState();
1218
}
1319

14-
class _MorazanAppState extends State<MorazanApp> {
20+
class _BaseWidgetState extends State<BaseWidget> {
1521
static const _satelites = Satelites.values;
1622
var _actualSatelite = _satelites[0];
1723
var _themeMode = ThemeMode.system;
1824

1925
@override
2026
Widget build(BuildContext context) {
27+
final l10n = AppLocalizations.of(context)!;
28+
// String welcomeMessage = l10n.temperatura;
2129
var colorScheme = Theme.of(context).colorScheme;
22-
var themeIcon = _themeMode == ThemeMode.light
30+
var themeIcon = Theme.of(context).brightness == Brightness.light
2331
? Icons.dark_mode
2432
: Icons.light_mode;
2533

2634
return MaterialApp(
35+
locale: const Locale("en"), // Establece el idioma predeterminado a inglés
36+
supportedLocales: AppLocalizations.supportedLocales,
37+
localizationsDelegates: AppLocalizations.localizationsDelegates,
38+
//Fin de local language
2739
title: 'Morazan',
2840
theme: AppTheme.lightTheme,
2941
darkTheme: AppTheme.darkTheme,
@@ -33,17 +45,24 @@ class _MorazanAppState extends State<MorazanApp> {
3345
title: Row(
3446
mainAxisAlignment: MainAxisAlignment.spaceBetween,
3547
children: [
36-
Text("Detalles de ${_actualSatelite.name.capitalize()}"),
48+
Text(" ${l10n.testMedium} ${_actualSatelite.name.capitalize()}"),
49+
BlocBuilder<LocaleBloc, LocaleState>(
50+
builder: (context, state) {
51+
return _buildLanguageSwitch(
52+
context,
53+
Theme.of(context),
54+
state,
55+
);
56+
},
57+
),
3758
TextButton(
38-
onPressed: () {
39-
setState(() {
40-
_themeMode = _themeMode == ThemeMode.light
41-
? ThemeMode.dark
42-
: ThemeMode.light;
43-
});
44-
},
59+
onPressed: () => setState(() {
60+
_themeMode = Theme.of(context).brightness == Brightness.light
61+
? ThemeMode.dark
62+
: ThemeMode.light;
63+
}),
4564
child: Icon(themeIcon, size: 20, color: colorScheme.onPrimary),
46-
),
65+
),
4766
],
4867
),
4968
),
@@ -56,11 +75,9 @@ class _MorazanAppState extends State<MorazanApp> {
5675
value: _actualSatelite,
5776
icon: Icon(Icons.expand_more,
5877
size: 24, color: colorScheme.outline),
59-
onChanged: (satelite) {
60-
setState(() {
61-
_actualSatelite = satelite!;
62-
});
63-
},
78+
onChanged: (satelite) => setState(() {
79+
_actualSatelite = satelite!;
80+
}),
6481
items: _satelites
6582
.map((satelite) => DropdownMenuItem(
6683
value: satelite,
@@ -69,11 +86,68 @@ class _MorazanAppState extends State<MorazanApp> {
6986
.toList(),
7087
),
7188
),
72-
SatelitesPage(satelite: _actualSatelite),
89+
SatelitesPage(satelite: _actualSatelite, key: UniqueKey()), // Use UniqueKey to force rebuild
7390
],
7491
),
7592
),
7693
),
7794
);
7895
}
96+
97+
Widget _buildLanguageSwitch(
98+
BuildContext context,
99+
ThemeData theme,
100+
LocaleState state,
101+
) {
102+
return Stack(
103+
children: [
104+
Align(
105+
alignment: Alignment.topRight,
106+
child: Padding(
107+
padding: const EdgeInsets.all(8.0),
108+
child: TextButton(
109+
onPressed: () {
110+
context.read<LocaleBloc>().add(
111+
ChangeLanguage(
112+
state.selectedLanguage == Language.english
113+
? Language.spanish
114+
: Language.english,
115+
),
116+
);
117+
},
118+
child: RichText(
119+
text: TextSpan(children: [
120+
TextSpan(
121+
text: "EN",
122+
style: TextStyle(
123+
fontSize: 18,
124+
color: state.selectedLanguage == Language.english
125+
? Colors.blue
126+
: const Color.fromARGB(255, 251, 250, 250),
127+
),
128+
),
129+
const TextSpan(
130+
text: " | ",
131+
style: TextStyle(
132+
fontSize: 18,
133+
color: Colors.black,
134+
),
135+
),
136+
TextSpan(
137+
text: "ES",
138+
style: TextStyle(
139+
fontSize: 18,
140+
color: state.selectedLanguage == Language.spanish
141+
? Colors.blue
142+
: const Color.fromARGB(255, 245, 245, 245),
143+
),
144+
),
145+
]),
146+
),
147+
),
148+
),
149+
),
150+
],
151+
);
152+
}
79153
}

lib/pages/satelites/satelites_widget.dart

+5-4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import 'package:morazan/util/constants.dart';
1111
class SatelitesPage extends StatefulWidget {
1212
final Satelites _satelite;
1313

14-
const SatelitesPage({super.key, required Satelites satelite})
15-
: _satelite = satelite;
14+
const SatelitesPage({Key? key, required Satelites satelite})
15+
: _satelite = satelite,
16+
super(key: key);
1617

1718
@override
1819
State<SatelitesPage> createState() => _SatelitesPageState();
@@ -62,11 +63,11 @@ class _SatelitesPageState extends State<SatelitesPage> {
6263
SolarRadiation(radiation: radiation),
6364
Temperature(temperature: temperature),
6465
Wind(velocity: windVelocity, direction: windDirection),
65-
Precipitation(precipitation: rainPrecipitation),
66+
PrecipitationWidget(precipitation: rainPrecipitation),
6667
],
6768
),
6869
);
6970
},
7071
);
7172
}
72-
}
73+
}

lib/util/language.dart

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import 'dart:ui';
2+
3+
enum Language { english, spanish }
4+
5+
extension LanguageExtension on Language {
6+
String get locale {
7+
switch (this) {
8+
case Language.english:
9+
return 'en';
10+
case Language.spanish:
11+
return 'es';
12+
default:
13+
return 'en';
14+
}
15+
}
16+
17+
String get name {
18+
switch (this) {
19+
case Language.english:
20+
return 'English';
21+
case Language.spanish:
22+
return 'Español';
23+
default:
24+
return 'English';
25+
}
26+
}
27+
28+
String get flag {
29+
switch (this) {
30+
case Language.english:
31+
return '🇺🇸';
32+
case Language.spanish:
33+
return '🇪🇸';
34+
default:
35+
return '🇺🇸';
36+
}
37+
}
38+
39+
Locale get localeValue {
40+
switch (this) {
41+
case Language.english:
42+
return const Locale('en', "US");
43+
case Language.spanish:
44+
return const Locale('es', "ES");
45+
default:
46+
return const Locale('en', "US");
47+
}
48+
}
49+
}

0 commit comments

Comments
 (0)