Farolero v0.2.0 — renombrado + i18n 18 idiomas
Renombrado de 'El Impostor' a 'Farolero'. Package: es.freetimelab.farolero 18 idiomas: es, en, fr, pt, de, it, ru, ja, ko, zh, zh_TW, ar, hi, tr, pl, nl, ca, eu Bancos de palabras: es (1000), en (1000), fr (1000) Pantalla de ajustes con selector de idioma 13138 líneas Dart, 0 issues
This commit is contained in:
24
README.md
24
README.md
@@ -1,20 +1,26 @@
|
||||
# El Impostor — Juego de deducción social
|
||||
# Farolero 🎭
|
||||
|
||||
Juego de fiesta para Android donde un grupo de jugadores debe encontrar al impostor.
|
||||
Todos conocen la palabra secreta menos el impostor, que debe fingir conocerla.
|
||||
Juego de deducción social para Android. ¿Quién finge saber la palabra secreta?
|
||||
|
||||
## Características
|
||||
- 3-20 jugadores, 1-4 impostores
|
||||
- Modo 1 móvil (pasa y mira) + multimóvil (Nearby Connections)
|
||||
- QR para conectar dispositivos (Bluetooth/WiFi Direct, sin internet)
|
||||
- 1000+ palabras en castellano organizadas por categorías
|
||||
- 1000+ palabras en castellano, inglés y francés (10 categorías)
|
||||
- 18 idiomas de interfaz
|
||||
- Notas privadas por jugador
|
||||
- Votación simultánea desde cada dispositivo
|
||||
- Pista opcional para el impostor
|
||||
- 100% offline, sin servidor externo
|
||||
|
||||
## Stack
|
||||
- Flutter (Dart)
|
||||
- Google Nearby Connections (P2P)
|
||||
- Package: es.freetimelab.farolero
|
||||
|
||||
## Build
|
||||
```bash
|
||||
flutter build apk --release
|
||||
flutter build appbundle --release
|
||||
```
|
||||
|
||||
## Desarrollado por
|
||||
FreeTTimeLab (freetimelab.es)
|
||||
|
||||
## Licencia
|
||||
Propietario — todos los derechos reservados
|
||||
|
||||
@@ -5,7 +5,7 @@ plugins {
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "es.freetimelab.elimpostor"
|
||||
namespace = "es.freetimelab.farolero"
|
||||
compileSdk = flutter.compileSdkVersion
|
||||
ndkVersion = flutter.ndkVersion
|
||||
|
||||
@@ -19,7 +19,7 @@ android {
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "es.freetimelab.elimpostor"
|
||||
applicationId = "es.freetimelab.farolero"
|
||||
minSdk = flutter.minSdkVersion
|
||||
targetSdk = 34
|
||||
versionCode = flutter.versionCode
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<uses-permission android:name="android.permission.CAMERA" />
|
||||
|
||||
<application
|
||||
android:label="El Impostor"
|
||||
android:label="Farolero"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher">
|
||||
<activity
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
arb-dir: lib/l10n
|
||||
template-arb-file: app_es.arb
|
||||
output-localization-file: app_localizations.dart
|
||||
output-class: AppLocalizations
|
||||
output-dir: lib/l10n/generated
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"@@locale": "de",
|
||||
|
||||
"appTitle": "Der Hochstapler",
|
||||
"appTitle": "Farolero",
|
||||
"subtitle": "Soziales Deduktionsspiel",
|
||||
"loadingWords": "Wörter werden geladen...",
|
||||
"playersRange": "3-20 Spieler • Ohne Internet",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"@@locale": "en",
|
||||
"appTitle": "The Impostor",
|
||||
"appTitle": "Farolero",
|
||||
"subtitle": "Social deduction game",
|
||||
"loadingWords": "Loading words...",
|
||||
"playersRange": "3-20 players • No internet needed",
|
||||
@@ -122,7 +122,7 @@
|
||||
"freeNote": "Free note",
|
||||
"freeNoteHint": "Personal notes...",
|
||||
"rulesTitle": "📖 How to play",
|
||||
"rulesWhatIsTitle": "🎭 What is The Impostor?",
|
||||
"rulesWhatIsTitle": "🎭 What is Farolero?",
|
||||
"rulesWhatIsBody": "A social deduction game for 3-20 players. Everyone receives a secret word... except the impostor! Your mission: figure out who's faking it.",
|
||||
"rulesHowToPlayTitle": "🔍 How do you play?",
|
||||
"rulesHowToPlayBody": "1. Roles are dealt: everyone receives the same word, except the impostor(s).\n\n2. Discussion: taking turns, each player describes the word WITHOUT saying it directly. The impostor must pretend they know it.\n\n3. Voting: once the discussion ends, everyone votes on who they think the impostor is.\n\n4. Elimination: the player with the most votes is eliminated and it is revealed whether they were the impostor or not.\n\n5. If they were the impostor, they can try to guess the word. If they get it right, the impostors win!",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"@@locale": "es",
|
||||
|
||||
"appTitle": "El Impostor",
|
||||
"appTitle": "Farolero",
|
||||
"subtitle": "Juego de deducción social",
|
||||
"loadingWords": "Cargando palabras...",
|
||||
"playersRange": "3-20 jugadores • Sin internet",
|
||||
@@ -185,7 +185,7 @@
|
||||
"freeNoteHint": "Apuntes personales...",
|
||||
|
||||
"rulesTitle": "📖 Cómo jugar",
|
||||
"rulesWhatIsTitle": "🎭 ¿Qué es El Impostor?",
|
||||
"rulesWhatIsTitle": "🎭 ¿Qué es Farolero?",
|
||||
"rulesWhatIsBody": "Un juego de deducción social para 3-20 jugadores. Todos reciben una palabra secreta... ¡excepto el impostor! Tu misión: descubrir quién finge.",
|
||||
"rulesHowToPlayTitle": "🔍 ¿Cómo se juega?",
|
||||
"rulesHowToPlayBody": "1. Se reparten los roles: todos reciben la misma palabra, excepto el/los impostores.\n\n2. Debate: por turnos, cada jugador describe la palabra SIN decirla directamente. El impostor debe fingir que la conoce.\n\n3. Votación: al terminar el debate, todos votan a quién creen que es el impostor.\n\n4. Eliminación: el más votado queda eliminado y se revela si era impostor o no.\n\n5. Si era impostor, puede intentar adivinar la palabra. Si acierta, ¡los impostores ganan!",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"@@locale": "fr",
|
||||
|
||||
"appTitle": "L'Imposteur",
|
||||
"appTitle": "Farolero",
|
||||
"subtitle": "Jeu de déduction sociale",
|
||||
"loadingWords": "Chargement des mots...",
|
||||
"playersRange": "3-20 joueurs • Sans internet",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"@@locale": "it",
|
||||
|
||||
"appTitle": "L'Impostore",
|
||||
"appTitle": "Farolero",
|
||||
"subtitle": "Gioco di deduzione sociale",
|
||||
"loadingWords": "Caricamento parole...",
|
||||
"playersRange": "3-20 giocatori • Senza internet",
|
||||
|
||||
@@ -132,7 +132,7 @@ abstract class AppLocalizations {
|
||||
/// No description provided for @appTitle.
|
||||
///
|
||||
/// In es, this message translates to:
|
||||
/// **'El Impostor'**
|
||||
/// **'Farolero'**
|
||||
String get appTitle;
|
||||
|
||||
/// No description provided for @subtitle.
|
||||
@@ -798,7 +798,7 @@ abstract class AppLocalizations {
|
||||
/// No description provided for @rulesWhatIsTitle.
|
||||
///
|
||||
/// In es, this message translates to:
|
||||
/// **'🎭 ¿Qué es El Impostor?'**
|
||||
/// **'🎭 ¿Qué es Farolero?'**
|
||||
String get rulesWhatIsTitle;
|
||||
|
||||
/// No description provided for @rulesWhatIsBody.
|
||||
|
||||
@@ -9,7 +9,7 @@ class AppLocalizationsDe extends AppLocalizations {
|
||||
AppLocalizationsDe([String locale = 'de']) : super(locale);
|
||||
|
||||
@override
|
||||
String get appTitle => 'Der Hochstapler';
|
||||
String get appTitle => 'Farolero';
|
||||
|
||||
@override
|
||||
String get subtitle => 'Soziales Deduktionsspiel';
|
||||
|
||||
@@ -9,7 +9,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
||||
|
||||
@override
|
||||
String get appTitle => 'The Impostor';
|
||||
String get appTitle => 'Farolero';
|
||||
|
||||
@override
|
||||
String get subtitle => 'Social deduction game';
|
||||
@@ -365,7 +365,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
||||
String get rulesTitle => '📖 How to play';
|
||||
|
||||
@override
|
||||
String get rulesWhatIsTitle => '🎭 What is The Impostor?';
|
||||
String get rulesWhatIsTitle => '🎭 What is Farolero?';
|
||||
|
||||
@override
|
||||
String get rulesWhatIsBody =>
|
||||
|
||||
@@ -9,7 +9,7 @@ class AppLocalizationsEs extends AppLocalizations {
|
||||
AppLocalizationsEs([String locale = 'es']) : super(locale);
|
||||
|
||||
@override
|
||||
String get appTitle => 'El Impostor';
|
||||
String get appTitle => 'Farolero';
|
||||
|
||||
@override
|
||||
String get subtitle => 'Juego de deducción social';
|
||||
@@ -366,7 +366,7 @@ class AppLocalizationsEs extends AppLocalizations {
|
||||
String get rulesTitle => '📖 Cómo jugar';
|
||||
|
||||
@override
|
||||
String get rulesWhatIsTitle => '🎭 ¿Qué es El Impostor?';
|
||||
String get rulesWhatIsTitle => '🎭 ¿Qué es Farolero?';
|
||||
|
||||
@override
|
||||
String get rulesWhatIsBody =>
|
||||
|
||||
@@ -9,7 +9,7 @@ class AppLocalizationsFr extends AppLocalizations {
|
||||
AppLocalizationsFr([String locale = 'fr']) : super(locale);
|
||||
|
||||
@override
|
||||
String get appTitle => 'L\'Imposteur';
|
||||
String get appTitle => 'Farolero';
|
||||
|
||||
@override
|
||||
String get subtitle => 'Jeu de déduction sociale';
|
||||
|
||||
@@ -9,7 +9,7 @@ class AppLocalizationsIt extends AppLocalizations {
|
||||
AppLocalizationsIt([String locale = 'it']) : super(locale);
|
||||
|
||||
@override
|
||||
String get appTitle => 'L\'Impostore';
|
||||
String get appTitle => 'Farolero';
|
||||
|
||||
@override
|
||||
String get subtitle => 'Gioco di deduzione sociale';
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'estado/estado_juego.dart';
|
||||
import 'servicios/servicio_idioma.dart';
|
||||
@@ -18,11 +18,11 @@ void main() {
|
||||
systemNavigationBarColor: TemaApp.colorFondo,
|
||||
),
|
||||
);
|
||||
runApp(const ElImpostorApp());
|
||||
runApp(const FaroleroApp());
|
||||
}
|
||||
|
||||
class ElImpostorApp extends StatelessWidget {
|
||||
const ElImpostorApp({super.key});
|
||||
class FaroleroApp extends StatelessWidget {
|
||||
const FaroleroApp({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -38,7 +38,7 @@ class ElImpostorApp extends StatelessWidget {
|
||||
child: Consumer<ServicioIdioma>(
|
||||
builder: (context, servicioIdioma, _) {
|
||||
return MaterialApp(
|
||||
title: 'El Impostor',
|
||||
title: 'Farolero',
|
||||
theme: TemaApp.obtenerTema(),
|
||||
debugShowCheckedModeBanner: false,
|
||||
locale: servicioIdioma.locale,
|
||||
@@ -74,7 +74,7 @@ class PantallaCarga extends StatelessWidget {
|
||||
const Text('🎭', style: TextStyle(fontSize: 72)),
|
||||
const SizedBox(height: 24),
|
||||
Text(
|
||||
l10n?.appTitle ?? 'El Impostor',
|
||||
l10n?.appTitle ?? 'Farolero',
|
||||
style: Theme.of(context).textTheme.headlineLarge,
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
|
||||
/// Categorías disponibles en el banco de palabras
|
||||
class BancoPalabras {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../servicios/servicio_idioma.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
@@ -120,7 +120,7 @@ class _PantallaAjustesState extends State<PantallaAjustes> {
|
||||
onPressed: () {
|
||||
showLicensePage(
|
||||
context: context,
|
||||
applicationName: 'El Impostor',
|
||||
applicationName: 'Farolero',
|
||||
applicationVersion: '1.0.0',
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../modelos/palabra.dart';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../modelos/palabra.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../servicios/servicio_notas.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
import 'pantalla_ajustes.dart';
|
||||
import 'pantalla_crear_partida.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
|
||||
class PantallaReglas extends StatelessWidget {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../modelos/partida.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
|
||||
class PantallaUnirse extends StatelessWidget {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../modelos/palabra.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:el_impostor/l10n/generated/app_localizations.dart';
|
||||
import 'package:farolero/l10n/generated/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import '../estado/estado_juego.dart';
|
||||
import '../tema/tema_app.dart';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: el_impostor
|
||||
description: "El Impostor - Juego de deducción social"
|
||||
name: farolero
|
||||
description: "Farolero — Juego de deducción social. ¿Quién finge saber?"
|
||||
publish_to: 'none'
|
||||
version: 1.0.0+1
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:el_impostor/main.dart';
|
||||
import 'package:farolero/main.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('App carga correctamente', (WidgetTester tester) async {
|
||||
await tester.pumpWidget(const ElImpostorApp());
|
||||
await tester.pumpWidget(const FaroleroApp());
|
||||
expect(find.text('El Impostor'), findsOneWidget);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user