jalil.arfaoui.net/src/utils/i18n.ts
Jalil Arfaoui dc3fb4f3d8 Ajout de la section galerie photo et nettoyage du template
Galerie photo :
- Ajout du layout photo avec slideshow plein écran
- Navigation par catégories (portraits, paysages, nature, etc.)
- Section "Fil Photo" avec posts illustrés (photoBlogPosts)
- Lightbox pour les albums de catégories
- Composants : Slideshow, CategoryNav, CategoryGrid, Lightbox, MasonryGallery

Nettoyage :
- Suppression du contenu démo du template (posts, images, about)
- Consolidation src/collections/ dans src/data/
- Suppression du config.js dupliqué (garde config.ts)
- Nettoyage des assets inutilisés (posts/, experiences/)

Corrections :
- Favicon récupéré du site actuel
- Chemins favicon corrigés dans les layouts

UI :
- Page d'accueil mise à jour
- Header/Footer simplifiés
- Nouvelle page À propos
2026-01-07 01:45:40 +01:00

107 lines
No EOL
4.1 KiB
TypeScript

export const defaultLocale = 'fr';
export const locales = ['fr', 'en', 'ar'] as const;
export type Locale = typeof locales[number];
export function getLocaleFromUrl(url: URL): Locale {
const [, locale] = url.pathname.split('/');
if (locales.includes(locale as Locale)) {
return locale as Locale;
}
return defaultLocale;
}
export function getLocalizedPath(path: string, locale: Locale): string {
if (locale === defaultLocale) {
return path;
}
return `/${locale}${path}`;
}
export function removeLocaleFromPath(path: string): string {
const segments = path.split('/').filter(Boolean);
if (locales.includes(segments[0] as Locale)) {
segments.shift();
}
return '/' + segments.join('/');
}
export interface LocalizedContent {
fr: string;
en: string;
ar: string;
}
export const translations = {
nav: {
home: { fr: 'Accueil', en: 'Home', ar: 'الرئيسية' },
pro: { fr: 'Pro', en: 'Pro', ar: 'مهني' },
comedy: { fr: 'Comédie', en: 'Comedy', ar: 'كوميديا' },
photo: { fr: 'Photo', en: 'Photo', ar: 'تصوير' },
blog: { fr: 'Blog', en: 'Blog', ar: 'مدونة' },
about: { fr: 'À propos', en: 'About', ar: 'حول' },
projects: { fr: 'Projets', en: 'Projects', ar: 'مشاريع' },
talks: { fr: 'Talks', en: 'Talks', ar: 'محاضرات' },
gallery: { fr: 'Galerie', en: 'Gallery', ar: 'معرض' },
shows: { fr: 'Spectacles', en: 'Shows', ar: 'عروض' },
now: { fr: 'Maintenant', en: 'Now', ar: 'الآن' },
uses: { fr: 'Utilise', en: 'Uses', ar: 'يستخدم' },
},
common: {
readMore: { fr: 'Lire la suite', en: 'Read more', ar: 'اقرأ المزيد' },
backToHome: { fr: 'Retour à l\'accueil', en: 'Back to home', ar: 'العودة إلى الرئيسية' },
publishedOn: { fr: 'Publié le', en: 'Published on', ar: 'نشر في' },
by: { fr: 'par', en: 'by', ar: 'بواسطة' },
allPosts: { fr: 'Tous les articles', en: 'All posts', ar: 'جميع المقالات' },
recentPosts: { fr: 'Articles récents', en: 'Recent posts', ar: 'المقالات الأخيرة' },
categories: { fr: 'Catégories', en: 'Categories', ar: 'الفئات' },
tags: { fr: 'Tags', en: 'Tags', ar: 'علامات' },
search: { fr: 'Rechercher', en: 'Search', ar: 'بحث' },
darkMode: { fr: 'Mode sombre', en: 'Dark mode', ar: 'الوضع الداكن' },
lightMode: { fr: 'Mode clair', en: 'Light mode', ar: 'الوضع الفاتح' },
},
categories: {
pro: { fr: 'Professionnel', en: 'Professional', ar: 'مهني' },
comedy: { fr: 'Comédie', en: 'Comedy', ar: 'كوميديا' },
photo: { fr: 'Photographie', en: 'Photography', ar: 'تصوير' },
dev: { fr: 'Développement', en: 'Development', ar: 'تطوير' },
},
pages: {
home: {
title: { fr: 'Jalil Arfaoui', en: 'Jalil Arfaoui', ar: 'جليل عرفاوي' },
subtitle: {
fr: 'Développeur • Comédien • Photographe',
en: 'Developer • Comedian • Photographer',
ar: 'مطور • ممثل كوميدي • مصور'
},
description: {
fr: 'Bienvenue dans mon univers créatif où le code rencontre l\'art',
en: 'Welcome to my creative universe where code meets art',
ar: 'مرحبًا بكم في عالمي الإبداعي حيث يلتقي الكود بالفن'
}
},
pro: {
title: { fr: 'Parcours Professionnel', en: 'Professional Journey', ar: 'المسار المهني' },
description: {
fr: 'Développeur passionné par le Software Craftsmanship',
en: 'Developer passionate about Software Craftsmanship',
ar: 'مطور شغوف بحرفية البرمجيات'
}
},
comedy: {
title: { fr: 'Univers Comédie', en: 'Comedy Universe', ar: 'عالم الكوميديا' },
description: {
fr: 'Acteur et créateur de contenus humoristiques',
en: 'Actor and creator of humorous content',
ar: 'ممثل ومنشئ محتوى فكاهي'
}
},
photo: {
title: { fr: 'Portfolio Photo', en: 'Photo Portfolio', ar: 'معرض الصور' },
description: {
fr: 'Capturer l\'instant, raconter une histoire',
en: 'Capturing the moment, telling a story',
ar: 'التقاط اللحظة، سرد قصة'
}
}
}
};