feat: add French i18n item (#547)

feat: add French i18n
pull/548/head^2
boojack 2 years ago committed by GitHub
parent 574e160a11
commit a0b35f7aa9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -30,7 +30,7 @@ func (key UserSettingKey) String() string {
} }
var ( var (
UserSettingLocaleValue = []string{"en", "zh", "vi"} UserSettingLocaleValue = []string{"en", "zh", "vi", "fr"}
UserSettingMemoVisibilityValue = []Visibility{Privite, Protected, Public} UserSettingMemoVisibilityValue = []Visibility{Privite, Protected, Public}
UserSettingEditorFontStyleValue = []string{"normal", "mono"} UserSettingEditorFontStyleValue = []string{"normal", "mono"}
UserSettingMemoDisplayTsOptionKeyValue = []string{"created_ts", "updated_ts"} UserSettingMemoDisplayTsOptionKeyValue = []string{"created_ts", "updated_ts"}

@ -25,6 +25,10 @@ const localeSelectorItems = [
text: "Tiếng Việt", text: "Tiếng Việt",
value: "vi", value: "vi",
}, },
{
text: "French",
value: "fr",
},
]; ];
const PreferencesSection = () => { const PreferencesSection = () => {

@ -3,6 +3,7 @@ import { initReactI18next } from "react-i18next";
import enLocale from "./locales/en.json"; import enLocale from "./locales/en.json";
import zhLocale from "./locales/zh.json"; import zhLocale from "./locales/zh.json";
import viLocale from "./locales/vi.json"; import viLocale from "./locales/vi.json";
import frLocale from "./locales/fr.json";
i18n.use(initReactI18next).init({ i18n.use(initReactI18next).init({
resources: { resources: {
@ -15,6 +16,9 @@ i18n.use(initReactI18next).init({
vi: { vi: {
translation: viLocale, translation: viLocale,
}, },
fr: {
translation: frLocale,
},
}, },
lng: "en", lng: "en",
fallbackLng: "en", fallbackLng: "en",

@ -5,7 +5,7 @@
"password": "Mot de passe", "password": "Mot de passe",
"new-password": "Nouveau mot de passe", "new-password": "Nouveau mot de passe",
"repeat-new-password": "Répétez le 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", "nickname": "Surnom",
"save": "Enregistrer", "save": "Enregistrer",
"close": "Fermer", "close": "Fermer",
@ -28,9 +28,9 @@
"admin": "Admin", "admin": "Admin",
"explore": "Explorez", "explore": "Explorez",
"sign-in": "Se connecter", "sign-in": "Se connecter",
"sign-up": "S\'inscrire", "sign-up": "S'inscrire",
"sign-out": "Se déconnecter", "sign-out": "Se déconnecter",
"back-to-home": "Retour à l\'accueil", "back-to-home": "Retour à l'accueil",
"type": "Type", "type": "Type",
"shortcuts": "Raccourcis", "shortcuts": "Raccourcis",
"title": "Titre", "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.", "slogan": "Un hub de mémos open source et auto-hébergé pour la gestion des connaissances et la collaboration.",
"auth": { "auth": {
"signup-as-host": "S\'inscrire en tant qu\'hôte", "signup-as-host": "S'inscrire en tant qu'hôte",
"host-tip": "Vous vous inscrivez en tant qu\'hébergeur du site.", "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." "not-host-tip": "Si vous n'avez pas de compte, veuillez contacter l'hôte du site."
}, },
"sidebar": { "sidebar": {
"daily-review": "Bilan quotidien", "daily-review": "Bilan quotidien",
@ -56,7 +56,7 @@
"archived": "Archivé" "archived": "Archivé"
}, },
"daily-review": { "daily-review": {
"oops-nothing": "Oups, il n\'y a rien." "oops-nothing": "Oups, il n'y a rien."
}, },
"resources": { "resources": {
"description": "Visualisez vos ressources statiques dans des mémos, par exemple des images.", "description": "Visualisez vos ressources statiques dans des mémos, par exemple des images.",
@ -80,7 +80,7 @@
}, },
"editor": { "editor": {
"editing": "Édition...", "editing": "Édition...",
"cancel-edit": "Annuler l\'édition", "cancel-edit": "Annuler l'édition",
"save": "Sauvegarder", "save": "Sauvegarder",
"placeholder": "Une idée...", "placeholder": "Une idée...",
"only-image-supported": "Seul le fichier image est pris en charge.", "only-image-supported": "Seul le fichier image est pris en charge.",
@ -114,12 +114,12 @@
"contains": "Contient", "contains": "Contient",
"not-contains": "Ne contient pas", "not-contains": "Ne contient pas",
"is": "Est", "is": "Est",
"is-not": "N\'est pas", "is-not": "N'est pas",
"before": "Avant", "before": "Avant",
"after": "Après" "after": "Après"
}, },
"value": { "value": {
"not-tagged": "Pas d\'étiquette", "not-tagged": "Pas d'étiquette",
"linked": "A des liens" "linked": "A des liens"
}, },
"text-placeholder": "Commence par ^ pour utiliser regex" "text-placeholder": "Commence par ^ pour utiliser regex"
@ -143,8 +143,8 @@
"preference-section": { "preference-section": {
"default-memo-visibility": "Visibilité du mémo par défaut", "default-memo-visibility": "Visibilité du mémo par défaut",
"enable-folding-memo": "Activer le mémo pliable", "enable-folding-memo": "Activer le mémo pliable",
"editor-font-style": "Style de police de l\'éditeur", "editor-font-style": "Style de police de l'éditeur",
"mobile-editor-style": "Style de l\'éditeur mobile", "mobile-editor-style": "Style de l'éditeur mobile",
"default-memo-sort-option": "Affichage par heure de création/mise à jour", "default-memo-sort-option": "Affichage par heure de création/mise à jour",
"created_ts": "Heure de création", "created_ts": "Heure de création",
"updated_ts": "Heure de mise à jour" "updated_ts": "Heure de mise à jour"
@ -154,7 +154,7 @@
}, },
"system-section": { "system-section": {
"database-file-size": "Taille de la base de données", "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-style": "Style supplémentaire",
"additional-script": "Script supplémentaire", "additional-script": "Script supplémentaire",
"additional-style-placeholder": "Codes CSS supplémentaires", "additional-style-placeholder": "Codes CSS supplémentaires",
@ -170,16 +170,16 @@
"no-memos": "pas de mémos 🌃", "no-memos": "pas de mémos 🌃",
"memos-ready": "tous les mémos sont prêts 🎉", "memos-ready": "tous les mémos sont prêts 🎉",
"restored-successfully": "Restauré avec succès", "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.", "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", "memo-not-found": "Mémo introuvable",
"fill-all": "Veuillez remplir tous les champs.", "fill-all": "Veuillez remplir tous les champs.",
"new-password-not-match": "Les mots de passe ne correspondent pas", "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", "fill-form": "Veuillez remplir ce formulaire",
"login-failed": "Connexion échouée", "login-failed": "Connexion échouée",
"signup-failed": "L\'inscription a échoué", "signup-failed": "L'inscription a échoué",
"user-not-found": "Utilisateur introuvable", "user-not-found": "Utilisateur introuvable",
"password-changed": "Mot de passe modifié", "password-changed": "Mot de passe modifié",
"private-only": "Ce mémo est uniquement privé.", "private-only": "Ce mémo est uniquement privé.",
@ -188,7 +188,7 @@
"change-resource-filename": "Changer le nom du fichier de ressources", "change-resource-filename": "Changer le nom du fichier de ressources",
"resource-filename-updated": "Le nom de fichier de la ressource a changé.", "resource-filename-updated": "Le nom de fichier de la ressource a changé.",
"invalid-resource-filename": "Nom de fichier invalide.", "invalid-resource-filename": "Nom de fichier invalide.",
"click-to-save-the-image": "Cliquez pour enregistrer l\'image", "click-to-save-the-image": "Cliquez pour enregistrer l'image",
"generating-the-screenshot": "Génération de la capture d\'écran..." "generating-the-screenshot": "Génération de la capture d'écran..."
} }
} }

@ -1,3 +1,4 @@
import { Option, Select } from "@mui/joy";
import { useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
@ -159,18 +160,18 @@ const Auth = () => {
{!systemStatus?.host && <p className="tip-text">{t("auth.host-tip")}</p>} {!systemStatus?.host && <p className="tip-text">{t("auth.host-tip")}</p>}
</div> </div>
<div className="footer-container"> <div className="footer-container">
<div className="language-container"> <div className="w-full flex flex-row justify-center items-center">
<span className={`locale-item ${i18n.language === "en" ? "active" : ""}`} onClick={() => handleLocaleItemClick("en")}> <Select
English className="w-40 text-sm"
</span> startDecorator={<Icon.Globe className="w-4 h-auto" />}
<span className="split-line">/</span> value={i18n.language}
<span className={`locale-item ${i18n.language === "zh" ? "active" : ""}`} onClick={() => handleLocaleItemClick("zh")}> onChange={(e, value) => handleLocaleItemClick(value as Locale)}
>
</span> <Option value="en">English</Option>
<span className="split-line">/</span> <Option value="zh"></Option>
<span className={`locale-item ${i18n.language === "vi" ? "active" : ""}`} onClick={() => handleLocaleItemClick("vi")}> <Option value="vi">Tiếng Vit</Option>
Tiếng Vit <Option value="fr">French</Option>
</span> </Select>
</div> </div>
</div> </div>
</div> </div>

@ -1 +1 @@
type Locale = "en" | "zh" | "vi"; type Locale = "en" | "zh" | "vi" | "fr";

Loading…
Cancel
Save