mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 02:37:05 +02:00
feat: translate compare
This commit is contained in:
1 parent
e59725d763
commit
a4828774ca
5 files changed
+100
-161
No files matched your search
@@ -1013,6 +1013,7 @@
|
||||
"power_to_weight_ratio": "Power to weight ratio",
|
||||
"hull_traverse_speed": "Hull traverse speed",
|
||||
"camouflage": "Camouflage",
|
||||
"reload": "Reload",
|
||||
|
||||
"crewCount": "Crew count",
|
||||
"shellNormalization": "Normalization",
|
||||
@@ -1111,6 +1112,7 @@
|
||||
"button": "Compare tanks",
|
||||
"description": "Compare tank statistics",
|
||||
"seo_description": "Compare tanks statistics and loadouts in World of Tanks Blitz",
|
||||
|
||||
"actions": {
|
||||
"add": {
|
||||
"button": "Add",
|
||||
@@ -1124,9 +1126,31 @@
|
||||
"absolute": "Absolute"
|
||||
}
|
||||
},
|
||||
|
||||
"no_tanks": {
|
||||
"title": "No tanks selected",
|
||||
"body": "Press the Add button to get started"
|
||||
},
|
||||
|
||||
"table": {
|
||||
"equipment": {
|
||||
"clear": "Clear",
|
||||
"apply_to_all": "Apply to all"
|
||||
},
|
||||
"skills": {
|
||||
"clear": "Clear",
|
||||
"maximize": "Maximize"
|
||||
},
|
||||
"modules": {
|
||||
"stock": "Stock",
|
||||
"upgrade": "Upgrade"
|
||||
},
|
||||
"provisions": {
|
||||
"clear": "Clear"
|
||||
},
|
||||
"consumables": {
|
||||
"clear": "Clear"
|
||||
}
|
||||
}
|
||||
},
|
||||
"performance": {
|
||||
|
||||
@@ -16,7 +16,7 @@ export function Body({ stats }: BodyProps) {
|
||||
const hasNonRegularGun = members.some(
|
||||
({ gun }) => gun.gun_type!.$case !== 'regular',
|
||||
);
|
||||
const { unwrap } = useLocale();
|
||||
const { unwrap, strings } = useLocale();
|
||||
const mutateCompareEphemeral = CompareEphemeral.useMutation();
|
||||
|
||||
return (
|
||||
@@ -78,10 +78,10 @@ export function Body({ stats }: BodyProps) {
|
||||
</Table.Header>
|
||||
|
||||
<Table.Body>
|
||||
<CompareRow stats={stats} name="DPM" value="dpm" decimals={0} />
|
||||
<CompareRow stats={stats} value="dpm" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Reload"
|
||||
name={strings.website.tools.tankopedia.characteristics.values.reload}
|
||||
deltaType="lowerIsBetter"
|
||||
value={(stats) =>
|
||||
stats.shellReload ??
|
||||
@@ -98,90 +98,44 @@ export function Body({ stats }: BodyProps) {
|
||||
<>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Intra-clip"
|
||||
deltaType="lowerIsBetter"
|
||||
value="intraClip"
|
||||
decimals={2}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Shells"
|
||||
value="shells"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow stats={stats} value="shells" decimals={0} />
|
||||
</>
|
||||
)}
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Penetration"
|
||||
value="penetration"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow stats={stats} name="Damage" value="damage" decimals={0} />
|
||||
<CompareRow stats={stats} value="penetration" decimals={0} />
|
||||
<CompareRow stats={stats} value="damage" decimals={0} />
|
||||
{hasNonRegularGun && (
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="clipping potential"
|
||||
indent
|
||||
value="clipDamage"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow stats={stats} indent value="clipDamage" decimals={0} />
|
||||
)}
|
||||
<CompareRow stats={stats} value="moduleDamage" decimals={0} />
|
||||
<CompareRow stats={stats} value="caliber" decimals={0} />
|
||||
<CompareRow stats={stats} value="shellNormalization" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Module damage"
|
||||
value="moduleDamage"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow stats={stats} name="Caliber" value="caliber" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Normalization"
|
||||
value="shellNormalization"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Ricochet"
|
||||
value="shellRicochet"
|
||||
deltaType="lowerIsBetter"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow stats={stats} value="shellVelocity" decimals={0} />
|
||||
<CompareRow stats={stats} value="shellRange" decimals={0} />
|
||||
<CompareRow stats={stats} value="shellCapacity" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Shell velocity"
|
||||
value="shellVelocity"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Shell range"
|
||||
value="shellRange"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Shell capacity"
|
||||
value="shellCapacity"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Aim time"
|
||||
value="aimTime"
|
||||
deltaType="lowerIsBetter"
|
||||
decimals={2}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Dispersion"
|
||||
value="dispersion"
|
||||
deltaType="lowerIsBetter"
|
||||
decimals={3}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="moving"
|
||||
indent
|
||||
value="dispersionMoving"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -189,7 +143,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="hull traversing"
|
||||
indent
|
||||
value="dispersionHullTraversing"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -197,7 +150,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="turret traversing"
|
||||
indent
|
||||
value="dispersionTurretTraversing"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -205,7 +157,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="shooting"
|
||||
indent
|
||||
value="dispersionShooting"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -213,79 +164,42 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="gun damaged"
|
||||
indent
|
||||
value="dispersionGunDamaged"
|
||||
deltaType="lowerIsBetter"
|
||||
decimals={3}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Gun depression"
|
||||
value="gunDepression"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="elevation"
|
||||
indent
|
||||
value="gunElevation"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow stats={stats} value="gunDepression" decimals={1} />
|
||||
<CompareRow stats={stats} indent value="gunElevation" decimals={1} />
|
||||
</Table.Body>
|
||||
|
||||
<CompareSectionTitle>Maneuverability</CompareSectionTitle>
|
||||
<Table.Body>
|
||||
<CompareRow stats={stats} value="speedForwards" decimals={0} />
|
||||
<CompareRow stats={stats} indent value="speedBackwards" decimals={0} />
|
||||
<CompareRow stats={stats} value="enginePower" decimals={0} />
|
||||
<CompareRow stats={stats} value="weight" decimals={1} />
|
||||
<CompareRow stats={stats} value="hardTerrainCoefficient" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Speed forwards"
|
||||
value="speedForwards"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="backwards"
|
||||
indent
|
||||
value="speedBackwards"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Engine power"
|
||||
value="enginePower"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow stats={stats} name="Weight" value="weight" decimals={1} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Terrain coefficient"
|
||||
value="hardTerrainCoefficient"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="medium terrain"
|
||||
indent
|
||||
value="mediumTerrainCoefficient"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="soft terrain"
|
||||
indent
|
||||
value="softTerrainCoefficient"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Raw terrain coefficient"
|
||||
value="hardTerrainCoefficientRaw"
|
||||
deltaType="lowerIsBetter"
|
||||
decimals={2}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="medium terrain"
|
||||
indent
|
||||
value="mediumTerrainCoefficientRaw"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -293,7 +207,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="soft terrain"
|
||||
indent
|
||||
value="softTerrainCoefficientRaw"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -301,46 +214,35 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Power to weight ratio"
|
||||
value="powerToWeightRatioHardTerrain"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="medium terrain"
|
||||
indent
|
||||
value="powerToWeightRatioMediumTerrain"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="soft terrain"
|
||||
indent
|
||||
value="powerToWeightRatioSoftTerrain"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow stats={stats} value="turretTraverseSpeed" decimals={1} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Turret traverse speed"
|
||||
value="turretTraverseSpeed"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Traverse speed"
|
||||
value="hullTraverseHardTerrain"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="medium terrain"
|
||||
indent
|
||||
value="hullTraverseMediumTerrain"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="soft terrain"
|
||||
indent
|
||||
value="hullTraverseSoftTerrain"
|
||||
decimals={1}
|
||||
@@ -349,31 +251,23 @@ export function Body({ stats }: BodyProps) {
|
||||
|
||||
<CompareSectionTitle>Survivability</CompareSectionTitle>
|
||||
<Table.Body>
|
||||
<CompareRow stats={stats} name="Health" value="health" decimals={0} />
|
||||
<CompareRow stats={stats} value="health" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Fire chance"
|
||||
value="fireChance"
|
||||
deltaType="lowerIsBetter"
|
||||
display={(stats) => (stats.fireChance * 100).toFixed(0)}
|
||||
deltaNominalDisplay={(delta) => (delta * 100).toFixed(0)}
|
||||
/>
|
||||
<CompareRow stats={stats} value="viewRange" decimals={0} />
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="View range"
|
||||
value="viewRange"
|
||||
decimals={0}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Camouflage"
|
||||
value="camouflageStill"
|
||||
display={(stats) => (stats.camouflageStill * 100).toFixed(2)}
|
||||
deltaNominalDisplay={(delta) => (delta * 100).toFixed(2)}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="moving"
|
||||
indent
|
||||
value="camouflageMoving"
|
||||
display={(stats) => (stats.camouflageMoving * 100).toFixed(2)}
|
||||
@@ -381,7 +275,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="shooting"
|
||||
indent
|
||||
value="camouflageShootingStill"
|
||||
display={(stats) => (stats.camouflageShootingStill * 100).toFixed(2)}
|
||||
@@ -389,7 +282,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="shooting & moving"
|
||||
indent
|
||||
value="camouflageShootingMoving"
|
||||
display={(stats) => (stats.camouflageShootingMoving * 100).toFixed(2)}
|
||||
@@ -397,7 +289,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="caught on fire"
|
||||
indent
|
||||
value="camouflageCaughtOnFire"
|
||||
display={(stats) => (stats.camouflageCaughtOnFire * 100).toFixed(2)}
|
||||
@@ -405,14 +296,12 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="Volume"
|
||||
value="volume"
|
||||
deltaType="lowerIsBetter"
|
||||
decimals={1}
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="width"
|
||||
indent
|
||||
value="width"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -420,7 +309,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="height"
|
||||
indent
|
||||
value="height"
|
||||
deltaType="lowerIsBetter"
|
||||
@@ -428,7 +316,6 @@ export function Body({ stats }: BodyProps) {
|
||||
/>
|
||||
<CompareRow
|
||||
stats={stats}
|
||||
name="length"
|
||||
indent
|
||||
value="length"
|
||||
deltaType="lowerIsBetter"
|
||||
|
||||
@@ -4,17 +4,15 @@ import {
|
||||
CaretSortIcon,
|
||||
} from '@radix-ui/react-icons';
|
||||
import { Flex, IconButton, Table, Text } from '@radix-ui/themes';
|
||||
import { useRef } from 'react';
|
||||
import type { TankCharacteristics } from '../../core/blitzkit/tankCharacteristics';
|
||||
import { Var } from '../../core/radix/var';
|
||||
import { useLocale } from '../../hooks/useLocale';
|
||||
import { CompareEphemeral } from '../../stores/compareEphemeral';
|
||||
import { ComparePersistent } from '../../stores/comparePersistent';
|
||||
import { StickyRowHeaderCell } from '../StickyRowHeaderCell';
|
||||
|
||||
interface CompareRowProps {
|
||||
name: string;
|
||||
value:
|
||||
| keyof TankCharacteristics
|
||||
| ((member: TankCharacteristics) => number | undefined);
|
||||
type CompareRowProps = {
|
||||
display?: (
|
||||
member: Awaited<TankCharacteristics>,
|
||||
) => number | string | undefined;
|
||||
@@ -23,24 +21,39 @@ interface CompareRowProps {
|
||||
deltaNominalDisplay?: (delta: number) => string | number;
|
||||
indent?: boolean;
|
||||
stats: TankCharacteristics[];
|
||||
}
|
||||
} & (
|
||||
| {
|
||||
name: string;
|
||||
value: (member: TankCharacteristics) => number | undefined;
|
||||
}
|
||||
| {
|
||||
value: keyof TankCharacteristics;
|
||||
}
|
||||
);
|
||||
|
||||
export function CompareRow({
|
||||
value,
|
||||
name,
|
||||
display,
|
||||
deltaType = 'higherIsBetter',
|
||||
decimals,
|
||||
deltaNominalDisplay,
|
||||
indent,
|
||||
stats,
|
||||
...props
|
||||
}: CompareRowProps) {
|
||||
const { strings } = useLocale();
|
||||
const mutateCompareEphemeral = CompareEphemeral.useMutation();
|
||||
const sorting = CompareEphemeral.use((state) => state.sorting);
|
||||
const deltaMode = ComparePersistent.use((state) => state.deltaMode);
|
||||
const values = stats.map((stat) =>
|
||||
typeof value === 'function' ? value(stat)! : (stat[value] as number),
|
||||
typeof props.value === 'function'
|
||||
? props.value(stat)!
|
||||
: (stat[props.value] as number),
|
||||
);
|
||||
const id = useRef(Math.random());
|
||||
const name =
|
||||
typeof props.value === 'string'
|
||||
? strings.website.tools.tankopedia.characteristics.values[props.value]
|
||||
: props.name;
|
||||
|
||||
return (
|
||||
<Table.Row>
|
||||
@@ -51,7 +64,7 @@ export function CompareRow({
|
||||
gap={indent ? { initial: '4', sm: '6' } : { initial: '1', sm: '2' }}
|
||||
>
|
||||
<IconButton
|
||||
color={sorting?.by === name ? undefined : 'gray'}
|
||||
color={sorting?.by === id.current ? undefined : 'gray'}
|
||||
variant="ghost"
|
||||
onClick={() => {
|
||||
mutateCompareEphemeral((draft) => {
|
||||
@@ -62,26 +75,26 @@ export function CompareRow({
|
||||
const valueB = values[indexB];
|
||||
|
||||
return draft.sorting?.direction === 'ascending' &&
|
||||
draft.sorting.by === name
|
||||
draft.sorting.by === id.current
|
||||
? valueA - valueB
|
||||
: valueB - valueA;
|
||||
});
|
||||
|
||||
draft.sorting = {
|
||||
by: name,
|
||||
by: id.current,
|
||||
direction:
|
||||
draft.sorting?.direction === 'ascending' &&
|
||||
draft.sorting.by === name
|
||||
draft.sorting.by === id.current
|
||||
? 'descending'
|
||||
: 'ascending',
|
||||
};
|
||||
});
|
||||
}}
|
||||
>
|
||||
{(sorting === undefined || sorting.by !== name) && (
|
||||
{(sorting === undefined || sorting.by !== id.current) && (
|
||||
<CaretSortIcon style={{ transform: 'rotate(90deg)' }} />
|
||||
)}
|
||||
{sorting?.by === name && (
|
||||
{sorting?.by === id.current && (
|
||||
<>
|
||||
{sorting.direction === 'ascending' && <CaretRightIcon />}
|
||||
{sorting.direction === 'descending' && <CaretLeftIcon />}
|
||||
|
||||
@@ -44,7 +44,7 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
const crewSkills = CompareEphemeral.use((state) => state.crewSkills);
|
||||
const members = CompareEphemeral.use((state) => state.members);
|
||||
const mutateCompareEphemeral = CompareEphemeral.useMutation();
|
||||
const { unwrap } = useLocale();
|
||||
const { unwrap, strings } = useLocale();
|
||||
|
||||
return (
|
||||
<StickyTableRoot
|
||||
@@ -142,7 +142,7 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Clear
|
||||
{strings.website.tools.compare.table.skills.clear}
|
||||
</Button>
|
||||
<Button
|
||||
variant="ghost"
|
||||
@@ -154,7 +154,7 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Maximize
|
||||
{strings.website.tools.compare.table.skills.maximize}
|
||||
</Button>
|
||||
</Flex>
|
||||
</Popover.Content>
|
||||
@@ -257,7 +257,7 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Stock
|
||||
{strings.website.tools.compare.table.modules.stock}
|
||||
</Button>
|
||||
<Button
|
||||
variant="ghost"
|
||||
@@ -274,7 +274,10 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Upgrade
|
||||
{
|
||||
strings.website.tools.compare.table.modules
|
||||
.upgrade
|
||||
}
|
||||
</Button>
|
||||
</Flex>
|
||||
</Popover.Content>
|
||||
@@ -357,7 +360,10 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Clear
|
||||
{
|
||||
strings.website.tools.compare.table.provisions
|
||||
.clear
|
||||
}
|
||||
</Button>
|
||||
</Flex>
|
||||
</Popover.Content>
|
||||
@@ -441,7 +447,10 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Clear
|
||||
{
|
||||
strings.website.tools.compare.table.equipment
|
||||
.clear
|
||||
}
|
||||
</Button>
|
||||
<Button
|
||||
variant="ghost"
|
||||
@@ -455,7 +464,10 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Apply to all
|
||||
{
|
||||
strings.website.tools.compare.table.equipment
|
||||
.apply_to_all
|
||||
}
|
||||
</Button>
|
||||
</Flex>
|
||||
</Popover.Content>
|
||||
@@ -539,7 +551,10 @@ export function CompareTable({ stats }: CompareTableProps) {
|
||||
});
|
||||
}}
|
||||
>
|
||||
Clear
|
||||
{
|
||||
strings.website.tools.compare.table.consumables
|
||||
.clear
|
||||
}
|
||||
</Button>
|
||||
</Flex>
|
||||
</Popover.Content>
|
||||
|
||||
@@ -11,7 +11,7 @@ export interface CompareEphemeral {
|
||||
members: CompareMember[];
|
||||
sorting?: {
|
||||
direction: 'ascending' | 'descending';
|
||||
by: string;
|
||||
by: number;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user