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

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

After

Width:  |  Height:  |  Size: 1.5 MiB

+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "الاسم",
"profileNick": "اللقب",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Nom",
"profileNick": "Àlies",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Name",
"profileNick": "Nickname",
"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"
}
}
}
}
+26 -1
View File
@@ -303,5 +303,30 @@
"profileName": "Name",
"profileNick": "Nick",
"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"
}
}
}
}
+26 -1
View File
@@ -339,5 +339,30 @@
"profileName": "Nombre",
"profileNick": "Nick",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Izena",
"profileNick": "Ezizena",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Nom",
"profileNick": "Pseudo",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "नाम",
"profileNick": "निकनेम",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Nome",
"profileNick": "Nick",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "名前",
"profileNick": "ニックネーム",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "이름",
"profileNick": "닉네임",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Naam",
"profileNick": "Nickname",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Nazwa",
"profileNick": "Nick",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Nome",
"profileNick": "Nick",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Имя",
"profileNick": "Ник",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "Ad",
"profileNick": "Takma ad",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "名称",
"profileNick": "昵称",
"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"
}
}
}
}
+26 -1
View File
@@ -271,5 +271,30 @@
"profileName": "名稱",
"profileNick": "暱稱",
"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"
}
}
}
}
+12
View File
@@ -1409,4 +1409,16 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
String get save;
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);
}
@@ -727,4 +727,24 @@ class AppLocalizationsAr extends AppLocalizations {
@override
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';
}
}
@@ -730,4 +730,24 @@ class AppLocalizationsCa extends AppLocalizations {
@override
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';
}
}
@@ -733,4 +733,24 @@ class AppLocalizationsDe extends AppLocalizations {
@override
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';
}
}
@@ -727,4 +727,24 @@ class AppLocalizationsEn extends AppLocalizations {
@override
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';
}
}
@@ -729,4 +729,24 @@ class AppLocalizationsEs extends AppLocalizations {
@override
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';
}
}
@@ -732,4 +732,24 @@ class AppLocalizationsEu extends AppLocalizations {
@override
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';
}
}
@@ -730,4 +730,24 @@ class AppLocalizationsFr extends AppLocalizations {
@override
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';
}
}
@@ -729,4 +729,24 @@ class AppLocalizationsHi extends AppLocalizations {
@override
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';
}
}
@@ -730,4 +730,24 @@ class AppLocalizationsIt extends AppLocalizations {
@override
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';
}
}
@@ -727,4 +727,24 @@ class AppLocalizationsJa extends AppLocalizations {
@override
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';
}
}
@@ -727,4 +727,24 @@ class AppLocalizationsKo extends AppLocalizations {
@override
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';
}
}
@@ -730,4 +730,24 @@ class AppLocalizationsNl extends AppLocalizations {
@override
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';
}
}
@@ -730,4 +730,24 @@ class AppLocalizationsPl extends AppLocalizations {
@override
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';
}
}
@@ -731,4 +731,24 @@ class AppLocalizationsPt extends AppLocalizations {
@override
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';
}
}
@@ -730,4 +730,24 @@ class AppLocalizationsRu extends AppLocalizations {
@override
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';
}
}
@@ -729,4 +729,24 @@ class AppLocalizationsTr extends AppLocalizations {
@override
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';
}
}
@@ -726,6 +726,26 @@ class AppLocalizationsZh extends AppLocalizations {
@override
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`).
@@ -1322,4 +1342,24 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
@override
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';
}
}
+14 -9
View File
@@ -94,6 +94,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
void _avanzarAFase(FaseJuego fase) {
final estado = context.read<EstadoJuego>();
final nearby = context.read<ServicioNearby>();
final l10n = AppLocalizations.of(context)!;
switch (fase) {
case FaseJuego.debate:
@@ -122,7 +123,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
_snapshot(
fase: 'resultado',
resultadoActual: resultado,
mensaje: _mensajeSiguienteAccion(estado, resultado),
mensaje: _mensajeSiguienteAccion(estado, resultado, l10n),
).toJson(),
);
}
@@ -142,7 +143,10 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
if (partida == null) {
return Scaffold(
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),
Expanded(
child: Text(
'Hay jugadores con el dispositivo desconectado.',
AppLocalizations.of(context)!.disconnectedPlayersWarning,
style: Theme.of(context).textTheme.titleSmall,
),
),
@@ -276,7 +280,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
child: OutlinedButton.icon(
onPressed: () => nearby.asumirUsuariosDesconectados(),
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:
return _buildFaseFinOnline(context, l10n);
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(
EstadoJuego estado,
ResultadoVotacion resultado,
AppLocalizations l10n,
) {
final partida = estado.partida;
if (partida != null && _hayFinTrasVotacion(partida)) {
return 'La partida ha terminado.';
return l10n.gameOver;
}
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) {
@@ -750,7 +755,7 @@ class _PantallaGestorHostState extends State<PantallaGestorHost> {
? partida!.historialVotaciones.last
: null;
if (partida == null || resultado == null) {
return const Center(child: Text('Sin resultado'));
return Center(child: Text(l10n.noResult));
}
final conteo = <String, int>{};
+85 -38
View File
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:farolero/l10n/generated/app_localizations.dart';
import '../servicios/servicio_historial_partidas.dart';
import '../tema/componentes_farolero.dart';
@@ -10,52 +11,98 @@ class PantallaHistorial extends StatelessWidget {
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
final historial = context.watch<ServicioHistorialPartidas>();
final partidas = historial.partidas;
return Scaffold(
appBar: AppBar(title: const Text('Historial')),
appBar: AppBar(title: Text(l10n.history)),
body: FondoFarolero(
intenso: true,
child: partidas.isEmpty
? const Center(child: Text('Todavía no hay partidas guardadas.'))
: ListView.builder(
padding: const EdgeInsets.all(16),
itemCount: partidas.length,
itemBuilder: (context, index) {
final partida = partidas[index];
final ganaronJugadores = partida.ganador == 'jugadores';
final dia =
partida.fecha.day.toString().padLeft(2, '0');
final mes =
partida.fecha.month.toString().padLeft(2, '0');
return Card(
child: ListTile(
leading: CircleAvatar(
backgroundColor: ganaronJugadores
? TemaApp.colorVerde
: TemaApp.colorAcento,
child: Icon(
ganaronJugadores ? Icons.groups : Icons.theater_comedy,
color: Colors.white,
),
? Center(
child: Padding(
padding: const EdgeInsets.all(20),
child: EstadoVacioFarolero(
icono: Icons.history_rounded,
titulo: l10n.history,
subtitulo: l10n.noSavedGames,
),
),
)
: SafeArea(
top: false,
child: ListView.separated(
padding: const EdgeInsets.fromLTRB(16, 12, 16, 24),
itemCount: partidas.length,
separatorBuilder: (_, __) => const SizedBox(height: 12),
itemBuilder: (context, index) {
final partida = partidas[index];
final ganaronJugadores = partida.ganador == 'jugadores';
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,
),
),
);
},
);
},
),
),
),
);
+55 -80
View File
@@ -14,82 +14,54 @@ class PantallaReglas extends StatelessWidget {
appBar: AppBar(title: Text(l10n.rulesTitle)),
body: FondoFarolero(
intenso: true,
child: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_seccion(
context,
1,
Icons.person_search,
l10n.rulesWhatIsTitle,
l10n.rulesWhatIsBody,
child: SafeArea(
top: false,
child: SingleChildScrollView(
padding: const EdgeInsets.fromLTRB(16, 12, 16, 28),
child: Center(
child: ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 620),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
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(
BuildContext context,
int numero,
IconData icono,
String titulo,
String contenido,
) {
Widget _seccion(BuildContext context, int numero, IconData icono, String titulo, String contenido) {
return Padding(
padding: const EdgeInsets.only(bottom: 16),
padding: const EdgeInsets.only(bottom: 14),
child: PanelFarolero(
padding: const EdgeInsets.all(12),
padding: const EdgeInsets.fromLTRB(14, 14, 14, 16),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: 54,
height: 54,
alignment: Alignment.center,
decoration: BoxDecoration(
color: TemaApp.colorNaranja.withValues(alpha: 0.16),
borderRadius: BorderRadius.circular(8),
borderRadius: BorderRadius.circular(16),
border: Border.all(color: TemaApp.colorNaranja),
),
child: Icon(icono, color: TemaApp.colorNaranja, size: 30),
@@ -97,23 +69,25 @@ class PantallaReglas extends StatelessWidget {
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'$numero. ${titulo.toUpperCase()}',
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 8),
Text(contenido,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
height: 1.5,
)),
],
const SizedBox(height: 8),
Text(
contenido,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(height: 1.45),
),
],
),
),
],
),
),
),
);
}
@@ -123,19 +97,20 @@ class PantallaReglas extends StatelessWidget {
child: PanelFarolero(
color: TemaApp.colorNaranja.withValues(alpha: 0.15),
borderColor: TemaApp.colorNaranja,
padding: const EdgeInsets.fromLTRB(18, 18, 18, 20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(titulo,
style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: TemaApp.colorNaranja,
)),
const SizedBox(height: 8),
Text(contenido,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
height: 1.5,
)),
],
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
titulo,
style: Theme.of(context).textTheme.titleLarge?.copyWith(color: TemaApp.colorNaranja),
),
const SizedBox(height: 8),
Text(
contenido,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(height: 1.45),
),
],
),
),
);
+1 -1
View File
@@ -213,7 +213,7 @@ class _PantallaVotacionClienteState extends State<PantallaVotacionCliente> {
return Scaffold(
backgroundColor: TemaApp.colorFondo,
appBar: AppBar(
title: const Text('Resultado'),
title: Text(l10n.result),
automaticallyImplyLeading: false,
backgroundColor: Colors.transparent,
elevation: 0,