mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
@ -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 Việt</Option>
|
||||||
Tiếng Việt
|
<Option value="fr">French</Option>
|
||||||
</span>
|
</Select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
2
web/src/types/i18n.d.ts
vendored
2
web/src/types/i18n.d.ts
vendored
@ -1 +1 @@
|
|||||||
type Locale = "en" | "zh" | "vi";
|
type Locale = "en" | "zh" | "vi" | "fr";
|
||||||
|
Reference in New Issue
Block a user