diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..be698a9
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,13 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/projectSettingsUpdater.xml
+/modules.xml
+/contentModel.xml
+/.idea.hutopy.iml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/indexLayout.xml b/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js
index bb16827..aed51a2 100644
--- a/frontend/src/i18n.js
+++ b/frontend/src/i18n.js
@@ -1,15 +1,18 @@
import { createI18n } from 'vue-i18n';
-import en from './locales/en.json';
-import fr from './locales/fr.json';
+import { useSessionStorage } from '@vueuse/core';
+
+// Get the stored locale or default to 'fr'
+const storedLocale = useSessionStorage('user-locale', 'fr');
-const messages = {
- en,
- fr,
-};
const i18n = createI18n({
legacy: false,
- locale: 'fr',
+ locale: storedLocale.value,
fallbackLocale: 'en',
- messages,
+ messages: {
+ en: {},
+ fr: {},
+ es: {}
+ }
});
+
export default i18n;
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
deleted file mode 100644
index 00e4d87..0000000
--- a/frontend/src/locales/en.json
+++ /dev/null
@@ -1,135 +0,0 @@
-{
- "general": {
- "yes": "yes",
- "no": "no"
- },
- "banner": {
- "subscription": "Subscriptions"
- },
- "footer": {
- "allRightsReserved": "All rights reserved",
- "helpandcontact": "Help and contact",
- "faq": "FAQ",
- "creatorguide": "Creator guide",
- "termsandconditions": "Terms and conditions",
- "contentpolicy": "Content policy",
- "about": "About",
- "pricing": "Pricing"
- },
- "subscribebutton": {
- "subscribe": "Subscribe",
- "unsubscribe": "Unsubscribe"
- },
- "profilemenu": {
- "manageyouraccount": "Manage your Hutopy account",
- "creator": "Creator",
- "user": "User"
- },
- "header": {
- "wallet": "Wallet"
- },
- "message": {
- "edit": "Edit",
- "delete": "Delete",
- "report": "Report",
- "yourcomment": "Your comment..."
- },
- "contentCard": {
- "commenttitle": "comments",
- "edit": "Edit",
- "delete": "delete",
- "report": "report",
- "deletecontenttitle": "Delete this content?",
- "deeletecontentwarning": "Are you sure you want to delete the content?"
- },
- "time": {
- "seconds": "seconds",
- "1minuteago": "1 minute ago",
- "1minutefromnow": "1 minute from now",
- "minutes": "minutes",
- "1hourago": "1 hour ago",
- "1hourfromnow": "1 hour from now",
- "hours": "hours",
- "yesterday": "Yesterday",
- "tomorrow": "Tomorrow",
- "days": "days",
- "lastweek": "Last week",
- "nextweek": "Next week",
- "weeks": "weeks",
- "lastmonth": "Last month",
- "nextmonth": "Next month",
- "months": "months",
- "lastyear": "Last year",
- "nextyear": "Next year",
- "years": "years",
- "lastcentury": "Last century",
- "nextcentury": "Next century",
- "centuries": "centuries",
- "ago": "ago"
- },
- "personnalinformation": {
- "informations": "Informations",
- "title": "Personal information",
- "profilepicture": "Profile picture",
- "fullname": "Name",
- "firstname": "Firstname",
- "lastname": "Lastname",
- "alias": "Alias",
- "dob": "Date of birth",
- "gender": "Gender",
- "contactdetails": "Contact details",
- "email": "Email",
- "phone": "Phone",
- "addresses": "Addresses",
- "home": "Home",
- "work": "Work"
- },
- "creatorinfopage": {
- "informations": "Informations",
- "name": "Name",
- "title": "Title",
- "slug": "Slug",
- "description": "Description",
- "banner&profile": "Banner and profile picture",
- "borderpicturecolor": "Profile picture border",
- "menucolor": "Menu color",
- "pageinformation": "Your page information",
- "socialnetwork": "Social Network"
- },
- "accountmanagement": {
- "accounts": "Account",
- "accountmanagement": "Account Management",
- "pageid": "Page ID",
- "addaccount": "Add Account",
- "authoritygranted": "Granted Permissions"
- },
- "security": {
- "title": "Security",
- "howtoconnect": "How to connect to Hutopy",
- "password": "Password",
- "recoverybyemail": "Recovery by Email",
- "recoverybymobile": "Recovery by Mobile"
- },
- "isupportbtn": {
- "isupport": "I support",
- "amount": "amount",
- "message": "Message (optional)",
- "send": "send"
- },
- "paymentConfirmation": {
- "success": {
- "title": "Payment completed",
- "message": "Your payment was successful. Thank you for supporting ",
- "usernameDefault": "this user.",
- "receipt": "A receipt has been sent to your email address.",
- "continue": "Continue"
- },
- "failure": {
- "title": "Payment cancelled",
- "message": "The payment was cancelled. If you did not intend to cancel, please try again.",
- "thanks": "Thank you for supporting",
- "tryAgain": "Try again",
- "return": "Return to the profile of "
- }
- }
-}
diff --git a/frontend/src/locales/fr.json b/frontend/src/locales/fr.json
deleted file mode 100644
index 77fa5fa..0000000
--- a/frontend/src/locales/fr.json
+++ /dev/null
@@ -1,135 +0,0 @@
-{
- "general": {
- "yes": "oui",
- "no": "non"
- },
- "banner": {
- "subscription": "Abonnés"
- },
- "footer": {
- "allRightsReserved": "Tout droits réservés",
- "helpandcontact": "Aide & Contact",
- "faq": "FAQ",
- "creatorguide": "Guide pour les créateurs",
- "termsandconditions": "Termes et conditions",
- "contentpolicy": "Politique de contenu",
- "about": "À propos",
- "pricing": "Frais"
- },
- "subscribebutton": {
- "subscribe": "S'abonner",
- "unsubscribe": "Se désabonner"
- },
- "profilemenu": {
- "manageyouraccount": "Gérer votre compte Hutopy",
- "creator": "Créateur",
- "user": "utilisateur"
- },
- "header": {
- "wallet": "PorteFeuille"
- },
- "message": {
- "edit": "Modifier",
- "delete": "Effacer",
- "report": "Signaler",
- "yourcomment": "Votre commentaire..."
- },
- "contentCard": {
- "commenttitle": "commentaires",
- "edit": "Modifier",
- "delete": "Effacer",
- "report": "signaler",
- "deletecontenttitle": " Supprimer ce contenu?",
- "deeletecontentwarning": "Êtes-vous sûr de vouloir supprimer le contenu?"
- },
- "time": {
- "seconds": "secondes",
- "1minuteago": "Il y a 1 minute",
- "1minutefromnow": "dans 1 minute",
- "minutes": "minutes",
- "1hourago": "Il y a 1 heure",
- "1hourfromnow": "dans 1 heure",
- "hours": "heures",
- "yesterday": "hier",
- "tomorrow": "demain",
- "days": "jours",
- "lastweek": "La semaine dernière.",
- "nextweek": "La semaine prochaine",
- "weeks": "semaines",
- "lastmonth": "Le mois dernier",
- "nextmonth": "Le mois prochain",
- "months": "mois",
- "lastyear": "L'année dernière",
- "nextyear": "L'année prochaine",
- "years": "années",
- "lastcentury": "Le siècle dernier",
- "nextcentury": "Le siècle prochain",
- "centuries": "siècles",
- "ago": ""
- },
- "personnalinformation": {
- "informations": "Informations",
- "title": "Informations personnelles",
- "profilepicture": "Photo de profil",
- "fullname": "Nom",
- "firstname": "Prénom",
- "lastname": "Nom",
- "alias": "Pseudonyme",
- "dob": "Date de naissance",
- "gender": "Genre",
- "contactdetails": "Coordonnées",
- "email": "Email",
- "phone": "Téléphone",
- "addresses": "Adresses",
- "home": "Domicile",
- "work": "Travail"
- },
- "creatorinfopage": {
- "informations": "Informations",
- "name": "Nom",
- "title": "Titre",
- "slug": "Slug",
- "description": "Description",
- "banner&profile": "Bannière et photo de profil",
- "borderpicturecolor": "Bordure de la photo de profil",
- "menucolor": "Couleur des menus",
- "pageinformation": "Informations de votre page",
- "socialnetwork": "Réseaux sociaux"
- },
- "accountmanagement": {
- "accounts": "comptes",
- "accountmanagement": "Gestion des comptes",
- "pageid": "ID de la page",
- "addaccount": "Ajouter un compte",
- "authoritygranted": "Autorisations accordées"
- },
- "security": {
- "title": "Sécurité",
- "howtoconnect": "Comment vous connecter à Hutopy",
- "password": "Mot de passe",
- "recoverybyemail": "Récupération par email",
- "recoverybymobile": "Récupération par mobile"
- },
- "isupportbtn": {
- "isupport": "Je soutiens",
- "amount": "Montant",
- "message": "Message (facultatif)",
- "send": "Envoyez"
- },
- "paymentConfirmation": {
- "success": {
- "title": "Paiement complété",
- "message": "Votre paiement a été effectué avec succès. Merci de soutenir ",
- "usernameDefault": "cet utilisateur.",
- "receipt": "Un reçu a été envoyé à votre adresse courriel.",
- "continue": "Continuer"
- },
- "failure": {
- "title": "Paiement annulé",
- "message": "Le paiement a été annulé. Si vous n'aviez pas l'intention d'annuler, veuillez réessayer.",
- "thanks": "Merci de supporter",
- "tryAgain": "Réessayer",
- "return": "Retour au profil de "
- }
- }
-}
diff --git a/frontend/src/stores/languageStore.js b/frontend/src/stores/languageStore.js
new file mode 100644
index 0000000..e79f1a4
--- /dev/null
+++ b/frontend/src/stores/languageStore.js
@@ -0,0 +1,26 @@
+import { defineStore } from 'pinia'
+import { useSessionStorage } from '@vueuse/core'
+import { useI18n } from 'vue-i18n'
+
+export const useLanguageStore = defineStore(
+ 'language',
+ () => {
+ const { locale } = useI18n()
+
+ // Initialize with the stored value or default to 'fr'
+ const storedLocale = useSessionStorage('user-locale', 'fr')
+
+ // Set the initial locale from storage
+ locale.value = storedLocale.value
+
+ function setLocale(newLocale) {
+ locale.value = newLocale
+ storedLocale.value = newLocale
+ }
+
+ return {
+ locale: storedLocale,
+ setLocale
+ }
+ }
+)
\ No newline at end of file
diff --git a/frontend/src/stores/userProfileStore.js b/frontend/src/stores/userProfileStore.js
index 929ace1..ab119a8 100644
--- a/frontend/src/stores/userProfileStore.js
+++ b/frontend/src/stores/userProfileStore.js
@@ -65,6 +65,7 @@ export const useUserProfileStore = defineStore(
async function changeFullname(firstname, lastname) {
try {
+ const client = useClient()
await client.post(
`/api/users/fullname`,
{
@@ -80,6 +81,7 @@ export const useUserProfileStore = defineStore(
async function changeAlias(alias) {
try {
+ const client = useClient()
await client.post(
`/api/users/alias`,
{
@@ -93,6 +95,7 @@ export const useUserProfileStore = defineStore(
async function changeBirthday(birthdate) {
try {
+ const client = useClient()
await client.post(
`/api/users/birthdate`,
{
@@ -106,6 +109,7 @@ export const useUserProfileStore = defineStore(
async function changePhone(phoneNumber) {
try {
+ const client = useClient()
await client.post(
`/api/users/phone`,
{
@@ -119,6 +123,7 @@ export const useUserProfileStore = defineStore(
async function changeEmail(email) {
try {
+ const client = useClient()
await client.post(
`/api/users/email`,
{
@@ -132,6 +137,7 @@ export const useUserProfileStore = defineStore(
async function changeAddress(address) {
try {
+ const client = useClient()
await client.post(
`/api/users/address`,
{
@@ -145,6 +151,7 @@ export const useUserProfileStore = defineStore(
async function changePortrait(selectedFile) {
try {
+ const client = useClient()
const formData = new FormData();
formData.append('file', selectedFile)
diff --git a/frontend/src/translations/common.en.json b/frontend/src/translations/common.en.json
new file mode 100644
index 0000000..d0d72d7
--- /dev/null
+++ b/frontend/src/translations/common.en.json
@@ -0,0 +1,15 @@
+{
+ "save": "Save",
+ "cancel": "Cancel",
+ "edit": "Edit",
+ "delete": "Delete",
+ "create": "Create",
+ "apply": "Apply",
+ "preview": "Preview",
+ "label": "Label",
+ "errors": {
+ "unexpected": "An unexpected error occurred",
+ "imageLoad": "Error loading image",
+ "imageUpload": "Error uploading image"
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/translations/common.es.json b/frontend/src/translations/common.es.json
new file mode 100644
index 0000000..56489be
--- /dev/null
+++ b/frontend/src/translations/common.es.json
@@ -0,0 +1,15 @@
+{
+ "save": "Guardar",
+ "cancel": "Cancelar",
+ "edit": "Editar",
+ "delete": "Eliminar",
+ "create": "Crear",
+ "apply": "Aplicar",
+ "preview": "Vista previa",
+ "label": "Etiqueta",
+ "errors": {
+ "unexpected": "Se produjo 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/translations/common.fr.json b/frontend/src/translations/common.fr.json
new file mode 100644
index 0000000..a88a51e
--- /dev/null
+++ b/frontend/src/translations/common.fr.json
@@ -0,0 +1,15 @@
+{
+ "save": "Enregistrer",
+ "cancel": "Annuler",
+ "edit": "Modifier",
+ "delete": "Supprimer",
+ "create": "Créer",
+ "apply": "Appliquer",
+ "preview": "Aperçu",
+ "label": "Étiquette",
+ "errors": {
+ "unexpected": "Une erreur inattendue s'est produite",
+ "imageLoad": "Erreur lors du chargement de l'image",
+ "imageUpload": "Erreur lors du téléchargement de l'image"
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/translations/translations.js b/frontend/src/translations/translations.js
new file mode 100644
index 0000000..8091fe4
--- /dev/null
+++ b/frontend/src/translations/translations.js
@@ -0,0 +1,95 @@
+import { ref, computed, watch } from 'vue'
+import { useI18n } from 'vue-i18n'
+
+// Helper function to get component path from stack trace
+function getComponentPath() {
+ const stack = new Error().stack
+ const stackLines = stack.split('\n')
+
+ // Find the first line that contains a .vue file
+ const vueFileLine = stackLines.find(line => line.includes('.vue'))
+ if (!vueFileLine) return null
+
+ // Extract the file path
+ const match = vueFileLine.match(/\/src\/(.*?\.vue)/)
+ if (!match) return null
+
+ // Return the full path without the .vue extension
+ return match[1].replace(/\.vue$/, '')
+}
+
+// Helper function to get nested value from an object using dot notation
+function getNestedValue(obj, path) {
+ return path.split('.').reduce((current, key) => {
+ return current && current[key] !== undefined ? current[key] : null
+ }, obj)
+}
+
+export function useTranslations() {
+ const { locale } = useI18n()
+ const componentPath = ref(getComponentPath())
+ const componentTranslations = ref({})
+ const commonTranslations = ref({})
+
+ // Load translations when locale changes
+ const loadTranslations = async () => {
+ // Load component translations
+ if (componentPath.value) {
+ try {
+ // The translation files are in the same directory as the Vue components
+ const importPath = `../${componentPath.value}.${locale.value}.json`
+ const translations = await import(importPath)
+ componentTranslations.value = translations.default
+ } catch (e) {
+ try {
+ const importPath = `../${componentPath.value}.en.json`
+ const translations = await import(importPath)
+ componentTranslations.value = translations.default
+ } catch (e) {
+ componentTranslations.value = {}
+ }
+ }
+ }
+
+ // Load common translations
+ try {
+ const importPath = `./common.${locale.value}.json`
+ const translations = await import(importPath)
+ commonTranslations.value = translations.default
+ } catch (e) {
+ try {
+ const importPath = './common.en.json'
+ const translations = await import(importPath)
+ commonTranslations.value = translations.default
+ } catch (e) {
+ commonTranslations.value = {}
+ }
+ }
+ }
+
+ // Load translations immediately
+ loadTranslations()
+
+ // Watch for locale changes
+ watch(locale, () => {
+ loadTranslations()
+ })
+
+ // Return synchronous translation function
+ return (key) => {
+ // Try to get the translation from component translations first
+ const componentValue = getNestedValue(componentTranslations.value, key)
+ if (componentValue !== null) {
+ return componentValue
+ }
+
+ // Then try common translations
+ const commonValue = getNestedValue(commonTranslations.value, key)
+ if (commonValue !== null) {
+ return commonValue
+ }
+
+ // If not found, return the key with MISSING prefix
+ return `MISSING: ${key}`
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/views/LoginView.en.json b/frontend/src/views/LoginView.en.json
new file mode 100644
index 0000000..3017fea
--- /dev/null
+++ b/frontend/src/views/LoginView.en.json
@@ -0,0 +1,4 @@
+{
+ "title": "Login",
+ "alt": "hutopy login"
+}
\ No newline at end of file
diff --git a/frontend/src/views/LoginView.es.json b/frontend/src/views/LoginView.es.json
new file mode 100644
index 0000000..9d5c514
--- /dev/null
+++ b/frontend/src/views/LoginView.es.json
@@ -0,0 +1,4 @@
+{
+ "title": "Iniciar sesión",
+ "alt": "iniciar sesión hutopy"
+}
\ No newline at end of file
diff --git a/frontend/src/views/LoginView.fr.json b/frontend/src/views/LoginView.fr.json
new file mode 100644
index 0000000..3a95b47
--- /dev/null
+++ b/frontend/src/views/LoginView.fr.json
@@ -0,0 +1,4 @@
+{
+ "title": "Connexion",
+ "alt": "connexion hutopy"
+}
\ No newline at end of file
diff --git a/frontend/src/views/LoginView.vue b/frontend/src/views/LoginView.vue
index 6df3775..a007597 100644
--- a/frontend/src/views/LoginView.vue
+++ b/frontend/src/views/LoginView.vue
@@ -2,11 +2,9 @@
import {ref} from 'vue';
import {GoogleLogin} from "vue3-google-login";
import {useAuthStore} from '@/stores/authStore.js';
+import {useTranslations} from '@/translations/translations';
-import {useFacebookLogin} from "@/composables/useFacebookLogin";
-import Facebook from "@/views/svg/Facebook.vue";
-
-const {loginWithFacebook} = useFacebookLogin();
+const t = useTranslations();
const authStore = useAuthStore();
@@ -22,21 +20,14 @@ async function googleCallback(token) {
-
-
-
-
-
-
-
- Connexion
+ {{ t('title') }}
-
@@ -45,24 +36,11 @@ async function googleCallback(token) {
Google
-
-
-
-
-
-
-
-
-
diff --git a/frontend/src/views/PaymentCompleted.en.json b/frontend/src/views/PaymentCompleted.en.json
new file mode 100644
index 0000000..7cf21c1
--- /dev/null
+++ b/frontend/src/views/PaymentCompleted.en.json
@@ -0,0 +1,7 @@
+{
+ "title": "Payment Successful!",
+ "message": "Your payment has been processed successfully.",
+ "usernameDefault": "the creator",
+ "receipt": "A receipt has been sent to your email.",
+ "continue": "Continue to"
+}
\ No newline at end of file
diff --git a/frontend/src/views/PaymentCompleted.es.json b/frontend/src/views/PaymentCompleted.es.json
new file mode 100644
index 0000000..6f89cda
--- /dev/null
+++ b/frontend/src/views/PaymentCompleted.es.json
@@ -0,0 +1,7 @@
+{
+ "title": "¡Pago exitoso!",
+ "message": "Su pago ha sido procesado con éxito.",
+ "usernameDefault": "el creador",
+ "receipt": "Se ha enviado un recibo a su correo electrónico.",
+ "continue": "Continuar a"
+}
\ No newline at end of file
diff --git a/frontend/src/views/PaymentCompleted.fr.json b/frontend/src/views/PaymentCompleted.fr.json
new file mode 100644
index 0000000..47c33ce
--- /dev/null
+++ b/frontend/src/views/PaymentCompleted.fr.json
@@ -0,0 +1,7 @@
+{
+ "title": "Paiement réussi !",
+ "message": "Votre paiement a été traité avec succès.",
+ "usernameDefault": "le créateur",
+ "receipt": "Un reçu a été envoyé à votre adresse e-mail.",
+ "continue": "Continuer vers"
+}
\ No newline at end of file
diff --git a/frontend/src/views/PaymentCompleted.vue b/frontend/src/views/PaymentCompleted.vue
index 2f6306c..3a1b81d 100644
--- a/frontend/src/views/PaymentCompleted.vue
+++ b/frontend/src/views/PaymentCompleted.vue
@@ -3,7 +3,7 @@
@@ -44,25 +44,21 @@
diff --git a/frontend/src/views/PaymentFailed.en.json b/frontend/src/views/PaymentFailed.en.json
new file mode 100644
index 0000000..4420703
--- /dev/null
+++ b/frontend/src/views/PaymentFailed.en.json
@@ -0,0 +1,5 @@
+{
+ "title": "Payment Failed",
+ "message": "We couldn't process your payment. Please try again or contact support if the problem persists.",
+ "continue": "Return to"
+}
\ No newline at end of file
diff --git a/frontend/src/views/PaymentFailed.es.json b/frontend/src/views/PaymentFailed.es.json
new file mode 100644
index 0000000..3f688c1
--- /dev/null
+++ b/frontend/src/views/PaymentFailed.es.json
@@ -0,0 +1,5 @@
+{
+ "title": "Pago fallido",
+ "message": "No pudimos procesar su pago. Por favor, inténtelo de nuevo o contacte con soporte si el problema persiste.",
+ "continue": "Volver a"
+}
\ No newline at end of file
diff --git a/frontend/src/views/PaymentFailed.fr.json b/frontend/src/views/PaymentFailed.fr.json
new file mode 100644
index 0000000..9027faf
--- /dev/null
+++ b/frontend/src/views/PaymentFailed.fr.json
@@ -0,0 +1,5 @@
+{
+ "title": "Échec du paiement",
+ "message": "Nous n'avons pas pu traiter votre paiement. Veuillez réessayer ou contacter le support si le problème persiste.",
+ "continue": "Retourner à"
+}
\ No newline at end of file
diff --git a/frontend/src/views/PaymentFailed.vue b/frontend/src/views/PaymentFailed.vue
index ca06480..f2e1f66 100644
--- a/frontend/src/views/PaymentFailed.vue
+++ b/frontend/src/views/PaymentFailed.vue
@@ -1,29 +1,11 @@
-
\ No newline at end of file
diff --git a/frontend/src/views/profile/account/PhoneDialog.en.json b/frontend/src/views/profile/account/PhoneDialog.en.json
new file mode 100644
index 0000000..86d83b2
--- /dev/null
+++ b/frontend/src/views/profile/account/PhoneDialog.en.json
@@ -0,0 +1,4 @@
+{
+ "title": "Phone Number",
+ "label": "Your phone number"
+}
\ No newline at end of file
diff --git a/frontend/src/views/profile/account/PhoneDialog.es.json b/frontend/src/views/profile/account/PhoneDialog.es.json
new file mode 100644
index 0000000..e322074
--- /dev/null
+++ b/frontend/src/views/profile/account/PhoneDialog.es.json
@@ -0,0 +1,4 @@
+{
+ "title": "Número de teléfono",
+ "label": "Tu número de teléfono"
+}
\ No newline at end of file
diff --git a/frontend/src/views/profile/account/PhoneDialog.fr.json b/frontend/src/views/profile/account/PhoneDialog.fr.json
new file mode 100644
index 0000000..5866fde
--- /dev/null
+++ b/frontend/src/views/profile/account/PhoneDialog.fr.json
@@ -0,0 +1,4 @@
+{
+ "title": "Numéro de téléphone",
+ "label": "Votre numéro de téléphone"
+}
\ No newline at end of file
diff --git a/frontend/src/views/profile/account/PhoneDialog.vue b/frontend/src/views/profile/account/PhoneDialog.vue
index 78862f0..adfc2cd 100644
--- a/frontend/src/views/profile/account/PhoneDialog.vue
+++ b/frontend/src/views/profile/account/PhoneDialog.vue
@@ -1,32 +1,33 @@
-
-
- Numéro de téléphone
-
+
+
+ {{ t('title') }}
+
-
+
-
-
- Annuler
-
-
- Enregistrer
-
-
-
-
+
+
+ {{ t('cancel') }}
+
+
+ {{ t('save') }}
+
+
+
\ No newline at end of file
diff --git a/frontend/src/views/profile/creators/ChangeNameDialog.en.json b/frontend/src/views/profile/creators/ChangeNameDialog.en.json
new file mode 100644
index 0000000..0986658
--- /dev/null
+++ b/frontend/src/views/profile/creators/ChangeNameDialog.en.json
@@ -0,0 +1,4 @@
+{
+ "title": "Change Name",
+ "label": "Your name"
+}
\ No newline at end of file
diff --git a/frontend/src/views/profile/creators/ChangeNameDialog.es.json b/frontend/src/views/profile/creators/ChangeNameDialog.es.json
new file mode 100644
index 0000000..06a5c10
--- /dev/null
+++ b/frontend/src/views/profile/creators/ChangeNameDialog.es.json
@@ -0,0 +1,4 @@
+{
+ "title": "Cambiar Nombre",
+ "label": "Tu nombre"
+}
\ No newline at end of file
diff --git a/frontend/src/views/profile/creators/ChangeNameDialog.fr.json b/frontend/src/views/profile/creators/ChangeNameDialog.fr.json
new file mode 100644
index 0000000..12d1f17
--- /dev/null
+++ b/frontend/src/views/profile/creators/ChangeNameDialog.fr.json
@@ -0,0 +1,4 @@
+{
+ "title": "Modifier le Nom",
+ "label": "Votre nom"
+}
\ No newline at end of file
diff --git a/frontend/src/views/profile/creators/ChangeNameDialog.vue b/frontend/src/views/profile/creators/ChangeNameDialog.vue
index c912454..a156666 100644
--- a/frontend/src/views/profile/creators/ChangeNameDialog.vue
+++ b/frontend/src/views/profile/creators/ChangeNameDialog.vue
@@ -1,7 +1,9 @@