From c1b9db3b15f7059657f403e75a9971e53412909d Mon Sep 17 00:00:00 2001 From: dan63047 Date: Fri, 13 Dec 2024 01:52:39 +0300 Subject: [PATCH] ok i guess i'm ready for a beta test of new design --- lib/gen/strings.g.dart | 8 +++++-- lib/services/tetrio_crud.dart | 37 +++++++++++++++--------------- lib/widgets/nerd_stats_thingy.dart | 4 ++-- lib/widgets/tl_thingy.dart | 33 ++++++++++++++++++-------- lib/widgets/user_thingy.dart | 7 +++--- res/i18n/strings.i18n.json | 1 + res/i18n/strings_ru-RU.i18n.json | 1 + 7 files changed, 57 insertions(+), 34 deletions(-) diff --git a/lib/gen/strings.g.dart b/lib/gen/strings.g.dart index 8adb1dc..802593e 100644 --- a/lib/gen/strings.g.dart +++ b/lib/gen/strings.g.dart @@ -4,9 +4,9 @@ /// To regenerate, run: `dart run slang` /// /// Locales: 2 -/// Strings: 1526 (763 per locale) +/// Strings: 1528 (764 per locale) /// -/// Built on 2024-12-12 at 15:53 UTC +/// Built on 2024-12-12 at 21:30 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -771,6 +771,7 @@ class _StringsRankViewEn { String underpopulated({required Object players}) => 'Underpopulated by a ${players}'; String get PlayersEqualSupposedToBe => 'cute'; String get avgStats => 'Average Stats'; + String avgForRank({required Object rank}) => 'Average for ${rank} rank'; String get avgNerdStats => 'Average Nerd Stats'; String get minimums => 'Minimums'; String get maximums => 'Maximums'; @@ -2309,6 +2310,7 @@ class _StringsRankViewRuRu implements _StringsRankViewEn { @override String underpopulated({required Object players}) => 'Не хватает ${players}'; @override String get PlayersEqualSupposedToBe => 'лол'; @override String get avgStats => 'Средние значения'; + @override String avgForRank({required Object rank}) => 'Среднее для ${rank} ранга'; @override String get avgNerdStats => 'Средние задротские значения'; @override String get minimums => 'Минимумы'; @override String get maximums => 'Максимумы'; @@ -3419,6 +3421,7 @@ extension on Translations { case 'rankView.underpopulated': return ({required Object players}) => 'Underpopulated by a ${players}'; case 'rankView.PlayersEqualSupposedToBe': return 'cute'; case 'rankView.avgStats': return 'Average Stats'; + case 'rankView.avgForRank': return ({required Object rank}) => 'Average for ${rank} rank'; case 'rankView.avgNerdStats': return 'Average Nerd Stats'; case 'rankView.minimums': return 'Minimums'; case 'rankView.maximums': return 'Maximums'; @@ -4231,6 +4234,7 @@ extension on _StringsRuRu { case 'rankView.underpopulated': return ({required Object players}) => 'Не хватает ${players}'; case 'rankView.PlayersEqualSupposedToBe': return 'лол'; case 'rankView.avgStats': return 'Средние значения'; + case 'rankView.avgForRank': return ({required Object rank}) => 'Среднее для ${rank} ранга'; case 'rankView.avgNerdStats': return 'Средние задротские значения'; case 'rankView.minimums': return 'Минимумы'; case 'rankView.maximums': return 'Максимумы'; diff --git a/lib/services/tetrio_crud.dart b/lib/services/tetrio_crud.dart index f0c0938..d8bb86b 100644 --- a/lib/services/tetrio_crud.dart +++ b/lib/services/tetrio_crud.dart @@ -35,6 +35,7 @@ import 'package:tetra_stats/services/sqlite_db_controller.dart'; import 'package:csv/csv.dart'; const String dbName = "TetraStats.db"; +const String webVersionDomain = "tsbeta.dan63.by"; const String tetrioUsersTable = "tetrioUsers"; const String tetrioUsersToTrackTable = "tetrioUsersToTrack"; const String tetraLeagueMatchesTable = "tetrioAlphaLeagueMathces"; @@ -289,7 +290,7 @@ class TetrioService extends DB { // If failed, actually trying to retrieve Uri url; if (kIsWeb) { // Web version sends every request through my php script at the same domain, where Tetra Stats located because of CORS - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioReplay", "replayid": replayID}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioReplay", "replayid": replayID}); } else { // Actually going to hit inoue url = Uri.https('inoue.szy.lol', '/api/replay/$replayID'); } @@ -385,7 +386,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "singleplayerStream", "user": userID.toLowerCase().trim(), "stream": stream}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "singleplayerStream", "user": userID.toLowerCase().trim(), "stream": stream}); } else { url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records/$stream'); } @@ -433,7 +434,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { // Web version sends every request through my php script at the same domain, where Tetra Stats located because of CORS - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "PeakTR", "user": id}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "PeakTR", "user": id}); } else { // Actually going to hit p1nkl0bst3r api url = Uri.https('api.p1nkl0bst3r.xyz', 'toptr/$id'); } @@ -484,7 +485,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "cutoffs"}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "cutoffs"}); } else { url = Uri.https('ch.tetr.io', 'api/labs/league_ranks'); } @@ -528,7 +529,7 @@ class TetrioService extends DB { Cutoffs? cached = _cache.get("CutoffsTetrioleague_ranks", Cutoffs); if (cached != null) return cached; - Uri url = Uri.https('ts.dan63.by', 'beanserver_blaster/cutoffs.json'); + Uri url = Uri.https(webVersionDomain, 'beanserver_blaster/cutoffs.json'); try{ final response = await client.get(url); @@ -572,7 +573,7 @@ class TetrioService extends DB { } Future> fetchCutoffsHistory() async { - Uri url = Uri.https('ts.dan63.by', 'beanserver_blaster/history.csv'); + Uri url = Uri.https(webVersionDomain, 'beanserver_blaster/history.csv'); try{ final response = await client.get(url); @@ -632,7 +633,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLTopOne"}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLTopOne"}); } else { url = Uri.https('ch.tetr.io', 'api/users/by/league', {"after": "25000:0:0", "limit": "1"}); } @@ -676,7 +677,7 @@ class TetrioService extends DB { // TODO: find le way to get season 2 history Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLHistory", "user": id}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLHistory", "user": id}); } else { url = Uri.https('api.p1nkl0bst3r.xyz', 'tlhist/$id'); } @@ -748,7 +749,7 @@ class TetrioService extends DB { Future fetchAndSaveOldTLmatches(String userID) async { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLMatches", "user": userID}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLMatches", "user": userID}); } else { url = Uri.https('api.p1nkl0bst3r.xyz', 'tlmatches/$userID', {"before": "0", "count": "9000"}); } @@ -790,7 +791,7 @@ class TetrioService extends DB { TetrioPlayersLeaderboard? cached = _cache.get("league", TetrioPlayersLeaderboard); if (cached != null) return cached; - Uri url = Uri.https('ts.dan63.by', 'beanserver_blaster/leaderboard.json'); + Uri url = Uri.https(webVersionDomain, 'beanserver_blaster/leaderboard.json'); try{ final response = await client.get(url); @@ -830,7 +831,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLLeaderboard"}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLLeaderboard"}); } else { url = Uri.https('ch.tetr.io', 'api/users/by/${lb??"league"}', { "limit": "100", @@ -882,7 +883,7 @@ class TetrioService extends DB { Future> fetchTetrioRecordsLeaderboard({String? prisecter, String? lb, String? country}) async{ Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "TLLeaderboard"}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "TLLeaderboard"}); } else { url = Uri.https('ch.tetr.io', 'api/records/${lb??"40l_global"}', { "limit": "100", @@ -942,7 +943,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioNews", "user": userID.toLowerCase().trim(), "limit": "100"}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioNews", "user": userID.toLowerCase().trim(), "limit": "100"}); } else { url = Uri.https('ch.tetr.io', 'api/news/user_${userID.toLowerCase().trim()}', {"limit": "100"}); } @@ -990,7 +991,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserTL", "user": userID.toLowerCase().trim()}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUserTL", "user": userID.toLowerCase().trim()}); } else { url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records/league/recent'); } @@ -1120,7 +1121,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserRecords", "user": userID.toLowerCase().trim()}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUserRecords", "user": userID.toLowerCase().trim()}); } else { url = Uri.https('ch.tetr.io', 'api/users/${userID.toLowerCase().trim()}/records'); } @@ -1173,7 +1174,7 @@ class TetrioService extends DB { Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "Summaries", "id": id}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "Summaries", "id": id}); } else { url = Uri.https('ch.tetr.io', 'api/users/$id/summaries'); } @@ -1311,7 +1312,7 @@ class TetrioService extends DB { // trying to find player with given discord id Uri dUrl; if (kIsWeb) { - dUrl = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUserByDiscordID", "user": user.toLowerCase().trim()}); + dUrl = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUserByDiscordID", "user": user.toLowerCase().trim()}); } else { dUrl = Uri.https('ch.tetr.io', 'api/users/search/discord:${user.toLowerCase().trim()}'); } @@ -1356,7 +1357,7 @@ class TetrioService extends DB { // finally going to obtain Uri url; if (kIsWeb) { - url = Uri.https('ts.dan63.by', 'oskware_bridge.php', {"endpoint": "tetrioUser", "user": user.toLowerCase().trim()}); + url = Uri.https(webVersionDomain, 'oskware_bridge.php', {"endpoint": "tetrioUser", "user": user.toLowerCase().trim()}); } else { url = Uri.https('ch.tetr.io', 'api/users/${user.toLowerCase().trim()}'); } diff --git a/lib/widgets/nerd_stats_thingy.dart b/lib/widgets/nerd_stats_thingy.dart index cecec82..d69cb47 100644 --- a/lib/widgets/nerd_stats_thingy.dart +++ b/lib/widgets/nerd_stats_thingy.dart @@ -58,7 +58,7 @@ class NerdStatsThingy extends StatelessWidget{ RichText( textAlign: TextAlign.center, text: TextSpan( - style: const TextStyle(fontFamily: "Eurostile Round"), + style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white), children: [ TextSpan(text: "${t.stats.app.short}\n"), TextSpan(text: f3.format(nerdStats.app), style: TextStyle(fontSize: 25, fontFamily: "Eurostile Round Extended", fontWeight: FontWeight.w100, color: getStatColor(nerdStats.app, averages?.nerdStats?.app, true))), @@ -99,7 +99,7 @@ class NerdStatsThingy extends StatelessWidget{ RichText( textAlign: TextAlign.center, text: TextSpan( - style: const TextStyle(fontFamily: "Eurostile Round"), + style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white), children: [ TextSpan(text: "${t.stats.vsapm.short}\n"), TextSpan(text: f3.format(nerdStats.vsapm), style: TextStyle(fontSize: 25, fontFamily: "Eurostile Round Extended", fontWeight: FontWeight.w100, color: getStatColor(nerdStats.vsapm, averages?.nerdStats?.vsapm, true))), diff --git a/lib/widgets/tl_thingy.dart b/lib/widgets/tl_thingy.dart index b43bdc1..202f96e 100644 --- a/lib/widgets/tl_thingy.dart +++ b/lib/widgets/tl_thingy.dart @@ -24,23 +24,29 @@ class TetraLeagueThingy extends StatelessWidget{ List secondColumn(){ return [ TableRow(children: [ - //Text("APM: ", style: TextStyle(fontSize: 21)), Text(intf.format(league.gamesPlayed), textAlign: TextAlign.right, style: const TextStyle(fontSize: 21)), - Text(" ${t.stats.gp.short}", style: TextStyle(fontSize: 21)), + Tooltip( + message: "${t.stats.gp.full}", + child: Text(" ${t.stats.gp.short}", style: TextStyle(fontSize: 21)) + ), if (toCompare != null) Text(" (${comparef2.format(league.gamesPlayed-toCompare!.gamesPlayed)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: Colors.grey)), if (lbPos != null) Text(lbPos?.gamesPlayed != null ? (lbPos!.gamesPlayed!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.gamesPlayed!.percentage*100)}%)" : " (№ ${lbPos!.gamesPlayed!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.gamesPlayed != null ? getColorOfRank(lbPos!.gamesPlayed!.position) : null)) ]), TableRow(children: [ - //Text("PPS: ", style: TextStyle(fontSize: 21)), Text(intf.format(league.gamesWon), textAlign: TextAlign.right, style: const TextStyle(fontSize: 21)), - Text(" ${t.stats.gw.short}", style: TextStyle(fontSize: 21)), + Tooltip( + message: "${t.stats.gw.full}", + child: Text(" ${t.stats.gw.short}", style: TextStyle(fontSize: 21)) + ), if (toCompare != null) Text(" (${comparef2.format(league.gamesWon-toCompare!.gamesWon)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: Colors.grey)), if (lbPos != null) Text(lbPos?.gamesWon != null ? (lbPos!.gamesWon!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.gamesWon!.percentage*100)}%)" : " (№ ${lbPos!.gamesWon!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.gamesWon != null ? getColorOfRank(lbPos!.gamesWon!.position) : null)) ]), TableRow(children: [ - //Text("VS: ", style: TextStyle(fontSize: 21)), Tooltip(child: Text("${league.gxe.isNegative ? "---" : f3.format(league.gxe)}", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "${f2.format(league.s1tr)} S1 TR"), - Tooltip(child: Text(" ${t.stats.glixare.short}", style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "Glixare"), + Tooltip( + message: "${t.stats.glixare.full}", + child: Tooltip(child: Text(" ${t.stats.glixare.short}", style: TextStyle(fontSize: 21, color: league.gxe.isNegative ? Colors.grey : Colors.white)), message: "Glixare") + ), if (toCompare != null) Text(" (${comparef.format(league.gxe-toCompare!.gxe)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.gxe-toCompare!.gxe))), if (lbPos != null) Text(lbPos?.glixare != null ? (lbPos!.glixare!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.glixare!.percentage*100)}%)" : " (№ ${lbPos!.glixare!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.glixare != null ? getColorOfRank(lbPos!.glixare!.position) : null)) ]), @@ -75,19 +81,28 @@ class TetraLeagueThingy extends StatelessWidget{ children: [ TableRow(children: [ Text(league.apm != null ? f2.format(league.apm) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey)), - Text(" ${t.stats.apm.short}", style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey)), + Tooltip( + message: "${t.stats.apm.full}${(averages != null) ? "\n${t.rankView.avgForRank(rank: league.percentileRank.toUpperCase())}: ${f2.format(averages!.apm)} ${t.stats.apm.short}" : ""}", + child: Text(" ${t.stats.apm.short}", style: TextStyle(fontSize: 21, color: league.apm != null ? getStatColor(league.apm!, averages?.apm, true) : Colors.grey)) + ), if (toCompare != null) Text(" (${comparef2.format(league.apm!-toCompare!.apm!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.apm!-toCompare!.apm!))), if (lbPos != null) Text(lbPos?.apm != null ? (lbPos!.apm!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.apm!.percentage*100)}%)" : " (№ ${lbPos!.apm!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.apm != null ? getColorOfRank(lbPos!.apm!.position) : null)) ]), TableRow(children: [ Text(league.pps != null ? f2.format(league.pps) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey)), - Text(" ${t.stats.pps.short}", style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey)), + Tooltip( + message: "${t.stats.pps.full}${(averages != null) ? "\n${t.rankView.avgForRank(rank: league.percentileRank.toUpperCase())}: ${f2.format(averages!.pps)} ${t.stats.pps.short}" : ""}", + child: Text(" ${t.stats.pps.short}", style: TextStyle(fontSize: 21, color: league.pps != null ? getStatColor(league.pps!, averages?.pps, true) : Colors.grey)) + ), if (toCompare != null) Text(" (${comparef2.format(league.pps!-toCompare!.pps!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.pps!-toCompare!.pps!))), if (lbPos != null) Text(lbPos?.pps != null ? (lbPos!.pps!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.pps!.percentage*100)}%)" : " (№ ${lbPos!.pps!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.pps != null ? getColorOfRank(lbPos!.pps!.position) : null)) ]), TableRow(children: [ Text(league.vs != null ? f2.format(league.vs) : "-.--", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey)), - Text(" ${t.stats.vs.short}", style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey)), + Tooltip( + message: "${t.stats.vs.full}${(averages != null) ? "\n${t.rankView.avgForRank(rank: league.percentileRank.toUpperCase())}: ${f2.format(averages!.vs)} ${t.stats.vs.short}" : ""}", + child: Text(" ${t.stats.vs.short}", style: TextStyle(fontSize: 21, color: league.vs != null ? getStatColor(league.vs!, averages?.vs, true) : Colors.grey)) + ), if (toCompare != null) Text(" (${comparef2.format(league.vs!-toCompare!.vs!)})", textAlign: TextAlign.right, style: TextStyle(fontSize: 21, color: getDifferenceColor(league.vs!-toCompare!.vs!))), if (lbPos != null) Text(lbPos?.vs != null ? (lbPos!.vs!.position >= 1000 ? " (${t.top} ${f2.format(lbPos!.vs!.percentage*100)}%)" : " (№ ${lbPos!.vs!.position})") : "(№ ---)", style: TextStyle(color: lbPos?.vs != null ? getColorOfRank(lbPos!.vs!.position) : null)) ]), diff --git a/lib/widgets/user_thingy.dart b/lib/widgets/user_thingy.dart index 636028c..0430862 100644 --- a/lib/widgets/user_thingy.dart +++ b/lib/widgets/user_thingy.dart @@ -133,6 +133,7 @@ class _UserThingyState extends State with SingleTickerProviderStateM child: RichText(text: TextSpan(text: widget.player.username, style: TextStyle( fontFamily: fontStyle(widget.player.username.length), fontSize: 28, + color: Colors.white ), recognizer: TapGestureRecognizer()..onTap = (){ copyToClipboard(widget.player.userId); @@ -156,7 +157,7 @@ class _UserThingyState extends State with SingleTickerProviderStateM ), RichText( text: TextSpan( - style: const TextStyle(fontFamily: "Eurostile Round"), + style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white), children: [ if (widget.player.friendCount > 0) WidgetSpan(child: Tooltip(message: t.stats.followers, child: Icon(Icons.person)), alignment: PlaceholderAlignment.middle, baseline: TextBaseline.alphabetic), @@ -176,7 +177,7 @@ class _UserThingyState extends State with SingleTickerProviderStateM width: 270, child: RichText( text: TextSpan( - style: const TextStyle(fontFamily: "Eurostile Round"), + style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white), children: [ TextSpan(text: timestamp(widget.player.registrationTime), style: const TextStyle(color: Colors.grey)), if (widget.player.country != null) TextSpan(text: " • ${t.countries[widget.player.country]}") @@ -191,7 +192,7 @@ class _UserThingyState extends State with SingleTickerProviderStateM child: RichText( textAlign: TextAlign.end, text: TextSpan( - style: const TextStyle(fontFamily: "Eurostile Round"), + style: const TextStyle(fontFamily: "Eurostile Round", color: Colors.white), children: [ TextSpan(text: "Level ${(widget.player.level.isNegative || widget.player.level.isNaN) ? "---" : intf.format(widget.player.level.floor())}", style: TextStyle(decoration: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TextDecoration.underline, decorationColor: Colors.white70, decorationStyle: TextDecorationStyle.dotted, color: (widget.player.level.isNegative || widget.player.level.isNaN) ? Colors.grey : Colors.white), recognizer: (widget.player.level.isNegative || widget.player.level.isNaN) ? null : TapGestureRecognizer()?..onTap = (){ showDialog( diff --git a/res/i18n/strings.i18n.json b/res/i18n/strings.i18n.json index 02c2e1e..e0b5a70 100644 --- a/res/i18n/strings.i18n.json +++ b/res/i18n/strings.i18n.json @@ -216,6 +216,7 @@ "underpopulated": "Underpopulated by a $players", "PlayersEqualSupposedToBe": "cute", "avgStats": "Average Stats", + "avgForRank": "Average for $rank rank", "avgNerdStats": "Average Nerd Stats", "minimums": "Minimums", "maximums": "Maximums" diff --git a/res/i18n/strings_ru-RU.i18n.json b/res/i18n/strings_ru-RU.i18n.json index 293b4ed..8fbcbdc 100644 --- a/res/i18n/strings_ru-RU.i18n.json +++ b/res/i18n/strings_ru-RU.i18n.json @@ -216,6 +216,7 @@ "underpopulated": "Не хватает $players", "PlayersEqualSupposedToBe": "лол", "avgStats": "Средние значения", + "avgForRank": "Среднее для $rank ранга", "avgNerdStats": "Средние задротские значения", "minimums": "Минимумы", "maximums": "Максимумы"