v0.2.0: i18n 18 idiomas + pantalla ajustes + bancos multiidioma
Internacionalización completa: - 18 ficheros .arb: es, en, fr, pt, de, it, ru, ja, ko, zh, zh_TW, ar, hi, tr, pl, nl, ca, eu - Todos los strings extraídos de todas las pantallas - Detección automática de idioma del sistema - Selector manual en pantalla de ajustes Pantalla de ajustes nueva: - Selector de idioma con banderas emoji - Vibración ON/OFF - Acerca de (versión, desarrollador) Bancos de palabras multiidioma: - palabras.json (castellano, 1000 palabras) - palabras_en.json (inglés, 1000 palabras) - palabras_fr.json (francés, 1000 palabras) - Fallback a castellano si no hay banco del idioma 13138 líneas Dart, 39 ficheros, 0 issues en flutter analyze
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../servicios/servicio_notas.dart';
|
||||
@@ -57,6 +58,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
final estado = context.watch<EstadoJuego>();
|
||||
final partida = estado.partida;
|
||||
if (partida == null) return const SizedBox.shrink();
|
||||
@@ -68,7 +70,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: const Text('📝 Notas'),
|
||||
title: Text(l10n.notesTitle),
|
||||
actions: [
|
||||
if (_jugadorSeleccionadoId != null)
|
||||
IconButton(
|
||||
@@ -77,7 +79,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
await _guardarNotas();
|
||||
if (context.mounted) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('Notas guardadas')),
|
||||
SnackBar(content: Text(l10n.notesSaved)),
|
||||
);
|
||||
}
|
||||
},
|
||||
@@ -91,18 +93,20 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
}
|
||||
|
||||
Widget _construirSelectorJugador(dynamic partida) {
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'¿Quién eres?',
|
||||
l10n.whoAreYou,
|
||||
style: Theme.of(context).textTheme.headlineMedium,
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
Text(
|
||||
'Selecciona tu nombre para ver tus notas privadas',
|
||||
l10n.selectYourName,
|
||||
style: Theme.of(context).textTheme.bodyMedium,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
@@ -142,6 +146,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
}
|
||||
|
||||
final l10n = AppLocalizations.of(context)!;
|
||||
final jugadorActual = partida.jugadores
|
||||
.firstWhere((j) => j.id == _jugadorSeleccionadoId);
|
||||
|
||||
@@ -167,7 +172,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
},
|
||||
),
|
||||
Text(
|
||||
'Notas de ${jugadorActual.nombre}',
|
||||
l10n.notesOf(jugadorActual.nombre),
|
||||
style: Theme.of(context).textTheme.titleLarge,
|
||||
),
|
||||
],
|
||||
@@ -176,7 +181,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
|
||||
// Notas por jugador
|
||||
Text(
|
||||
'Apuntes sobre cada jugador',
|
||||
l10n.notesAboutPlayers,
|
||||
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
||||
color: TemaApp.colorTextoSecundario,
|
||||
),
|
||||
@@ -190,7 +195,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
decoration: InputDecoration(
|
||||
labelText: j.nombre,
|
||||
prefixIcon: const Icon(Icons.person, size: 20),
|
||||
hintText: '¿Qué ha dicho? ¿Sospechoso?',
|
||||
hintText: l10n.playerNoteHint,
|
||||
),
|
||||
maxLines: 2,
|
||||
minLines: 1,
|
||||
@@ -200,7 +205,7 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
'Nota libre',
|
||||
l10n.freeNote,
|
||||
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
||||
color: TemaApp.colorTextoSecundario,
|
||||
),
|
||||
@@ -208,9 +213,9 @@ class _PantallaNotasState extends State<PantallaNotas> {
|
||||
const SizedBox(height: 8),
|
||||
TextField(
|
||||
controller: _controladorNotaLibre,
|
||||
decoration: const InputDecoration(
|
||||
hintText: 'Apuntes personales...',
|
||||
prefixIcon: Icon(Icons.note, size: 20),
|
||||
decoration: InputDecoration(
|
||||
hintText: l10n.freeNoteHint,
|
||||
prefixIcon: const Icon(Icons.note, size: 20),
|
||||
),
|
||||
maxLines: 5,
|
||||
minLines: 3,
|
||||
|
||||
Reference in New Issue
Block a user