fix: use user locale instead of hardcoded de-DE for number/date formatting — closes #144
- CurrencyWidget: format numbers with user's locale - ReservationModal: date formatting uses locale - TripPDF: locale fallback to browser default instead of de-DE - holidays.ts: formatDate accepts optional locale parameter
This commit is contained in:
@@ -14,7 +14,7 @@ const CURRENCIES = [
|
|||||||
const CURRENCY_OPTIONS = CURRENCIES.map(c => ({ value: c, label: c }))
|
const CURRENCY_OPTIONS = CURRENCIES.map(c => ({ value: c, label: c }))
|
||||||
|
|
||||||
export default function CurrencyWidget() {
|
export default function CurrencyWidget() {
|
||||||
const { t } = useTranslation()
|
const { t, locale } = useTranslation()
|
||||||
const [from, setFrom] = useState(() => localStorage.getItem('currency_from') || 'EUR')
|
const [from, setFrom] = useState(() => localStorage.getItem('currency_from') || 'EUR')
|
||||||
const [to, setTo] = useState(() => localStorage.getItem('currency_to') || 'USD')
|
const [to, setTo] = useState(() => localStorage.getItem('currency_to') || 'USD')
|
||||||
const [amount, setAmount] = useState('100')
|
const [amount, setAmount] = useState('100')
|
||||||
@@ -40,7 +40,7 @@ export default function CurrencyWidget() {
|
|||||||
const rawResult = rate && amount ? (parseFloat(amount) * rate).toFixed(2) : null
|
const rawResult = rate && amount ? (parseFloat(amount) * rate).toFixed(2) : null
|
||||||
const formatNumber = (num) => {
|
const formatNumber = (num) => {
|
||||||
if (!num || num === '—') return '—'
|
if (!num || num === '—') return '—'
|
||||||
return parseFloat(num).toLocaleString('de-DE', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
|
return parseFloat(num).toLocaleString(locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 })
|
||||||
}
|
}
|
||||||
const result = rawResult
|
const result = rawResult
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ interface downloadTripPDFProps {
|
|||||||
|
|
||||||
export async function downloadTripPDF({ trip, days, places, assignments, categories, dayNotes, reservations = [], t: _t, locale: _locale }: downloadTripPDFProps) {
|
export async function downloadTripPDF({ trip, days, places, assignments, categories, dayNotes, reservations = [], t: _t, locale: _locale }: downloadTripPDFProps) {
|
||||||
await ensureRenderer()
|
await ensureRenderer()
|
||||||
const loc = _locale || 'de-DE'
|
const loc = _locale || undefined
|
||||||
const tr = _t || (k => k)
|
const tr = _t || (k => k)
|
||||||
const sorted = [...(days || [])].sort((a, b) => a.day_number - b.day_number)
|
const sorted = [...(days || [])].sort((a, b) => a.day_number - b.day_number)
|
||||||
const range = longDateRange(sorted, loc)
|
const range = longDateRange(sorted, loc)
|
||||||
|
|||||||
@@ -573,5 +573,5 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p
|
|||||||
function formatDate(dateStr, locale) {
|
function formatDate(dateStr, locale) {
|
||||||
if (!dateStr) return ''
|
if (!dateStr) return ''
|
||||||
const d = new Date(dateStr + 'T00:00:00')
|
const d = new Date(dateStr + 'T00:00:00')
|
||||||
return d.toLocaleDateString(locale || 'de-DE', { day: 'numeric', month: 'short' })
|
return d.toLocaleDateString(locale || undefined, { day: 'numeric', month: 'short' })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,9 +122,9 @@ export function daysInMonth(year: number, month: number): number {
|
|||||||
return new Date(year, month, 0).getDate()
|
return new Date(year, month, 0).getDate()
|
||||||
}
|
}
|
||||||
|
|
||||||
export function formatDate(dateStr: string): string {
|
export function formatDate(dateStr: string, locale?: string): string {
|
||||||
const d = new Date(dateStr + 'T00:00:00')
|
const d = new Date(dateStr + 'T00:00:00')
|
||||||
return d.toLocaleDateString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit', year: 'numeric' })
|
return d.toLocaleDateString(locale || undefined, { weekday: 'short', day: '2-digit', month: '2-digit', year: 'numeric' })
|
||||||
}
|
}
|
||||||
|
|
||||||
export { BUNDESLAENDER }
|
export { BUNDESLAENDER }
|
||||||
|
|||||||
Reference in New Issue
Block a user