Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/desktop/changelog/next.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@

## Shiny new things

- markdown link supports open share feed link directly in the app
- Supported French localization.

## Improvements

## No longer broken

## Thanks

Special thanks to volunteer contributors @ for their valuable contributions
Special thanks to volunteer contributors @AnthonyMahe for their valuable contributions
3 changes: 2 additions & 1 deletion apps/desktop/layer/renderer/src/@types/constants.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// DONT EDIT THIS FILE MANUALLY
const langs = ["en", "zh-CN", "zh-TW", "ja"] as const
const langs = ["en", "zh-CN", "zh-TW", "ja", "fr-FR"] as const
export const currentSupportedLanguages = langs as readonly string[]
export type RendererSupportedLanguages = (typeof langs)[number]

Expand All @@ -8,6 +8,7 @@ export const dayjsLocaleImportMap = {
["zh-CN"]: ["zh-cn", () => import("dayjs/locale/zh-cn")],
["ja"]: ["ja", () => import("dayjs/locale/ja")],
["zh-TW"]: ["zh-tw", () => import("dayjs/locale/zh-tw")],
["fr-FR"]: ["fr", () => import("dayjs/locale/fr")],
}
export const ns = ["common", "lang", "errors", "app", "settings", "shortcuts", "ai"] as const
export const defaultNS = "app" as const
3 changes: 3 additions & 0 deletions apps/desktop/layer/renderer/src/@types/default-resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
import ai_en from "@locales/ai/en.json"
import en from "@locales/app/en.json"
import common_en from "@locales/common/en.json"
import common_frFR from "@locales/common/fr-FR.json"
import common_ja from "@locales/common/ja.json"
import common_zhCN from "@locales/common/zh-CN.json"
import common_zhTW from "@locales/common/zh-TW.json"
import errors_en from "@locales/errors/en.json"
import lang_en from "@locales/lang/en.json"
import lang_frFR from "@locales/lang/fr-FR.json"
import lang_ja from "@locales/lang/ja.json"
import lang_zhCN from "@locales/lang/zh-CN.json"
import lang_zhTW from "@locales/lang/zh-TW.json"
Expand Down Expand Up @@ -42,6 +44,7 @@ export const defaultResources = {
common: common_ja,
},
"zh-TW": { lang: lang_zhTW, common: common_zhTW },
"fr-FR": { lang: lang_frFR, common: common_frFR },
} satisfies Record<
RendererSupportedLanguages,
Partial<Record<(typeof ns)[number], Record<string, string>>>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@ const LanguageOptions = [
label: "words.english",
value: "eng",
},
{
label: "words.french",
value: "fra",
},
{
label: "words.chinese",
value: "cmn",
},
] satisfies ResponsiveSelectItem[]

type Language = "all" | "eng" | "cmn"
type Language = "all" | "eng" | "cmn" | "fra"
type DiscoveryView = "trending" | "categories"

export function DiscoveryContent() {
Expand Down
4 changes: 3 additions & 1 deletion apps/mobile/changelog/next.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

## Shiny new things

- Supported French localization.

## Improvements

## No longer broken

## Thanks

Special thanks to volunteer contributors @ for their valuable contributions
Special thanks to volunteer contributors @AnthonyMahe for their valuable contributions
371 changes: 371 additions & 0 deletions locales/ai/fr-FR.json

Large diffs are not rendered by default.

548 changes: 548 additions & 0 deletions locales/app/fr-FR.json

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions locales/common/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,11 @@
"words.english": "English",
"words.entry": "Entry",
"words.expand": "Expand",
"words.feedback": "Feedback",
"words.feeds": "Feeds",
"words.finishSetup": "Finish Setup",
"words.follow": "Follow",
"words.french": "French",
"words.id": "ID",
"words.inbox": "Inbox",
"words.items_one": "Item",
Expand Down
95 changes: 95 additions & 0 deletions locales/common/fr-FR.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"app.copied_to_clipboard": "Copié dans le presse-papier",
"discover.category.all": "Populaire",
"discover.category.anime": "Anime / Manga",
"discover.category.bbs": "Forum",
"discover.category.blog": "Blog",
"discover.category.design": "Design",
"discover.category.finance": "Finance",
"discover.category.forecast": "Prévisions",
"discover.category.game": "Jeux vidéo",
"discover.category.government": "Gouvernement",
"discover.category.journal": "Journal scientifique",
"discover.category.live": "Direct",
"discover.category.multimedia": "Multimédia",
"discover.category.new-media": "Nouveaux médias",
"discover.category.picture": "Images",
"discover.category.program-update": "Mises à jour logicielles",
"discover.category.programming": "Programmation",
"discover.category.reading": "Lecture",
"discover.category.shopping": "Shopping",
"discover.category.social-media": "Réseaux sociaux",
"discover.category.study": "Études",
"discover.category.traditional-media": "Actualités",
"discover.category.travel": "Voyage",
"discover.category.university": "Université",
"feed.entry_week_one": "{{count}} article/semaine",
"feed.entry_week_other": "{{count}} articles/semaine",
"feed.follower_one": "abonné",
"feed.follower_other": "abonnés",
"feed.updated_at": "Mis à jour",
"feed_view_type.all": "Tout",
"feed_view_type.articles": "Articles",
"feed_view_type.audios": "Audios",
"feed_view_type.notifications": "Notifications",
"feed_view_type.pictures": "Images",
"feed_view_type.social_media": "Réseaux sociaux",
"feed_view_type.videos": "Vidéos",
"ok": "OK",
"quantifier.piece": "",
"retry": "Réessayer",
"space": " ",
"time.last_night": "Hier soir",
"time.the_night_before_last": "Avant-hier soir",
"time.today": "Aujourd'hui",
"time.yesterday": "Hier",
"tips.load-lng-error": "Échec du chargement du pack de langue",
"words.actions": "Actions",
"words.ago": "il y a",
"words.all": "Tout",
"words.back": "Retour",
"words.cancel": "Annuler",
"words.chinese": "Chinois",
"words.close": "Fermer",
"words.confirm": "Confirmer",
"words.copy": "Copier",
"words.create": "Créer",
"words.default": "Défaut",
"words.delete": "Supprimer",
"words.documentation": "Documentation",
"words.download": "Télécharger",
"words.edit": "Modifier",
"words.english": "Anglais",
"words.entry": "Entrée",
"words.expand": "Développer",
"words.feedback": "Feedback",
"words.feeds": "Flux",
"words.finishSetup": "Terminer l'installation",
"words.follow": "S'abonner",
"words.french": "Français",
"words.id": "ID",
"words.inbox": "Boîte de réception",
"words.items_one": "Élément",
"words.items_other": "Éléments",
"words.letsGo": "C'est parti",
"words.lists": "Listes",
"words.local": "local",
"words.manage": "gérer",
"words.next": "Suivant",
"words.record": "enregistrement",
"words.record_one": "enregistrement",
"words.record_other": "enregistrements",
"words.reset": "Réinitialiser",
"words.result": "résultat",
"words.result_one": "résultat",
"words.result_other": "résultats",
"words.rsshub": "RSSHub",
"words.save": "Enregistrer",
"words.search": "Rechercher",
"words.starred": "Favoris",
"words.submit": "Soumettre",
"words.unsaved_changes": "Modifications non enregistrées",
"words.update": "Mettre à jour",
"words.which.above": "ci-dessus",
"words.which.all": "tout"
}
88 changes: 88 additions & 0 deletions locales/errors/fr-FR.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
{
"1": "L'opération précédente n'est pas terminée",
"3": "Contenu non traitable",
"4": "Entrée invalide",
"5": "Configuration manquante",
"6": "Introuvable",
"1000": "Non autorisé",
"1001": "Échec de la création de session",
"1002": "Paramètre invalide",
"1003": "Invitation invalide",
"1004": "Aucune permission",
"1005": "Erreur interne",
"1006": "Email non vérifié",
"1007": "Échec de la vérification du captcha",
"2000": "Seuls les administrateurs peuvent actualiser les flux",
"2001": "Flux introuvable",
"2002": "feedId ou url requis",
"2003": "Erreur de récupération du flux",
"2004": "Échec de l'analyse du flux",
"2010": "Échec de la vérification de propriété",
"2011": "Limite d'abonnement dépassée",
"3000": "Entrée introuvable",
"4000": "Déjà réclamé",
"4001": "Erreur de portefeuille utilisateur",
"4002": "Solde insuffisant",
"4003": "Solde retirable du flux insuffisant",
"4004": "Erreur de portefeuille utilisateur cible",
"4005": "Calcul de la puissance quotidienne en cours",
"4006": "Montant de boost invalide",
"4007": "Code à deux facteurs invalide",
"4008": "Code à deux facteurs requis",
"4010": "Airdrop non éligible",
"4011": "Envoi de l'airdrop en cours",
"4012": "Airdrop déjà envoyé",
"4013": "Airdrop non vérifié",
"5000": "Limite d'invitation dépassée. Veuillez réessayer dans quelques jours.",
"5001": "L'invitation existe déjà.",
"5002": "Code d'invitation déjà utilisé.",
"5003": "Le code d'invitation n'existe pas.",
"6000": "Utilisateur introuvable",
"7000": "Paramètre introuvable",
"7001": "Onglet de paramètre invalide",
"7002": "Charge utile de paramètre invalide",
"7003": "Charge utile de paramètre trop volumineuse",
"8000": "Liste introuvable",
"8001": "Permission de liste refusée",
"8002": "Limite de liste dépassée",
"8003": "Flux déjà ajouté à la liste",
"8004": "Impossible de supprimer une liste avec des abonnements.",
"9000": "Succès non terminé",
"9001": "Succès déjà reçu",
"9002": "Succès en cours d'audit",
"9003": "Audit de succès non nécessaire",
"10000": "Boîte de réception introuvable",
"10001": "La boîte de réception existe déjà",
"10002": "Limite de boîte de réception dépassée",
"10003": "Permission de boîte de réception refusée",
"12000": "Limite d'action dépassée",
"13000": "Route RSSHub introuvable",
"13001": "Vous n'êtes pas le propriétaire de cette instance RSSHub",
"13002": "RSSHub est en cours d'utilisation",
"13003": "RSSHub introuvable",
"13004": "Limite d'abonnement RSSHub dépassée",
"13005": "Achat RSSHub introuvable",
"13006": "Configuration RSSHub invalide",
"13007": "Cette instance RSSHub est actuellement indisponible",
"14000": "Fichier invalide",
"14001": "Fichier trop volumineux",
"14002": "Échec du téléchargement",
"15000": "Limite de jetons IA dépassée. Veuillez réessayer plus tard.",
"15001": "Vous n'êtes pas autorisé à accéder au chat IA",
"15002": "Limite de fichier joint IA dépassée. Veuillez réessayer plus tard.",
"15003": "Mémoire IA introuvable",
"15004": "Limite de mémoire IA dépassée",
"15005": "Crédits IA insuffisants pour accéder à cette fonctionnalité.",
"16000": "Erreur OAuth MCP",
"16001": "Erreur de découverte MCP",
"16002": "Service MCP introuvable",
"16003": "État OAuth invalide ou expiré",
"16004": "Échec de l'échange de jeton",
"16005": "Service MCP utilisateur introuvable",
"16006": "Erreur de configuration MCP",
"16007": "Échec de l'exécution de l'outil MCP",
"17000": "Limite d'abonnement aux flux max pour utilisateur d'essai dépassée",
"17001": "Limite d'abonnement aux listes max pour utilisateur d'essai dépassée",
"17002": "Limite d'abonnement aux boîtes de réception max pour utilisateur d'essai dépassée",
"17003": "Aucune permission pour l'utilisateur gratuit"
}
89 changes: 89 additions & 0 deletions locales/external/fr-FR.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{
"copied_link": "Lien copié dans le presse-papiers",
"feed.actions.follow": "S'abonner",
"feed.actions.followed": "Abonné",
"feed.actions.open": "Ouvrir dans {{which}}",
"feed.copy_feed_url": "Copier l'URL du flux",
"feed.entry_week_one": "{{count}} entrée/semaine",
"feed.entry_week_other": "{{count}} entrées/semaine",
"feed.feeds_one": "flux",
"feed.feeds_other": "flux",
"feed.follow_to_view_all": "Abonnez-vous pour voir tous les {{count}} flux...",
"feed.follower_one": "abonné",
"feed.follower_other": "abonnés",
"feed.followsAndFeeds": "{{subscriptionCount}} {{subscriptionNoun}} et {{feedsCount}} {{feedsNoun}} sur {{appName}}",
"feed.madeby": "Fait par",
"feed.preview": "Aperçu",
"feed.read_one": "lu",
"feed.read_other": "lus",
"feed.updated_at": "Mis à jour",
"feed.view_feed_url": "Voir l'URL du flux",
"feed_item.claimed_by_owner": "Ce flux est revendiqué par",
"feed_item.claimed_by_unknown": "son propriétaire.",
"feed_item.claimed_by_you": "Revendiqué par vous",
"feed_item.claimed_feed": "Flux revendiqué",
"feed_item.claimed_list": "Liste revendiquée",
"feed_item.error_since": "Erreur depuis",
"feed_item.not_publicly_visible": "Non visible publiquement sur votre page de profil",
"header.app": "App",
"header.download": "Télécharger",
"invitation.activate": "Activer",
"invitation.codeOptions.1": "Cherchez un utilisateur alpha test pour vous inviter.",
"invitation.codeOptions.2": "Rejoignez notre serveur Discord pour des giveaways occasionnels.",
"invitation.codeOptions.3": "Suivez notre compte X pour des giveaways occasionnels.",
"invitation.earlyAccess": "Folo nécessite actuellement un code d'invitation.",
"invitation.earlyAccessMessage": "😰 Désolé, Folo nécessite actuellement un code d'invitation pour être utilisé.",
"invitation.generateButton": "Générer un nouveau code",
"invitation.generateCost": "Vous pouvez dépenser {{INVITATION_PRICE}} Power pour générer un code d'invitation pour vos amis.",
"invitation.getCodeMessage": "Vous pouvez obtenir un code d'invitation des manières suivantes :",
"invitation.title": "Code d'invitation",
"login.backToWebApp": "Retour à l'application Web",
"login.confirm_password.label": "Confirmer le mot de passe",
"login.continueWith": "Continuer avec {{provider}}",
"login.email": "E-mail",
"login.enter_token": "Si vous avez installé le client mais n'êtes pas redirigé, copiez le jeton ci-dessous et collez-le dans le formulaire \"Entrez le jeton d'autorisation pour continuer\" sur le client (v0.5.0+).",
"login.errors.unknown": "Erreurs inconnues",
"login.forget_password.description": "Entrez l'adresse e-mail associée à votre compte et nous vous enverrons un e-mail expliquant comment réinitialiser votre mot de passe.",
"login.forget_password.email_invalid": "E-mail invalide",
"login.forget_password.email_required": "E-mail requis",
"login.forget_password.label": "Mot de passe oublié",
"login.forget_password.note": "Mot de passe oublié ?",
"login.forget_password.success": "L'e-mail a été envoyé avec succès",
"login.have_account": "Vous avez déjà un compte ? <strong>Se connecter</strong>",
"login.lastUsed": "Dernière utilisation",
"login.logInTo": "Se connecter à",
"login.logInWithEmail": "Se connecter avec un e-mail",
"login.new_password.label": "Nouveau mot de passe",
"login.no_account": "Vous n'avez pas de compte ? <strong>S'inscrire</strong>",
"login.no_client": "Aucun client détecté, vous pouvez <weblink>continuer à utiliser l'application Web</weblink>.",
"login.openApp": "Ouvrir l'application",
"login.or": "Ou",
"login.password": "Mot de passe",
"login.redirecting": "Redirection",
"login.register": "En créer un",
"login.reset_password.description": "Entrez un nouveau mot de passe et confirmez-le pour réinitialiser votre mot de passe.",
"login.reset_password.label": "Réinitialiser le mot de passe",
"login.reset_password.success": "Le mot de passe a été réinitialisé avec succès",
"login.signOut": "Se déconnecter",
"login.signUp": "S'inscrire avec un e-mail",
"login.signUpTo": "S'inscrire à",
"login.submit": "Soumettre",
"login.two_factor.code": "Code d'authentification à deux facteurs",
"login.two_factor.verify": "Terminer la vérification",
"login.welcomeTo": "Bienvenue sur ",
"redirect.continueInBrowser": "Continuer dans le navigateur",
"redirect.instruction": "Il est maintenant temps d'ouvrir {{app_name}} et de fermer cette page en toute sécurité.",
"redirect.openApp": "Ouvrir {{app_name}}",
"redirect.successMessage": "Vous vous êtes connecté avec succès au compte {{app_name}}.",
"register.confirm_password": "Confirmer le mot de passe",
"register.email": "E-mail",
"register.label": "S'inscrire à {{app_name}}",
"register.login": "Se connecter",
"register.password": "Mot de passe",
"register.referral.days": "Inscrivez-vous avec ce code de parrainage pour obtenir {{days}} jours d'essai Pro",
"register.referral.description": "Inscrivez-vous avec un code de parrainage pour obtenir des jours supplémentaires d'essai Pro.",
"register.referral.invalid": "Code de parrainage invalide",
"register.referral.label": "Code de parrainage",
"register.submit": "Créer un compte",
"words.email": "E-mail"
}
3 changes: 3 additions & 0 deletions locales/lang/fr-FR.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"name": "Français (France)"
}
Loading