Cambio de icono y traducciones

This commit is contained in:
2026-05-11 18:05:13 +02:00
parent 4bf8a01a20
commit 112a8a6142
58 changed files with 996 additions and 147 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="ic_launcher_background">#1A1040</color> <color name="ic_launcher_background">#05080D</color>
</resources> </resources>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -271,5 +271,30 @@
"profileName": "الاسم", "profileName": "الاسم",
"profileNick": "اللقب", "profileNick": "اللقب",
"save": "حفظ", "save": "حفظ",
"automaticLanguage": "تلقائي" "automaticLanguage": "تلقائي",
"noSavedGames": "لا توجد مباريات محفوظة بعد.",
"errorNoGame": "خطأ: لا توجد مباراة",
"disconnectedPlayersWarning": "يوجد لاعبون بأجهزة غير متصلة.",
"assumeOnThisPhone": "تولّي على هذا الهاتف",
"noResult": "لا توجد نتيجة",
"historyGameSummary": "$players لاعبون • $impostors محتالون • $rounds جولات\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Nom", "profileName": "Nom",
"profileNick": "Àlies", "profileNick": "Àlies",
"save": "Desa", "save": "Desa",
"automaticLanguage": "Automàtic" "automaticLanguage": "Automàtic",
"noSavedGames": "Encara no hi ha partides desades.",
"errorNoGame": "Error: no hi ha partida",
"disconnectedPlayersWarning": "Hi ha jugadors amb el dispositiu desconnectat.",
"assumeOnThisPhone": "Assumir en aquest mòbil",
"noResult": "Sense resultat",
"historyGameSummary": "$players jugadors • $impostors impostor(s) • $rounds ronda(es)\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Name", "profileName": "Name",
"profileNick": "Nickname", "profileNick": "Nickname",
"save": "Speichern", "save": "Speichern",
"automaticLanguage": "Automatisch" "automaticLanguage": "Automatisch",
"noSavedGames": "Es gibt noch keine gespeicherten Partien.",
"errorNoGame": "Fehler: Keine Partie",
"disconnectedPlayersWarning": "Einige Spieler haben ein getrenntes Gerät.",
"assumeOnThisPhone": "Auf diesem Handy übernehmen",
"noResult": "Kein Ergebnis",
"historyGameSummary": "$players Spieler • $impostors Verräter • $rounds Runden\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -303,5 +303,30 @@
"profileName": "Name", "profileName": "Name",
"profileNick": "Nick", "profileNick": "Nick",
"save": "Save", "save": "Save",
"automaticLanguage": "Automatic" "automaticLanguage": "Automatic",
"noSavedGames": "No saved games yet.",
"errorNoGame": "Error: no game",
"disconnectedPlayersWarning": "Some players have a disconnected device.",
"assumeOnThisPhone": "Take over on this phone",
"noResult": "No result",
"historyGameSummary": "$players players • $impostors impostor(s) • $rounds round(s)\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -339,5 +339,30 @@
"profileName": "Nombre", "profileName": "Nombre",
"profileNick": "Nick", "profileNick": "Nick",
"save": "Guardar", "save": "Guardar",
"automaticLanguage": "Automático" "automaticLanguage": "Automático",
"noSavedGames": "Todavía no hay partidas guardadas.",
"errorNoGame": "Error: sin partida",
"disconnectedPlayersWarning": "Hay jugadores con el dispositivo desconectado.",
"assumeOnThisPhone": "Asumir en este móvil",
"noResult": "Sin resultado",
"historyGameSummary": "$players jugadores • $impostors impostor(es) • $rounds ronda(s)\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Izena", "profileName": "Izena",
"profileNick": "Ezizena", "profileNick": "Ezizena",
"save": "Gorde", "save": "Gorde",
"automaticLanguage": "Automatikoa" "automaticLanguage": "Automatikoa",
"noSavedGames": "Oraindik ez dago gordetako partidarik.",
"errorNoGame": "Errorea: partidarik ez",
"disconnectedPlayersWarning": "Jokalari batzuek gailua deskonektatuta dute.",
"assumeOnThisPhone": "Hartu mugikor honetan",
"noResult": "Emaitzarik ez",
"historyGameSummary": "$players jokalari • $impostors inpostore • $rounds txanda\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Nom", "profileName": "Nom",
"profileNick": "Pseudo", "profileNick": "Pseudo",
"save": "Enregistrer", "save": "Enregistrer",
"automaticLanguage": "Automatique" "automaticLanguage": "Automatique",
"noSavedGames": "Aucune partie enregistrée pour le moment.",
"errorNoGame": "Erreur : aucune partie",
"disconnectedPlayersWarning": "Des joueurs ont un appareil déconnecté.",
"assumeOnThisPhone": "Reprendre sur ce mobile",
"noResult": "Aucun résultat",
"historyGameSummary": "$players joueurs • $impostors imposteur(s) • $rounds manche(s)\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "नाम", "profileName": "नाम",
"profileNick": "निकनेम", "profileNick": "निकनेम",
"save": "सहेजें", "save": "सहेजें",
"automaticLanguage": "स्वचालित" "automaticLanguage": "स्वचालित",
"noSavedGames": "अभी तक कोई गेम सेव नहीं है।",
"errorNoGame": "त्रुटि: कोई गेम नहीं",
"disconnectedPlayersWarning": "कुछ खिलाड़ियों का डिवाइस डिसकनेक्ट है।",
"assumeOnThisPhone": "इस फ़ोन पर संभालें",
"noResult": "कोई परिणाम नहीं",
"historyGameSummary": "$players खिलाड़ी • $impostors इम्पोस्टर • $rounds राउंड\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Nome", "profileName": "Nome",
"profileNick": "Nick", "profileNick": "Nick",
"save": "Salva", "save": "Salva",
"automaticLanguage": "Automatico" "automaticLanguage": "Automatico",
"noSavedGames": "Non ci sono ancora partite salvate.",
"errorNoGame": "Errore: nessuna partita",
"disconnectedPlayersWarning": "Alcuni giocatori hanno il dispositivo disconnesso.",
"assumeOnThisPhone": "Assumi su questo telefono",
"noResult": "Nessun risultato",
"historyGameSummary": "$players giocatori • $impostors impostore/i • $rounds round\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "名前", "profileName": "名前",
"profileNick": "ニックネーム", "profileNick": "ニックネーム",
"save": "保存", "save": "保存",
"automaticLanguage": "自動" "automaticLanguage": "自動",
"noSavedGames": "保存されたゲームはまだありません。",
"errorNoGame": "エラー: ゲームがありません",
"disconnectedPlayersWarning": "接続が切れた端末のプレイヤーがいます。",
"assumeOnThisPhone": "このスマホで引き継ぐ",
"noResult": "結果なし",
"historyGameSummary": "$players人 • インポスター$impostors人 • $roundsラウンド\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "이름", "profileName": "이름",
"profileNick": "닉네임", "profileNick": "닉네임",
"save": "저장", "save": "저장",
"automaticLanguage": "자동" "automaticLanguage": "자동",
"noSavedGames": "아직 저장된 게임이 없습니다.",
"errorNoGame": "오류: 게임 없음",
"disconnectedPlayersWarning": "기기가 연결 해제된 플레이어가 있습니다.",
"assumeOnThisPhone": "이 휴대폰에서 맡기",
"noResult": "결과 없음",
"historyGameSummary": "플레이어 $players명 • 임포스터 $impostors명 • $rounds라운드\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Naam", "profileName": "Naam",
"profileNick": "Nickname", "profileNick": "Nickname",
"save": "Opslaan", "save": "Opslaan",
"automaticLanguage": "Automatisch" "automaticLanguage": "Automatisch",
"noSavedGames": "Er zijn nog geen opgeslagen spellen.",
"errorNoGame": "Fout: geen spel",
"disconnectedPlayersWarning": "Sommige spelers hebben een losgekoppeld apparaat.",
"assumeOnThisPhone": "Overnemen op deze mobiel",
"noResult": "Geen resultaat",
"historyGameSummary": "$players spelers • $impostors impostor(s) • $rounds ronde(s)\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Nazwa", "profileName": "Nazwa",
"profileNick": "Nick", "profileNick": "Nick",
"save": "Zapisz", "save": "Zapisz",
"automaticLanguage": "Automatycznie" "automaticLanguage": "Automatycznie",
"noSavedGames": "Nie ma jeszcze zapisanych gier.",
"errorNoGame": "Błąd: brak gry",
"disconnectedPlayersWarning": "Niektórzy gracze mają rozłączone urządzenie.",
"assumeOnThisPhone": "Przejmij na tym telefonie",
"noResult": "Brak wyniku",
"historyGameSummary": "$players graczy • $impostors impostor(ów) • $rounds rund\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Nome", "profileName": "Nome",
"profileNick": "Nick", "profileNick": "Nick",
"save": "Guardar", "save": "Guardar",
"automaticLanguage": "Automático" "automaticLanguage": "Automático",
"noSavedGames": "Ainda não há partidas guardadas.",
"errorNoGame": "Erro: sem partida",
"disconnectedPlayersWarning": "Há jogadores com o dispositivo desligado.",
"assumeOnThisPhone": "Assumir neste telemóvel",
"noResult": "Sem resultado",
"historyGameSummary": "$players jogadores • $impostors impostor(es) • $rounds ronda(s)\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Имя", "profileName": "Имя",
"profileNick": "Ник", "profileNick": "Ник",
"save": "Сохранить", "save": "Сохранить",
"automaticLanguage": "Автоматически" "automaticLanguage": "Автоматически",
"noSavedGames": "Сохранённых игр пока нет.",
"errorNoGame": "Ошибка: нет игры",
"disconnectedPlayersWarning": "У некоторых игроков устройство отключено.",
"assumeOnThisPhone": "Взять на этом телефоне",
"noResult": "Нет результата",
"historyGameSummary": "$players игроков • $impostors самозванцев • $rounds раундов\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "Ad", "profileName": "Ad",
"profileNick": "Takma ad", "profileNick": "Takma ad",
"save": "Kaydet", "save": "Kaydet",
"automaticLanguage": "Otomatik" "automaticLanguage": "Otomatik",
"noSavedGames": "Henüz kaydedilmiş oyun yok.",
"errorNoGame": "Hata: oyun yok",
"disconnectedPlayersWarning": "Bazı oyuncuların cihazı bağlantısız.",
"assumeOnThisPhone": "Bu telefonda devral",
"noResult": "Sonuç yok",
"historyGameSummary": "$players oyuncu • $impostors sahtekar • $rounds tur\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "名称", "profileName": "名称",
"profileNick": "昵称", "profileNick": "昵称",
"save": "保存", "save": "保存",
"automaticLanguage": "自动" "automaticLanguage": "自动",
"noSavedGames": "还没有保存的游戏。",
"errorNoGame": "错误:没有游戏",
"disconnectedPlayersWarning": "有玩家的设备已断开连接。",
"assumeOnThisPhone": "在此手机上接管",
"noResult": "无结果",
"historyGameSummary": "$players 名玩家 • $impostors 名冒牌者 • $rounds 回合\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -271,5 +271,30 @@
"profileName": "名稱", "profileName": "名稱",
"profileNick": "暱稱", "profileNick": "暱稱",
"save": "儲存", "save": "儲存",
"automaticLanguage": "自動" "automaticLanguage": "自動",
"noSavedGames": "尚未有已儲存的遊戲。",
"errorNoGame": "錯誤:沒有遊戲",
"disconnectedPlayersWarning": "有玩家的裝置已中斷連線。",
"assumeOnThisPhone": "在此手機上接管",
"noResult": "無結果",
"historyGameSummary": "$players 位玩家 • $impostors 位冒牌者 • $rounds 回合\n$word • $category",
"@historyGameSummary": {
"placeholders": {
"players": {
"type": "int"
},
"impostors": {
"type": "int"
},
"rounds": {
"type": "int"
},
"word": {
"type": "String"
},
"category": {
"type": "String"
}
}
}
} }

View File

@@ -1409,4 +1409,16 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
String get save; String get save;
String get automaticLanguage; String get automaticLanguage;
String get noSavedGames;
String get errorNoGame;
String get disconnectedPlayersWarning;
String get assumeOnThisPhone;
String get noResult;
String historyGameSummary(int players, int impostors, int rounds, String word, String category);
} }

View File

@@ -727,4 +727,24 @@ class AppLocalizationsAr extends AppLocalizations {
@override @override
String get automaticLanguage => 'تلقائي'; String get automaticLanguage => 'تلقائي';
@override
String get noSavedGames => 'لا توجد مباريات محفوظة بعد.';
@override
String get errorNoGame => 'خطأ: لا توجد مباراة';
@override
String get disconnectedPlayersWarning => 'يوجد لاعبون بأجهزة غير متصلة.';
@override
String get assumeOnThisPhone => 'تولّي على هذا الهاتف';
@override
String get noResult => 'لا توجد نتيجة';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players لاعبون • $impostors محتالون • $rounds جولات\n$word$category';
}
} }

View File

@@ -730,4 +730,24 @@ class AppLocalizationsCa extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automàtic'; String get automaticLanguage => 'Automàtic';
@override
String get noSavedGames => 'Encara no hi ha partides desades.';
@override
String get errorNoGame => 'Error: no hi ha partida';
@override
String get disconnectedPlayersWarning => 'Hi ha jugadors amb el dispositiu desconnectat.';
@override
String get assumeOnThisPhone => 'Assumir en aquest mòbil';
@override
String get noResult => 'Sense resultat';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players jugadors • $impostors impostor(s) • $rounds ronda(es)\n$word$category';
}
} }

View File

@@ -733,4 +733,24 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatisch'; String get automaticLanguage => 'Automatisch';
@override
String get noSavedGames => 'Es gibt noch keine gespeicherten Partien.';
@override
String get errorNoGame => 'Fehler: Keine Partie';
@override
String get disconnectedPlayersWarning => 'Einige Spieler haben ein getrenntes Gerät.';
@override
String get assumeOnThisPhone => 'Auf diesem Handy übernehmen';
@override
String get noResult => 'Kein Ergebnis';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players Spieler • $impostors Verräter • $rounds Runden\n$word$category';
}
} }

View File

@@ -727,4 +727,24 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatic'; String get automaticLanguage => 'Automatic';
@override
String get noSavedGames => 'No saved games yet.';
@override
String get errorNoGame => 'Error: no game';
@override
String get disconnectedPlayersWarning => 'Some players have a disconnected device.';
@override
String get assumeOnThisPhone => 'Take over on this phone';
@override
String get noResult => 'No result';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players players • $impostors impostor(s) • $rounds round(s)\n$word$category';
}
} }

View File

@@ -729,4 +729,24 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automático'; String get automaticLanguage => 'Automático';
@override
String get noSavedGames => 'Todavía no hay partidas guardadas.';
@override
String get errorNoGame => 'Error: sin partida';
@override
String get disconnectedPlayersWarning => 'Hay jugadores con el dispositivo desconectado.';
@override
String get assumeOnThisPhone => 'Asumir en este móvil';
@override
String get noResult => 'Sin resultado';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players jugadores • $impostors impostor(es) • $rounds ronda(s)\n$word$category';
}
} }

View File

@@ -732,4 +732,24 @@ class AppLocalizationsEu extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatikoa'; String get automaticLanguage => 'Automatikoa';
@override
String get noSavedGames => 'Oraindik ez dago gordetako partidarik.';
@override
String get errorNoGame => 'Errorea: partidarik ez';
@override
String get disconnectedPlayersWarning => 'Jokalari batzuek gailua deskonektatuta dute.';
@override
String get assumeOnThisPhone => 'Hartu mugikor honetan';
@override
String get noResult => 'Emaitzarik ez';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players jokalari • $impostors inpostore • $rounds txanda\n$word$category';
}
} }

View File

@@ -730,4 +730,24 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatique'; String get automaticLanguage => 'Automatique';
@override
String get noSavedGames => 'Aucune partie enregistrée pour le moment.';
@override
String get errorNoGame => 'Erreur : aucune partie';
@override
String get disconnectedPlayersWarning => 'Des joueurs ont un appareil déconnecté.';
@override
String get assumeOnThisPhone => 'Reprendre sur ce mobile';
@override
String get noResult => 'Aucun résultat';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players joueurs • $impostors imposteur(s) • $rounds manche(s)\n$word$category';
}
} }

View File

@@ -729,4 +729,24 @@ class AppLocalizationsHi extends AppLocalizations {
@override @override
String get automaticLanguage => 'स्वचालित'; String get automaticLanguage => 'स्वचालित';
@override
String get noSavedGames => 'अभी तक कोई गेम सेव नहीं है।';
@override
String get errorNoGame => 'त्रुटि: कोई गेम नहीं';
@override
String get disconnectedPlayersWarning => 'कुछ खिलाड़ियों का डिवाइस डिसकनेक्ट है।';
@override
String get assumeOnThisPhone => 'इस फ़ोन पर संभालें';
@override
String get noResult => 'कोई परिणाम नहीं';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players खिलाड़ी • $impostors इम्पोस्टर • $rounds राउंड\n$word$category';
}
} }

View File

@@ -730,4 +730,24 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatico'; String get automaticLanguage => 'Automatico';
@override
String get noSavedGames => 'Non ci sono ancora partite salvate.';
@override
String get errorNoGame => 'Errore: nessuna partita';
@override
String get disconnectedPlayersWarning => 'Alcuni giocatori hanno il dispositivo disconnesso.';
@override
String get assumeOnThisPhone => 'Assumi su questo telefono';
@override
String get noResult => 'Nessun risultato';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players giocatori • $impostors impostore/i • $rounds round\n$word$category';
}
} }

View File

@@ -727,4 +727,24 @@ class AppLocalizationsJa extends AppLocalizations {
@override @override
String get automaticLanguage => '自動'; String get automaticLanguage => '自動';
@override
String get noSavedGames => '保存されたゲームはまだありません。';
@override
String get errorNoGame => 'エラー: ゲームがありません';
@override
String get disconnectedPlayersWarning => '接続が切れた端末のプレイヤーがいます。';
@override
String get assumeOnThisPhone => 'このスマホで引き継ぐ';
@override
String get noResult => '結果なし';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players人 • インポスター$impostors人$roundsラウンド\n$word$category';
}
} }

View File

@@ -727,4 +727,24 @@ class AppLocalizationsKo extends AppLocalizations {
@override @override
String get automaticLanguage => '자동'; String get automaticLanguage => '자동';
@override
String get noSavedGames => '아직 저장된 게임이 없습니다.';
@override
String get errorNoGame => '오류: 게임 없음';
@override
String get disconnectedPlayersWarning => '기기가 연결 해제된 플레이어가 있습니다.';
@override
String get assumeOnThisPhone => '이 휴대폰에서 맡기';
@override
String get noResult => '결과 없음';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '플레이어 $players명 • 임포스터 $impostors명$rounds라운드\n$word$category';
}
} }

View File

@@ -730,4 +730,24 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatisch'; String get automaticLanguage => 'Automatisch';
@override
String get noSavedGames => 'Er zijn nog geen opgeslagen spellen.';
@override
String get errorNoGame => 'Fout: geen spel';
@override
String get disconnectedPlayersWarning => 'Sommige spelers hebben een losgekoppeld apparaat.';
@override
String get assumeOnThisPhone => 'Overnemen op deze mobiel';
@override
String get noResult => 'Geen resultaat';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players spelers • $impostors impostor(s) • $rounds ronde(s)\n$word$category';
}
} }

View File

@@ -730,4 +730,24 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automatycznie'; String get automaticLanguage => 'Automatycznie';
@override
String get noSavedGames => 'Nie ma jeszcze zapisanych gier.';
@override
String get errorNoGame => 'Błąd: brak gry';
@override
String get disconnectedPlayersWarning => 'Niektórzy gracze mają rozłączone urządzenie.';
@override
String get assumeOnThisPhone => 'Przejmij na tym telefonie';
@override
String get noResult => 'Brak wyniku';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players graczy • $impostors impostor(ów) • $rounds rund\n$word$category';
}
} }

View File

@@ -731,4 +731,24 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get automaticLanguage => 'Automático'; String get automaticLanguage => 'Automático';
@override
String get noSavedGames => 'Ainda não há partidas guardadas.';
@override
String get errorNoGame => 'Erro: sem partida';
@override
String get disconnectedPlayersWarning => 'Há jogadores com o dispositivo desligado.';
@override
String get assumeOnThisPhone => 'Assumir neste telemóvel';
@override
String get noResult => 'Sem resultado';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players jogadores • $impostors impostor(es) • $rounds ronda(s)\n$word$category';
}
} }

View File

@@ -730,4 +730,24 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get automaticLanguage => 'Автоматически'; String get automaticLanguage => 'Автоматически';
@override
String get noSavedGames => 'Сохранённых игр пока нет.';
@override
String get errorNoGame => 'Ошибка: нет игры';
@override
String get disconnectedPlayersWarning => 'У некоторых игроков устройство отключено.';
@override
String get assumeOnThisPhone => 'Взять на этом телефоне';
@override
String get noResult => 'Нет результата';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players игроков • $impostors самозванцев • $rounds раундов\n$word$category';
}
} }

View File

@@ -729,4 +729,24 @@ class AppLocalizationsTr extends AppLocalizations {
@override @override
String get automaticLanguage => 'Otomatik'; String get automaticLanguage => 'Otomatik';
@override
String get noSavedGames => 'Henüz kaydedilmiş oyun yok.';
@override
String get errorNoGame => 'Hata: oyun yok';
@override
String get disconnectedPlayersWarning => 'Bazı oyuncuların cihazı bağlantısız.';
@override
String get assumeOnThisPhone => 'Bu telefonda devral';
@override
String get noResult => 'Sonuç yok';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players oyuncu • $impostors sahtekar • $rounds tur\n$word$category';
}
} }

View File

@@ -726,6 +726,26 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get automaticLanguage => '自动'; String get automaticLanguage => '自动';
@override
String get noSavedGames => '还没有保存的游戏。';
@override
String get errorNoGame => '错误:没有游戏';
@override
String get disconnectedPlayersWarning => '有玩家的设备已断开连接。';
@override
String get assumeOnThisPhone => '在此手机上接管';
@override
String get noResult => '无结果';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players 名玩家 • $impostors 名冒牌者 • $rounds 回合\n$word$category';
}
} }
/// The translations for Chinese, as used in Taiwan (`zh_TW`). /// The translations for Chinese, as used in Taiwan (`zh_TW`).
@@ -1322,4 +1342,24 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override @override
String get automaticLanguage => '自動'; String get automaticLanguage => '自動';
@override
String get noSavedGames => '尚未有已儲存的遊戲。';
@override
String get errorNoGame => '錯誤:沒有遊戲';
@override
String get disconnectedPlayersWarning => '有玩家的裝置已中斷連線。';
@override
String get assumeOnThisPhone => '在此手機上接管';
@override
String get noResult => '無結果';
@override
String historyGameSummary(int players, int impostors, int rounds, String word, String category) {
return '$players 位玩家 • $impostors 位冒牌者 • $rounds 回合\n$word$category';
}
} }

View File

@@ -94,6 +94,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
void _avanzarAFase(FaseJuego fase) { void _avanzarAFase(FaseJuego fase) {
final estado = context.read<EstadoJuego>(); final estado = context.read<EstadoJuego>();
final nearby = context.read<ServicioNearby>(); final nearby = context.read<ServicioNearby>();
final l10n = AppLocalizations.of(context)!;
switch (fase) { switch (fase) {
case FaseJuego.debate: case FaseJuego.debate:
@@ -122,7 +123,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
_snapshot( _snapshot(
fase: 'resultado', fase: 'resultado',
resultadoActual: resultado, resultadoActual: resultado,
mensaje: _mensajeSiguienteAccion(estado, resultado), mensaje: _mensajeSiguienteAccion(estado, resultado, l10n),
).toJson(), ).toJson(),
); );
} }
@@ -142,7 +143,10 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
if (partida == null) { if (partida == null) {
return Scaffold( return Scaffold(
appBar: AppBar(title: Text(l10n.hostGame)), appBar: AppBar(title: Text(l10n.hostGame)),
body: const Center(child: Text('Error: Sin partida')), body: FondoFarolero(
intenso: true,
child: Center(child: Text(l10n.errorNoGame)),
),
); );
} }
@@ -259,7 +263,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
const SizedBox(width: 8), const SizedBox(width: 8),
Expanded( Expanded(
child: Text( child: Text(
'Hay jugadores con el dispositivo desconectado.', AppLocalizations.of(context)!.disconnectedPlayersWarning,
style: Theme.of(context).textTheme.titleSmall, style: Theme.of(context).textTheme.titleSmall,
), ),
), ),
@@ -276,7 +280,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
child: OutlinedButton.icon( child: OutlinedButton.icon(
onPressed: () => nearby.asumirUsuariosDesconectados(), onPressed: () => nearby.asumirUsuariosDesconectados(),
icon: const Icon(Icons.person_add_alt_1), icon: const Icon(Icons.person_add_alt_1),
label: const Text('Asumir en este móvil'), label: Text(AppLocalizations.of(context)!.assumeOnThisPhone),
), ),
), ),
], ],
@@ -347,7 +351,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
case FaseJuego.finPartida: case FaseJuego.finPartida:
return _buildFaseFinOnline(context, l10n); return _buildFaseFinOnline(context, l10n);
default: default:
return const Center(child: Text('Fin de la partida')); return Center(child: Text(l10n.gameOver));
} }
} }
@@ -374,15 +378,16 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
String _mensajeSiguienteAccion( String _mensajeSiguienteAccion(
EstadoJuego estado, EstadoJuego estado,
ResultadoVotacion resultado, ResultadoVotacion resultado,
AppLocalizations l10n,
) { ) {
final partida = estado.partida; final partida = estado.partida;
if (partida != null && _hayFinTrasVotacion(partida)) { if (partida != null && _hayFinTrasVotacion(partida)) {
return 'La partida ha terminado.'; return l10n.gameOver;
} }
if (resultado.eraImpostor) { if (resultado.eraImpostor) {
return 'El impostor eliminado puede intentar adivinar la palabra.'; return l10n.impostorCanGuess.replaceAll('\n', ' ');
} }
return 'La partida continúa en la siguiente ronda.'; return l10n.gameContinues;
} }
bool _hayFinTrasVotacion(Partida partida) { bool _hayFinTrasVotacion(Partida partida) {
@@ -750,7 +755,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
? partida!.historialVotaciones.last ? partida!.historialVotaciones.last
: null; : null;
if (partida == null || resultado == null) { if (partida == null || resultado == null) {
return const Center(child: Text('Sin resultado')); return Center(child: Text(l10n.noResult));
} }
final conteo = <String, int>{}; final conteo = <String, int>{};

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:farolero/l10n/generated/app_localizations.dart';
import '../servicios/servicio_historial_partidas.dart'; import '../servicios/servicio_historial_partidas.dart';
import '../tema/componentes_farolero.dart'; import '../tema/componentes_farolero.dart';
@@ -10,52 +11,98 @@ class PantallaHistorial extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final historial = context.watch<ServicioHistorialPartidas>(); final historial = context.watch<ServicioHistorialPartidas>();
final partidas = historial.partidas; final partidas = historial.partidas;
return Scaffold( return Scaffold(
appBar: AppBar(title: const Text('Historial')), appBar: AppBar(title: Text(l10n.history)),
body: FondoFarolero( body: FondoFarolero(
intenso: true, intenso: true,
child: partidas.isEmpty child: partidas.isEmpty
? const Center(child: Text('Todavía no hay partidas guardadas.')) ? Center(
: ListView.builder( child: Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(20),
itemCount: partidas.length, child: EstadoVacioFarolero(
itemBuilder: (context, index) { icono: Icons.history_rounded,
final partida = partidas[index]; titulo: l10n.history,
final ganaronJugadores = partida.ganador == 'jugadores'; subtitulo: l10n.noSavedGames,
final dia = ),
partida.fecha.day.toString().padLeft(2, '0'); ),
final mes = )
partida.fecha.month.toString().padLeft(2, '0'); : SafeArea(
return Card( top: false,
child: ListTile( child: ListView.separated(
leading: CircleAvatar( padding: const EdgeInsets.fromLTRB(16, 12, 16, 24),
backgroundColor: ganaronJugadores itemCount: partidas.length,
? TemaApp.colorVerde separatorBuilder: (_, __) => const SizedBox(height: 12),
: TemaApp.colorAcento, itemBuilder: (context, index) {
child: Icon( final partida = partidas[index];
ganaronJugadores ? Icons.groups : Icons.theater_comedy, final ganaronJugadores = partida.ganador == 'jugadores';
color: Colors.white, final color = ganaronJugadores
), ? TemaApp.colorVerde
: TemaApp.colorAcento;
final dia = partida.fecha.day.toString().padLeft(2, '0');
final mes = partida.fecha.month.toString().padLeft(2, '0');
return PanelFarolero(
padding: const EdgeInsets.all(14),
borderColor: color.withValues(alpha: 0.48),
child: Row(
children: [
Container(
width: 52,
height: 52,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: color.withValues(alpha: 0.18),
border: Border.all(color: color),
),
child: Icon(
ganaronJugadores
? Icons.groups_rounded
: Icons.theater_comedy_rounded,
color: color,
),
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
ganaronJugadores
? l10n.playersWin
: l10n.impostorsWin,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.titleMedium,
),
const SizedBox(height: 4),
Text(
l10n.historyGameSummary(
partida.jugadores,
partida.impostores,
partida.rondas,
partida.palabra,
partida.categoria,
),
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.bodyMedium,
),
],
),
),
const SizedBox(width: 12),
Text(
'$dia/$mes',
style: Theme.of(context).textTheme.bodySmall,
),
],
), ),
title: Text( );
ganaronJugadores },
? 'Ganaron los jugadores' ),
: 'Ganaron los impostores',
),
subtitle: Text(
'${partida.jugadores} jugadores · ${partida.impostores} impostor(es) · ${partida.rondas} ronda(s)\n${partida.palabra} · ${partida.categoria}',
),
isThreeLine: true,
trailing: Text(
'$dia/$mes',
style: Theme.of(context).textTheme.bodySmall,
),
),
);
},
), ),
), ),
); );

View File

@@ -14,82 +14,54 @@ class PantallaReglas extends StatelessWidget {
appBar: AppBar(title: Text(l10n.rulesTitle)), appBar: AppBar(title: Text(l10n.rulesTitle)),
body: FondoFarolero( body: FondoFarolero(
intenso: true, intenso: true,
child: SingleChildScrollView( child: SafeArea(
padding: const EdgeInsets.all(16), top: false,
child: Column( child: SingleChildScrollView(
crossAxisAlignment: CrossAxisAlignment.start, padding: const EdgeInsets.fromLTRB(16, 12, 16, 28),
children: [ child: Center(
_seccion( child: ConstrainedBox(
context, constraints: const BoxConstraints(maxWidth: 620),
1, child: Column(
Icons.person_search, crossAxisAlignment: CrossAxisAlignment.stretch,
l10n.rulesWhatIsTitle, children: [
l10n.rulesWhatIsBody, EncabezadoFarolero(
icono: Icons.menu_book_rounded,
titulo: l10n.rulesTitle,
subtitulo: l10n.rulesWhatIsBody,
),
const SizedBox(height: 16),
_seccion(context, 1, Icons.person_search, l10n.rulesWhatIsTitle, l10n.rulesWhatIsBody),
_seccion(context, 2, Icons.chat_bubble, l10n.rulesHowToPlayTitle, l10n.rulesHowToPlayBody),
_seccion(context, 3, Icons.how_to_vote, l10n.rulesWhoWinsTitle, l10n.rulesWhoWinsBody),
_seccion(context, 4, Icons.lightbulb, l10n.rulesTipsPlayersTitle, l10n.rulesTipsPlayersBody),
_seccion(context, 5, Icons.theater_comedy, l10n.rulesTipsImpostorTitle, l10n.rulesTipsImpostorBody),
_seccion(context, 6, Icons.devices, l10n.rulesModesTitle, l10n.rulesModesBody),
_ejemplo(context, l10n.rulesExampleTitle, l10n.rulesExampleBody),
],
),
),
), ),
_seccion(
context,
2,
Icons.chat_bubble,
l10n.rulesHowToPlayTitle,
l10n.rulesHowToPlayBody,
),
_seccion(
context,
3,
Icons.how_to_vote,
l10n.rulesWhoWinsTitle,
l10n.rulesWhoWinsBody,
),
_seccion(
context,
4,
Icons.lightbulb,
l10n.rulesTipsPlayersTitle,
l10n.rulesTipsPlayersBody,
),
_seccion(
context,
5,
Icons.theater_comedy,
l10n.rulesTipsImpostorTitle,
l10n.rulesTipsImpostorBody,
),
_seccion(
context,
6,
Icons.devices,
l10n.rulesModesTitle,
l10n.rulesModesBody,
),
_ejemplo(context, l10n.rulesExampleTitle, l10n.rulesExampleBody),
const SizedBox(height: 32),
],
), ),
), ),
), ),
); );
} }
Widget _seccion( Widget _seccion(BuildContext context, int numero, IconData icono, String titulo, String contenido) {
BuildContext context,
int numero,
IconData icono,
String titulo,
String contenido,
) {
return Padding( return Padding(
padding: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.only(bottom: 14),
child: PanelFarolero( child: PanelFarolero(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.fromLTRB(14, 14, 14, 16),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Container( Container(
width: 54, width: 54,
height: 54, height: 54,
alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: TemaApp.colorNaranja.withValues(alpha: 0.16), color: TemaApp.colorNaranja.withValues(alpha: 0.16),
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(16),
border: Border.all(color: TemaApp.colorNaranja), border: Border.all(color: TemaApp.colorNaranja),
), ),
child: Icon(icono, color: TemaApp.colorNaranja, size: 30), child: Icon(icono, color: TemaApp.colorNaranja, size: 30),
@@ -97,23 +69,25 @@ class PantallaReglas extends StatelessWidget {
const SizedBox(width: 12), const SizedBox(width: 12),
Expanded( Expanded(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
'$numero. ${titulo.toUpperCase()}', '$numero. ${titulo.toUpperCase()}',
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text(contenido, Text(
style: Theme.of(context).textTheme.bodyLarge?.copyWith( contenido,
height: 1.5, style: Theme.of(context).textTheme.bodyLarge?.copyWith(height: 1.45),
)), ),
], ],
), ),
), ),
], ],
),
), ),
),
); );
} }
@@ -123,19 +97,20 @@ class PantallaReglas extends StatelessWidget {
child: PanelFarolero( child: PanelFarolero(
color: TemaApp.colorNaranja.withValues(alpha: 0.15), color: TemaApp.colorNaranja.withValues(alpha: 0.15),
borderColor: TemaApp.colorNaranja, borderColor: TemaApp.colorNaranja,
padding: const EdgeInsets.fromLTRB(18, 18, 18, 20),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text(titulo, Text(
style: Theme.of(context).textTheme.titleLarge?.copyWith( titulo,
color: TemaApp.colorNaranja, style: Theme.of(context).textTheme.titleLarge?.copyWith(color: TemaApp.colorNaranja),
)), ),
const SizedBox(height: 8), const SizedBox(height: 8),
Text(contenido, Text(
style: Theme.of(context).textTheme.bodyLarge?.copyWith( contenido,
height: 1.5, style: Theme.of(context).textTheme.bodyLarge?.copyWith(height: 1.45),
)), ),
], ],
), ),
), ),
); );

View File

@@ -213,7 +213,7 @@ class _PantallaVotacionClienteState extends State<PantallaVotacionCliente> {
return Scaffold( return Scaffold(
backgroundColor: TemaApp.colorFondo, backgroundColor: TemaApp.colorFondo,
appBar: AppBar( appBar: AppBar(
title: const Text('Resultado'), title: Text(l10n.result),
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
elevation: 0, elevation: 0,