From 5098b5ebf913743da761e10d8f5b81f0aa96e30a Mon Sep 17 00:00:00 2001 From: dan63047 Date: Thu, 9 Nov 2023 01:17:44 +0300 Subject: [PATCH] Teto API was updated, it's time to update --- lib/data_objects/tetrio.dart | 4 +- lib/gen/strings.g.dart | 60 ++++++++++++++++++++++------- lib/services/tetrio_crud.dart | 4 +- lib/views/customization_view.dart | 2 + lib/views/tl_match_view.dart | 16 ++++---- lib/views/tracked_players_view.dart | 6 +-- lib/widgets/tl_thingy.dart | 4 +- pubspec.yaml | 2 +- res/i18n/strings.i18n.json | 16 ++++++-- res/i18n/strings_ru.i18n.json | 16 ++++++-- 10 files changed, 90 insertions(+), 40 deletions(-) diff --git a/lib/data_objects/tetrio.dart b/lib/data_objects/tetrio.dart index f2a03ff..2b4adc1 100644 --- a/lib/data_objects/tetrio.dart +++ b/lib/data_objects/tetrio.dart @@ -801,8 +801,8 @@ class EndContextMulti { required this.success}); EndContextMulti.fromJson(Map json) { - userId = json['user']['_id']; - username = json['user']['username']; + userId = json['id'] ?? json['user']['_id']; + username = json['username'] ?? json['user']['username']; handling = Handling.fromJson(json['handling']); success = json['success']; inputs = json['inputs']; diff --git a/lib/gen/strings.g.dart b/lib/gen/strings.g.dart index d5fbc6c..349c4ab 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: 970 (485 per locale) +/// Strings: 986 (493 per locale) /// -/// Built on 2023-10-07 at 16:34 UTC +/// Built on 2023-11-08 at 22:09 UTC // coverage:ignore-file // ignore_for_file: type=lint @@ -196,10 +196,9 @@ class _StringsEn implements BaseTranslations { String get notSupporter => 'Not a supporter'; String get assignedManualy => 'That badge was assigned manualy by TETR.IO admins'; String supporter({required Object tier}) => 'Supporter tier ${tier}'; - String comparingWith({required Object date}) => 'Comparing with data from ${date}'; + String comparingWith({required Object newDate, required Object oldDate}) => 'Data from ${newDate} comparing with ${oldDate}'; String get top => 'Top'; String get topRank => 'Top Rank'; - String get decaying => 'Decaying'; String gamesUntilRanked({required Object left}) => '${left} games until being ranked'; String get nerdStats => 'Nerd Stats'; String get playersYouTrack => 'Players you track'; @@ -222,7 +221,7 @@ class _StringsEn implements BaseTranslations { String get yourIDText => 'Every time when app loads, stats of that player will be fetched. Please prefer ID over nickname because nickname can be changed.'; String get language => 'Language'; String get aboutApp => 'About app'; - String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r'; + String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r\nTETR.IO replay grabber API by szy'; String stateViewTitle({required Object nickname, required Object date}) => '${nickname} account on ${date}'; String statesViewTitle({required Object number, required Object nickname}) => '${number} states of ${nickname} account'; String matchesViewTitle({required Object nickname}) => '${nickname} TL matches'; @@ -237,9 +236,15 @@ class _StringsEn implements BaseTranslations { String trackedPlayersEntry({required Object nickname, required Object numberOfStates}) => '${nickname}: ${numberOfStates} states'; String trackedPlayersDescription({required Object firstStateDate, required Object lastStateDate}) => 'From ${firstStateDate} until ${lastStateDate}'; String trackedPlayersStatesDeleted({required Object nickname}) => '${nickname} states was removed from database!'; + String get duplicatedFix => 'Remove duplicated TL mathces'; + String get compressDB => 'Compress DB'; + String SpaceSaved({required Object size}) => 'Space saved: ${size}'; String averageXrank({required Object rankLetter}) => 'Average ${rankLetter} rank'; String get vs => 'vs'; String get inTLmatch => 'in TL match'; + String get downloadReplay => 'Download .ttrm replay'; + String get openReplay => 'Open replay in TETR.IO'; + String replaySaved({required Object path}) => 'Replay saved to ${path}'; String get match => 'Match'; String roundNumber({required Object n}) => 'Round ${n}'; String get statsFor => 'Stats for'; @@ -693,6 +698,9 @@ class _StringsErrorsEn { String get p1nkl0bst3rTooManyRequests => 'Too many requests to third party API. Try again later'; String get p1nkl0bst3rinternal => 'Something happend on the p1nkl0bst3r side'; String get p1nkl0bst3rinternalWebVersion => 'Something happend on the p1nkl0bst3r side (or on oskware_bridge, idk honestly)'; + String get replayAlreadySaved => 'Replay already saved'; + String get replayExpired => 'Replay expired and not available anymore'; + String get replayRejected => 'Third party API blocked your IP address.\nChange IP address or reach out to szy'; } // Path: @@ -766,10 +774,9 @@ class _StringsRu implements _StringsEn { @override String get notSupporter => 'Нет саппортерки'; @override String supporter({required Object tier}) => 'Саппортерка ${tier} уровня'; @override String get assignedManualy => 'Этот значок был присвоен вручную администрацией TETR.IO'; - @override String comparingWith({required Object date}) => 'Сравнивая с данными от ${date}'; + @override String comparingWith({required Object newDate, required Object oldDate}) => 'Данные от ${newDate} в сравнении с данными от ${oldDate}'; @override String get top => 'Топ'; @override String get topRank => 'Топ Ранг'; - @override String get decaying => 'Загнивает'; @override String gamesUntilRanked({required Object left}) => '${left} матчей до получения рейтинга'; @override String get nerdStats => 'Для задротов'; @override String get playersYouTrack => 'Отслеживаемые игроки'; @@ -792,7 +799,7 @@ class _StringsRu implements _StringsEn { @override String get yourIDText => 'Каждый раз, когда приложение запускается, приложение будет получать статистику этого игрока. Пожалуйста, отдайте предпочтение ID, так как никнейм можно изменить.'; @override String get language => 'Язык (Language)'; @override String get aboutApp => 'О приложении'; - @override String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r'; + @override String aboutAppText({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r\nВозможность скачивать повторы из TETR.IO предоставляет szy'; @override String stateViewTitle({required Object nickname, required Object date}) => 'Аккаунт ${nickname} ${date}'; @override String statesViewTitle({required Object number, required Object nickname}) => '${number} состояний аккаунта ${nickname}'; @override String matchesViewTitle({required Object nickname}) => 'Матчи аккаунта ${nickname}'; @@ -807,9 +814,15 @@ class _StringsRu implements _StringsEn { @override String trackedPlayersEntry({required Object nickname, required Object numberOfStates}) => '${nickname}: ${numberOfStates} состояний'; @override String trackedPlayersDescription({required Object firstStateDate, required Object lastStateDate}) => 'Начиная с ${firstStateDate} и заканчивая ${lastStateDate}'; @override String trackedPlayersStatesDeleted({required Object nickname}) => 'Состояния аккаунта ${nickname} были удалены из локальной базы данных!'; + @override String get duplicatedFix => 'Удалить дубликаты матчей в Тетра Лиге'; + @override String get compressDB => 'Сжать базу данных'; + @override String SpaceSaved({required Object size}) => 'Места освобождено: ${size}'; @override String averageXrank({required Object rankLetter}) => 'Средний ${rankLetter} ранг'; @override String get vs => 'против'; @override String get inTLmatch => 'в матче ТЛ'; + @override String get downloadReplay => 'Скачать .ttrm повтор'; + @override String get openReplay => 'Открыть повтор в TETR.IO'; + @override String replaySaved({required Object path}) => 'Повтор сохранён по пути ${path}'; @override String get match => 'Матч'; @override String roundNumber({required Object n}) => 'Раунд ${n}'; @override String get statsFor => 'Статистика за'; @@ -1263,6 +1276,9 @@ class _StringsErrorsRu implements _StringsErrorsEn { @override String get p1nkl0bst3rTooManyRequests => 'Слишком много запросов к стороннему API. Попробуйте позже'; @override String get p1nkl0bst3rinternal => 'Что-то случилось на стороне p1nkl0bst3r-а'; @override String get p1nkl0bst3rinternalWebVersion => 'Что-то случилось на стороне p1nkl0bst3r-а (или на стороне oskware_bridge, я хз если честно)'; + @override String get replayAlreadySaved => 'Повтор уже сохранён'; + @override String get replayExpired => 'Повтор истёк и больше недоступен'; + @override String get replayRejected => 'Стороннее API заблокировало ваш IP адрес.\nСмените IP адрес или свяжитесь с szy'; } /// Flat map(s) containing all translations. @@ -1327,10 +1343,9 @@ extension on _StringsEn { case 'notSupporter': return 'Not a supporter'; case 'assignedManualy': return 'That badge was assigned manualy by TETR.IO admins'; case 'supporter': return ({required Object tier}) => 'Supporter tier ${tier}'; - case 'comparingWith': return ({required Object date}) => 'Comparing with data from ${date}'; + case 'comparingWith': return ({required Object newDate, required Object oldDate}) => 'Data from ${newDate} comparing with ${oldDate}'; case 'top': return 'Top'; case 'topRank': return 'Top Rank'; - case 'decaying': return 'Decaying'; case 'gamesUntilRanked': return ({required Object left}) => '${left} games until being ranked'; case 'nerdStats': return 'Nerd Stats'; case 'playersYouTrack': return 'Players you track'; @@ -1353,7 +1368,7 @@ extension on _StringsEn { case 'yourIDText': return 'Every time when app loads, stats of that player will be fetched. Please prefer ID over nickname because nickname can be changed.'; case 'language': return 'Language'; case 'aboutApp': return 'About app'; - case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r'; + case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r\nTETR.IO replay grabber API by szy'; case 'stateViewTitle': return ({required Object nickname, required Object date}) => '${nickname} account on ${date}'; case 'statesViewTitle': return ({required Object number, required Object nickname}) => '${number} states of ${nickname} account'; case 'matchesViewTitle': return ({required Object nickname}) => '${nickname} TL matches'; @@ -1368,9 +1383,15 @@ extension on _StringsEn { case 'trackedPlayersEntry': return ({required Object nickname, required Object numberOfStates}) => '${nickname}: ${numberOfStates} states'; case 'trackedPlayersDescription': return ({required Object firstStateDate, required Object lastStateDate}) => 'From ${firstStateDate} until ${lastStateDate}'; case 'trackedPlayersStatesDeleted': return ({required Object nickname}) => '${nickname} states was removed from database!'; + case 'duplicatedFix': return 'Remove duplicated TL mathces'; + case 'compressDB': return 'Compress DB'; + case 'SpaceSaved': return ({required Object size}) => 'Space saved: ${size}'; case 'averageXrank': return ({required Object rankLetter}) => 'Average ${rankLetter} rank'; case 'vs': return 'vs'; case 'inTLmatch': return 'in TL match'; + case 'downloadReplay': return 'Download .ttrm replay'; + case 'openReplay': return 'Open replay in TETR.IO'; + case 'replaySaved': return ({required Object path}) => 'Replay saved to ${path}'; case 'match': return 'Match'; case 'roundNumber': return ({required Object n}) => 'Round ${n}'; case 'statsFor': return 'Stats for'; @@ -1499,6 +1520,9 @@ extension on _StringsEn { case 'errors.p1nkl0bst3rTooManyRequests': return 'Too many requests to third party API. Try again later'; case 'errors.p1nkl0bst3rinternal': return 'Something happend on the p1nkl0bst3r side'; case 'errors.p1nkl0bst3rinternalWebVersion': return 'Something happend on the p1nkl0bst3r side (or on oskware_bridge, idk honestly)'; + case 'errors.replayAlreadySaved': return 'Replay already saved'; + case 'errors.replayExpired': return 'Replay expired and not available anymore'; + case 'errors.replayRejected': return 'Third party API blocked your IP address.\nChange IP address or reach out to szy'; case 'countries.': return 'Not selected'; case 'countries.AF': return 'Afghanistan'; case 'countries.AX': return 'Åland Islands'; @@ -1822,10 +1846,9 @@ extension on _StringsRu { case 'notSupporter': return 'Нет саппортерки'; case 'supporter': return ({required Object tier}) => 'Саппортерка ${tier} уровня'; case 'assignedManualy': return 'Этот значок был присвоен вручную администрацией TETR.IO'; - case 'comparingWith': return ({required Object date}) => 'Сравнивая с данными от ${date}'; + case 'comparingWith': return ({required Object newDate, required Object oldDate}) => 'Данные от ${newDate} в сравнении с данными от ${oldDate}'; case 'top': return 'Топ'; case 'topRank': return 'Топ Ранг'; - case 'decaying': return 'Загнивает'; case 'gamesUntilRanked': return ({required Object left}) => '${left} матчей до получения рейтинга'; case 'nerdStats': return 'Для задротов'; case 'playersYouTrack': return 'Отслеживаемые игроки'; @@ -1848,7 +1871,7 @@ extension on _StringsRu { case 'yourIDText': return 'Каждый раз, когда приложение запускается, приложение будет получать статистику этого игрока. Пожалуйста, отдайте предпочтение ID, так как никнейм можно изменить.'; case 'language': return 'Язык (Language)'; case 'aboutApp': return 'О приложении'; - case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r'; + case 'aboutAppText': return ({required Object appName, required Object packageName, required Object version, required Object buildNumber}) => '${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r\nВозможность скачивать повторы из TETR.IO предоставляет szy'; case 'stateViewTitle': return ({required Object nickname, required Object date}) => 'Аккаунт ${nickname} ${date}'; case 'statesViewTitle': return ({required Object number, required Object nickname}) => '${number} состояний аккаунта ${nickname}'; case 'matchesViewTitle': return ({required Object nickname}) => 'Матчи аккаунта ${nickname}'; @@ -1863,9 +1886,15 @@ extension on _StringsRu { case 'trackedPlayersEntry': return ({required Object nickname, required Object numberOfStates}) => '${nickname}: ${numberOfStates} состояний'; case 'trackedPlayersDescription': return ({required Object firstStateDate, required Object lastStateDate}) => 'Начиная с ${firstStateDate} и заканчивая ${lastStateDate}'; case 'trackedPlayersStatesDeleted': return ({required Object nickname}) => 'Состояния аккаунта ${nickname} были удалены из локальной базы данных!'; + case 'duplicatedFix': return 'Удалить дубликаты матчей в Тетра Лиге'; + case 'compressDB': return 'Сжать базу данных'; + case 'SpaceSaved': return ({required Object size}) => 'Места освобождено: ${size}'; case 'averageXrank': return ({required Object rankLetter}) => 'Средний ${rankLetter} ранг'; case 'vs': return 'против'; case 'inTLmatch': return 'в матче ТЛ'; + case 'downloadReplay': return 'Скачать .ttrm повтор'; + case 'openReplay': return 'Открыть повтор в TETR.IO'; + case 'replaySaved': return ({required Object path}) => 'Повтор сохранён по пути ${path}'; case 'match': return 'Матч'; case 'roundNumber': return ({required Object n}) => 'Раунд ${n}'; case 'statsFor': return 'Статистика за'; @@ -1994,6 +2023,9 @@ extension on _StringsRu { case 'errors.p1nkl0bst3rTooManyRequests': return 'Слишком много запросов к стороннему API. Попробуйте позже'; case 'errors.p1nkl0bst3rinternal': return 'Что-то случилось на стороне p1nkl0bst3r-а'; case 'errors.p1nkl0bst3rinternalWebVersion': return 'Что-то случилось на стороне p1nkl0bst3r-а (или на стороне oskware_bridge, я хз если честно)'; + case 'errors.replayAlreadySaved': return 'Повтор уже сохранён'; + case 'errors.replayExpired': return 'Повтор истёк и больше недоступен'; + case 'errors.replayRejected': return 'Стороннее API заблокировало ваш IP адрес.\nСмените IP адрес или свяжитесь с szy'; case 'countries.': return 'Не выбрана'; case 'countries.AF': return 'Афганистан'; case 'countries.AX': return 'Аландские острова'; diff --git a/lib/services/tetrio_crud.dart b/lib/services/tetrio_crud.dart index 0f10f43..9885137 100644 --- a/lib/services/tetrio_crud.dart +++ b/lib/services/tetrio_crud.dart @@ -59,8 +59,8 @@ class TetrioService extends DB { final Map> _newsCache = {}; final Map> _topTRcache = {}; final Map _tlStreamsCache = {}; // i'm trying to respect oskware api It should look something like {"cached_until": TetrioPlayer} - // final client = UserAgentClient("Tetra Stats v${packageInfo.version} (dm @dan63047 if someone abuse that software)", http.Client()); - final client = UserAgentClient("Kagari-chan loves osk (Tetra Stats dev build)", http.Client()); + final client = UserAgentClient("Tetra Stats v${packageInfo.version} (dm @dan63047 if someone abuse that software)", http.Client()); + // final client = UserAgentClient("Kagari-chan loves osk (Tetra Stats dev build)", http.Client()); static final TetrioService _shared = TetrioService._sharedInstance(); factory TetrioService() => _shared; late final StreamController>> _tetrioStreamController; diff --git a/lib/views/customization_view.dart b/lib/views/customization_view.dart index 9a41524..b975752 100644 --- a/lib/views/customization_view.dart +++ b/lib/views/customization_view.dart @@ -113,9 +113,11 @@ class CustomizationState extends State { }), ListTile( title: Text("Font"), + subtitle: Text("Not implemented"), ), ListTile( title: Text("Stats Table in TL mathes list"), + subtitle: Text("Not implemented"), ), ], )), diff --git a/lib/views/tl_match_view.dart b/lib/views/tl_match_view.dart index a08d02d..86ecaf9 100644 --- a/lib/views/tl_match_view.dart +++ b/lib/views/tl_match_view.dart @@ -63,13 +63,13 @@ class TlMatchResultState extends State { PopupMenuButton( enabled: widget.record.replayAvalable, itemBuilder: (BuildContext context) => [ - const PopupMenuItem( + PopupMenuItem( value: 1, - child: Text("Download le replay"), + child: Text(t.downloadReplay), ), - const PopupMenuItem( + PopupMenuItem( value: 2, - child: Text("Open le replay in TETR.IO"), + child: Text(t.openReplay), ), ], onSelected: (value) async { @@ -86,13 +86,13 @@ class TlMatchResultState extends State { } else{ try{ String path = await teto.szyDownloadAndSaveReplay(widget.record.replayId); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Replay saved to $path"))); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.replaySaved(path: path)))); } on TetrioReplayAlreadyExist{ - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Replay already saved"))); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.errors.replayAlreadySaved))); } on SzyNotFound { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Replay expired (i think)"))); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.errors.replayExpired))); } on SzyForbidden { - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Request has been rejected"))); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.errors.replayRejected))); } on SzyTooManyRequests { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.errors.tooManyRequests))); } diff --git a/lib/views/tracked_players_view.dart b/lib/views/tracked_players_view.dart index cda5fa8..d179d60 100644 --- a/lib/views/tracked_players_view.dart +++ b/lib/views/tracked_players_view.dart @@ -48,11 +48,11 @@ class TrackedPlayersState extends State { itemBuilder: (BuildContext context) => [ PopupMenuItem( value: 1, - child: Text("Remove duplicated TL mathces"), + child: Text(t.duplicatedFix), ), PopupMenuItem( value: 2, - child: Text("Compress DB"), + child: Text(t.compressDB), ), ], onSelected: (value) { @@ -61,7 +61,7 @@ class TrackedPlayersState extends State { teto.removeDuplicatesFromTLMatches(); break; case 2: - teto.compressDB().then((value) => ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Space saved: ${bytesToSize(value)}")))); + teto.compressDB().then((value) => ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(t.SpaceSaved(size: bytesToSize(value)))))); break; default: } diff --git a/lib/widgets/tl_thingy.dart b/lib/widgets/tl_thingy.dart index c49e95a..5d357aa 100644 --- a/lib/widgets/tl_thingy.dart +++ b/lib/widgets/tl_thingy.dart @@ -47,7 +47,6 @@ class _TLThingyState extends State { final t = Translations.of(context); return LayoutBuilder(builder: (context, constraints) { bool bigScreen = constraints.maxWidth > 768; - print(_currentRangeValues); return ListView.builder( physics: const ClampingScrollPhysics(), itemCount: 1, @@ -56,7 +55,8 @@ class _TLThingyState extends State { children: (currentTl.gamesPlayed > 0) ? [ if (widget.showTitle) Text(t.tetraLeague, style: TextStyle(fontFamily: "Eurostile Round Extended", fontSize: bigScreen ? 42 : 28)), - if (oldTl != null) Text(t.comparingWith(date: dateFormat.format(oldTl!.timestamp))), + if (oldTl != null) Text(t.comparingWith(newDate: dateFormat.format(currentTl.timestamp), oldDate: dateFormat.format(oldTl!.timestamp)), + textAlign: TextAlign.center,), if (oldTl != null) RangeSlider(values: _currentRangeValues, max: widget.states.length.toDouble(), labels: RangeLabels( _currentRangeValues.start.round().toString(), diff --git a/pubspec.yaml b/pubspec.yaml index bcc62f3..472eef7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: tetra_stats description: Track your and other player stats in TETR.IO publish_to: 'none' -version: 1.2.4+12 +version: 1.3.0+13 environment: sdk: '>=3.0.0' diff --git a/res/i18n/strings.i18n.json b/res/i18n/strings.i18n.json index adf56e7..842915c 100644 --- a/res/i18n/strings.i18n.json +++ b/res/i18n/strings.i18n.json @@ -59,10 +59,9 @@ "notSupporter": "Not a supporter", "assignedManualy": "That badge was assigned manualy by TETR.IO admins", "supporter": "Supporter tier ${tier}", - "comparingWith": "Comparing with data from ${date}", + "comparingWith": "Data from ${newDate} comparing with ${oldDate}", "top": "Top", "topRank": "Top Rank", - "decaying": "Decaying", "gamesUntilRanked": "${left} games until being ranked", "nerdStats": "Nerd Stats", "playersYouTrack": "Players you track", @@ -85,7 +84,7 @@ "yourIDText": "Every time when app loads, stats of that player will be fetched. Please prefer ID over nickname because nickname can be changed.", "language": "Language", "aboutApp": "About app", - "aboutAppText": "${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r", + "aboutAppText": "${appName} (${packageName}) Version ${version} Build ${buildNumber}\n\nDeveloped by dan63047\nFormulas provided by kerrmunism\nHistory provided by p1nkl0bst3r\nTETR.IO replay grabber API by szy", "stateViewTitle": "${nickname} account on ${date}", "statesViewTitle": "${number} states of ${nickname} account", "matchesViewTitle": "${nickname} TL matches", @@ -100,9 +99,15 @@ "trackedPlayersEntry": "${nickname}: ${numberOfStates} states", "trackedPlayersDescription": "From ${firstStateDate} until ${lastStateDate}", "trackedPlayersStatesDeleted": "${nickname} states was removed from database!", + "duplicatedFix": "Remove duplicated TL mathces", + "compressDB": "Compress DB", + "SpaceSaved": "Space saved: ${size}", "averageXrank": "Average ${rankLetter} rank", "vs": "vs", "inTLmatch": "in TL match", + "downloadReplay": "Download .ttrm replay", + "openReplay": "Open replay in TETR.IO", + "replaySaved": "Replay saved to ${path}", "match": "Match", "roundNumber": "Round $n", "statsFor": "Stats for", @@ -239,7 +244,10 @@ "p1nkl0bst3rForbidden": "Third party API blocked your IP address.\nChange IP address or reach out to p1nkl0bst3r", "p1nkl0bst3rTooManyRequests": "Too many requests to third party API. Try again later", "p1nkl0bst3rinternal": "Something happend on the p1nkl0bst3r side", - "p1nkl0bst3rinternalWebVersion": "Something happend on the p1nkl0bst3r side (or on oskware_bridge, idk honestly)" + "p1nkl0bst3rinternalWebVersion": "Something happend on the p1nkl0bst3r side (or on oskware_bridge, idk honestly)", + "replayAlreadySaved": "Replay already saved", + "replayExpired": "Replay expired and not available anymore", + "replayRejected": "Third party API blocked your IP address.\nChange IP address or reach out to szy" }, "countries(map)": { "": "Not selected", diff --git a/res/i18n/strings_ru.i18n.json b/res/i18n/strings_ru.i18n.json index d83fc23..184e4ce 100644 --- a/res/i18n/strings_ru.i18n.json +++ b/res/i18n/strings_ru.i18n.json @@ -59,10 +59,9 @@ "notSupporter": "Нет саппортерки", "supporter": "Саппортерка ${tier} уровня", "assignedManualy": "Этот значок был присвоен вручную администрацией TETR.IO", - "comparingWith": "Сравнивая с данными от ${date}", + "comparingWith": "Данные от ${newDate} в сравнении с данными от ${oldDate}", "top": "Топ", "topRank": "Топ Ранг", - "decaying": "Загнивает", "gamesUntilRanked": "${left} матчей до получения рейтинга", "nerdStats": "Для задротов", "playersYouTrack": "Отслеживаемые игроки", @@ -85,7 +84,7 @@ "yourIDText": "Каждый раз, когда приложение запускается, приложение будет получать статистику этого игрока. Пожалуйста, отдайте предпочтение ID, так как никнейм можно изменить.", "language": "Язык (Language)", "aboutApp": "О приложении", - "aboutAppText": "${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r", + "aboutAppText": "${appName} (${packageName}) Версия ${version} Сборка ${buildNumber}\n\nРазработал dan63047\nФормулы предоставил kerrmunism\nИсторию предоставляет p1nkl0bst3r\nВозможность скачивать повторы из TETR.IO предоставляет szy", "stateViewTitle": "Аккаунт ${nickname} ${date}", "statesViewTitle": "${number} состояний аккаунта ${nickname}", "matchesViewTitle": "Матчи аккаунта ${nickname}", @@ -100,9 +99,15 @@ "trackedPlayersEntry": "${nickname}: ${numberOfStates} состояний", "trackedPlayersDescription": "Начиная с ${firstStateDate} и заканчивая ${lastStateDate}", "trackedPlayersStatesDeleted": "Состояния аккаунта ${nickname} были удалены из локальной базы данных!", + "duplicatedFix": "Удалить дубликаты матчей в Тетра Лиге", + "compressDB": "Сжать базу данных", + "SpaceSaved": "Места освобождено: ${size}", "averageXrank": "Средний ${rankLetter} ранг", "vs": "против", "inTLmatch": "в матче ТЛ", + "downloadReplay": "Скачать .ttrm повтор", + "openReplay": "Открыть повтор в TETR.IO", + "replaySaved": "Повтор сохранён по пути ${path}", "match": "Матч", "roundNumber": "Раунд $n", "statsFor": "Статистика за", @@ -239,7 +244,10 @@ "p1nkl0bst3rForbidden": "Стороннее API заблокировало ваш IP адрес.\nСмените IP адрес или свяжитесь с p1nkl0bst3r-ом", "p1nkl0bst3rTooManyRequests": "Слишком много запросов к стороннему API. Попробуйте позже", "p1nkl0bst3rinternal": "Что-то случилось на стороне p1nkl0bst3r-а", - "p1nkl0bst3rinternalWebVersion": "Что-то случилось на стороне p1nkl0bst3r-а (или на стороне oskware_bridge, я хз если честно)" + "p1nkl0bst3rinternalWebVersion": "Что-то случилось на стороне p1nkl0bst3r-а (или на стороне oskware_bridge, я хз если честно)", + "replayAlreadySaved": "Повтор уже сохранён", + "replayExpired": "Повтор истёк и больше недоступен", + "replayRejected": "Стороннее API заблокировало ваш IP адрес.\nСмените IP адрес или свяжитесь с szy" }, "countries(map)": { "": "Не выбрана",