Explorar el Código

fix: localize display pricing units

master
fengsilin hace 1 semana
padre
commit
a61ca078fc
Se han modificado 2 ficheros con 32 adiciones y 5 borrados
  1. +20
    -3
      web/src/helpers/utils.jsx
  2. +12
    -2
      web/src/helpers/utils.test.js

+ 20
- 3
web/src/helpers/utils.jsx Ver fichero

@@ -644,13 +644,14 @@ export const formatDisplayPricingItem = ({
t = (key) => key, t = (key) => key,
}) => { }) => {
const unit = item.unit || 'call'; const unit = item.unit || 'call';
const unitText = formatDisplayPricingUnit(unit, t);
const effectivePrice = Number(item.effectivePrice ?? item.price ?? 0); const effectivePrice = Number(item.effectivePrice ?? item.price ?? 0);
const hasDiscount = item.discount_rate > 0 && item.discount_rate < 1; const hasDiscount = item.discount_rate > 0 && item.discount_rate < 1;
return { return {
...item, ...item,
formattedPrice: `${displayPrice(effectivePrice)} / ${t(unit)}`,
formattedPrice: `${displayPrice(effectivePrice)} / ${unitText}`,
originalPrice: hasDiscount originalPrice: hasDiscount
? `${displayPrice(Number(item.price || 0))} / ${t(unit)}`
? `${displayPrice(Number(item.price || 0))} / ${unitText}`
: '', : '',
discountText: hasDiscount discountText: hasDiscount
? `${Math.round(item.discount_rate * 100) / 10}折` ? `${Math.round(item.discount_rate * 100) / 10}折`
@@ -658,6 +659,22 @@ export const formatDisplayPricingItem = ({
}; };
}; };


const DISPLAY_PRICING_UNIT_FALLBACKS = {
second: '秒',
call: '次',
image: '张图片',
video: '个视频',
};

export const formatDisplayPricingUnit = (unit, t = (key) => key) => {
const normalizedUnit = unit || 'call';
const translated = t(normalizedUnit);
if (translated && translated !== normalizedUnit) {
return translated;
}
return DISPLAY_PRICING_UNIT_FALLBACKS[normalizedUnit] || normalizedUnit;
};

export const summarizeDisplayPricing = ({ export const summarizeDisplayPricing = ({
record, record,
displayPrice, displayPrice,
@@ -682,7 +699,7 @@ export const summarizeDisplayPricing = ({
min === max min === max
? displayPrice(min) ? displayPrice(min)
: `${displayPrice(min)} - ${displayPrice(max)}`; : `${displayPrice(min)} - ${displayPrice(max)}`;
return `${priceText} / ${t(unit)}`;
return `${priceText} / ${formatDisplayPricingUnit(unit, t)}`;
}); });


return { return {


+ 12
- 2
web/src/helpers/utils.test.js Ver fichero

@@ -17,6 +17,8 @@ globalThis.localStorage = {


const { const {
calculateModelPrice, calculateModelPrice,
formatDisplayPricingItem,
formatDisplayPricingUnit,
formatMatrixPrice, formatMatrixPrice,
hasDisplayPricing, hasDisplayPricing,
hasMatrixPricing, hasMatrixPricing,
@@ -151,6 +153,14 @@ describe('model pricing helpers', () => {
]); ]);
expect(items[0].effectivePrice).toBeCloseTo(0.266664); expect(items[0].effectivePrice).toBeCloseTo(0.266664);
expect(items[1].discount_rate).toBe(1); expect(items[1].discount_rate).toBe(1);
expect(
formatDisplayPricingItem({
item: items[0],
displayPrice,
t: (key) => key,
}).discountText,
).toBe('8折');
expect(formatDisplayPricingUnit('second', (key) => key)).toBe('秒');
}); });


it('summarizes display pricing by unit', () => { it('summarizes display pricing by unit', () => {
@@ -178,7 +188,7 @@ describe('model pricing helpers', () => {
}); });


expect(summary.isDisplayPricing).toBe(true); expect(summary.isDisplayPricing).toBe(true);
expect(summary.price).toBe('$0.333 - $0.583 / second');
expect(summary.price).toBe('$0.333 - $0.583 / ');
expect(summary.details).toHaveLength(2); expect(summary.details).toHaveLength(2);
}); });


@@ -209,6 +219,6 @@ describe('model pricing helpers', () => {
}); });


expect(result.isDisplayPricing).toBe(true); expect(result.isDisplayPricing).toBe(true);
expect(result.price).toBe('$0.333 / second');
expect(result.price).toBe('$0.333 / ');
}); });
}); });

Cargando…
Cancelar
Guardar