From a0b35f7aa9b090a0b9c26f5497ba2a5d88ea55c4 Mon Sep 17 00:00:00 2001 From: boojack Date: Thu, 24 Nov 2022 08:42:38 +0800 Subject: [PATCH] feat: add French i18n item (#547) feat: add French i18n --- api/user_setting.go | 2 +- .../Settings/PreferencesSection.tsx | 4 ++ web/src/i18n.ts | 4 ++ web/src/locales/fr.json | 38 +++++++++---------- web/src/pages/Auth.tsx | 25 ++++++------ web/src/types/i18n.d.ts | 2 +- 6 files changed, 42 insertions(+), 33 deletions(-) diff --git a/api/user_setting.go b/api/user_setting.go index a4d993c5..072cf00a 100644 --- a/api/user_setting.go +++ b/api/user_setting.go @@ -30,7 +30,7 @@ func (key UserSettingKey) String() string { } var ( - UserSettingLocaleValue = []string{"en", "zh", "vi"} + UserSettingLocaleValue = []string{"en", "zh", "vi", "fr"} UserSettingMemoVisibilityValue = []Visibility{Privite, Protected, Public} UserSettingEditorFontStyleValue = []string{"normal", "mono"} UserSettingMemoDisplayTsOptionKeyValue = []string{"created_ts", "updated_ts"} diff --git a/web/src/components/Settings/PreferencesSection.tsx b/web/src/components/Settings/PreferencesSection.tsx index 5293340d..09139718 100644 --- a/web/src/components/Settings/PreferencesSection.tsx +++ b/web/src/components/Settings/PreferencesSection.tsx @@ -25,6 +25,10 @@ const localeSelectorItems = [ text: "Tiếng Việt", value: "vi", }, + { + text: "French", + value: "fr", + }, ]; const PreferencesSection = () => { diff --git a/web/src/i18n.ts b/web/src/i18n.ts index 11d8451f..65eb561c 100644 --- a/web/src/i18n.ts +++ b/web/src/i18n.ts @@ -3,6 +3,7 @@ import { initReactI18next } from "react-i18next"; import enLocale from "./locales/en.json"; import zhLocale from "./locales/zh.json"; import viLocale from "./locales/vi.json"; +import frLocale from "./locales/fr.json"; i18n.use(initReactI18next).init({ resources: { @@ -15,6 +16,9 @@ i18n.use(initReactI18next).init({ vi: { translation: viLocale, }, + fr: { + translation: frLocale, + }, }, lng: "en", fallbackLng: "en", diff --git a/web/src/locales/fr.json b/web/src/locales/fr.json index a3e0050b..e246fc8e 100644 --- a/web/src/locales/fr.json +++ b/web/src/locales/fr.json @@ -5,7 +5,7 @@ "password": "Mot de passe", "new-password": "Nouveau mot de passe", "repeat-new-password": "Répétez le nouveau mot de passe", - "username": "Nom d\'utilisateur", + "username": "Nom d'utilisateur", "nickname": "Surnom", "save": "Enregistrer", "close": "Fermer", @@ -28,9 +28,9 @@ "admin": "Admin", "explore": "Explorez", "sign-in": "Se connecter", - "sign-up": "S\'inscrire", + "sign-up": "S'inscrire", "sign-out": "Se déconnecter", - "back-to-home": "Retour à l\'accueil", + "back-to-home": "Retour à l'accueil", "type": "Type", "shortcuts": "Raccourcis", "title": "Titre", @@ -45,9 +45,9 @@ }, "slogan": "Un hub de mémos open source et auto-hébergé pour la gestion des connaissances et la collaboration.", "auth": { - "signup-as-host": "S\'inscrire en tant qu\'hôte", - "host-tip": "Vous vous inscrivez en tant qu\'hébergeur du site.", - "not-host-tip": "Si vous n\'avez pas de compte, veuillez contacter l\'hôte du site." + "signup-as-host": "S'inscrire en tant qu'hôte", + "host-tip": "Vous vous inscrivez en tant qu'hébergeur du site.", + "not-host-tip": "Si vous n'avez pas de compte, veuillez contacter l'hôte du site." }, "sidebar": { "daily-review": "Bilan quotidien", @@ -56,7 +56,7 @@ "archived": "Archivé" }, "daily-review": { - "oops-nothing": "Oups, il n\'y a rien." + "oops-nothing": "Oups, il n'y a rien." }, "resources": { "description": "Visualisez vos ressources statiques dans des mémos, par exemple des images.", @@ -80,7 +80,7 @@ }, "editor": { "editing": "Édition...", - "cancel-edit": "Annuler l\'édition", + "cancel-edit": "Annuler l'édition", "save": "Sauvegarder", "placeholder": "Une idée...", "only-image-supported": "Seul le fichier image est pris en charge.", @@ -114,12 +114,12 @@ "contains": "Contient", "not-contains": "Ne contient pas", "is": "Est", - "is-not": "N\'est pas", + "is-not": "N'est pas", "before": "Avant", "after": "Après" }, "value": { - "not-tagged": "Pas d\'étiquette", + "not-tagged": "Pas d'étiquette", "linked": "A des liens" }, "text-placeholder": "Commence par ^ pour utiliser regex" @@ -143,8 +143,8 @@ "preference-section": { "default-memo-visibility": "Visibilité du mémo par défaut", "enable-folding-memo": "Activer le mémo pliable", - "editor-font-style": "Style de police de l\'éditeur", - "mobile-editor-style": "Style de l\'éditeur mobile", + "editor-font-style": "Style de police de l'éditeur", + "mobile-editor-style": "Style de l'éditeur mobile", "default-memo-sort-option": "Affichage par heure de création/mise à jour", "created_ts": "Heure de création", "updated_ts": "Heure de mise à jour" @@ -154,7 +154,7 @@ }, "system-section": { "database-file-size": "Taille de la base de données", - "allow-user-signup": "Autoriser l\'inscription des utilisateurs", + "allow-user-signup": "Autoriser l'inscription des utilisateurs", "additional-style": "Style supplémentaire", "additional-script": "Script supplémentaire", "additional-style-placeholder": "Codes CSS supplémentaires", @@ -170,16 +170,16 @@ "no-memos": "pas de mémos 🌃", "memos-ready": "tous les mémos sont prêts 🎉", "restored-successfully": "Restauré avec succès", - "memo-updated-datetime": "La date et l\'heure de création du mémo ont été modifiées.", + "memo-updated-datetime": "La date et l'heure de création du mémo ont été modifiées.", "invalid-created-datetime": "Date/heure de création non valide.", - "change-memo-created-time": "Modifier l\'heure de création du mémo", + "change-memo-created-time": "Modifier l'heure de création du mémo", "memo-not-found": "Mémo introuvable", "fill-all": "Veuillez remplir tous les champs.", "new-password-not-match": "Les mots de passe ne correspondent pas", - "image-load-failed": "Le chargement de l\'image a échoué", + "image-load-failed": "Le chargement de l'image a échoué", "fill-form": "Veuillez remplir ce formulaire", "login-failed": "Connexion échouée", - "signup-failed": "L\'inscription a échoué", + "signup-failed": "L'inscription a échoué", "user-not-found": "Utilisateur introuvable", "password-changed": "Mot de passe modifié", "private-only": "Ce mémo est uniquement privé.", @@ -188,7 +188,7 @@ "change-resource-filename": "Changer le nom du fichier de ressources", "resource-filename-updated": "Le nom de fichier de la ressource a changé.", "invalid-resource-filename": "Nom de fichier invalide.", - "click-to-save-the-image": "Cliquez pour enregistrer l\'image", - "generating-the-screenshot": "Génération de la capture d\'écran..." + "click-to-save-the-image": "Cliquez pour enregistrer l'image", + "generating-the-screenshot": "Génération de la capture d'écran..." } } diff --git a/web/src/pages/Auth.tsx b/web/src/pages/Auth.tsx index 62a451df..49508487 100644 --- a/web/src/pages/Auth.tsx +++ b/web/src/pages/Auth.tsx @@ -1,3 +1,4 @@ +import { Option, Select } from "@mui/joy"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -159,18 +160,18 @@ const Auth = () => { {!systemStatus?.host &&

{t("auth.host-tip")}

}
-
- handleLocaleItemClick("en")}> - English - - / - handleLocaleItemClick("zh")}> - 中文 - - / - handleLocaleItemClick("vi")}> - Tiếng Việt - +
+
diff --git a/web/src/types/i18n.d.ts b/web/src/types/i18n.d.ts index 78ab4f5b..97fe73f5 100644 --- a/web/src/types/i18n.d.ts +++ b/web/src/types/i18n.d.ts @@ -1 +1 @@ -type Locale = "en" | "zh" | "vi"; +type Locale = "en" | "zh" | "vi" | "fr";