mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-11-05 00:40:38 +01:00
Compare commits
27
Commits
220e4388d4
...
v1.29.11
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5dba69f30a | ||
|
|
023c348b0d | ||
|
|
8313dd811d | ||
|
|
3f7d10c2c6 | ||
|
|
98e83d120a | ||
|
|
dd845d2784 | ||
|
|
dc15df2a40 | ||
|
|
7c838aaf06 | ||
|
|
f181c96518 | ||
|
|
6fbfa2c70b | ||
|
|
17dd50b902 | ||
|
|
9061335292 | ||
|
|
c27d3a3b6a | ||
|
|
c37acf4a93 | ||
|
|
0c1cef87f6 | ||
|
|
e8b777be8a | ||
|
|
2941348412 | ||
|
|
68b2ecfb6d | ||
|
|
d5526da1fb | ||
|
|
091305a20f | ||
|
|
85cd70b2d5 | ||
|
|
7997f490fc | ||
|
|
5a0b309b0b | ||
|
|
43c14665de | ||
|
|
e249408360 | ||
|
|
24e57d7125 | ||
|
|
636a2934a2 |
No files matched your search
@@ -10,7 +10,7 @@ concurrency:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build
|
name: Build bot
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build
|
name: Build website
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# BlitzKit 1.29.10
|
||||||
|
|
||||||
|
Thank you to [Mark Greene](https://github.com/Hitjack007) for your contributions this update.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Combined game mode passive and active abilities into a single dropdown
|
||||||
|
- [Mark Greene] Added tier filters to the Guess game
|
||||||
|
- Changing tiers will break your streak
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
- [Mark Greene] module damage is now properly shown when sorting with it in the tank search
|
||||||
|
- Duplicate abilities in the tank filters are now removed
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# BlitzKit 1.29.11
|
||||||
|
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
- The Guesser game's toolbar now scales properly with screen size
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "blitzkit",
|
"name": "blitzkit",
|
||||||
"version": "1.29.9",
|
"version": "1.29.11",
|
||||||
"license": "BlitzKit License",
|
"license": "BlitzKit License",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -762,6 +762,8 @@
|
|||||||
"sorting_by": "Sorting by {name}",
|
"sorting_by": "Sorting by {name}",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"tier": "Tier {tier}",
|
"tier": "Tier {tier}",
|
||||||
|
"passive": "{name} (Passive)",
|
||||||
|
"active": "{name} (Active)",
|
||||||
|
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "No tanks found.",
|
"body": "No tanks found.",
|
||||||
@@ -928,7 +930,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "Clear",
|
||||||
|
"select_all": "Select all",
|
||||||
|
"tier": "Tier {tier}"
|
||||||
},
|
},
|
||||||
|
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
|
|||||||
@@ -671,6 +671,8 @@
|
|||||||
"sorting_by": "Sorting by {name}",
|
"sorting_by": "Sorting by {name}",
|
||||||
"clear": "Limpiar",
|
"clear": "Limpiar",
|
||||||
"tier": "Tier {tier}",
|
"tier": "Tier {tier}",
|
||||||
|
"passive": "{name} (Passive)",
|
||||||
|
"active": "{name} (Active)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "No se encontraron tanques.",
|
"body": "No se encontraron tanques.",
|
||||||
"search_again": "Intenta buscar de nuevo.",
|
"search_again": "Intenta buscar de nuevo.",
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "Limpiar",
|
||||||
|
"select_all": "Seleccionar todo",
|
||||||
|
"tier": "Tier {tier}"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Search a stat...",
|
"search": "Search a stat...",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"test": {
|
"test": {
|
||||||
"default": "teste",
|
"default": "teste",
|
||||||
"long": "This is a long test string. You MUST NEVER see this in the UI. My favorite fruit is {fruit} because it has the color of {color}. I like it so much that I will say its name 3 times! {fruit}! {fruit}! {fruit}! Once again, it's {color}, not {not_color}.",
|
"long": "Ceci est une longue chaîne de test. Vous ne DEVEZ JAMAIS le voir dans l'interface utilisateur. Mon fruit préféré est {fruit}, car il a la couleur {color}. Je l'aime tellement que je vais dire son nom 3 fois ! {fruit}! {fruit}! {fruit} ! Encore une fois, c'est {color}, pas {not_color}.",
|
||||||
"fox": "Le renard brun et rapide saute par-dessus le chien paresseux."
|
"fox": "Le renard brun et rapide saute par-dessus le chien paresseux."
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
"m": "{value}m",
|
"m": "{value}m",
|
||||||
"mm": "{value}mm",
|
"mm": "{value}mm",
|
||||||
"deg": "{value}°",
|
"deg": "{value}°",
|
||||||
"hp": "{value}hp",
|
"hp": "{value}pv",
|
||||||
"x": "x{value}",
|
"x": "x{value}",
|
||||||
"percentage": "{value}%",
|
"percentage": "{value}%",
|
||||||
"deg_s": "{value}°/s",
|
"deg_s": "{value}°/s",
|
||||||
@@ -187,11 +187,11 @@
|
|||||||
"bot": {
|
"bot": {
|
||||||
"common": {
|
"common": {
|
||||||
"errors": {
|
"errors": {
|
||||||
"clan_not_found": "# Could not find clan\nCouldn't find \"{search}\". Try selecting a clan from the search result.",
|
"clan_not_found": "# Impossible de trouver le clan\nImpossible de trouver «{search} ». Essayez de sélectionner un clan dans le résultat de la recherche.",
|
||||||
"player_not_found": "# Could not find user\nI couldn't find user \"{search}\". Try picking an user from the search result, typing in a valid username, or using the `/link` command.",
|
"player_not_found": "# Impossible de trouver l'utilisateur\nJe n'ai pas pu trouver l'utilisateur \"{search}\". Essayez de choisir un utilisateur dans le résultat de la recherche, en tapant un nom d'utilisateur valide, ou en utilisant la commande `/link`.",
|
||||||
"player_not_linked": "# Utilisez `/link` pour commencer\nJe ne sais pas qui vous êtes, mais vous pouvez me le dire aujourd'hui !",
|
"player_not_linked": "# Utilisez `/link` pour commencer\nJe ne sais pas qui vous êtes, mais vous pouvez me le dire aujourd'hui !",
|
||||||
"tank_name_not_found": "# Tank not found\nCould not find tank by the name \"{search}\".",
|
"tank_name_not_found": "# Char introuvable\nImpossible de trouver le char sous le nom \"{search}\".",
|
||||||
"tank_id_not_found": "# Tank not found\nCould not find tank by the ID \"{search}\". Try typing the name of the tank instead of a number.",
|
"tank_id_not_found": "# Char introuvable\nImpossible de trouver le char avec l'ID \"{search}\". Essayez de taper le nom du char au lieu d'un nombre.",
|
||||||
"no_tank_stats": "# Aucune statistique de tank disponible\nCe joueur n'a pas de statistiques disponibles. Ce n'est peut-être pas le joueur que vous cherchez.",
|
"no_tank_stats": "# Aucune statistique de tank disponible\nCe joueur n'a pas de statistiques disponibles. Ce n'est peut-être pas le joueur que vous cherchez.",
|
||||||
"get_help": "Aidez le serveur Discord",
|
"get_help": "Aidez le serveur Discord",
|
||||||
"uncaught_error": "# Blitzkit a rencontré une erreur !\nNous sommes désolés de cela. N'hésitez pas à [rejoindre le serveur officiel Discord](https://discord.gg/nDt7AjGJQH) pour obtenir de l'aide.",
|
"uncaught_error": "# Blitzkit a rencontré une erreur !\nNous sommes désolés de cela. N'hésitez pas à [rejoindre le serveur officiel Discord](https://discord.gg/nDt7AjGJQH) pour obtenir de l'aide.",
|
||||||
@@ -285,19 +285,19 @@
|
|||||||
"name": "rang",
|
"name": "rang",
|
||||||
"description": "Rang",
|
"description": "Rang",
|
||||||
"choices": {
|
"choices": {
|
||||||
"tier": "Tier {tier_1} - {tier_2}"
|
"tier": "Rang {tier_}1 - {tier_}2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"periods": {
|
"periods": {
|
||||||
"career": "Carrière",
|
"career": "Carrière",
|
||||||
"today": "Aujourd'hui",
|
"today": "Aujourd'hui",
|
||||||
"days": "{days} days",
|
"days": "{days} jours",
|
||||||
"custom": "{day_1} - {day_2} days"
|
"custom": "{day_1} - {day_2} jours"
|
||||||
},
|
},
|
||||||
"filters": {
|
"filters": {
|
||||||
"none": "Aucun filtre",
|
"none": "Aucun filtre",
|
||||||
"tier": "Tier {tier}"
|
"tier": "Rang {tier}"
|
||||||
},
|
},
|
||||||
"no_data": {
|
"no_data": {
|
||||||
"battles_in_period": "",
|
"battles_in_period": "",
|
||||||
@@ -340,19 +340,19 @@
|
|||||||
"body": {
|
"body": {
|
||||||
"subtitle": "Recherche",
|
"subtitle": "Recherche",
|
||||||
"total": "Total",
|
"total": "Total",
|
||||||
"research": "Research: {cost}",
|
"research": "Recherche : {cost}",
|
||||||
"upgrades": "Upgrades: {cost}",
|
"upgrades": "Améliorations : {cost}",
|
||||||
"purchase": "Purchase: {cost}",
|
"purchase": "Achat : {cost}",
|
||||||
"equipment": "Equipment: {cost}",
|
"equipment": "Équipement : {cost}",
|
||||||
"estimation": "# Ceci est une estimation !\n\nCette liste peut inclure des chars déjà recherchés en raison de l'information inexacte fournie par Wargaming. Essayez de fournir un `char de départ` depuis la ligne lorsque vous utilisez la commande si vous le pouvez."
|
"estimation": "# Ceci est une estimation !\n\nCette liste peut inclure des chars déjà recherchés en raison de l'information inexacte fournie par Wargaming. Essayez de fournir un `char de départ` depuis la ligne lorsque vous utilisez la commande si vous le pouvez."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"non_tech_tree": "# {tank} is not on the tech tree\n\nYou cannot research a premium/collector tank.",
|
"non_tech_tree": "# {tank} n'est pas dans l'arbre technologique\n\nVous ne pouvez pas rechercher un char premium/de collection.",
|
||||||
"tier_1": "# {tank} is a tier I\n\nTier I tanks are always unlocked for free for all players.",
|
"tier_1": "# {tank} est un char de rang I\n\nLe char de rang 1 sont déverrouillé gratuitement pour tous les joueurs.",
|
||||||
"already_researched": "# {tank} is already researched\n\nTry providing a `starting-tank` when using the command to view the totals for a line you have already researched.",
|
"already_researched": "# {tank} est déjà recherché\n\nEssayez de fournir un `char de départ` en utilisant la commande pour voir la progression d'une lignée.",
|
||||||
"start_end_equal": "# {tank} was provided twice\n\nMake sure `starting-tank` and `target-tank` are different.",
|
"start_end_equal": "# {tank} a été fourni deux fois\n\nAssurez-vous que `starting-tank` et `target-tank` sont différents.",
|
||||||
"tanks_not_on_line": "# {tank_1} and {tank_2} are not on the same line\n\nMake sure `starting-tank` and `target-tank` are on the same tech-tree line.",
|
"tanks_not_on_line": "{tank_}1 et {tank_}2 ne sont pas sur la même ligne \n\nAssurez-vous que `starting-tank` et `target-tank` sont sur la même ligne d'arbre technologique.",
|
||||||
"unordered": "# {tank_1} higher tiered to {tank_2}\n\nMake sure to provide {tank_2} as the `starting-tank` instead as it is the lower tiered tank."
|
"unordered": "# {tank_1} niveau supérieur à {tank_2}\n\nAssurez-vous de fournir {tank_2} comme le `starting-tank` à la place car c'est le char de niveau inférieur."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"about": {
|
"about": {
|
||||||
@@ -395,7 +395,7 @@
|
|||||||
"wn8": "WN8",
|
"wn8": "WN8",
|
||||||
"winrate": "Taux de victoires",
|
"winrate": "Taux de victoires",
|
||||||
"damage": "Dégâts",
|
"damage": "Dégâts",
|
||||||
"unknown_tank": "Unknown tank {id}"
|
"unknown_tank": "Char {id} inconnu"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
@@ -431,12 +431,12 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"threshold": {
|
"threshold": {
|
||||||
"name": "seuil",
|
"name": "seuil",
|
||||||
"description": "The number of days inactive (default: {days} days)"
|
"description": "Le nombre de jours inactifs (par défaut: {days} jours)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"subtitle": "Inactive for {days}+ days",
|
"subtitle": "Inactif depuis plus de {days} jours",
|
||||||
"listing": "{days} days"
|
"listing": "{days} jours"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"full_stats": {
|
"full_stats": {
|
||||||
@@ -479,7 +479,7 @@
|
|||||||
"body": {
|
"body": {
|
||||||
"accounts_linked": "Comptes liés",
|
"accounts_linked": "Comptes liés",
|
||||||
"no_role_permissions": {
|
"no_role_permissions": {
|
||||||
"title": "{name} failed to verify",
|
"title": "La vérification de {name} a échouée",
|
||||||
"description": "Je n'ai pas l'autorisation de gérer les rôles."
|
"description": "Je n'ai pas l'autorisation de gérer les rôles."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -494,11 +494,11 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"limit": {
|
"limit": {
|
||||||
"name": "limite",
|
"name": "limite",
|
||||||
"description": "The max number of clan results (default: {limit})"
|
"description": "Nombre maximum de résultats du clan (par défaut: {limit})"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"title": "Clan search for {search} in region {region}",
|
"title": "Recherche de clan {search} dans la région {region}",
|
||||||
"no_results": "Pas de clan trouvé"
|
"no_results": "Pas de clan trouvé"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -508,11 +508,11 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"limit": {
|
"limit": {
|
||||||
"name": "limite",
|
"name": "limite",
|
||||||
"description": "The max number of player results (default: {limit})"
|
"description": "Le nombre maximum de résultats de joueur (par défaut: {limit})"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"title": "Player search for {search} in region {region}",
|
"title": "Recherche de {search} dans la région {region}",
|
||||||
"no_results": "Pas de joueur de trouvé"
|
"no_results": "Pas de joueur de trouvé"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -532,13 +532,13 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"limit": {
|
"limit": {
|
||||||
"name": "limite",
|
"name": "limite",
|
||||||
"description": "How many neighbors to display (default: {count})"
|
"description": "Combien de voisins afficher (par défaut : {count})"
|
||||||
},
|
},
|
||||||
"season": {
|
"season": {
|
||||||
"name": "saison",
|
"name": "saison",
|
||||||
"description": "Numéro de saison (défaut : courant)",
|
"description": "Numéro de saison (défaut : courant)",
|
||||||
"choices": {
|
"choices": {
|
||||||
"current": "{season} (current)"
|
"current": "{season} (actuel)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"league": {
|
"league": {
|
||||||
@@ -547,12 +547,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"top_players": "Top {count} players",
|
"top_players": "Top {count} joueurs",
|
||||||
"no_participation": "# {player} didn't play rating in season {season}\n\nThis player did not participate in this season or did not get past calibration.",
|
"no_participation": "# {player} n'a pas joué de cotées dans la saison {season}\n\nCe joueur n'a pas participé à cette saison ou n'a pas dépassé l'étalonnage.",
|
||||||
"no_ongoing_season": "Pas de saison en cours\n\nIl n'y a pas de saison de notation en cours actuellement.",
|
"no_ongoing_season": "Pas de saison en cours\n\nIl n'y a pas de saison de notation en cours actuellement.",
|
||||||
"deleted_player": "Deleted {id}",
|
"deleted_player": "{id} supprimé",
|
||||||
"neighbors": "évaluer les voisins",
|
"neighbors": "évaluer les voisins",
|
||||||
"more": "+ {count} more"
|
"more": "+ {count} plus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"today": {
|
"today": {
|
||||||
@@ -567,7 +567,7 @@
|
|||||||
"name": "chars possédés",
|
"name": "chars possédés",
|
||||||
"description": "Affiche tous les chars d'un niveau",
|
"description": "Affiche tous les chars d'un niveau",
|
||||||
"body": {
|
"body": {
|
||||||
"title": "# {name}'s owned tier {tier} tanks\n\n"
|
"title": "# Les chars du palier {tier} possédés par {name}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"permissions": {
|
"permissions": {
|
||||||
@@ -603,94 +603,96 @@
|
|||||||
"name": "info-joueur",
|
"name": "info-joueur",
|
||||||
"description": "Informations de base sur un joueur",
|
"description": "Informations de base sur un joueur",
|
||||||
"body": {
|
"body": {
|
||||||
"title": "{name}'s information",
|
"title": "Informations de {name}",
|
||||||
"nickname": "Nickname",
|
"nickname": "Pseudo",
|
||||||
"battles": "Batailles",
|
"battles": "Batailles",
|
||||||
"winrate": "Taux de victoires",
|
"winrate": "Taux de victoires",
|
||||||
"account_id": "Account ID",
|
"account_id": "Account ID",
|
||||||
"created": "Created",
|
"created": "Créé",
|
||||||
"last_battle": "Last battle"
|
"last_battle": "Dernière bataille"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rating": {
|
"rating": {
|
||||||
"name": "côtée",
|
"name": "côtée",
|
||||||
"description": "Rating player's statistics",
|
"description": "Statistiques des batailles cotées du joueur",
|
||||||
"subcommands": {
|
"subcommands": {
|
||||||
"today": {
|
"today": {
|
||||||
"name": "aujourd'hui",
|
"name": "aujourd'hui",
|
||||||
"description": "Today's rating statistics"
|
"description": "Statistiques des batailles cotées d'aujourd'hui"
|
||||||
},
|
},
|
||||||
"season": {
|
"season": {
|
||||||
"name": "saison",
|
"name": "saison",
|
||||||
"description": "This season's rating statistics"
|
"description": "Statistiques des batailles cotées de cette saison"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"subtitle": {
|
"subtitle": {
|
||||||
"today": "Today's rating statistics",
|
"today": "Statistiques de batailles cotées d'aujourd'hui",
|
||||||
"season": "This season's rating statistics"
|
"season": "Statistiques de batailles cotées cette saison"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"no_participation": "# {name} hasn't played rating\n\nThis player hasn't participated in the rating gamemode this season.",
|
"no_participation": "# {name} n’a pas joué en cotée\n\nCe joueur n’a pas participé au mode cotée cette saison.",
|
||||||
"unrecorded_stats": "# Statistics currently unavailable\n\nWargaming may be currently be facing server downtime. If there is an on-going season, statistics should be available withing 24 hours."
|
"unrecorded_stats": "# Statistiques actuellement indisponibles\n\nWargaming rencontre peut-être une interruption de service.\nSi une saison est en cours, les statistiques devraient être disponibles sous 24 heures."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"website": {
|
"website": {
|
||||||
"redirect": {
|
"redirect": {
|
||||||
"title": "301: moved permanently",
|
"title": "301 : déplacé définitivement",
|
||||||
"body": "This page has moved. Redirecting..."
|
"body": "Cette page a été déplacée. Redirection en cours…"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Settings",
|
"title": "Paramètres",
|
||||||
"description": "Change BlitzKit settings",
|
"description": "Modifier les paramètres de BlitzKit",
|
||||||
"dev_mode": "Development mode",
|
"dev_mode": "Mode développement",
|
||||||
"language": "Language"
|
"language": "Langue"
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"player_search": {
|
"player_search": {
|
||||||
"hint": "Search players...",
|
"hint": "Recherche de joueurs...",
|
||||||
"no_results": "No results",
|
"no_results": "Aucun résultat",
|
||||||
"searching": "Searching..."
|
"searching": "Recherche..."
|
||||||
},
|
},
|
||||||
"copy_button": {
|
"copy_button": {
|
||||||
"copied": "Copied!"
|
"copied": "Copié !"
|
||||||
},
|
},
|
||||||
"tank_search": {
|
"tank_search": {
|
||||||
"select_dialog_title": "Search for tanks",
|
"select_dialog_title": "Recherche de chars",
|
||||||
"swap_dialog_title": "Swap tank",
|
"swap_dialog_title": "Échanger le char",
|
||||||
"clear_filters": "Clear filters",
|
"clear_filters": "Supprimer les filtres",
|
||||||
"login": "Login to use this",
|
"login": "Connectez-vous pour utiliser ceci",
|
||||||
"search_bar_hint": "Search tanks...",
|
"search_bar_hint": "Recherche des tanks...",
|
||||||
"recent": "Recently viewed",
|
"recent": "Vu récemment",
|
||||||
"select_all": "Select all",
|
"select_all": "Sélectionner tout",
|
||||||
"count_singular": "1 tank",
|
"count_singular": "1 char",
|
||||||
"count_plural": "{count} tanks",
|
"count_plural": "{count} chars",
|
||||||
"sorting_by": "Sorting by {name}",
|
"sorting_by": "Trier par {name}",
|
||||||
"clear": "Clear",
|
"clear": "Effacer",
|
||||||
"tier": "Tier {tier}",
|
"tier": "Rang {tier}",
|
||||||
|
"passive": "{name} (Passif)",
|
||||||
|
"active": "{name} (actif)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "No tanks found.",
|
"body": "Aucun tank trouvé.",
|
||||||
"search_again": "Try searching again.",
|
"search_again": "Essayez de chercher à nouveau.",
|
||||||
"clear_filters": "Try clearing filters."
|
"clear_filters": "Essayez de supprimer les filtres."
|
||||||
},
|
},
|
||||||
"sort": {
|
"sort": {
|
||||||
"meta.none": "none",
|
"meta.none": "aucun",
|
||||||
"survivability.health": "health",
|
"survivability.health": "santé",
|
||||||
"survivability.viewRange": "view range",
|
"survivability.viewRange": "portée de vue",
|
||||||
"survivability.camouflageStill": "camouflage still",
|
"survivability.camouflageStill": "camouflage à l’arrêt",
|
||||||
"survivability.camouflageMoving": "camouflage moving",
|
"survivability.camouflageMoving": "camouflage en movement",
|
||||||
"survivability.camouflageShooting": "camouflage shooting",
|
"survivability.camouflageShooting": "camouflage en tirant",
|
||||||
"survivability.volume": "volume",
|
"survivability.volume": "volume",
|
||||||
"survivability.length": "length",
|
"survivability.length": "longueur",
|
||||||
"fire.dpm": "standard DPM",
|
"fire.dpm": "DPM standard",
|
||||||
"fire.dpmPremium": "premium DPM",
|
"fire.dpmPremium": "DPM premium",
|
||||||
"fire.reload": "reload",
|
"fire.reload": "rechargement",
|
||||||
"fire.caliber": "caliber",
|
"fire.caliber": "calibration",
|
||||||
"fire.standardPenetration": "standard penetration",
|
"fire.standardPenetration": "pénétration standard",
|
||||||
"fire.premiumPenetration": "premium penetration",
|
"fire.premiumPenetration": "pénétration premium",
|
||||||
"fire.tertiaryPenetration": "tertiary penetration",
|
"fire.tertiaryPenetration": "tertiary penetration",
|
||||||
"fire.damage": "damage",
|
"fire.damage": "damage",
|
||||||
"fire.moduleDamage": "module damage",
|
"fire.moduleDamage": "module damage",
|
||||||
@@ -815,7 +817,7 @@
|
|||||||
"skip": "Skip",
|
"skip": "Skip",
|
||||||
"guess": "Guess",
|
"guess": "Guess",
|
||||||
"next": "Next",
|
"next": "Next",
|
||||||
"no_results": "No results"
|
"no_results": "Aucun résultat"
|
||||||
},
|
},
|
||||||
"stats": "{correct} / {total} guessed correctly",
|
"stats": "{correct} / {total} guessed correctly",
|
||||||
"help": {
|
"help": {
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "Clear",
|
||||||
|
"select_all": "Sélectionner tout",
|
||||||
|
"tier": "Rang {tier}"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Search a stat...",
|
"search": "Search a stat...",
|
||||||
@@ -1206,8 +1211,8 @@
|
|||||||
"seo_description": "Track your stats in real time as you play World of Tanks Blitz",
|
"seo_description": "Track your stats in real time as you play World of Tanks Blitz",
|
||||||
"search": {
|
"search": {
|
||||||
"lookup": "Look up a player to get started",
|
"lookup": "Look up a player to get started",
|
||||||
"hint": "Search players...",
|
"hint": "Recherche de joueurs...",
|
||||||
"searching": "Searching...",
|
"searching": "Recherche...",
|
||||||
"no_results": "Pas de joueur de trouvé"
|
"no_results": "Pas de joueur de trouvé"
|
||||||
},
|
},
|
||||||
"controls": {
|
"controls": {
|
||||||
|
|||||||
@@ -187,11 +187,11 @@
|
|||||||
"bot": {
|
"bot": {
|
||||||
"common": {
|
"common": {
|
||||||
"errors": {
|
"errors": {
|
||||||
"clan_not_found": "# Could not find clan\nCouldn't find \"{search}\". Try selecting a clan from the search result.",
|
"clan_not_found": "",
|
||||||
"player_not_found": "# Could not find user\nI couldn't find user \"{search}\". Try picking an user from the search result, typing in a valid username, or using the `/link` command.",
|
"player_not_found": "# ユーザーが見つかりませんでした\nユーザー「{search}」が見つかりませんでした。検索結果からユーザーを選択するか、有効なユーザー名を入力するか、/link コマンドを使用してください。",
|
||||||
"player_not_linked": "# `/link`を使用して始めましょう\nはじめまして!あなたが誰か、私に教えてください。",
|
"player_not_linked": "# `/link`を使用して始めましょう\nはじめまして!あなたが誰か、私に教えてください。",
|
||||||
"tank_name_not_found": "# Tank not found\nCould not find tank by the name \"{search}\".",
|
"tank_name_not_found": "# Tank not found\nCould not find tank by the name \"{search}\".",
|
||||||
"tank_id_not_found": "# Tank not found\nCould not find tank by the ID \"{search}\". Try typing the name of the tank instead of a number.",
|
"tank_id_not_found": "# 車両が見つかりません\nID「{search}」の戦車が見つかりませんでした。数字ではなく戦車の名前を入力してみてください。",
|
||||||
"no_tank_stats": "# 利用可能な車輌統計がありません\nこのプレイヤーには利用可能な統計がありません。あなたが探しているプレイヤーではない可能性があります。",
|
"no_tank_stats": "# 利用可能な車輌統計がありません\nこのプレイヤーには利用可能な統計がありません。あなたが探しているプレイヤーではない可能性があります。",
|
||||||
"get_help": "Discordサーバーに参加する",
|
"get_help": "Discordサーバーに参加する",
|
||||||
"uncaught_error": "# BlitzKitがエラーに遭遇しました!\n申し訳ありません。お気軽に[公式Discordサーバー](https://discord.gg/nDt7AjGJQH)にお問い合わせください。",
|
"uncaught_error": "# BlitzKitがエラーに遭遇しました!\n申し訳ありません。お気軽に[公式Discordサーバー](https://discord.gg/nDt7AjGJQH)にお問い合わせください。",
|
||||||
@@ -395,7 +395,7 @@
|
|||||||
"wn8": "WN8",
|
"wn8": "WN8",
|
||||||
"winrate": "勝率",
|
"winrate": "勝率",
|
||||||
"damage": "ダメージ",
|
"damage": "ダメージ",
|
||||||
"unknown_tank": "Unknown tank {id}"
|
"unknown_tank": "不明な車両{id}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
@@ -560,7 +560,7 @@
|
|||||||
"description": "Today's played tanks and statistics"
|
"description": "Today's played tanks and statistics"
|
||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"name": "stats",
|
"name": "",
|
||||||
"description": "Quick statistics for a period"
|
"description": "Quick statistics for a period"
|
||||||
},
|
},
|
||||||
"owned_tanks": {
|
"owned_tanks": {
|
||||||
@@ -671,6 +671,8 @@
|
|||||||
"sorting_by": "Sorting by {name}",
|
"sorting_by": "Sorting by {name}",
|
||||||
"clear": "クリア",
|
"clear": "クリア",
|
||||||
"tier": "Tier {tier}",
|
"tier": "Tier {tier}",
|
||||||
|
"passive": "{name} (Passive)",
|
||||||
|
"active": "{name} (Active)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "該当する車輌が存在しません。",
|
"body": "該当する車輌が存在しません。",
|
||||||
"search_again": "もう一度検索してください。",
|
"search_again": "もう一度検索してください。",
|
||||||
@@ -781,7 +783,7 @@
|
|||||||
"tank": "車輌名",
|
"tank": "車輌名",
|
||||||
"last_played": "Last played",
|
"last_played": "Last played",
|
||||||
"battles": "Career battles",
|
"battles": "Career battles",
|
||||||
"unrecorded": "--",
|
"unrecorded": "",
|
||||||
"wins": "勝利"
|
"wins": "勝利"
|
||||||
},
|
},
|
||||||
"large_warning": {
|
"large_warning": {
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "クリア",
|
||||||
|
"select_all": "全て選択",
|
||||||
|
"tier": "Tier {tier}"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Search a stat...",
|
"search": "Search a stat...",
|
||||||
|
|||||||
@@ -671,6 +671,8 @@
|
|||||||
"sorting_by": "Sorting by {name}",
|
"sorting_by": "Sorting by {name}",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"tier": "Tier {tier}",
|
"tier": "Tier {tier}",
|
||||||
|
"passive": "{name} (Passive)",
|
||||||
|
"active": "{name} (Active)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "No tanks found.",
|
"body": "No tanks found.",
|
||||||
"search_again": "Try searching again.",
|
"search_again": "Try searching again.",
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "Clear",
|
||||||
|
"select_all": "Select all",
|
||||||
|
"tier": "Tier {tier}"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Search a stat...",
|
"search": "Search a stat...",
|
||||||
|
|||||||
@@ -671,6 +671,8 @@
|
|||||||
"sorting_by": "Sorting by {name}",
|
"sorting_by": "Sorting by {name}",
|
||||||
"clear": "Limpar",
|
"clear": "Limpar",
|
||||||
"tier": "Tier {tier}",
|
"tier": "Tier {tier}",
|
||||||
|
"passive": "{name} (Passive)",
|
||||||
|
"active": "{name} (Active)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "Nenhum tanque encontrado.",
|
"body": "Nenhum tanque encontrado.",
|
||||||
"search_again": "Tente pesquisar novamente.",
|
"search_again": "Tente pesquisar novamente.",
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "Limpar",
|
||||||
|
"select_all": "Selecionar todos",
|
||||||
|
"tier": "Tier {tier}"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Search a stat...",
|
"search": "Search a stat...",
|
||||||
|
|||||||
@@ -297,7 +297,7 @@
|
|||||||
},
|
},
|
||||||
"filters": {
|
"filters": {
|
||||||
"none": "Без фильтров",
|
"none": "Без фильтров",
|
||||||
"tier": " {tier} уровня"
|
"tier": "{tier} уровень"
|
||||||
},
|
},
|
||||||
"no_data": {
|
"no_data": {
|
||||||
"battles_in_period": "За этот период боёв не было",
|
"battles_in_period": "За этот период боёв не было",
|
||||||
@@ -670,7 +670,9 @@
|
|||||||
"count_plural": "Танков: {count}",
|
"count_plural": "Танков: {count}",
|
||||||
"sorting_by": "Сортировать по {name}",
|
"sorting_by": "Сортировать по {name}",
|
||||||
"clear": "Очистить",
|
"clear": "Очистить",
|
||||||
"tier": " {tier} уровня",
|
"tier": "{tier} уровень",
|
||||||
|
"passive": "{name} (Пассивный)",
|
||||||
|
"active": "{name} (Активный)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "Танков не найдено.",
|
"body": "Танков не найдено.",
|
||||||
"search_again": "Попробуйте повторить поиск.",
|
"search_again": "Попробуйте повторить поиск.",
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Показывает танк не показывая название. Этот раунд будет считаться проигранным и прекратит серию!",
|
"description": "Показывает танк не показывая название. Этот раунд будет считаться проигранным и прекратит серию!",
|
||||||
"cancel": "Отмена",
|
"cancel": "Отмена",
|
||||||
"reveal": "Раскрыть"
|
"reveal": "Раскрыть"
|
||||||
}
|
},
|
||||||
|
"clear": "Очистить",
|
||||||
|
"select_all": "Выбрать всё",
|
||||||
|
"tier": "{tier} уровень"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Поиск характеристик...",
|
"search": "Поиск характеристик...",
|
||||||
|
|||||||
@@ -79,11 +79,11 @@
|
|||||||
"10": "Супер винятковий"
|
"10": "Супер винятковий"
|
||||||
},
|
},
|
||||||
"nations": {
|
"nations": {
|
||||||
"ussr": "СРСР",
|
"ussr": "С.Р.С.Р.",
|
||||||
"germany": "Німеччина",
|
"germany": "Німеччина",
|
||||||
"usa": "ЗША",
|
"usa": "С.Ш.А.",
|
||||||
"china": "Китай",
|
"china": "Китай",
|
||||||
"uk": "Велика Британія",
|
"uk": "Сполучене Королівство ",
|
||||||
"france": "Франція",
|
"france": "Франція",
|
||||||
"japan": "Японія",
|
"japan": "Японія",
|
||||||
"european": "Європейська нація",
|
"european": "Європейська нація",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"3": "ПТ-САУ"
|
"3": "ПТ-САУ"
|
||||||
},
|
},
|
||||||
"tree_type": {
|
"tree_type": {
|
||||||
"-1": "не розпізнано",
|
"-1": "не розпізнаний",
|
||||||
"0": "Звичайний",
|
"0": "Звичайний",
|
||||||
"1": "Преміум",
|
"1": "Преміум",
|
||||||
"2": "Колекційний"
|
"2": "Колекційний"
|
||||||
@@ -341,18 +341,18 @@
|
|||||||
"subtitle": "Дослідження",
|
"subtitle": "Дослідження",
|
||||||
"total": "Загалом",
|
"total": "Загалом",
|
||||||
"research": "Дослідження: {cost}",
|
"research": "Дослідження: {cost}",
|
||||||
"upgrades": "Upgrades: {cost}",
|
"upgrades": "Прокачування: {cost}",
|
||||||
"purchase": "Вартість: {cost}",
|
"purchase": "Вартість: {cost}",
|
||||||
"equipment": "Спорядження: {cost}",
|
"equipment": "Спорядження: {cost}",
|
||||||
"estimation": "# Це оцінка!\n\nЦей список може включати вже досліджені танки через неточну інформацію для вантажу. Спробуйте використати \"початковий танк\" з рядка за допомогою команди."
|
"estimation": "# Це оцінка!\n\nЦей список може включати вже досліджені танки через неточну інформацію для вантажу. Спробуйте використати \"початковий танк\" з рядка за допомогою команди."
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"non_tech_tree": "# {tank} is not on the tech tree\n\nYou cannot research a premium/collector tank.",
|
"non_tech_tree": "#{tank} відсутній в дереві дослідження\n\nВи не можете дослідити преміум/колеційний танк.",
|
||||||
"tier_1": "# {tank} is a tier I\n\nTier I tanks are always unlocked for free for all players.",
|
"tier_1": "#{tank} І рівня \n\nТанки І рівня завжди розблоковані для всіх гравців безкоштовно",
|
||||||
"already_researched": "# {tank} is already researched\n\nTry providing a `starting-tank` when using the command to view the totals for a line you have already researched.",
|
"already_researched": "# {tank} вже було досліджено\n\nСпробуйте використати `початковий-танк` коли використовуєте команду для перегляду загальної гілки, яку ви вже дослідили",
|
||||||
"start_end_equal": "# {tank} was provided twice\n\nMake sure `starting-tank` and `target-tank` are different.",
|
"start_end_equal": "#{tank} було введено двічі \n\nПереконайтесь що `початковий-танк` та `ціль-танк` різні",
|
||||||
"tanks_not_on_line": "# {tank_1} and {tank_2} are not on the same line\n\nMake sure `starting-tank` and `target-tank` are on the same tech-tree line.",
|
"tanks_not_on_line": "# {tank_1} та {tank_2} не в одній гілці\n\nПереконайтесь що `початковий-танк` та `ціль-танк` знаходяться в єдиній гілці дерева дослідження",
|
||||||
"unordered": "# {tank_1} higher tiered to {tank_2}\n\nMake sure to provide {tank_2} as the `starting-tank` instead as it is the lower tiered tank."
|
"unordered": "# {tank_1} вище рівнем відносно {tank_2}\n\nОбов’язково вкажіть {tank_2} як `початковий-танк`, оскільки це танк нижчого рівня."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"about": {
|
"about": {
|
||||||
@@ -395,7 +395,7 @@
|
|||||||
"wn8": "WN8",
|
"wn8": "WN8",
|
||||||
"winrate": "Відсоток перемог",
|
"winrate": "Відсоток перемог",
|
||||||
"damage": "Шкода",
|
"damage": "Шкода",
|
||||||
"unknown_tank": "Unknown tank {id}"
|
"unknown_tank": "Невідомий танк {id}"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
@@ -431,11 +431,11 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"threshold": {
|
"threshold": {
|
||||||
"name": "поріг",
|
"name": "поріг",
|
||||||
"description": "The number of days inactive (default: {days} days)"
|
"description": "Кількість днів неактивності (за замовчуванням: {days} днів)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"subtitle": "Inactive for {days}+ days",
|
"subtitle": "Неактивний {days}+ днів",
|
||||||
"listing": "{days} днів"
|
"listing": "{days} днів"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -479,7 +479,7 @@
|
|||||||
"body": {
|
"body": {
|
||||||
"accounts_linked": "Прив'язані акаунти",
|
"accounts_linked": "Прив'язані акаунти",
|
||||||
"no_role_permissions": {
|
"no_role_permissions": {
|
||||||
"title": "{name} failed to verify",
|
"title": "{name} не вдалося перевірити",
|
||||||
"description": "У мене немає дозволу керувати ролями."
|
"description": "У мене немає дозволу керувати ролями."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -494,11 +494,11 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"limit": {
|
"limit": {
|
||||||
"name": "ліміт",
|
"name": "ліміт",
|
||||||
"description": "The max number of clan results (default: {limit})"
|
"description": "Максимальна кількість результатів клану (за замовчуванням: {limit})"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"title": "Clan search for {search} in region {region}",
|
"title": "Пошук клану для {search} в регіоні {region}",
|
||||||
"no_results": "Жодного клану не знайдено"
|
"no_results": "Жодного клану не знайдено"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -508,11 +508,11 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"limit": {
|
"limit": {
|
||||||
"name": "ліміт",
|
"name": "ліміт",
|
||||||
"description": "The max number of player results (default: {limit})"
|
"description": "Максимальна кількість результатів гравця (за замовчуванням: {limit})"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"title": "Player search for {search} in region {region}",
|
"title": "Пошук гравця для {search} у регіоні {region}",
|
||||||
"no_results": "Гравця не знайдено"
|
"no_results": "Гравця не знайдено"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -521,8 +521,8 @@
|
|||||||
"description": "Статистика рейтингових боїв",
|
"description": "Статистика рейтингових боїв",
|
||||||
"subcommands": {
|
"subcommands": {
|
||||||
"neighbors": {
|
"neighbors": {
|
||||||
"name": "neighbors",
|
"name": "сусіди",
|
||||||
"description": "Neighboring players on the leaderboard"
|
"description": "Сусідуючі гравці в лідерборді"
|
||||||
},
|
},
|
||||||
"league": {
|
"league": {
|
||||||
"name": "ліга",
|
"name": "ліга",
|
||||||
@@ -532,32 +532,32 @@
|
|||||||
"options": {
|
"options": {
|
||||||
"limit": {
|
"limit": {
|
||||||
"name": "ліміт",
|
"name": "ліміт",
|
||||||
"description": "How many neighbors to display (default: {count})"
|
"description": "Скільки сусідів відобразити (за замовчуванням: {count})"
|
||||||
},
|
},
|
||||||
"season": {
|
"season": {
|
||||||
"name": "сезон",
|
"name": "сезон",
|
||||||
"description": "Базова інформація про гравця",
|
"description": "Базова інформація про гравця",
|
||||||
"choices": {
|
"choices": {
|
||||||
"current": "{season} (current)"
|
"current": "{season} (поточний)"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"league": {
|
"league": {
|
||||||
"name": "ліга",
|
"name": "ліга",
|
||||||
"description": "The league to display"
|
"description": "Ліга для відображення"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"top_players": "Top {count} players",
|
"top_players": "Топ {count} гравців",
|
||||||
"no_participation": "# {player} didn't play rating in season {season}\n\nThis player did not participate in this season or did not get past calibration.",
|
"no_participation": "# {player} не грав у рейтингу в сезоні {season}\n\nЦей гравець не брав участь у цьому сезоні або не проходив калібрування",
|
||||||
"no_ongoing_season": "# No ongoing season\n\nThere isn't a currently running rating season.",
|
"no_ongoing_season": "# Немає поточного сезону\n\nВ даний час немає сезону рейтингу.",
|
||||||
"deleted_player": "",
|
"deleted_player": "",
|
||||||
"neighbors": "Rating neighbors",
|
"neighbors": "Сусіди по рейтингу",
|
||||||
"more": "+ {count} more"
|
"more": "+ {count} ще"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"today": {
|
"today": {
|
||||||
"name": "сьогодні",
|
"name": "сьогодні",
|
||||||
"description": "Today's played tanks and statistics"
|
"description": "Сьогодні зіграні танки та статистика"
|
||||||
},
|
},
|
||||||
"stats": {
|
"stats": {
|
||||||
"name": "статистика",
|
"name": "статистика",
|
||||||
@@ -567,43 +567,43 @@
|
|||||||
"name": "отримані танки",
|
"name": "отримані танки",
|
||||||
"description": "Показує всі ваші танки даного рівня",
|
"description": "Показує всі ваші танки даного рівня",
|
||||||
"body": {
|
"body": {
|
||||||
"title": "# {name}'s owned tier {tier} tanks\n\n"
|
"title": "# {name} отриманих рівнів {tier} танків\n\n"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"name": "дозволи",
|
"name": "дозволи",
|
||||||
"description": "Checks wether the bot has the required permissions to function",
|
"description": "Перевіряє чи бот має необхідні дозволи для роботи",
|
||||||
"body": {
|
"body": {
|
||||||
"title": "# Permissions\n\n{body}",
|
"title": "# Дозволи\n\n{body}",
|
||||||
"view_channels": "View channels: needed to find the message the refresh button was used on",
|
"view_channels": "Перегляньте канали: необхідне для знаходження повідомлення, на якому використовувалася кнопка оновлення",
|
||||||
"read_message_history": "Read message history: needed to find the message to refresh",
|
"read_message_history": "Прочитайте історію повідомлень: потрібно знайти повідомлення для оновлення",
|
||||||
"attach_files": "Attach files: needed to add images to image-based commands",
|
"attach_files": "Закріпіть файли: потрібно для додавання зображень до команд на основі зображень",
|
||||||
"external_emojis": "External emojis: needed to add national flags and tank class emojis"
|
"external_emojis": "Зовнішні емодзі: потрібні для додавання емодзі національних прапорів та класів техніки"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ping": {
|
"ping": {
|
||||||
"name": "",
|
"name": "",
|
||||||
"description": "Check wether the bot is alive.",
|
"description": "Перевірити чи бот живий",
|
||||||
"body": {
|
"body": {
|
||||||
"pong": "Pong 🏓",
|
"pong": "Понг🏓",
|
||||||
"pong_with_time": "Pong 🏓 - {time}ms"
|
"pong_with_time": "Понг🏓 - {time}мс"
|
||||||
},
|
},
|
||||||
"subcommands": {
|
"subcommands": {
|
||||||
"blitzkit": {
|
"blitzkit": {
|
||||||
"name": "blitzkit",
|
"name": "BlitzKit",
|
||||||
"description": "Ping BlitzKit"
|
"description": "Ping BlitzKit"
|
||||||
},
|
},
|
||||||
"wotb": {
|
"wotb": {
|
||||||
"name": "wotb",
|
"name": "WoTB",
|
||||||
"description": "Ping World of Tanks Blitz"
|
"description": "Ping World of Tanks Blitz"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"player_info": {
|
"player_info": {
|
||||||
"name": "player-info",
|
"name": "інформація про гравця",
|
||||||
"description": "Базова інформація про гравця",
|
"description": "Базова інформація про гравця",
|
||||||
"body": {
|
"body": {
|
||||||
"title": "{name}'s information",
|
"title": "інформація про {name}",
|
||||||
"nickname": "Нік",
|
"nickname": "Нік",
|
||||||
"battles": "Бої",
|
"battles": "Бої",
|
||||||
"winrate": "Відсоток перемог",
|
"winrate": "Відсоток перемог",
|
||||||
@@ -614,33 +614,33 @@
|
|||||||
},
|
},
|
||||||
"rating": {
|
"rating": {
|
||||||
"name": "рейтинг",
|
"name": "рейтинг",
|
||||||
"description": "Rating player's statistics",
|
"description": "Статистика рейтингових боїв гравця ",
|
||||||
"subcommands": {
|
"subcommands": {
|
||||||
"today": {
|
"today": {
|
||||||
"name": "сьогодні",
|
"name": "сьогодні",
|
||||||
"description": "Today's rating statistics"
|
"description": "Сьогоднішня статистика рейтингових боїв"
|
||||||
},
|
},
|
||||||
"season": {
|
"season": {
|
||||||
"name": "сезон",
|
"name": "сезон",
|
||||||
"description": "This season's rating statistics"
|
"description": "Статистика рейтингових боїв поточного сезону"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"body": {
|
"body": {
|
||||||
"subtitle": {
|
"subtitle": {
|
||||||
"today": "Today's rating statistics",
|
"today": "Сьогоднішня статистика рейтингових боїв",
|
||||||
"season": "This season's rating statistics"
|
"season": "Статистика рейтингових боїв даного сезону"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"no_participation": "# {name} hasn't played rating\n\nThis player hasn't participated in the rating gamemode this season.",
|
"no_participation": "# {name} не грав рейтингові бої\n\nЦей гравець не брав участь у рейтинговому режимі цього сезону.",
|
||||||
"unrecorded_stats": "# Statistics currently unavailable\n\nWargaming may be currently be facing server downtime. If there is an on-going season, statistics should be available withing 24 hours."
|
"unrecorded_stats": "# Статистика на цей момент недоступна\n\nWargaming наразі зіткнулась з технічними несправностями. Якщо зараз проходить сезон, статистика буде доступною в найближчі 24 години."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"website": {
|
"website": {
|
||||||
"redirect": {
|
"redirect": {
|
||||||
"title": "301: moved permanently",
|
"title": "301: переміщено назавжди",
|
||||||
"body": "This page has moved. Redirecting..."
|
"body": "This page has moved. Redirecting..."
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
@@ -671,6 +671,8 @@
|
|||||||
"sorting_by": "Відсортувати за {name}",
|
"sorting_by": "Відсортувати за {name}",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"tier": "Рівень {tier}",
|
"tier": "Рівень {tier}",
|
||||||
|
"passive": "{name} (Passive)",
|
||||||
|
"active": "{name} (Active)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "Нічого не знайдено.",
|
"body": "Нічого не знайдено.",
|
||||||
"search_again": "Спробуйте шукати заново.",
|
"search_again": "Спробуйте шукати заново.",
|
||||||
@@ -823,7 +825,10 @@
|
|||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"reveal": "Reveal"
|
"reveal": "Reveal"
|
||||||
}
|
},
|
||||||
|
"clear": "Clear",
|
||||||
|
"select_all": "Вибрати все",
|
||||||
|
"tier": "Рівень {tier}"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "Search a stat...",
|
"search": "Search a stat...",
|
||||||
@@ -832,33 +837,33 @@
|
|||||||
"description": "Танкова енциклопедія",
|
"description": "Танкова енциклопедія",
|
||||||
"seo_description": "Характеристики, броня та інше для всіх танків WoT Blitz",
|
"seo_description": "Характеристики, броня та інше для всіх танків WoT Blitz",
|
||||||
"tank_seo_title": "{name} - Tier {tier} {nationality} {class} | {website} Tankopedia | World of Tanks Blitz (WoTB)",
|
"tank_seo_title": "{name} - Tier {tier} {nationality} {class} | {website} Tankopedia | World of Tanks Blitz (WoTB)",
|
||||||
"tank_seo_description": "{name} armor, statistics, equipment, provisions, and more. {dpm} DPM, {alpha}hp alpha, {penetration}mm penetration, {speed}kph top speed, {health}hp health.",
|
"tank_seo_description": "{name} броня, характеристики, обладнання, амуніція і т.д. {dpm} шкода на хвилину, {alpha} разова шкода, {penetration}мм пробиття, {speed} км/год максимальна швидкість, {health} міцність.",
|
||||||
"visualizers": {
|
"visualizers": {
|
||||||
"reload": {
|
"reload": {
|
||||||
"skip": "Skip"
|
"skip": "Пропустити"
|
||||||
},
|
},
|
||||||
"assault": {
|
"assault": {
|
||||||
"title": "Assault shells"
|
"title": "Штурмові снаряди"
|
||||||
},
|
},
|
||||||
"rotator": {
|
"rotator": {
|
||||||
"hull": "Hull",
|
"hull": "Корпус",
|
||||||
"turret": "Turret",
|
"turret": "Башта",
|
||||||
"hard": "Hard",
|
"hard": "Жорстко",
|
||||||
"medium": "Середній",
|
"medium": "Середній",
|
||||||
"soft": "Soft",
|
"soft": "Ніжно",
|
||||||
"effective": "Effective"
|
"effective": "Ефективний"
|
||||||
},
|
},
|
||||||
"ricochet": {
|
"ricochet": {
|
||||||
"angle": "Angle",
|
"angle": "Кут",
|
||||||
"normalization": "Нормалізація",
|
"normalization": "Нормалізація",
|
||||||
"effective_angle": "Effective angle",
|
"effective_angle": "Ефективний кут",
|
||||||
"armor": "Броня",
|
"armor": "Броня",
|
||||||
"no_ricochet": "Explosive shells don't ricochet"
|
"no_ricochet": "Фугасні снаряди не рикошетять"
|
||||||
},
|
},
|
||||||
"view_range": {
|
"view_range": {
|
||||||
"camo": "Camo",
|
"camo": "Камуфляж",
|
||||||
"ghost_factory": "Ghost Factory",
|
"ghost_factory": "Промзона",
|
||||||
"dead_rail": "Dead Rail"
|
"dead_rail": "Ешелон"
|
||||||
},
|
},
|
||||||
"flexibility": {
|
"flexibility": {
|
||||||
"yaw": "Yaw",
|
"yaw": "Yaw",
|
||||||
|
|||||||
@@ -23,8 +23,8 @@
|
|||||||
},
|
},
|
||||||
"shells": {
|
"shells": {
|
||||||
"ap": "穿甲弹",
|
"ap": "穿甲弹",
|
||||||
"ap_cr": "APCR",
|
"ap_cr": "硬式复合穿甲弹",
|
||||||
"hc": "HEAT",
|
"hc": "反战车高爆弹",
|
||||||
"he": "高爆弹"
|
"he": "高爆弹"
|
||||||
},
|
},
|
||||||
"player_count_period": {
|
"player_count_period": {
|
||||||
@@ -671,6 +671,8 @@
|
|||||||
"sorting_by": "按 {name} 排序",
|
"sorting_by": "按 {name} 排序",
|
||||||
"clear": "清除",
|
"clear": "清除",
|
||||||
"tier": "{tier} 阶",
|
"tier": "{tier} 阶",
|
||||||
|
"passive": "{name} (被动)",
|
||||||
|
"active": "{name} (主动)",
|
||||||
"no_tanks_found": {
|
"no_tanks_found": {
|
||||||
"body": "找不到战车。",
|
"body": "找不到战车。",
|
||||||
"search_again": "请尝试重新搜索。",
|
"search_again": "请尝试重新搜索。",
|
||||||
@@ -819,11 +821,14 @@
|
|||||||
},
|
},
|
||||||
"stats": "猜对了 {correct} / {total}",
|
"stats": "猜对了 {correct} / {total}",
|
||||||
"help": {
|
"help": {
|
||||||
"title": "Partially reveal tank?",
|
"title": "显示坦克?",
|
||||||
"description": "Reveals the tank without showing the name. This round will be considered incorrect and break your streak!",
|
"description": "显示坦克而不显示名字。这轮会被视为不正确,并打破你的连续记录!",
|
||||||
"cancel": "取消",
|
"cancel": "取消",
|
||||||
"reveal": "Reveal"
|
"reveal": "显示"
|
||||||
}
|
},
|
||||||
|
"clear": "清除",
|
||||||
|
"select_all": "全选",
|
||||||
|
"tier": "{tier} 阶"
|
||||||
},
|
},
|
||||||
"tankopedia": {
|
"tankopedia": {
|
||||||
"search": "搜索属性……",
|
"search": "搜索属性……",
|
||||||
@@ -1145,11 +1150,11 @@
|
|||||||
},
|
},
|
||||||
"provisions": {
|
"provisions": {
|
||||||
"clear": "清除",
|
"clear": "清除",
|
||||||
"clear_all": "Clear all tanks"
|
"clear_all": "清除所有坦克"
|
||||||
},
|
},
|
||||||
"consumables": {
|
"consumables": {
|
||||||
"clear": "清除",
|
"clear": "清除",
|
||||||
"clear_all": "Clear all tanks"
|
"clear_all": "清除所有坦克"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,13 +9,17 @@ import {
|
|||||||
ArrowRightIcon,
|
ArrowRightIcon,
|
||||||
EyeOpenIcon,
|
EyeOpenIcon,
|
||||||
MagnifyingGlassIcon,
|
MagnifyingGlassIcon,
|
||||||
|
MixerVerticalIcon,
|
||||||
PaperPlaneIcon,
|
PaperPlaneIcon,
|
||||||
|
StarFilledIcon,
|
||||||
|
TrashIcon,
|
||||||
} from "@radix-ui/react-icons";
|
} from "@radix-ui/react-icons";
|
||||||
import {
|
import {
|
||||||
AlertDialog,
|
AlertDialog,
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
Card,
|
Card,
|
||||||
|
DropdownMenu,
|
||||||
Flex,
|
Flex,
|
||||||
IconButton,
|
IconButton,
|
||||||
Spinner,
|
Spinner,
|
||||||
@@ -23,7 +27,7 @@ import {
|
|||||||
TextField,
|
TextField,
|
||||||
} from "@radix-ui/themes";
|
} from "@radix-ui/themes";
|
||||||
import fuzzysort from "fuzzysort";
|
import fuzzysort from "fuzzysort";
|
||||||
import { debounce } from "lodash-es";
|
import { debounce, times } from "lodash-es";
|
||||||
import { useCallback, useEffect, useRef, useState } from "react";
|
import { useCallback, useEffect, useRef, useState } from "react";
|
||||||
import { awaitableTankDefinitions } from "../core/awaitables/tankDefinitions";
|
import { awaitableTankDefinitions } from "../core/awaitables/tankDefinitions";
|
||||||
import { awaitableTankNames } from "../core/awaitables/tankNames";
|
import { awaitableTankNames } from "../core/awaitables/tankNames";
|
||||||
@@ -53,6 +57,7 @@ export function Guesser() {
|
|||||||
const [searching, setSearching] = useState(false);
|
const [searching, setSearching] = useState(false);
|
||||||
const [results, setResults] = useState<TankDefinition[] | null>(null);
|
const [results, setResults] = useState<TankDefinition[] | null>(null);
|
||||||
const [selected, setSelected] = useState<TankDefinition | null>(null);
|
const [selected, setSelected] = useState<TankDefinition | null>(null);
|
||||||
|
const tiers = Guess.use((state) => state.tiers);
|
||||||
|
|
||||||
const requestSearch = useCallback(() => {
|
const requestSearch = useCallback(() => {
|
||||||
setSelected(null);
|
setSelected(null);
|
||||||
@@ -97,58 +102,60 @@ export function Guesser() {
|
|||||||
width="100%"
|
width="100%"
|
||||||
p="4"
|
p="4"
|
||||||
maxWidth="25rem"
|
maxWidth="25rem"
|
||||||
gap="4"
|
gap="3"
|
||||||
>
|
>
|
||||||
{results !== null && (
|
<Box position="relative">
|
||||||
<Card variant="classic">
|
{results !== null && (
|
||||||
<Box py="2" px="3">
|
<Card variant="classic">
|
||||||
{results.length === 0 && (
|
<Box py="2" px="3">
|
||||||
<Flex justify="center">
|
{results.length === 0 && (
|
||||||
<Text color="gray">
|
<Flex justify="center">
|
||||||
{strings.website.tools.guess.search.no_results}
|
<Text color="gray">
|
||||||
</Text>
|
{strings.website.tools.guess.search.no_results}
|
||||||
</Flex>
|
</Text>
|
||||||
)}
|
</Flex>
|
||||||
|
)}
|
||||||
|
|
||||||
<SearchResults.Root>
|
<SearchResults.Root>
|
||||||
{results.map((result) => {
|
{results.map((result) => {
|
||||||
const Icon = classIcons[result.class];
|
const Icon = classIcons[result.class];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SearchResults.Item
|
<SearchResults.Item
|
||||||
key={result.id}
|
key={result.id}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
if (!input.current) return;
|
if (!input.current) return;
|
||||||
|
|
||||||
input.current.value = unwrap(result.name);
|
input.current.value = unwrap(result.name);
|
||||||
setSelected(result);
|
setSelected(result);
|
||||||
setResults(null);
|
setResults(null);
|
||||||
}}
|
}}
|
||||||
text={unwrap(result.name)}
|
text={unwrap(result.name)}
|
||||||
prefix={
|
prefix={
|
||||||
<img
|
<img
|
||||||
style={{ width: "1em", height: "1em" }}
|
style={{ width: "1em", height: "1em" }}
|
||||||
src={asset(`flags/circle/${result.nation}.webp`)}
|
src={asset(`flags/circle/${result.nation}.webp`)}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
discriminator={
|
discriminator={
|
||||||
<Flex
|
<Flex
|
||||||
align="center"
|
align="center"
|
||||||
gap="1"
|
gap="1"
|
||||||
width="38px"
|
width="38px"
|
||||||
justify="center"
|
justify="center"
|
||||||
>
|
>
|
||||||
<Icon width="1em" height="1em" />
|
<Icon width="1em" height="1em" />
|
||||||
{TIER_ROMAN_NUMERALS[result.tier]}
|
{TIER_ROMAN_NUMERALS[result.tier]}
|
||||||
</Flex>
|
</Flex>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</SearchResults.Root>
|
</SearchResults.Root>
|
||||||
</Box>
|
</Box>
|
||||||
</Card>
|
</Card>
|
||||||
)}
|
)}
|
||||||
|
</Box>
|
||||||
|
|
||||||
<Flex justify="center" style={{ userSelect: "none" }}>
|
<Flex justify="center" style={{ userSelect: "none" }}>
|
||||||
<Text>
|
<Text>
|
||||||
@@ -160,14 +167,85 @@ export function Guesser() {
|
|||||||
</Text>
|
</Text>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
<Flex gap="3">
|
<Flex gap={{ initial: "2", sm: "3" }}>
|
||||||
|
<DropdownMenu.Root modal={false}>
|
||||||
|
<DropdownMenu.Trigger>
|
||||||
|
<IconButton
|
||||||
|
size={{ initial: "2", sm: "3" }}
|
||||||
|
variant="surface"
|
||||||
|
color="gray"
|
||||||
|
>
|
||||||
|
<MixerVerticalIcon />
|
||||||
|
</IconButton>
|
||||||
|
</DropdownMenu.Trigger>
|
||||||
|
|
||||||
|
<DropdownMenu.Content>
|
||||||
|
{times(10, (index) => {
|
||||||
|
const tier = 10 - index;
|
||||||
|
const isSelected = tiers.includes(tier);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DropdownMenu.CheckboxItem
|
||||||
|
checked={isSelected}
|
||||||
|
key={tier}
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
Guess.mutate((draft) => {
|
||||||
|
if (isSelected) {
|
||||||
|
if (draft.tiers.length === 1) return;
|
||||||
|
draft.tiers = draft.tiers.filter((t) => t !== tier);
|
||||||
|
} else {
|
||||||
|
draft.tiers = [...draft.tiers, tier];
|
||||||
|
}
|
||||||
|
|
||||||
|
draft.streak = 0;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{literals(strings.website.tools.guess.tier, {
|
||||||
|
tier: TIER_ROMAN_NUMERALS[tier],
|
||||||
|
})}
|
||||||
|
</DropdownMenu.CheckboxItem>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
|
||||||
|
<DropdownMenu.Separator />
|
||||||
|
|
||||||
|
<DropdownMenu.Item
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
Guess.mutate((draft) => {
|
||||||
|
draft.tiers = Guess.initial.tiers;
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<StarFilledIcon /> {strings.website.tools.guess.select_all}
|
||||||
|
</DropdownMenu.Item>
|
||||||
|
|
||||||
|
<DropdownMenu.Item
|
||||||
|
color="red"
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
Guess.mutate((draft) => {
|
||||||
|
draft.tiers = [];
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<TrashIcon /> {strings.website.tools.guess.clear}
|
||||||
|
</DropdownMenu.Item>
|
||||||
|
</DropdownMenu.Content>
|
||||||
|
</DropdownMenu.Root>
|
||||||
|
|
||||||
<TextField.Root
|
<TextField.Root
|
||||||
disabled={guessState !== GuessState.NotGuessed}
|
disabled={guessState !== GuessState.NotGuessed}
|
||||||
ref={input}
|
ref={input}
|
||||||
onChange={requestSearch}
|
onChange={requestSearch}
|
||||||
style={{ flex: 1 }}
|
style={{ flex: 1, maxWidth: "14rem" }}
|
||||||
placeholder={strings.website.tools.guess.search.placeholder}
|
placeholder={strings.website.tools.guess.search.placeholder}
|
||||||
size="3"
|
size={{ initial: "2", sm: "3" }}
|
||||||
variant="classic"
|
variant="classic"
|
||||||
>
|
>
|
||||||
<TextField.Slot>
|
<TextField.Slot>
|
||||||
@@ -178,7 +256,7 @@ export function Guesser() {
|
|||||||
<AlertDialog.Root>
|
<AlertDialog.Root>
|
||||||
<AlertDialog.Trigger>
|
<AlertDialog.Trigger>
|
||||||
<IconButton
|
<IconButton
|
||||||
size="3"
|
size={{ initial: "2", sm: "3" }}
|
||||||
disabled={guessState !== GuessState.NotGuessed}
|
disabled={guessState !== GuessState.NotGuessed}
|
||||||
>
|
>
|
||||||
<EyeOpenIcon />
|
<EyeOpenIcon />
|
||||||
@@ -218,7 +296,7 @@ export function Guesser() {
|
|||||||
</AlertDialog.Root>
|
</AlertDialog.Root>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
size="3"
|
size={{ initial: "2", sm: "3" }}
|
||||||
color={
|
color={
|
||||||
guessState === GuessState.NotGuessed && selected === null
|
guessState === GuessState.NotGuessed && selected === null
|
||||||
? "red"
|
? "red"
|
||||||
@@ -238,7 +316,13 @@ export function Guesser() {
|
|||||||
draft.streak = correct ? draft.streak + 1 : 0;
|
draft.streak = correct ? draft.streak + 1 : 0;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
const id = Number(ids[Math.floor(Math.random() * ids.length)]);
|
const filteredIds = ids.filter((id) => {
|
||||||
|
const tank = tankDefinitions.tanks[Number(id)];
|
||||||
|
return tiers.includes(tank.tier);
|
||||||
|
});
|
||||||
|
const id = Number(
|
||||||
|
filteredIds[Math.floor(Math.random() * filteredIds.length)]
|
||||||
|
);
|
||||||
const tank = tankDefinitions.tanks[id];
|
const tank = tankDefinitions.tanks[id];
|
||||||
|
|
||||||
Guess.mutate((draft) => {
|
Guess.mutate((draft) => {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export function TankSearchCard({ tank, onSelect }: TankSearchCardProps) {
|
|||||||
case 'fire.damage':
|
case 'fire.damage':
|
||||||
return shell0.armor_damage.toFixed(0);
|
return shell0.armor_damage.toFixed(0);
|
||||||
case 'fire.moduleDamage':
|
case 'fire.moduleDamage':
|
||||||
return shell0.armor_damage.toFixed(0);
|
return shell0.module_damage.toFixed(0);
|
||||||
case 'fire.dispersionMoving':
|
case 'fire.dispersionMoving':
|
||||||
return tracks.dispersion_move.toFixed(3);
|
return tracks.dispersion_move.toFixed(3);
|
||||||
case 'fire.dispersionStill':
|
case 'fire.dispersionStill':
|
||||||
|
|||||||
@@ -83,11 +83,36 @@ for (const gameModeIdString in gameModeRoleSets) {
|
|||||||
for (const roleId of roles) {
|
for (const roleId of roles) {
|
||||||
const role = gameDefinitions.roles[roleId];
|
const role = gameDefinitions.roles[roleId];
|
||||||
|
|
||||||
for (const id of role.consumables) {
|
outerLoop: for (const id of role.consumables) {
|
||||||
|
const name =
|
||||||
|
consumableDefinitions.consumables[id].name.locales[locales.default];
|
||||||
|
|
||||||
|
for (const otherConsumable of consumables.values()) {
|
||||||
|
const otherName =
|
||||||
|
consumableDefinitions.consumables[otherConsumable].name.locales[
|
||||||
|
locales.default
|
||||||
|
];
|
||||||
|
|
||||||
|
if (name === otherName) continue outerLoop;
|
||||||
|
}
|
||||||
|
|
||||||
consumables.add(id);
|
consumables.add(id);
|
||||||
allGameModeConsumables.add(id);
|
allGameModeConsumables.add(id);
|
||||||
}
|
}
|
||||||
for (const id of role.provisions) {
|
|
||||||
|
outerLoop: for (const id of role.provisions) {
|
||||||
|
const name =
|
||||||
|
provisionDefinitions.provisions[id].name.locales[locales.default];
|
||||||
|
|
||||||
|
for (const otherProvision of provisions.values()) {
|
||||||
|
const otherName =
|
||||||
|
provisionDefinitions.provisions[otherProvision].name.locales[
|
||||||
|
locales.default
|
||||||
|
];
|
||||||
|
|
||||||
|
if (name === otherName) continue outerLoop;
|
||||||
|
}
|
||||||
|
|
||||||
provisions.add(id);
|
provisions.add(id);
|
||||||
allGameModeProvisions.add(id);
|
allGameModeProvisions.add(id);
|
||||||
}
|
}
|
||||||
@@ -155,7 +180,7 @@ const TIERS = times(10, (i) => 10 - i);
|
|||||||
|
|
||||||
export function FilterControl() {
|
export function FilterControl() {
|
||||||
return (
|
return (
|
||||||
<Flex align="center" gap="2" wrap="wrap">
|
<Flex align="center" justify="center" gap="2" wrap="wrap">
|
||||||
<TiersFilter />
|
<TiersFilter />
|
||||||
<ClassFilter />
|
<ClassFilter />
|
||||||
<TypeFilter />
|
<TypeFilter />
|
||||||
@@ -168,8 +193,7 @@ export function FilterControl() {
|
|||||||
<ShellFilter />
|
<ShellFilter />
|
||||||
<ConsumablesFilter />
|
<ConsumablesFilter />
|
||||||
<ProvisionsFilter />
|
<ProvisionsFilter />
|
||||||
<AbilitiesFilter />
|
<GameModeAbilitiesFilter />
|
||||||
<PowersFilter />
|
|
||||||
|
|
||||||
<ResetButton />
|
<ResetButton />
|
||||||
</Flex>
|
</Flex>
|
||||||
@@ -1031,22 +1055,33 @@ function ProvisionsFilter() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function PowersFilter() {
|
function GameModeAbilitiesFilter() {
|
||||||
const { unwrap, strings } = useLocale();
|
const { unwrap, strings } = useLocale();
|
||||||
|
const rawAbilities = TankFilters.use((state) => state.abilities);
|
||||||
const rawPowers = TankFilters.use((state) => state.powers);
|
const rawPowers = TankFilters.use((state) => state.powers);
|
||||||
|
|
||||||
|
const abilities =
|
||||||
|
rawAbilities.length === 0 && rawPowers.length === 0
|
||||||
|
? Array.from(allGameModeConsumables.values())
|
||||||
|
: rawAbilities;
|
||||||
const powers =
|
const powers =
|
||||||
rawPowers.length === 0
|
rawPowers.length === 0 && rawAbilities.length === 0
|
||||||
? Array.from(allGameModeProvisions.values())
|
? Array.from(allGameModeProvisions.values())
|
||||||
: rawPowers;
|
: rawPowers;
|
||||||
|
|
||||||
|
const icons = [
|
||||||
|
...abilities.map((ability) => `icons/consumables/${ability}.webp`),
|
||||||
|
...powers.map((power) => `icons/provisions/${power}.webp`),
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<DropdownMenu.Root modal={false}>
|
<DropdownMenu.Root modal={false}>
|
||||||
<DropdownMenu.Trigger>
|
<DropdownMenu.Trigger>
|
||||||
<Button color="gray" variant="surface">
|
<Button color="gray" variant="surface">
|
||||||
<Flex>
|
<Flex>
|
||||||
{powers.slice(0, MAX_ICONS).map((power, index) => (
|
{icons.slice(0, MAX_ICONS).map((icon, index) => (
|
||||||
<img
|
<img
|
||||||
key={power}
|
key={icon}
|
||||||
style={{
|
style={{
|
||||||
filter: "drop-shadow(0 0 var(--space-1) var(--black-a11))",
|
filter: "drop-shadow(0 0 var(--space-1) var(--black-a11))",
|
||||||
marginLeft: index > 0 ? "-0.5em" : undefined,
|
marginLeft: index > 0 ? "-0.5em" : undefined,
|
||||||
@@ -1054,14 +1089,14 @@ function PowersFilter() {
|
|||||||
height: "1.25em",
|
height: "1.25em",
|
||||||
objectFit: "contain",
|
objectFit: "contain",
|
||||||
}}
|
}}
|
||||||
src={asset(`icons/provisions/${power}.webp`)}
|
src={asset(icon)}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
{powers.length > MAX_ICONS && (
|
{icons.length > MAX_ICONS && (
|
||||||
<Text size="1" ml="1">
|
<Text size="1" ml="1">
|
||||||
{literals(strings.common.units.plus, {
|
{literals(strings.common.units.plus, {
|
||||||
value: powers.length - MAX_ICONS,
|
value: icons.length - MAX_ICONS,
|
||||||
})}
|
})}
|
||||||
</Text>
|
</Text>
|
||||||
)}
|
)}
|
||||||
@@ -1070,14 +1105,75 @@ function PowersFilter() {
|
|||||||
</DropdownMenu.Trigger>
|
</DropdownMenu.Trigger>
|
||||||
|
|
||||||
<DropdownMenu.Content>
|
<DropdownMenu.Content>
|
||||||
{gameModeRoles.map(({ gameModeId, provisions }) => {
|
{gameModeRoles.map(({ gameModeId, consumables, provisions }) => {
|
||||||
const gameMode = gameDefinitions.gameModes[gameModeId];
|
const gameMode = gameDefinitions.gameModes[gameModeId];
|
||||||
|
const hasNeither =
|
||||||
|
consumables.length === 0 && provisions.length === 0;
|
||||||
|
|
||||||
if (provisions.length === 0) return null;
|
if (hasNeither) return null;
|
||||||
|
|
||||||
|
const hasBoth = consumables.length > 0 && provisions.length > 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Fragment key={gameModeId}>
|
<Fragment key={gameModeId}>
|
||||||
<DropdownMenu.Label>{unwrap(gameMode.name)}</DropdownMenu.Label>
|
{consumables.length > 0 && (
|
||||||
|
<DropdownMenu.Label>
|
||||||
|
{hasBoth
|
||||||
|
? literals(strings.website.common.tank_search.active, {
|
||||||
|
name: unwrap(gameMode.name),
|
||||||
|
})
|
||||||
|
: unwrap(gameMode.name)}
|
||||||
|
</DropdownMenu.Label>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{consumables.map((consumable) => {
|
||||||
|
{
|
||||||
|
const selected = rawAbilities.includes(consumable);
|
||||||
|
const abilityDefinition =
|
||||||
|
consumableDefinitions.consumables[consumable];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<DropdownMenu.CheckboxItem
|
||||||
|
onClick={(event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
TankFilters.mutate((draft) => {
|
||||||
|
if (selected) {
|
||||||
|
draft.abilities = draft.abilities.filter(
|
||||||
|
(n) => n !== consumable
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
draft.abilities = [...draft.abilities, consumable];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
checked={selected}
|
||||||
|
key={consumable}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
style={{
|
||||||
|
width: "1.25em",
|
||||||
|
height: "1.25em",
|
||||||
|
objectFit: "contain",
|
||||||
|
}}
|
||||||
|
src={asset(`icons/consumables/${consumable}.webp`)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{unwrap(abilityDefinition.name)}
|
||||||
|
</DropdownMenu.CheckboxItem>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
})}
|
||||||
|
|
||||||
|
{provisions.length > 0 && (
|
||||||
|
<DropdownMenu.Label>
|
||||||
|
{hasBoth
|
||||||
|
? literals(strings.website.common.tank_search.passive, {
|
||||||
|
name: unwrap(gameMode.name),
|
||||||
|
})
|
||||||
|
: unwrap(gameMode.name)}
|
||||||
|
</DropdownMenu.Label>
|
||||||
|
)}
|
||||||
|
|
||||||
{provisions.map((provision) => {
|
{provisions.map((provision) => {
|
||||||
{
|
{
|
||||||
@@ -1129,6 +1225,7 @@ function PowersFilter() {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
TankFilters.mutate((draft) => {
|
TankFilters.mutate((draft) => {
|
||||||
|
draft.abilities = [];
|
||||||
draft.powers = [];
|
draft.powers = [];
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@@ -1140,113 +1237,3 @@ function PowersFilter() {
|
|||||||
</DropdownMenu.Root>
|
</DropdownMenu.Root>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function AbilitiesFilter() {
|
|
||||||
const { unwrap, strings } = useLocale();
|
|
||||||
const rawAbilities = TankFilters.use((state) => state.abilities);
|
|
||||||
const abilities =
|
|
||||||
rawAbilities.length === 0
|
|
||||||
? Array.from(allGameModeConsumables.values())
|
|
||||||
: rawAbilities;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DropdownMenu.Root modal={false}>
|
|
||||||
<DropdownMenu.Trigger>
|
|
||||||
<Button color="gray" variant="surface">
|
|
||||||
<Flex>
|
|
||||||
{abilities.slice(0, MAX_ICONS).map((ability, index) => (
|
|
||||||
<img
|
|
||||||
key={ability}
|
|
||||||
style={{
|
|
||||||
filter: "drop-shadow(0 0 var(--space-1) var(--black-a11))",
|
|
||||||
marginLeft: index > 0 ? "-0.5em" : undefined,
|
|
||||||
width: "1.25em",
|
|
||||||
height: "1.25em",
|
|
||||||
objectFit: "contain",
|
|
||||||
}}
|
|
||||||
src={asset(`icons/consumables/${ability}.webp`)}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
|
|
||||||
{abilities.length > MAX_ICONS && (
|
|
||||||
<Text size="1" ml="1">
|
|
||||||
{literals(strings.common.units.plus, {
|
|
||||||
value: abilities.length - MAX_ICONS,
|
|
||||||
})}
|
|
||||||
</Text>
|
|
||||||
)}
|
|
||||||
</Flex>
|
|
||||||
</Button>
|
|
||||||
</DropdownMenu.Trigger>
|
|
||||||
|
|
||||||
<DropdownMenu.Content>
|
|
||||||
{gameModeRoles.map(({ gameModeId, consumables }) => {
|
|
||||||
const gameMode = gameDefinitions.gameModes[gameModeId];
|
|
||||||
|
|
||||||
if (consumables.length === 0) return null;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Fragment key={gameModeId}>
|
|
||||||
<DropdownMenu.Label>{unwrap(gameMode.name)}</DropdownMenu.Label>
|
|
||||||
|
|
||||||
{consumables.map((consumable) => {
|
|
||||||
{
|
|
||||||
const selected = rawAbilities.includes(consumable);
|
|
||||||
const abilityDefinition =
|
|
||||||
consumableDefinitions.consumables[consumable];
|
|
||||||
|
|
||||||
return (
|
|
||||||
<DropdownMenu.CheckboxItem
|
|
||||||
onClick={(event) => {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
TankFilters.mutate((draft) => {
|
|
||||||
if (selected) {
|
|
||||||
draft.abilities = draft.abilities.filter(
|
|
||||||
(n) => n !== consumable
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
draft.abilities = [...draft.abilities, consumable];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
checked={selected}
|
|
||||||
key={consumable}
|
|
||||||
>
|
|
||||||
<img
|
|
||||||
style={{
|
|
||||||
width: "1.25em",
|
|
||||||
height: "1.25em",
|
|
||||||
objectFit: "contain",
|
|
||||||
}}
|
|
||||||
src={asset(`icons/consumables/${consumable}.webp`)}
|
|
||||||
/>
|
|
||||||
|
|
||||||
{unwrap(abilityDefinition.name)}
|
|
||||||
</DropdownMenu.CheckboxItem>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
})}
|
|
||||||
</Fragment>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
|
|
||||||
<DropdownMenu.Separator />
|
|
||||||
|
|
||||||
<DropdownMenu.Item
|
|
||||||
color="red"
|
|
||||||
onClick={(event) => {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
TankFilters.mutate((draft) => {
|
|
||||||
draft.abilities = [];
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<TrashIcon />
|
|
||||||
{strings.website.common.tank_search.clear}
|
|
||||||
</DropdownMenu.Item>
|
|
||||||
</DropdownMenu.Content>
|
|
||||||
</DropdownMenu.Root>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Box, Flex, Heading } from "@radix-ui/themes";
|
import { Box, Flex, Heading } from "@radix-ui/themes";
|
||||||
import { Suspense } from "react";
|
import { Suspense, useEffect } from "react";
|
||||||
import { GuessBackground } from "../../../components/GuessBackground";
|
import { GuessBackground } from "../../../components/GuessBackground";
|
||||||
import { Guesser } from "../../../components/Guesser";
|
import { Guesser } from "../../../components/Guesser";
|
||||||
import { GuessRenderer } from "../../../components/GuessRenderer";
|
import { GuessRenderer } from "../../../components/GuessRenderer";
|
||||||
@@ -62,6 +62,31 @@ function Content({ skeleton }: MaybeSkeletonComponentProps) {
|
|||||||
const name = unwrap(tank.name);
|
const name = unwrap(tank.name);
|
||||||
const fontSize = `min(48vh, ${55 / name.length}vw)`;
|
const fontSize = `min(48vh, ${55 / name.length}vw)`;
|
||||||
const transitionDuration = isRevealed ? "2s" : undefined;
|
const transitionDuration = isRevealed ? "2s" : undefined;
|
||||||
|
const tiers = Guess.use((state) => state.tiers);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const isTankAlreadyCompliant = tiers.includes(tank.tier);
|
||||||
|
|
||||||
|
if (isTankAlreadyCompliant) return;
|
||||||
|
|
||||||
|
const filteredIds = ids.filter((id) => {
|
||||||
|
const tank = tankDefinitions.tanks[Number(id)];
|
||||||
|
return tiers.includes(tank.tier);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (filteredIds.length === 0) return;
|
||||||
|
|
||||||
|
const id = Number(
|
||||||
|
filteredIds[Math.floor(Math.random() * filteredIds.length)]
|
||||||
|
);
|
||||||
|
const newTank = tankDefinitions.tanks[id];
|
||||||
|
|
||||||
|
Guess.mutate((draft) => {
|
||||||
|
draft.tank = newTank;
|
||||||
|
draft.guessState = GuessState.NotGuessed;
|
||||||
|
draft.helpingReveal = false;
|
||||||
|
});
|
||||||
|
}, [tiers]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex flexGrow="1" position="relative" overflow="hidden">
|
<Flex flexGrow="1" position="relative" overflow="hidden">
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import type { TankDefinition } from "@blitzkit/core";
|
import type { TankDefinition } from "@blitzkit/core";
|
||||||
|
import { times } from "lodash-es";
|
||||||
import { Varuna } from "varuna";
|
import { Varuna } from "varuna";
|
||||||
|
|
||||||
export enum GuessState {
|
export enum GuessState {
|
||||||
@@ -14,6 +15,7 @@ export interface Guess {
|
|||||||
correctGuesses: number;
|
correctGuesses: number;
|
||||||
streak: number;
|
streak: number;
|
||||||
helpingReveal: boolean;
|
helpingReveal: boolean;
|
||||||
|
tiers: number[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Guess = new Varuna<Guess, TankDefinition>((tank) => ({
|
export const Guess = new Varuna<Guess, TankDefinition>((tank) => ({
|
||||||
@@ -23,4 +25,5 @@ export const Guess = new Varuna<Guess, TankDefinition>((tank) => ({
|
|||||||
correctGuesses: 0,
|
correctGuesses: 0,
|
||||||
streak: 0,
|
streak: 0,
|
||||||
helpingReveal: false,
|
helpingReveal: false,
|
||||||
|
tiers: times(10, (index) => index + 1),
|
||||||
}));
|
}));
|
||||||
Reference in new issue
Block a user