Initial commit (unpacked platform)
This commit is contained in:
@@ -0,0 +1,338 @@
|
||||
{
|
||||
"common.loading": "Chargement …",
|
||||
"common.error": "Un problème est survenu. Réessayez.",
|
||||
"common.retry": "Réessayer",
|
||||
"common.save": "Enregistrer",
|
||||
"common.cancel": "Annuler",
|
||||
"common.next": "Suivant",
|
||||
"common.back": "Retour",
|
||||
"common.done": "Terminé",
|
||||
"common.skip": "Passer",
|
||||
"common.offline": "Hors ligne – dernières données chargées",
|
||||
"common.estimate": "Estimation",
|
||||
"tabs.whatToEat": "On mange quoi ?",
|
||||
"tabs.scan": "Scanner",
|
||||
"tabs.myDay": "Ma journée",
|
||||
"tabs.home": "À la maison",
|
||||
"auth.login": "Se connecter",
|
||||
"auth.register": "Créer un compte",
|
||||
"auth.email": "E-mail",
|
||||
"auth.password": "Mot de passe",
|
||||
"auth.displayName": "Comment vous appeler ?",
|
||||
"auth.noAccount": "Nouveau ? Créez un compte",
|
||||
"auth.hasAccount": "Déjà un compte ? Connectez-vous",
|
||||
"auth.trialNote": "7 jours d'accès complet – sans carte.",
|
||||
"auth.forgotLink": "Mot de passe oublié ?",
|
||||
"auth.forgotTitle": "Réinitialiser le mot de passe",
|
||||
"auth.forgotBody": "Saisissez votre e-mail : nous enverrons un lien si le compte existe.",
|
||||
"auth.forgotSubmit": "Envoyer le lien",
|
||||
"auth.forgotSentTitle": "Vérifiez votre boîte mail",
|
||||
"auth.forgotSentBody": "Si l'adresse possède un compte, un lien valable 30 minutes a été envoyé. Ouvrez-le sur cet appareil.",
|
||||
"auth.backToLogin": "Retour à la connexion",
|
||||
"auth.resetTitle": "Choisissez un nouveau mot de passe",
|
||||
"auth.resetBody": "Le lien est valable 30 minutes et à usage unique. Tous les appareils seront déconnectés.",
|
||||
"auth.resetTokenPlaceholder": "Collez le code reçu par e-mail",
|
||||
"auth.newPassword": "Nouveau mot de passe (10 caractères min.)",
|
||||
"auth.resetSubmit": "Changer le mot de passe",
|
||||
"auth.resetDoneTitle": "C'est fait !",
|
||||
"auth.resetDoneBody": "Votre mot de passe a été changé. Connectez-vous avec le nouveau.",
|
||||
"auth.verifyDoneTitle": "E-mail confirmé",
|
||||
"auth.verifyDoneBody": "Merci ! Votre compte est vérifié.",
|
||||
"auth.verifyFailedTitle": "Le lien n'a pas fonctionné",
|
||||
"auth.verifyFailedBody": "Le lien est invalide ou expiré. Demandez-en un nouveau depuis votre profil.",
|
||||
"onboarding.title": "Parlez-nous un peu de vous",
|
||||
"onboarding.subtitle": "Tout est facultatif et modifiable à tout moment. Plus vous en dites, meilleures sont les suggestions.",
|
||||
"onboarding.goal": "Quel est votre objectif principal ?",
|
||||
"onboarding.diet": "Comment mangez-vous ?",
|
||||
"onboarding.allergies": "Allergies et intolérances",
|
||||
"onboarding.allergyNote": "Le filtre allergies est toujours strict : les plats contenant vos allergènes ne sont jamais affichés.",
|
||||
"onboarding.household": "Votre foyer",
|
||||
"onboarding.householdCreate": "Créer un foyer",
|
||||
"onboarding.householdJoin": "Rejoindre avec un code",
|
||||
"onboarding.householdName": "Nom du foyer",
|
||||
"onboarding.inviteCode": "Code d'invitation",
|
||||
"onboarding.mode": "Quel niveau de précision ?",
|
||||
"onboarding.modeSimple": "Mode simple",
|
||||
"onboarding.modeSimpleDesc": "Photographiez vos aliments, acceptez les estimations, zéro prise de tête.",
|
||||
"onboarding.modeExact": "Mode exact",
|
||||
"onboarding.modeExactDesc": "Pesez, saisissez les grammes, contrôle total des chiffres.",
|
||||
"onboarding.notMedical": "{brand} fournit des repères, pas un avis médical.",
|
||||
"wte.title": "On mange quoi ?",
|
||||
"wte.subtitle": "Selon ce que vous avez chez vous, ce qu'il faut consommer vite et vos goûts.",
|
||||
"wte.cravingPlaceholder": "J'ai envie de … (ex. crémeux, asiatique, moins de 500 kcal)",
|
||||
"wte.mealBoxFirst": "Plats prêts à la maison",
|
||||
"wte.whyTitle": "Pourquoi cette suggestion ?",
|
||||
"wte.coverage": "{pct} % à la maison",
|
||||
"wte.missing": "Il manque : {items}",
|
||||
"wte.empty": "Pas encore de suggestions : ajoutez des aliments ou assouplissez les filtres.",
|
||||
"wte.refresh": "Nouvelles suggestions",
|
||||
"scan.title": "Scanner",
|
||||
"scan.subtitle": "Remplissez votre stock ou enregistrez un repas avec l'appareil photo.",
|
||||
"scan.fridge": "Frigo",
|
||||
"scan.freezer": "Congélateur",
|
||||
"scan.pantry": "Placard",
|
||||
"scan.ingredients": "Ingrédients",
|
||||
"scan.plate": "Assiette",
|
||||
"scan.receipt": "Ticket de caisse",
|
||||
"scan.barcode": "Code-barres",
|
||||
"scan.expiry": "Date limite",
|
||||
"scan.nutrition": "Étiquette nutritionnelle",
|
||||
"scan.takePhoto": "Prendre une photo",
|
||||
"scan.tips.title": "Pour une analyse optimale",
|
||||
"scan.tips.overview": "Commencez par une vue d'ensemble",
|
||||
"scan.tips.shelf": "Photographiez étagère par étagère",
|
||||
"scan.tips.light": "Évitez l'obscurité et les ombres",
|
||||
"scan.tips.move": "Écartez les produits qui se cachent",
|
||||
"scan.analyzing": "Analyse en cours …",
|
||||
"scan.quotaLeft_one": "1 scan IA restant ce mois-ci",
|
||||
"scan.quotaLeft_other": "{count} scans IA restants ce mois-ci",
|
||||
"scan.review.title": "Vérifiez le résultat",
|
||||
"scan.review.subtitle": "L'IA doute parfois : c'est vous qui décidez. Modifiez, supprimez ou ajoutez avant d'enregistrer.",
|
||||
"scan.review.uncertain": "Incertain – à vérifier",
|
||||
"scan.review.approveAll": "Enregistrer dans le stock",
|
||||
"scan.review.rejected": "Supprimé",
|
||||
"scan.failed": "L'analyse a échoué. Réessayez ou saisissez manuellement.",
|
||||
"myday.title": "Ma journée",
|
||||
"myday.calories": "Calories",
|
||||
"myday.protein": "Protéines",
|
||||
"myday.carbs": "Glucides",
|
||||
"myday.fat": "Lipides",
|
||||
"myday.fiber": "Fibres",
|
||||
"myday.salt": "Sel",
|
||||
"myday.remaining": "{kcal} kcal restantes",
|
||||
"myday.over": "{kcal} kcal au-dessus de l'objectif",
|
||||
"myday.logMeal": "Enregistrer un repas",
|
||||
"myday.noMeals": "Aucun repas enregistré aujourd'hui.",
|
||||
"myday.estimateNote": "Les valeurs avec ~ sont des estimations ajustables.",
|
||||
"myday.targetsNote": "Les objectifs sont des repères, pas un avis médical.",
|
||||
"home.title": "À la maison",
|
||||
"home.inventory": "Stock",
|
||||
"home.useSoon": "À consommer vite",
|
||||
"home.mealBoxes": "Lunchbox",
|
||||
"home.shopping": "Liste de courses",
|
||||
"home.budget": "Budget",
|
||||
"home.household": "Foyer",
|
||||
"home.waste": "Gaspillage",
|
||||
"home.emptyInventory": "Le stock est vide. Scannez le frigo ou ajoutez manuellement.",
|
||||
"home.expiresIn_one": "1 jour restant",
|
||||
"home.expiresIn_other": "{days} jours restants",
|
||||
"home.expiresToday": "Expire aujourd'hui",
|
||||
"home.expired": "Expiré",
|
||||
"home.pastBestBefore": "DLUO dépassée : sentez et goûtez d'abord",
|
||||
"recipe.portions_one": "1 portion",
|
||||
"recipe.portions_other": "{count} portions",
|
||||
"recipe.time": "{min} min",
|
||||
"recipe.perPortion": "par portion",
|
||||
"recipe.ingredients": "Ingrédients",
|
||||
"recipe.steps": "Préparation",
|
||||
"recipe.cook": "Cuisiner maintenant",
|
||||
"recipe.notSafe": "Incompatible avec vos réglages alimentaires",
|
||||
"recipe.substitutions": "Remplacer",
|
||||
"recipe.iCookedThis": "Je l'ai cuisiné",
|
||||
"recipe.cost": "env. {amount}/portion",
|
||||
"cooking.step": "Étape {current} sur {total}",
|
||||
"cooking.timer": "Lancer le minuteur",
|
||||
"cooking.timerRunning": "{time} restants",
|
||||
"cooking.finish": "Terminé – enregistrer le repas",
|
||||
"cooking.scale": "Portions",
|
||||
"cooking.keepAwake": "L'écran reste allumé pendant que vous cuisinez",
|
||||
"cooked.title": "Alors, verdict ?",
|
||||
"cooked.portionsCooked": "Portions cuisinées",
|
||||
"cooked.whoAte": "Qui a mangé ?",
|
||||
"cooked.mealBoxes": "Portions en lunchbox",
|
||||
"cooked.deductPantry": "Déduire les ingrédients du stock",
|
||||
"cooked.rate": "Noter",
|
||||
"shopping.title": "Liste de courses",
|
||||
"shopping.addPlaceholder": "Ajouter un article …",
|
||||
"shopping.complete": "Terminer les courses",
|
||||
"shopping.completeNote": "Les articles cochés rejoignent le stock.",
|
||||
"shopping.empty": "La liste est vide.",
|
||||
"shopping.estimated": "env. {amount}",
|
||||
"shopping.estimatedTotal": "Total estimé : env. {amount}",
|
||||
"mealbox.title": "Lunchbox",
|
||||
"mealbox.eatBy": "À consommer avant le {date}",
|
||||
"mealbox.portionsLeft_one": "1 portion restante",
|
||||
"mealbox.portionsLeft_other": "{count} portions restantes",
|
||||
"mealbox.eat": "Manger maintenant",
|
||||
"mealbox.empty": "Aucune lunchbox pour l'instant. En cuisinant, gardez des portions ici.",
|
||||
"household.members": "Membres",
|
||||
"household.invite": "Inviter avec le code : {code}",
|
||||
"household.shared": "Partagé dans le foyer : stock, liste de courses, plan de semaine, lunchbox et budget.",
|
||||
"household.private": "Privé par personne : objectifs, allergies, données de santé et historique des repas.",
|
||||
"memory.title": "Ce que {brand} sait de moi",
|
||||
"memory.subtitle": "Transparence totale. Corrigez, mettez en pause ou supprimez : votre mémoire vous appartient.",
|
||||
"memory.paused": "En pause",
|
||||
"memory.verify": "Exact",
|
||||
"memory.pause": "Pause",
|
||||
"memory.delete": "Supprimer",
|
||||
"memory.deleteAll": "Supprimer toute la mémoire",
|
||||
"memory.empty": "{brand} n'a encore rien appris sur vous.",
|
||||
"memory.origin.user_stated": "Vous nous l'avez dit",
|
||||
"memory.origin.observed": "Habitude observée",
|
||||
"memory.origin.ai_inferred": "Hypothèse de l'IA",
|
||||
"paywall.title": "{brand} Premium",
|
||||
"paywall.subtitle": "L'OS alimentaire de tout le foyer : stock illimité, plan de semaine et partage.",
|
||||
"paywall.trialActive_one": "1 jour d'essai restant",
|
||||
"paywall.trialActive_other": "{days} jours d'essai restants",
|
||||
"paywall.household": "Household · jusqu'à 3 personnes",
|
||||
"paywall.family": "Family · jusqu'à 6 personnes",
|
||||
"paywall.large": "Large Household · jusqu'à 12 personnes",
|
||||
"paywall.perMonth": "{price}/mois",
|
||||
"paywall.fairUse": "Quota d'usage raisonnable de scans IA inclus.",
|
||||
"paywall.restore": "Restaurer les achats",
|
||||
"paywall.freeNote": "Gratuit : 10 scans IA/mois, stock manuel, recettes enregistrées et suivi simple.",
|
||||
"profile.title": "Profil",
|
||||
"profile.goals": "Objectifs & alimentation",
|
||||
"profile.consents": "Consentements & données",
|
||||
"profile.memory": "Ce que {brand} sait de moi",
|
||||
"profile.subscription": "Abonnement",
|
||||
"profile.logout": "Se déconnecter",
|
||||
"profile.export": "Exporter mes données",
|
||||
"profile.deleteAccount": "Supprimer le compte",
|
||||
"profile.language": "Langue",
|
||||
"profile.language.sv": "Svenska",
|
||||
"profile.language.en": "English",
|
||||
"profile.emailUnverified": "Adresse e-mail non confirmée",
|
||||
"profile.resendVerification": "Renvoyer l'e-mail de confirmation",
|
||||
"profile.verificationSent": "Envoyé ! Vérifiez votre boîte mail.",
|
||||
"profile.language.es": "Español",
|
||||
"profile.language.it": "Italiano",
|
||||
"profile.language.de": "Deutsch",
|
||||
"profile.language.fr": "Français",
|
||||
"profile.language.da": "Dansk",
|
||||
"profile.language.nb": "Norsk",
|
||||
"profile.language.fi": "Suomi",
|
||||
"profile.language.nl": "Nederlands",
|
||||
"profile.language.pl": "Polski",
|
||||
"profile.language.pt": "Português",
|
||||
"common.oops": "Oups",
|
||||
"common.undo": "Rétablir",
|
||||
"common.remove": "Retirer",
|
||||
"common.add": "Ajouter",
|
||||
"common.on": "Activé",
|
||||
"common.off": "Désactivé",
|
||||
"home.thisWeek": "Cette semaine",
|
||||
"home.wasteWeek": "Gaspillage cette semaine",
|
||||
"home.useSoonHint": "La DDM (à consommer de préférence) concerne la qualité : sentez, regardez et goûtez avant de jeter. La DLC doit en revanche être respectée.",
|
||||
"scan.review.itemPlaceholder": "Article",
|
||||
"scan.review.quantityPlaceholder": "Quantité",
|
||||
"scan.review.unitPlaceholder": "Unité (g, l, pcs …)",
|
||||
"scan.review.datePlaceholder": "AAAA-MM-JJ (facultatif)",
|
||||
"scan.review.dateKindBestBefore": "DDM – de préférence",
|
||||
"scan.review.dateKindUseBy": "DLC – à consommer jusqu'au",
|
||||
"scan.review.bestBeforeNote": "Date de qualité : l'aliment peut rester bon après. Sentez et goûtez avant de jeter.",
|
||||
"scan.review.useByNote": "Date de sécurité : ne pas consommer après cette date.",
|
||||
"scan.review.addItem": "+ Ajouter un article",
|
||||
"scan.review.unknownItem": "Article inconnu",
|
||||
"barcode.aim": "Visez le code-barres avec l'appareil photo",
|
||||
"barcode.addPrompt": "Ajouter au stock ?",
|
||||
"barcode.kcalPer100": "{kcal} kcal/100 g",
|
||||
"barcode.noNutrition": "Pas de données nutritionnelles",
|
||||
"barcode.unknownTitle": "Produit inconnu",
|
||||
"barcode.unknownBody": "Ce produit n'est pas encore dans la base. Photographiez l'avant et l'étiquette nutritionnelle et nous l'ajouterons.",
|
||||
"barcode.photoPackage": "Photographier l'emballage",
|
||||
"barcode.needHousehold": "Il vous faut d'abord un foyer.",
|
||||
"barcode.noLocation": "Aucun lieu de stockage trouvé.",
|
||||
"barcode.cameraTitle": "Appareil photo requis",
|
||||
"barcode.cameraBody": "{brand} a besoin de l'appareil photo pour scanner les codes-barres.",
|
||||
"barcode.allowCamera": "Autoriser l'appareil photo",
|
||||
"onboarding.goal.lose_weight": "Perdre du poids",
|
||||
"onboarding.goal.build_muscle": "Prendre du muscle",
|
||||
"onboarding.goal.maintain_weight": "Maintenir mon poids",
|
||||
"onboarding.goal.more_protein": "Manger plus de protéines",
|
||||
"onboarding.goal.less_waste": "Réduire le gaspillage",
|
||||
"onboarding.goal.lower_cost": "Dépenser moins en courses",
|
||||
"onboarding.goal.cook_more": "Cuisiner plus à la maison",
|
||||
"onboarding.diet.omnivore": "Omnivore",
|
||||
"onboarding.diet.flexitarian": "Flexitarien",
|
||||
"onboarding.diet.pescatarian": "Pescétarien",
|
||||
"onboarding.diet.vegetarian": "Végétarien",
|
||||
"onboarding.diet.vegan": "Végane",
|
||||
"onboarding.allergen.gluten": "Gluten",
|
||||
"onboarding.allergen.milk": "Lait/lactose",
|
||||
"onboarding.allergen.eggs": "Œufs",
|
||||
"onboarding.allergen.tree_nuts": "Fruits à coque",
|
||||
"onboarding.allergen.peanuts": "Arachides",
|
||||
"onboarding.allergen.fish": "Poisson",
|
||||
"onboarding.allergen.crustaceans": "Crustacés",
|
||||
"onboarding.allergen.soy": "Soja",
|
||||
"onboarding.allergen.sesame": "Sésame",
|
||||
"onboarding.bodyTitle": "Pour des objectifs caloriques personnalisés (facultatif)",
|
||||
"onboarding.weightPlaceholder": "Poids (kg)",
|
||||
"onboarding.heightPlaceholder": "Taille (cm)",
|
||||
"onboarding.birthYearPlaceholder": "Année de naissance",
|
||||
"onboarding.householdDefaultName": "Maison",
|
||||
"onboarding.modesCombine": "Les modes se combinent : simple au quotidien, précis quand vous voulez.",
|
||||
"myday.mealType.breakfast": "Petit-déjeuner",
|
||||
"myday.mealType.lunch": "Déjeuner",
|
||||
"myday.mealType.dinner": "Dîner",
|
||||
"myday.mealType.snack": "Encas",
|
||||
"myday.mealType.dessert": "Dessert",
|
||||
"myday.overRecommended": "Au-dessus du recommandé",
|
||||
"myday.todaysMeals": "Repas du jour",
|
||||
"myday.estimateRange": "{min}–{max} kcal, probablement {kcal}",
|
||||
"myday.kcalProtein": "{kcal} kcal · {protein} g de protéines",
|
||||
"logmeal.mealTypeTitle": "Type de repas",
|
||||
"logmeal.quickTitle": "Enregistrement rapide",
|
||||
"logmeal.quickSubtitle": "Enregistre les mêmes valeurs nutritionnelles que la dernière fois.",
|
||||
"logmeal.manualTitle": "Manuel",
|
||||
"logmeal.whatPlaceholder": "Qu'avez-vous mangé ?",
|
||||
"logmeal.proteinPlaceholder": "protéines (g)",
|
||||
"logmeal.validationTitle": "Infos manquantes",
|
||||
"logmeal.validationBody": "Le nom et les calories sont requis pour un enregistrement manuel.",
|
||||
"logmeal.photoTip": "Astuce : photographiez l'assiette dans Scanner, l'app estime pour vous – vous confirmez toujours.",
|
||||
"shopping.section.frukt_gront": "Fruits & légumes",
|
||||
"shopping.section.brod": "Pain",
|
||||
"shopping.section.mejeri": "Produits laitiers",
|
||||
"shopping.section.kott_fagel": "Viande & volaille",
|
||||
"shopping.section.fisk": "Poisson",
|
||||
"shopping.section.chark": "Charcuterie",
|
||||
"shopping.section.frys": "Surgelés",
|
||||
"shopping.section.skafferi": "Épicerie",
|
||||
"shopping.section.konserver": "Conserves",
|
||||
"shopping.section.kryddor_bak": "Épices & pâtisserie",
|
||||
"shopping.section.dryck": "Boissons",
|
||||
"shopping.section.snacks": "Snacks",
|
||||
"shopping.section.hygien_ovrigt": "Divers",
|
||||
"shopping.completedTitle": "Terminé !",
|
||||
"household.role.owner": "Propriétaire",
|
||||
"household.role.adult": "Adulte",
|
||||
"household.role.member": "Membre",
|
||||
"household.role.child": "Enfant",
|
||||
"household.empty": "Vous n'avez pas encore de foyer. Créez-en un lors de l'intégration ou rejoignez-en un avec un code.",
|
||||
"household.shareCode": "Partagez le code avec votre famille pour partager stock, liste et planning.",
|
||||
"household.locations": "Lieux de stockage",
|
||||
"household.portionFactor": "×{factor} portion",
|
||||
"mealbox.enjoyTitle": "Bon appétit !",
|
||||
"mealbox.enjoyBody": "La portion est enregistrée dans Ma journée.",
|
||||
"mealbox.guidanceNote": "Le délai recommandé est indicatif : fiez-vous à l'odeur et au goût.",
|
||||
"paywall.soonTitle": "Bientôt !",
|
||||
"paywall.soonBody": "Les achats s'activeront via l'App Store/Google Play quand l'intégration boutique sera lancée (phase 7). Le backend est déjà prêt.",
|
||||
"paywall.popular": "Le plus populaire",
|
||||
"paywall.choose": "Choisir",
|
||||
"recipe.saved": "Enregistrée",
|
||||
"recipe.save": "Enregistrer",
|
||||
"recipe.avgRating": "Moyenne {avg} sur {count} avis",
|
||||
"memory.verified": "Vérifié",
|
||||
"memory.resume": "Reprendre",
|
||||
"memory.deleteAllTitle": "Supprimer toute la mémoire ?",
|
||||
"memory.irreversible": "Cette action est irréversible.",
|
||||
"profile.consent.personalization": "Fonctions personnelles (mémoire & profil de goûts)",
|
||||
"profile.consent.anonymized_improvement": "Amélioration anonymisée de l'IA",
|
||||
"profile.consent.image_training": "Mes photos peuvent servir à l'entraînement",
|
||||
"profile.consent.health_integration": "Données de santé (Apple Health / Health Connect)",
|
||||
"profile.consent.location_weather": "Position pour des suggestions selon la météo",
|
||||
"profile.consent.push_notifications": "Notifications push",
|
||||
"profile.modeLabel": "Mode :",
|
||||
"profile.memorySubtitle": "Voyez, corrigez, mettez en pause ou supprimez ce que la plateforme a appris.",
|
||||
"profile.consentsNote": "Les consentements sont distincts : les fonctions personnelles n'exigent jamais le consentement d'entraînement.",
|
||||
"profile.aiScansUsed": "Scans IA : {used} / {total} ce mois-ci",
|
||||
"profile.deleteTitle": "Supprimer le compte ?",
|
||||
"profile.deleteBody": "Toutes vos données seront supprimées définitivement conformément au RGPD.",
|
||||
"cooking.timerDone": "Terminé !",
|
||||
"cooked.deductPantryNote": "Les ingrédients sont déduits du stock, en commençant par ceux qui expirent en premier.",
|
||||
"home.moreItems_one": "+ 1 autre …",
|
||||
"home.moreItems_other": "+ {count} autres …",
|
||||
"shopping.completedBody_one": "1 article a été ajouté au stock.",
|
||||
"shopping.completedBody_other": "{count} articles ont été ajoutés au stock."
|
||||
}
|
||||
Reference in New Issue
Block a user