feat(translations): add French language support and improve localization handling

This commit is contained in:
PiR1
2026-05-09 18:23:11 +02:00
parent fd98a78123
commit a5db4bd46e
12 changed files with 2352 additions and 126 deletions
-1
View File
@@ -1,6 +1,5 @@
export * from './useSessionTimeout';
export * from './useOnClickOutside';
export * from './useLocalizedDate';
export * from './useLocalizedTimeAgo';
export * from './usePermission';
export * from './usePublicSettings';
+12 -4
View File
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next';
import { format as dateFnsFormat, formatDistanceToNow as dateFnsFormatDistanceToNow } from 'date-fns';
import { de, enUS, ptBR } from 'date-fns/locale';
import { de, enUS, ptBR, fr } from 'date-fns/locale';
import { usePublicSettings } from './usePublicSettings';
// Convert old date format strings to new date-fns format
@@ -17,9 +17,17 @@ export const useLocalizedDate = () => {
const { data: settings } = usePublicSettings();
const getLocale = () => {
if (i18n.language === 'de') return de;
if (i18n.language === 'pt' || i18n.language === 'pt-BR') return ptBR;
return enUS;
switch (i18n.language) {
case 'de':
return de;
case 'pt':
case 'pt-BR':
return ptBR;
case 'fr':
return fr;
default:
return enUS;
}
};
const format = (date: Date | string, formatStr?: string) => {
-72
View File
@@ -1,72 +0,0 @@
import { useTranslation } from 'react-i18next';
export const useLocalizedTimeAgo = () => {
const { i18n } = useTranslation();
const formatTimeAgo = (date: Date | string): string => {
const dateObj = typeof date === 'string' ? new Date(date) : date;
const now = new Date();
const seconds = Math.floor((now.getTime() - dateObj.getTime()) / 1000);
const isGerman = i18n.language === 'de';
// Less than a minute
if (seconds < 60) {
return isGerman ? 'gerade eben' : 'just now';
}
// Minutes
const minutes = Math.floor(seconds / 60);
if (minutes < 60) {
if (minutes === 1) {
return isGerman ? 'vor 1 Minute' : '1 minute ago';
}
return isGerman ? `vor ${minutes} Minuten` : `${minutes} minutes ago`;
}
// Hours
const hours = Math.floor(minutes / 60);
if (hours < 24) {
if (hours === 1) {
return isGerman ? 'vor 1 Stunde' : '1 hour ago';
}
return isGerman ? `vor ${hours} Stunden` : `${hours} hours ago`;
}
// Days
const days = Math.floor(hours / 24);
if (days < 7) {
if (days === 1) {
return isGerman ? 'vor 1 Tag' : '1 day ago';
}
return isGerman ? `vor ${days} Tagen` : `${days} days ago`;
}
// Weeks
const weeks = Math.floor(days / 7);
if (weeks < 4) {
if (weeks === 1) {
return isGerman ? 'vor 1 Woche' : '1 week ago';
}
return isGerman ? `vor ${weeks} Wochen` : `${weeks} weeks ago`;
}
// Months
const months = Math.floor(days / 30);
if (months < 12) {
if (months === 1) {
return isGerman ? 'vor 1 Monat' : '1 month ago';
}
return isGerman ? `vor ${months} Monaten` : `${months} months ago`;
}
// Years
const years = Math.floor(days / 365);
if (years === 1) {
return isGerman ? 'vor 1 Jahr' : '1 year ago';
}
return isGerman ? `vor ${years} Jahren` : `${years} years ago`;
};
return { formatTimeAgo };
};