mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-17 13:05:32 +09:00
fix(i18n): review translations and fix i18n library misuse (#2750)
This commit is contained in:
1 parent
78f783f0c4
commit
8cb097f954
575 files changed
+192671
-160540
No files matched your search
@@ -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)};
|
||||
}
|
||||
Reference in new issue
Block a user