Teto API was updated, it's time to update

This commit is contained in:
dan63047 2023-11-09 01:17:44 +03:00
parent 754073a6ad
commit 5098b5ebf9
10 changed files with 90 additions and 40 deletions

View File

@ -801,8 +801,8 @@ class EndContextMulti {
required this.success});
EndContextMulti.fromJson(Map<String, dynamic> 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'];

View File

@ -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<AppLocale, _StringsEn> {
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<AppLocale, _StringsEn> {
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<AppLocale, _StringsEn> {
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: <root>
@ -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 'Аландские острова';

View File

@ -59,8 +59,8 @@ class TetrioService extends DB {
final Map<String, List<News>> _newsCache = {};
final Map<String, Map<String, double?>> _topTRcache = {};
final Map<String, TetraLeagueAlphaStream> _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<Map<String, List<TetrioPlayer>>> _tetrioStreamController;

View File

@ -113,9 +113,11 @@ class CustomizationState extends State<CustomizationView> {
}),
ListTile(
title: Text("Font"),
subtitle: Text("Not implemented"),
),
ListTile(
title: Text("Stats Table in TL mathes list"),
subtitle: Text("Not implemented"),
),
],
)),

View File

@ -63,13 +63,13 @@ class TlMatchResultState extends State<TlMatchResultView> {
PopupMenuButton(
enabled: widget.record.replayAvalable,
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
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<TlMatchResultView> {
} 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)));
}

View File

@ -48,11 +48,11 @@ class TrackedPlayersState extends State<TrackedPlayersView> {
itemBuilder: (BuildContext context) => <PopupMenuEntry>[
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<TrackedPlayersView> {
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:
}

View File

@ -47,7 +47,6 @@ class _TLThingyState extends State<TLThingy> {
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<TLThingy> {
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(),

View File

@ -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'

View File

@ -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",

View File

@ -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)": {
"": "Не выбрана",