fix(i18n): review translations and fix i18n library misuse (#2750)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-13 22:58:09 +02:00
1 parent 78f783f0c4
commit 8cb097f954
575 files changed
+192671 -160540

No files matched your search

+31 -12
View File
@@ -12,20 +12,39 @@ import {
import {parseDate} from '@fluxer/date_utils/src/DateParsing';
import type {DateInput} from '@fluxer/date_utils/src/DateTypes';
export function formatDuration(seconds: number): string {
const UNLOCALIZED_DURATION_LOCALE = 'en-US';
const durationSegmentFormatters = new Map<string, Intl.NumberFormat>();
function formatDurationSegment(value: number, locale: string, minimumIntegerDigits: number): string {
const key = `${locale}|${minimumIntegerDigits}`;
let formatter = durationSegmentFormatters.get(key);
if (formatter === undefined) {
formatter = new Intl.NumberFormat(locale, {minimumIntegerDigits, useGrouping: false});
durationSegmentFormatters.set(key, formatter);
}
return formatter.format(value);
}
export function formatDuration(seconds: number, locale: string = UNLOCALIZED_DURATION_LOCALE): string {
if (!Number.isFinite(seconds) || seconds < 0) {
return '0:00';
return `${formatDurationSegment(0, locale, 1)}:${formatDurationSegment(0, locale, 2)}`;
}
const hours = Math.floor(seconds / SECONDS_PER_HOUR);
const minutes = Math.floor((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
const secs = Math.floor(seconds % SECONDS_PER_MINUTE);
const secondsLabel = formatDurationSegment(secs, locale, 2);
if (hours > 0) {
return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
const hoursLabel = formatDurationSegment(hours, locale, 1);
return `${hoursLabel}:${formatDurationSegment(minutes, locale, 2)}:${secondsLabel}`;
}
return `${minutes}:${secs.toString().padStart(2, '0')}`;
return `${formatDurationSegment(minutes, locale, 1)}:${secondsLabel}`;
}
export function formatShortRelativeTime(timestamp: DateInput, minUnit: '1m' | 'now' = 'now'): string {
type ShortRelativeTimeUnit = 'now' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';
type ShortRelativeTimeParts = {unit: ShortRelativeTimeUnit; value: number};
export function getShortRelativeTimeParts(timestamp: DateInput, minUnit: '1m' | 'now' = 'now'): ShortRelativeTimeParts {
const date = parseDate(timestamp);
const now = new Date();
const diffMs = Math.abs(date.getTime() - now.getTime());
@@ -34,22 +53,22 @@ export function formatShortRelativeTime(timestamp: DateInput, minUnit: '1m' | 'n
const diffHours = Math.floor(diffMinutes / MINUTES_PER_HOUR);
const diffDays = Math.floor(diffHours / HOURS_PER_DAY);
if (diffSeconds < SECONDS_PER_MINUTE) {
return minUnit === '1m' ? '1m' : 'now';
return minUnit === '1m' ? {unit: 'minute', value: 1} : {unit: 'now', value: 0};
}
if (diffMinutes < MINUTES_PER_HOUR) {
return `${diffMinutes}m`;
return {unit: 'minute', value: diffMinutes};
}
if (diffHours < HOURS_PER_DAY) {
return `${diffHours}h`;
return {unit: 'hour', value: diffHours};
}
if (diffDays < DAYS_PER_WEEK) {
return `${diffDays}d`;
return {unit: 'day', value: diffDays};
}
if (diffDays < DAYS_PER_MONTH) {
return `${Math.floor(diffDays / DAYS_PER_WEEK)}w`;
return {unit: 'week', value: Math.floor(diffDays / DAYS_PER_WEEK)};
}
if (diffDays < DAYS_PER_YEAR) {
return `${Math.floor(diffDays / DAYS_PER_MONTH)}mo`;
return {unit: 'month', value: Math.floor(diffDays / DAYS_PER_MONTH)};
}
return `${Math.floor(diffDays / DAYS_PER_YEAR)}y`;
return {unit: 'year', value: Math.floor(diffDays / DAYS_PER_YEAR)};
}