From aff7953ab19f68ae3ee5544cecaeb8792c82cc78 Mon Sep 17 00:00:00 2001 From: Houmgaor Date: Sun, 22 Mar 2026 16:59:29 +0100 Subject: [PATCH] feat(i18n): add French and Spanish translations --- server/channelserver/lang_es.go | 99 ++++++++++++++++++++++++++++ server/channelserver/lang_fr.go | 99 ++++++++++++++++++++++++++++ server/channelserver/sys_language.go | 4 ++ 3 files changed, 202 insertions(+) create mode 100644 server/channelserver/lang_es.go create mode 100644 server/channelserver/lang_fr.go diff --git a/server/channelserver/lang_es.go b/server/channelserver/lang_es.go new file mode 100644 index 000000000..c1f1cdd44 --- /dev/null +++ b/server/channelserver/lang_es.go @@ -0,0 +1,99 @@ +package channelserver + +func langSpanish() i18n { + var i i18n + + i.language = "Español" + i.cafe.reset = "Se reinicia el %d/%d" + i.timer = "Tiempo: %02d:%02d:%02d.%03d (%df)" + + i.commands.noOp = "No tienes permiso para usar este comando" + i.commands.disabled = "El comando %s está desactivado" + i.commands.reload = "Recargando jugadores..." + i.commands.playtime = "Tiempo de juego: %d hora(s) %d minuto(s) %d segundo(s)" + + i.commands.kqf.get = "KQF: %x" + i.commands.kqf.set.error = "Error en el comando. Formato: %s set xxxxxxxxxxxxxxxx" + i.commands.kqf.set.success = "KQF establecido, por favor cambia de Zona/Mundo" + i.commands.kqf.version = "Este comando está desactivado antes de MHFG10" + i.commands.rights.error = "Error en el comando. Formato: %s x" + i.commands.rights.success = "Establecer entero de derechos: %d" + i.commands.course.error = "Error en el comando. Formato: %s " + i.commands.course.disabled = "Curso %s desactivado" + i.commands.course.enabled = "Curso %s activado" + i.commands.course.locked = "El curso %s está bloqueado" + i.commands.teleport.error = "Error en el comando. Formato: %s x y" + i.commands.teleport.success = "Teletransportando a %d %d" + i.commands.psn.error = "Error en el comando. Formato: %s " + i.commands.psn.success = "ID de PSN conectado: %s" + i.commands.psn.exists = "Este ID de PSN ya está asociado a otra cuenta" + + i.commands.discord.success = "Tu token de Discord: %s" + + i.commands.ban.noUser = "No se encontró al usuario" + i.commands.ban.success = "%s ha sido baneado con éxito" + i.commands.ban.invalid = "ID de personaje inválido" + i.commands.ban.error = "Error en el comando. Formato: %s [duración]" + i.commands.ban.length = " hasta el %s" + + i.commands.timer.enabled = "Temporizador de misión activado" + i.commands.timer.disabled = "Temporizador de misión desactivado" + + i.commands.ravi.noCommand = "No se especificó ningún comando de Raviente" + i.commands.ravi.start.success = "La Gran Cacería comenzará en un momento" + i.commands.ravi.start.error = "¡La Gran Cacería ya ha comenzado!" + i.commands.ravi.multiplier = "El multiplicador de Raviente es actualmente %.2fx" + i.commands.ravi.res.success = "¡Enviando apoyo de resurrección!" + i.commands.ravi.res.error = "¡El apoyo de resurrección no ha sido solicitado!" + i.commands.ravi.sed.success = "¡Enviando apoyo de sedación si fue solicitado!" + i.commands.ravi.request = "¡Solicitando apoyo de sedación!" + i.commands.ravi.error = "¡Comando de Raviente no reconocido!" + i.commands.ravi.noPlayers = "¡Nadie se ha unido a la Gran Cacería!" + i.commands.ravi.version = "Este comando está desactivado fuera de MHFZZ" + + i.raviente.berserk = "¡ está en curso!" + i.raviente.extreme = "¡ está en curso!" + i.raviente.extremeLimited = "¡ está en curso!" + i.raviente.berserkSmall = "¡ está en curso!" + + i.guild.rookieGuildName = "Clan Novato %d" + i.guild.returnGuildName = "Clan Regreso %d" + + i.guild.invite.title = "¡Invitación!" + i.guild.invite.body = "Has sido invitado a unirte a\n「%s」\n¿Deseas aceptar?" + + i.guild.invite.success.title = "¡Éxito!" + i.guild.invite.success.body = "Te has unido a\n「%s」 con éxito." + + i.guild.invite.accepted.title = "Aceptada" + i.guild.invite.accepted.body = "El destinatario aceptó tu invitación para unirse a\n「%s」." + + i.guild.invite.rejected.title = "Rechazada" + i.guild.invite.rejected.body = "Rechazaste la invitación para unirte a\n「%s」." + + i.guild.invite.declined.title = "Declinada" + i.guild.invite.declined.body = "El destinatario declinó tu invitación para unirse a\n「%s」." + + i.beads = []Bead{ + {1, "Perla de Tormentas", "Una perla de oración imbuida con el poder de las tormentas.\nInvoca vientos furiosos para fortalecer a los aliados."}, + {3, "Perla de Corte", "Una perla de oración imbuida con poder cortante.\nOtorga a los aliados mayor fuerza de corte."}, + {4, "Perla de Vitalidad", "Una perla de oración imbuida con vitalidad.\nAumenta los puntos de vida de los aliados cercanos."}, + {8, "Perla de Curación", "Una perla de oración imbuida con poder curativo.\nProtege a los aliados con energía restauradora."}, + {9, "Perla de Furia", "Una perla de oración imbuida con energía furiosa.\nImbuye a los aliados con rabia de combate."}, + {10, "Perla de Plaga", "Una perla de oración imbuida con miasma.\nInfunde a los aliados con poder venenoso."}, + {11, "Perla de Poder", "Una perla de oración imbuida con fuerza bruta.\nOtorga a los aliados una fuerza abrumadora."}, + {14, "Perla del Trueno", "Una perla de oración imbuida con rayos.\nCarga a los aliados con fuerza eléctrica."}, + {15, "Perla de Hielo", "Una perla de oración imbuida con frío glacial.\nOtorga a los aliados poder elemental helado."}, + {17, "Perla de Fuego", "Una perla de oración imbuida con calor abrasador.\nEnciende a los aliados con poder elemental ígneo."}, + {18, "Perla de Agua", "Una perla de oración imbuida con agua fluyente.\nOtorga a los aliados poder elemental acuático."}, + {19, "Perla del Dragón", "Una perla de oración imbuida con energía dracónica.\nOtorga a los aliados poder elemental dracónico."}, + {20, "Perla de Tierra", "Una perla de oración imbuida con el poder de la tierra.\nAfianza a los aliados con fuerza elemental telúrica."}, + {21, "Perla del Viento", "Una perla de oración imbuida con viento veloz.\nOtorga a los aliados mayor agilidad."}, + {22, "Perla de Luz", "Una perla de oración imbuida con luz radiante.\nInspira a los aliados con energía luminosa."}, + {23, "Perla de Sombra", "Una perla de oración imbuida con oscuridad.\nInfunde a los aliados con poder sombrío."}, + {24, "Perla de Hierro", "Una perla de oración imbuida con la resistencia del hierro.\nOtorga a los aliados una defensa reforzada."}, + {25, "Perla de Inmunidad", "Una perla de oración imbuida con poder de sellado.\nAnula las debilidades elementales de los aliados."}, + } + + return i +} diff --git a/server/channelserver/lang_fr.go b/server/channelserver/lang_fr.go new file mode 100644 index 000000000..2db839b84 --- /dev/null +++ b/server/channelserver/lang_fr.go @@ -0,0 +1,99 @@ +package channelserver + +func langFrench() i18n { + var i i18n + + i.language = "Français" + i.cafe.reset = "Réinitialisation le %d/%d" + i.timer = "Temps : %02d:%02d:%02d.%03d (%df)" + + i.commands.noOp = "Vous n'avez pas la permission d'utiliser cette commande" + i.commands.disabled = "La commande %s est désactivée" + i.commands.reload = "Rechargement des joueurs..." + i.commands.playtime = "Temps de jeu : %d heure(s) %d minute(s) %d seconde(s)" + + i.commands.kqf.get = "KQF : %x" + i.commands.kqf.set.error = "Erreur de commande. Format : %s set xxxxxxxxxxxxxxxx" + i.commands.kqf.set.success = "KQF défini, veuillez changer de Zone/Monde" + i.commands.kqf.version = "Cette commande est désactivée avant MHFG10" + i.commands.rights.error = "Erreur de commande. Format : %s x" + i.commands.rights.success = "Définir entier de droits : %d" + i.commands.course.error = "Erreur de commande. Format : %s " + i.commands.course.disabled = "Cours %s désactivé" + i.commands.course.enabled = "Cours %s activé" + i.commands.course.locked = "Le cours %s est verrouillé" + i.commands.teleport.error = "Erreur de commande. Format : %s x y" + i.commands.teleport.success = "Téléportation vers %d %d" + i.commands.psn.error = "Erreur de commande. Format : %s " + i.commands.psn.success = "ID PSN connecté : %s" + i.commands.psn.exists = "Cet ID PSN est déjà associé à un autre compte !" + + i.commands.discord.success = "Votre jeton Discord : %s" + + i.commands.ban.noUser = "Utilisateur introuvable" + i.commands.ban.success = "%s a été banni avec succès" + i.commands.ban.invalid = "ID de personnage invalide" + i.commands.ban.error = "Erreur de commande. Format : %s [durée]" + i.commands.ban.length = " jusqu'au %s" + + i.commands.timer.enabled = "Minuteur de quête activé" + i.commands.timer.disabled = "Minuteur de quête désactivé" + + i.commands.ravi.noCommand = "Aucune commande Raviente spécifiée !" + i.commands.ravi.start.success = "La Grande Chasse va commencer dans un instant" + i.commands.ravi.start.error = "La Grande Chasse a déjà commencé !" + i.commands.ravi.multiplier = "Le multiplicateur Raviente est actuellement de %.2fx" + i.commands.ravi.res.success = "Envoi du soutien de résurrection !" + i.commands.ravi.res.error = "Le soutien de résurrection n'a pas été demandé !" + i.commands.ravi.sed.success = "Envoi du soutien de sédation si demandé !" + i.commands.ravi.request = "Demande de soutien de sédation !" + i.commands.ravi.error = "Commande Raviente non reconnue !" + i.commands.ravi.noPlayers = "Personne n'a rejoint la Grande Chasse !" + i.commands.ravi.version = "Cette commande est désactivée en dehors de MHFZZ" + + i.raviente.berserk = " est en cours !" + i.raviente.extreme = " est en cours !" + i.raviente.extremeLimited = " est en cours !" + i.raviente.berserkSmall = " est en cours !" + + i.guild.rookieGuildName = "Clan Novice %d" + i.guild.returnGuildName = "Clan Retour %d" + + i.guild.invite.title = "Invitation !" + i.guild.invite.body = "Vous avez été invité à rejoindre\n「%s」\nSouhaitez-vous accepter ?" + + i.guild.invite.success.title = "Succès !" + i.guild.invite.success.body = "Vous avez rejoint\n「%s」 avec succès." + + i.guild.invite.accepted.title = "Acceptée" + i.guild.invite.accepted.body = "Le destinataire a accepté votre invitation à rejoindre\n「%s」." + + i.guild.invite.rejected.title = "Refusée" + i.guild.invite.rejected.body = "Vous avez refusé l'invitation à rejoindre\n「%s」." + + i.guild.invite.declined.title = "Déclinée" + i.guild.invite.declined.body = "Le destinataire a décliné votre invitation à rejoindre\n「%s」." + + i.beads = []Bead{ + {1, "Perle des Tempêtes", "Une perle de prière imprégnée du pouvoir des tempêtes.\nInvoque des vents déchaînés pour soutenir les alliés."}, + {3, "Perle de Tranchant", "Une perle de prière imprégnée du pouvoir tranchant.\nAccorde aux alliés une force de coupe accrue."}, + {4, "Perle de Vitalité", "Une perle de prière imprégnée de vitalité.\nAugmente les points de vie des alliés proches."}, + {8, "Perle de Guérison", "Une perle de prière imprégnée du pouvoir de guérison.\nProtège les alliés avec une énergie restauratrice."}, + {9, "Perle de Fureur", "Une perle de prière imprégnée d'énergie furieuse.\nEmbrasse les alliés d'une rage au combat."}, + {10, "Perle de Fléau", "Une perle de prière imprégnée de miasmes.\nInfuse les alliés d'un pouvoir venimeux."}, + {11, "Perle de Puissance", "Une perle de prière imprégnée d'une force brute.\nAccorde aux alliés une force accablante."}, + {14, "Perle du Tonnerre", "Une perle de prière imprégnée de foudre.\nCharge les alliés d'une force électrique."}, + {15, "Perle de Glace", "Une perle de prière imprégnée d'un froid glacial.\nAccorde aux alliés un pouvoir élémentaire glacé."}, + {17, "Perle de Feu", "Une perle de prière imprégnée d'une chaleur brûlante.\nEnflamme les alliés d'un pouvoir élémentaire ardent."}, + {18, "Perle d'Eau", "Une perle de prière imprégnée d'eau courante.\nAccorde aux alliés un pouvoir élémentaire aquatique."}, + {19, "Perle du Dragon", "Une perle de prière imprégnée d'énergie draconique.\nAccorde aux alliés un pouvoir élémentaire draconique."}, + {20, "Perle de Terre", "Une perle de prière imprégnée du pouvoir de la terre.\nAncre les alliés avec une force élémentaire tellurique."}, + {21, "Perle du Vent", "Une perle de prière imprégnée d'un vent rapide.\nAccorde aux alliés une agilité accrue."}, + {22, "Perle de Lumière", "Une perle de prière imprégnée d'une lumière radieuse.\nInspire les alliés avec une énergie lumineuse."}, + {23, "Perle d'Ombre", "Une perle de prière imprégnée d'obscurité.\nInfuse les alliés d'un pouvoir ténébreux."}, + {24, "Perle de Fer", "Une perle de prière imprégnée de la résistance du fer.\nAccorde aux alliés une défense renforcée."}, + {25, "Perle d'Immunité", "Une perle de prière imprégnée d'un pouvoir de scellement.\nAnnule les faiblesses élémentaires des alliés."}, + } + + return i +} diff --git a/server/channelserver/sys_language.go b/server/channelserver/sys_language.go index bbf62a304..6c970909f 100644 --- a/server/channelserver/sys_language.go +++ b/server/channelserver/sys_language.go @@ -138,6 +138,10 @@ func getLangStrings(s *Server) i18n { switch s.erupeConfig.Language { case "jp": return langJapanese() + case "fr": + return langFrench() + case "es": + return langSpanish() default: return langEnglish() }