diff --git a/src/commands/stats.tsx b/src/commands/stats.tsx index 0e18962d7..ceca9cd0c 100644 --- a/src/commands/stats.tsx +++ b/src/commands/stats.tsx @@ -1,4 +1,4 @@ -import { SlashCommandBuilder } from 'discord.js'; +import { Locale, SlashCommandBuilder } from 'discord.js'; import AllStatsOverview from '../components/AllStatsOverview'; import CommandWrapper from '../components/CommandWrapper'; import NoData, { NoDataType } from '../components/NoData'; @@ -33,13 +33,14 @@ async function render( { region, id }: ResolvedPlayer, { start, end, name }: ResolvedPeriod, filters: StatFilters, + locale: Locale, ) { const { nickname } = await getAccountInfo(region, id); const clan = (await getClanAccountInfo(region, id, ['clan']))?.clan; const clanImage = clan ? emblemIdToURL(clan.emblem_set_id) : undefined; const diffedTankStats = await getStatsInPeriod(region, id, start, end); const { stats, supplementary } = await filterStats(diffedTankStats, filters); - const filterDescriptions = await filtersToDescription(filters); + const filterDescriptions = await filtersToDescription(filters, locale); return ( @@ -82,7 +83,7 @@ export const statsCommand = new Promise(async (resolve) => { }); return Promise.all([ - render(player, period, filters), + render(player, period, filters, interaction.locale), buttonRefresh(interaction, path), getBlitzStarsLinkButton(player.region, player.id), ]); @@ -98,7 +99,7 @@ export const statsCommand = new Promise(async (resolve) => { const period = resolvePeriodFromButton(player.region, interaction); const filters = getFiltersFromButton(interaction); - return await render(player, period, filters); + return await render(player, period, filters, interaction.locale); }, }); }); diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index da22e336f..870abd89a 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -17,6 +17,7 @@ export const TREE_TYPES = ['researchable', 'premium', 'collector'] as const; export type TankType = (typeof TANK_TYPES)[number]; export type TreeType = (typeof TREE_TYPES)[number]; +// BIG TODO: REMOVE THIS AFTER LOCALIZATION export const TREE_TYPE_NAMES: Record = { researchable: 'Tech tree', premium: 'Premium', diff --git a/src/core/blitzkrieg/filtersToDescription.ts b/src/core/blitzkrieg/filtersToDescription.ts index ce5b5a8b0..122cab1e8 100644 --- a/src/core/blitzkrieg/filtersToDescription.ts +++ b/src/core/blitzkrieg/filtersToDescription.ts @@ -1,24 +1,28 @@ -import { TREE_TYPE_NAMES } from '../../components/Tanks'; -import { encyclopediaInfo } from '../blitz/encyclopediaInfo'; +import { Locale } from 'discord.js'; +import { translator } from '../localization/translator'; import { StatFilters } from '../statistics/filterStats'; import { TIER_ROMAN_NUMERALS, Tier, tankDefinitions } from './tankDefinitions'; -export async function filtersToDescription({ - nation, - tier, - tankType, - treeType, - tank, -}: StatFilters) { - const awaitedEncyclopediaInfo = await encyclopediaInfo; +export async function filtersToDescription( + { nation, tier, tankType, treeType, tank }: StatFilters, + locale: Locale, +) { + const { translate } = translator(locale); const awaitedTankDefinitions = await tankDefinitions; const info: string[] = []; + // TODO: somehow localize tank names? if (tank) return awaitedTankDefinitions[tank].name; - if (nation) info.push(awaitedEncyclopediaInfo.vehicle_nations[nation]); - if (tier) info.push(`Tier ${TIER_ROMAN_NUMERALS[tier as Tier]}`); - if (tankType) info.push(awaitedEncyclopediaInfo.vehicle_types[tankType]); - if (treeType) info.push(TREE_TYPE_NAMES[treeType]); + if (nation) info.push(translate(`common.nations.${nation}`)); + if (tier) { + info.push( + translate('bot.common.filters.tier', [TIER_ROMAN_NUMERALS[tier as Tier]]), + ); + } + if (tankType) info.push(translate(`common.tank_type_short.${tankType}`)); + if (treeType) info.push(translate(`common.tree_type.${treeType}`)); - return info.length === 0 ? 'No filters' : info.join(', '); + return info.length === 0 + ? translate('bot.common.filters.none') + : info.join(', '); } diff --git a/src/core/discord/resolvePeriodFromCommand.ts b/src/core/discord/resolvePeriodFromCommand.ts index 043c53140..6681fd51f 100644 --- a/src/core/discord/resolvePeriodFromCommand.ts +++ b/src/core/discord/resolvePeriodFromCommand.ts @@ -8,7 +8,6 @@ import { PeriodSize, PeriodType } from './addPeriodSubCommands'; export function getPeriodOptionName(period: PeriodSize, locale: Locale) { const { translate } = translator(locale); - if (period === 'career') return translate('bot.common.periods.career'); if (period === 'today') return translate('bot.common.periods.today'); return translate('bot.common.periods.days', [period]); @@ -25,6 +24,7 @@ export default function resolvePeriodFromCommand( interaction: ChatInputCommandInteraction, forcedPeriod?: PeriodType, ) { + const { translate } = translator(interaction.locale); let name: string; let start: number; let end: number; @@ -38,7 +38,10 @@ export default function resolvePeriodFromCommand( const startDaysAgoMin = Math.min(startOption, endOption); const endDaysAgoMax = Math.max(startOption, endOption); - name = `${startDaysAgoMin} - ${endDaysAgoMax} days`; + name = translate('bot.common.periods.custom', [ + `${startDaysAgoMin}`, + `${endDaysAgoMax}`, + ]); start = getTimeDaysAgo(region, endDaysAgoMax); end = getTimeDaysAgo(region, startDaysAgoMin); } else { diff --git a/src/core/localization/translator.ts b/src/core/localization/translator.ts index 78714fbcd..c53877a93 100644 --- a/src/core/localization/translator.ts +++ b/src/core/localization/translator.ts @@ -27,7 +27,7 @@ export function translator(localeRaw: Locale) { console.warn( `Undefined translation at "${pathItem}" in "${path}" for locale "${locale}"; falling back to en-US`, ); - return translator(Locale.EnglishUS).translate(path); + return translator(Locale.EnglishUS).translate(path, literals); } } } @@ -51,6 +51,8 @@ export function translator(localeRaw: Locale) { if (index !== 0) embeddedString += literals[index - 1]; embeddedString += chunk; }); + + return embeddedString; } return resolvedString; diff --git a/src/lang/en-US.json b/src/lang/en-US.json index fa80328a0..be0637bba 100644 --- a/src/lang/en-US.json +++ b/src/lang/en-US.json @@ -1,4 +1,31 @@ { + "common": { + "nations": { + "ussr": "USSR", + "germany": "Germany", + "usa": "USA", + "china": "China", + "uk": "Britain", + "france": "France", + "japan": "Japan", + "european": "Europe", + "other": "Hybrid" + }, + + "tank_type_short": { + "lightTank": "Light", + "mediumTank": "Medium", + "heavyTank": "Heavy", + "AT-SPG": "TD" + }, + + "tree_type": { + "researchable": "Tech tree", + "premium": "Premium", + "collector": "Collector" + } + }, + "bot": { "common": { "wn8": { @@ -58,6 +85,11 @@ "today": "Today", "days": "%s days", "custom": "%s - %s days" + }, + + "filters": { + "none": "No filters", + "tier": "Tier %s" } },