+
diff --git a/frontend/src/cssstyle/homeView.css b/frontend/src/cssstyle/homeView.css
deleted file mode 100644
index 3974177..0000000
--- a/frontend/src/cssstyle/homeView.css
+++ /dev/null
@@ -1,49 +0,0 @@
-.banner-image {
-
- margin: 0 auto;
- width: 100%; /* Augmenter la largeur de l'image */
- max-height: 40vh; /* Réduire légèrement la hauteur de l'image */
- object-fit: cover;
- object-position: center;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* Ajouter une ombre à l'image */
- }
-
- .banner-images-row {
- display: flex;
- justify-content: space-between;
- gap: 0; /* Supprime l'espacement entre les éléments */
- }
-
- .banner-image-item-wrapper {
- width: 76%; /* Définit la largeur du conteneur à 20% de la largeur de l'écran */
- height: auto; /* Garde la hauteur d'origine */
-
-
- }
-
- .banner-image-item {
- width: 100%; /* Définit la largeur de l'image à 100% du conteneur */
- height: 300x; /* Hauteur fixe pour l'exemple, à ajuster selon vos besoins */
- object-fit: cover; /* Coupe l'image pour remplir le conteneur tout en conservant les proportions */
-}
- .dropdown-menu {
- position: absolute;
- top: 100%;
- left: 50%;
- transform: translateX(-50%);
- background-color: white;
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
- padding: 10px;
- border-radius: 5px;
- display: none;
- }
-
- .banner-image-item:hover .dropdown-menu {
- display: block;
- }
-
- .custom-container {
- width: 40%;
- }
-
-
\ No newline at end of file
diff --git a/frontend/src/cssstyle/index.css b/frontend/src/cssstyle/index.css
deleted file mode 100644
index e48adb5..0000000
--- a/frontend/src/cssstyle/index.css
+++ /dev/null
@@ -1,112 +0,0 @@
-/* CSS pour ajuster la taille de l'image */
-.img-small {
- width: 70px;
- height: 70px;
-}
-
-.img-Logo {
- width: 200px;
- height: 70px;
-}
-
-
-.text-custom {
- color: #000000;
- /* Couleur de texte spécifique */
-}
-
-/* CSS pour le texte du menu-left */
-.menu-left a {
- color: #000000;
- /* Couleur du texte */
- font-weight: bold;
- /* Gras */
- text-decoration: none;
- /* Pas de soulignement */
- font-size: 24px;
- /* Taille de la police en pixels */
-}
-
-/* CSS pour le texte des liens du menu-center */
-.menu-center {
- display: flex;
- justify-content: center;
- /* Centrer les éléments horizontalement */
- align-items: center;
- /* Centrer les éléments verticalement */
- flex: 1;
- /* Utiliser tout l'espace disponible */
- margin-right: 8%
-}
-
-/* CSS pour le texte du menu-right */
-.menu-right a {
- color: #e4e4e4;
- /* Couleur du texte */
-}
-
-.bg-custom {
- background-color: #ffffff;
- /* Définissez la couleur de fond souhaitée */
-}
-
-.textLogo {
- font-size: 35px;
- /* Taille de la police en pixels */
-}
-
-
-
-.logo {
- margin-right: 5px;
- /* Réduire la marge entre le logo et le texte */
-
-}
-
-.profilePicture {
- box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
- /* Ajouter une ombre à la photo */
- border: 2px solid #a30e79;
- /* Ajouter une bordure de 2px solide de couleur rouge (#f00) */
-}
-
-.bg-customdarker {
- background-color: #ffffffa4;
- /* Définissez la couleur de fond souhaitée */
-}
-
-.top-aligned-column {
- display: flex;
- justify-content: space-between;
-}
-
-.column {
- flex: 1;
-}
-
-.center-column {
- flex: 3;
- /* La colonne centrale occupe 3 fois plus d'espace que les autres */
-}
-
-
-.colum-aligncenter {
- text-align: center;
-}
-
-.menu-center a:nth-child(1):hover svg {
- color: rgba(163, 14, 121, 1);
- /* Changer la couleur en rouge au survol */
-}
-
-/* Pour le deuxième bouton */
-.menu-center a:nth-child(2):hover svg {
- color: rgba(163, 14, 121, 1);
- /* Changer la couleur en bleu au survol */
-}
-
-/* Pour le troisième bouton */
-.menu-center a:nth-child(3):hover svg {
- color: rgba(163, 14, 121, 1);
- /* Changer la couleur en vert au survol */
-}
\ No newline at end of file
diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json
deleted file mode 100644
index 0c64d44..0000000
--- a/frontend/src/locales/es.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "save": "Guardar",
- "cancel": "Cancelar",
- "edit": "Editar",
- "delete": "Eliminar",
- "create": "Crear",
- "apply": "Aplicar",
- "preview": "Vista previa",
- "label": "Etiqueta",
- "confirm": "Confirmar",
- "close": "Cerrar",
- "accept": "Aceptar",
- "loading": "Cargando...",
- "error": "Error",
- "success": "Éxito",
- "changesSaved": "Cambios guardados con éxito",
- "errorOccurred": "Ha ocurrido un error",
- "name": "Nombre",
- "email": "Correo electrónico",
- "password": "Contraseña",
- "description": "Descripción",
- "title": "Título",
- "image": "Imagen",
- "file": "Archivo",
- "required": "Este campo es obligatorio",
- "invalidEmail": "Correo electrónico inválido",
- "invalidPassword": "Contraseña inválida",
- "facebook": "Facebook",
- "instagram": "Instagram",
- "linkedin": "LinkedIn",
- "reddit": "Reddit",
- "tiktok": "TikTok",
- "x": "X (Twitter)",
- "youtube": "YouTube",
- "website": "Sitio web",
- "errors": {
- "unexpected": "Ha ocurrido un error inesperado",
- "imageLoad": "Error al cargar la imagen",
- "imageUpload": "Error al subir la imagen"
- }
-}
\ No newline at end of file
diff --git a/frontend/src/main.js b/frontend/src/main.js
index b99bc6d..52698cc 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -5,54 +5,71 @@ import { createPinia } from 'pinia';
import 'vuetify/styles';
import { createVuetify } from 'vuetify';
import { aliases, mdi } from 'vuetify/iconsets/mdi-svg';
-import { VDialog, VApp, VBtn, VProgressLinear, VProgressCircular, VIcon, VTextField, VSnackbar, VForm, VTextarea, VAlert } from 'vuetify/components';
-import { } from 'vuetify/directives';
+import {
+ VAlert,
+ VApp,
+ VBtn,
+ VDialog,
+ VForm,
+ VIcon,
+ VProgressCircular,
+ VProgressLinear,
+ VSnackbar,
+ VTextarea,
+ VTextField,
+} from 'vuetify/components';
import vueGoogleOauth from 'vue3-google-login';
-import { useAuthStore } from "@/stores/authStore.js";
-import { useUserProfileStore } from "@/stores/userProfileStore.js";
-import { useCreatorProfileStore } from "@/stores/creatorProfileStore.js";
+import { useAuthStore } from '@/stores/authStore.js';
+import { useUserProfileStore } from '@/stores/userProfileStore.js';
+import { useCreatorProfileStore } from '@/stores/creatorProfileStore.js';
import Toast, { POSITION } from 'vue-toastification';
import 'vue-toastification/dist/index.css';
import './assets/main.css';
+import { createI18n } from 'vue-i18n';
+import en from '@/locales/en.json';
+import fr from '@/locales/fr.json';
const vuetify = createVuetify({
- components: {
- VDialog, VApp, VBtn, VProgressLinear, VProgressCircular, VIcon, VTextField, VSnackbar, VForm, VTextarea, VAlert
- },
- directives: {
- },
- icons: {
- defaultSet: 'mdi',
- aliases,
- sets: { mdi }
- }
+ components: {
+ VDialog,
+ VApp,
+ VBtn,
+ VProgressLinear,
+ VProgressCircular,
+ VIcon,
+ VTextField,
+ VSnackbar,
+ VForm,
+ VTextarea,
+ VAlert,
+ },
+ directives: {},
+ icons: {
+ defaultSet: 'mdi',
+ aliases,
+ sets: { mdi },
+ },
});
-import { createI18n } from 'vue-i18n'
-import en from '@/locales/en.json'
-import fr from '@/locales/fr.json'
-import es from '@/locales/es.json'
-
const i18n = createI18n({
- legacy: false,
- fallbackLocale: 'en',
- messages: {
- en: en,
- fr: fr,
- es: es
- }
-})
+ legacy: false,
+ fallbackLocale: 'fr',
+ messages: {
+ en: en,
+ fr: fr,
+ },
+});
const pinia = createPinia();
const app = createApp(App)
- .use(pinia)
- .use(vuetify)
- .use(router)
- .use(i18n)
- .use(vueGoogleOauth, {
- clientId: import.meta.env.VITE_GOOGLE_CLIENT_ID,
- })
+ .use(pinia)
+ .use(vuetify)
+ .use(router)
+ .use(i18n)
+ .use(vueGoogleOauth, {
+ clientId: import.meta.env.VITE_GOOGLE_CLIENT_ID,
+ })
.use(Toast, {
position: POSITION.TOP_CENTER,
});
diff --git a/frontend/src/stores/languageStore.js b/frontend/src/stores/languageStore.js
index 89bd26a..783ab83 100644
--- a/frontend/src/stores/languageStore.js
+++ b/frontend/src/stores/languageStore.js
@@ -1,31 +1,38 @@
-import { defineStore } from 'pinia'
-import { useSessionStorage } from '@vueuse/core'
-import { useI18n } from 'vue-i18n'
+import { defineStore } from 'pinia';
+import { useSessionStorage } from '@vueuse/core';
+import { useI18n } from 'vue-i18n';
-export const useLanguageStore = defineStore(
- 'language',
- () => {
- // Initialize with the stored value or default to 'fr'
- const storedLocale = useSessionStorage('user-locale', 'fr')
-
- // Get i18n instance
- const { locale } = useI18n()
-
- // Set the initial locale from storage
- if (locale && storedLocale.value) {
- locale.value = storedLocale.value
- }
-
- function setLocale(newLocale) {
- if (locale) {
- locale.value = newLocale
- }
- storedLocale.value = newLocale
- }
-
- return {
- locale: storedLocale,
- setLocale
- }
+const ALLOWED_LOCALES = ['en', 'fr'];
+const DEFAULT_LOCALE = 'fr';
+
+export const useLanguageStore = defineStore('language', () => {
+ const storedLocale = useSessionStorage('user-locale', DEFAULT_LOCALE);
+
+ // Get i18n instance (provided globally)
+ const { locale } = useI18n();
+
+ function sanitizeLocale(value) {
+ return ALLOWED_LOCALES.includes(value) ? value : DEFAULT_LOCALE;
}
-)
\ No newline at end of file
+
+ // Initialize locale with a sanitized value
+ const initial = sanitizeLocale(storedLocale.value);
+ storedLocale.value = initial;
+ if (locale) {
+ locale.value = initial;
+ }
+
+ function setLocale(newLocale) {
+ const next = sanitizeLocale(newLocale);
+ if (locale) {
+ locale.value = next;
+ }
+ storedLocale.value = next;
+ }
+
+ return {
+ locale: storedLocale,
+ setLocale,
+ allowedLocales: ALLOWED_LOCALES,
+ };
+});
diff --git a/frontend/src/views/auth/ForgotPasswordView.vue b/frontend/src/views/auth/ForgotPasswordView.vue
index 7131f20..bb99f05 100644
--- a/frontend/src/views/auth/ForgotPasswordView.vue
+++ b/frontend/src/views/auth/ForgotPasswordView.vue
@@ -1,209 +1,218 @@
-
-
-
- {{ t('title') }}
-
+
+
+
+ {{ t('title') }}
+
-
- {{ t('description') }}
-
+
+ {{ t('description') }}
+
-
-
-
{
- "en": {
- "title": "Forgot Password?",
- "description": "Please enter your account email address. A password reset link will be sent to you.",
- "email": "Email",
- "resetPassword": "Reset Password",
- "backToLogin": "Back to Login",
- "resetEmailSent": "Password reset email sent. Please check your inbox.",
- "resetRequestFailed": "Failed to request password reset. Please try again.",
- "emailRequired": "Email is required."
- },
- "fr": {
- "title": "Mot de passe oublié ?",
- "description": "Veuillez saisir l'adresse e-mail de votre compte. Un lien de réinitialisation vous sera envoyé.",
- "email": "Email",
- "resetPassword": "Réinitialiser le mot de passe",
- "backToLogin": "Retour à la connexion",
- "resetEmailSent": "Email de réinitialisation du mot de passe envoyé. Veuillez vérifier votre boîte de réception.",
- "resetRequestFailed": "Échec de la demande de réinitialisation du mot de passe. Veuillez réessayer.",
- "emailRequired": "L'email est requis."
- },
- "es": {
- "title": "¿Olvidaste tu contraseña?",
- "description": "Por favor, introduce la dirección de correo electrónico de tu cuenta. Te enviaremos un enlace para restablecer tu contraseña.",
- "email": "Correo electrónico",
- "resetPassword": "Restablecer contraseña",
- "backToLogin": "Volver al inicio de sesión",
- "resetEmailSent": "Correo electrónico de restablecimiento de contraseña enviado. Por favor revise su bandeja de entrada.",
- "resetRequestFailed": "No se pudo solicitar el restablecimiento de contraseña. Por favor, inténtelo de nuevo.",
- "emailRequired": "El correo electrónico es obligatorio."
- }
+ "en": {
+ "title": "Forgot Password?",
+ "description": "Please enter your account email address. A password reset link will be sent to you.",
+ "email": "Email",
+ "resetPassword": "Reset Password",
+ "backToLogin": "Back to Login",
+ "resetEmailSent": "Password reset email sent. Please check your inbox.",
+ "resetRequestFailed": "Failed to request password reset. Please try again.",
+ "emailRequired": "Email is required."
+ },
+ "fr": {
+ "title": "Mot de passe oublié ?",
+ "description": "Veuillez saisir l'adresse e-mail de votre compte. Un lien de réinitialisation vous sera envoyé.",
+ "email": "Email",
+ "resetPassword": "Réinitialiser le mot de passe",
+ "backToLogin": "Retour à la connexion",
+ "resetEmailSent": "Email de réinitialisation du mot de passe envoyé. Veuillez vérifier votre boîte de réception.",
+ "resetRequestFailed": "Échec de la demande de réinitialisation du mot de passe. Veuillez réessayer.",
+ "emailRequired": "L'email est requis."
+ }
}
diff --git a/frontend/src/views/auth/LoginView.vue b/frontend/src/views/auth/LoginView.vue
index 4561027..ba2cdd8 100644
--- a/frontend/src/views/auth/LoginView.vue
+++ b/frontend/src/views/auth/LoginView.vue
@@ -1,195 +1,214 @@
-
-
{
- "en": {
- "inscription": "Sign Up",
- "createPage": "Create Page",
- "support": "Support",
- "creators": "Creators",
- "projects": "Projects",
- "love": "Love",
- "supportText": "Support",
- "supportDescription": "Support your favorite creators and help them grow. Your contributions make a real difference in their creative journey.",
- "create": "Create",
- "creatorDescription": "Create your own page and start your creative journey. Share your passion with the world and build your community.",
- "signup": "Sign Up",
- "whatIsHutopy": "What is Hutopy?",
- "hutopyDescription": "Hutopy is a platform that connects creators with their audience. We provide tools and features to help creators monetize their content and build their community.",
- "hutopyValues": "Our values are centered around creativity, community, and support. We believe in empowering creators to pursue their passions and build sustainable careers."
- },
- "fr": {
- "inscription": "S'inscrire",
- "createPage": "Créer une Page",
- "slogan": "Soutenez les projets qui vous tiennent à cœur",
- "supportText": "Soutenir",
- "supportDescription": "Soutenez vos créateurs préférés et aidez-les à grandir. Vos contributions font une réelle différence dans leur parcours créatif.",
- "create": "Créer",
- "creatorDescription": "Créez votre propre page et construisez votre Hutopy.",
-
- "signup": "S'inscrire",
- "whatIsHutopy": "Qu'est-ce que Hutopy ?",
- "hutopyDescription": "Hutopy est une plateforme qui connecte les créateurs avec leur audience. Nous fournissons des outils et des fonctionnalités pour aider les créateurs à monétiser leur contenu et à construire leur communauté.",
- "hutopyValues": "Nos valeurs sont centrées sur la créativité, la communauté et le soutient."
- },
- "es": {
- "inscription": "Registrarse",
- "createPage": "Crear Página",
- "support": "Apoyar",
- "creators": "Creadores",
- "projects": "Proyectos",
- "love": "Pasión",
- "supportText": "Apoyar",
- "supportDescription": "Apoya a tus creadores favoritos y ayúdales a crecer. Tus contribuciones hacen una diferencia real en su viaje creativo.",
- "create": "Crear",
- "creatorDescription": "Crea tu propia página y comienza tu viaje creativo. Comparte tu pasión con el mundo y construye tu comunidad.",
- "signup": "Registrarse",
- "whatIsHutopy": "¿Qué es Hutopy?",
- "hutopyDescription": "Hutopy es una plataforma que conecta a los creadores con su audiencia. Proporcionamos herramientas y funciones para ayudar a los creadores a monetizar su contenido y construir su comunidad.",
- "hutopyValues": "Nuestros valores se centran en la creatividad, la comunidad y el apoyo. Creemos en empoderar a los creadores para perseguir sus pasiones y construir carreras sostenibles."
- }
+ "en": {
+ "inscription": "Sign Up",
+ "createPage": "Create Page",
+ "support": "Support",
+ "creators": "Creators",
+ "projects": "Projects",
+ "love": "Love",
+ "supportText": "Support",
+ "supportDescription": "Support your favorite creators and help them grow. Your contributions make a real difference in their creative journey.",
+ "create": "Create",
+ "creatorDescription": "Create your own page and start your creative journey. Share your passion with the world and build your community.",
+ "signup": "Sign Up",
+ "whatIsHutopy": "What is Hutopy?",
+ "hutopyDescription": "Hutopy is a platform that connects creators with their audience. We provide tools and features to help creators monetize their content and build their community.",
+ "hutopyValues": "Our values are centered around creativity, community, and support. We believe in empowering creators to pursue their passions and build sustainable careers."
+ },
+ "fr": {
+ "inscription": "S'inscrire",
+ "createPage": "Créer une Page",
+ "support": "Soutenir",
+ "creators": "Créateurs",
+ "projects": "Projets",
+ "love": "Passion",
+ "supportText": "Soutenir",
+ "supportDescription": "Soutenez vos créateurs préférés et aidez-les à grandir. Vos contributions font une réelle différence dans leur parcours créatif.",
+ "create": "Créer",
+ "creatorDescription": "Créez votre propre page et commencez votre parcours créatif. Partagez votre passion avec le monde et construisez votre communauté.",
+ "signup": "S'inscrire",
+ "whatIsHutopy": "Qu'est-ce que Hutopy ?",
+ "hutopyDescription": "Hutopy est une plateforme qui connecte les créateurs avec leur audience. Nous fournissons des outils et des fonctionnalités pour aider les créateurs à monétiser leur contenu et à construire leur communauté.",
+ "hutopyValues": "Nos valeurs sont centrées sur la créativité, la communauté et le soutien. Nous croyons en l'autonomisation des créateurs pour poursuivre leurs passions et construire des carrières durables."
+ }
}
-
\ No newline at end of file
+
diff --git a/frontend/src/views/main/SideBar.vue b/frontend/src/views/main/SiteBar.vue
similarity index 88%
rename from frontend/src/views/main/SideBar.vue
rename to frontend/src/views/main/SiteBar.vue
index 13c8ce0..9277ef8 100644
--- a/frontend/src/views/main/SideBar.vue
+++ b/frontend/src/views/main/SiteBar.vue
@@ -4,19 +4,17 @@
import { useCreatorProfileStore } from '@/stores/creatorProfileStore.js';
import { useUserProfileStore } from '@/stores/userProfileStore.js';
import { useLanguageStore } from '@/stores/languageStore.js';
- import { useRoute } from 'vue-router';
import { mdiAccount, mdiFileAccountOutline, mdiLogin, mdiLogout, mdiTranslateVariant } from '@mdi/js';
const { locale, t } = useI18n();
const languageStore = useLanguageStore();
- const route = useRoute();
const userProfileStore = useUserProfileStore();
const creatorProfileStore = useCreatorProfileStore();
const authStore = useAuthStore();
function toggleLanguage() {
- const languages = ['fr', 'en', 'es'];
+ const languages = ['fr', 'en'];
const currentIndex = languages.indexOf(locale.value);
const nextIndex = (currentIndex + 1) % languages.length;
languageStore.setLocale(languages[nextIndex]);
@@ -117,23 +115,20 @@
{
- "en": {
- "changePassword": "Update Password",
- "newPassword": "New Password",
- "confirmPassword": "Confirm New Password",
- "passwordRequirements": "Password must be at least 8 characters",
- "passwordDescription": "Updating your password allows you to log in directly with your email and password.",
- "save": "Save",
- "cancel": "Cancel",
- "passwordsDoNotMatch": "New passwords do not match",
- "passwordTooShort": "Password must be at least 8 characters long",
- "passwordUpdateFailed": "Failed to update password. Please try again."
- },
- "fr": {
- "changePassword": "Modifier le mot de passe",
- "newPassword": "Nouveau mot de passe",
- "confirmPassword": "Confirmer le nouveau mot de passe",
- "passwordRequirements": "Le mot de passe doit comporter au moins 8 caractères",
- "passwordDescription": "La modification de votre mot de passe vous permet de vous connecter directement avec votre email et mot de passe.",
- "save": "Enregistrer",
- "cancel": "Annuler",
- "passwordsDoNotMatch": "Les nouveaux mots de passe ne correspondent pas",
- "passwordTooShort": "Le mot de passe doit comporter au moins 8 caractères",
- "passwordUpdateFailed": "Échec de la mise à jour du mot de passe. Veuillez réessayer."
- },
- "es": {
- "changePassword": "Actualizar contraseña",
- "newPassword": "Nueva contraseña",
- "confirmPassword": "Confirmar nueva contraseña",
- "passwordRequirements": "La contraseña debe tener al menos 8 caracteres",
- "passwordDescription": "La actualización de su contraseña le permite iniciar sesión directamente con su correo electrónico y contraseña.",
- "save": "Guardar",
- "cancel": "Cancelar",
- "passwordsDoNotMatch": "Las nuevas contraseñas no coinciden",
- "passwordTooShort": "La contraseña debe tener al menos 8 caracteres",
- "passwordUpdateFailed": "Error al actualizar la contraseña. Por favor, inténtelo de nuevo."
- }
+ "en": {
+ "changePassword": "Update Password",
+ "newPassword": "New Password",
+ "confirmPassword": "Confirm New Password",
+ "passwordRequirements": "Password must be at least 8 characters",
+ "passwordDescription": "Updating your password allows you to log in directly with your email and password.",
+ "save": "Save",
+ "cancel": "Cancel",
+ "passwordsDoNotMatch": "New passwords do not match",
+ "passwordTooShort": "Password must be at least 8 characters long",
+ "passwordUpdateFailed": "Failed to update password. Please try again."
+ },
+ "fr": {
+ "changePassword": "Modifier le mot de passe",
+ "newPassword": "Nouveau mot de passe",
+ "confirmPassword": "Confirmer le nouveau mot de passe",
+ "passwordRequirements": "Le mot de passe doit comporter au moins 8 caractères",
+ "passwordDescription": "La modification de votre mot de passe vous permet de vous connecter directement avec votre email et mot de passe.",
+ "save": "Enregistrer",
+ "cancel": "Annuler",
+ "passwordsDoNotMatch": "Les nouveaux mots de passe ne correspondent pas",
+ "passwordTooShort": "Le mot de passe doit comporter au moins 8 caractères",
+ "passwordUpdateFailed": "Échec de la mise à jour du mot de passe. Veuillez réessayer."
+ }
}
diff --git a/frontend/src/views/profile/account/EmailDialog.vue b/frontend/src/views/profile/account/EmailDialog.vue
index f691c2a..0056d71 100644
--- a/frontend/src/views/profile/account/EmailDialog.vue
+++ b/frontend/src/views/profile/account/EmailDialog.vue
@@ -1,82 +1,78 @@
-