From 8a4f35e5928d620294b286b83f2529126429f810 Mon Sep 17 00:00:00 2001 From: Marcus Wolschon Date: Wed, 12 Jan 2022 11:37:08 +0100 Subject: [PATCH 01/29] #1093 Recipe link in plan #1093 add a recipe link into meal plan --- vue/src/apps/MealPlanView/MealPlanView.vue | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/vue/src/apps/MealPlanView/MealPlanView.vue b/vue/src/apps/MealPlanView/MealPlanView.vue index a6fd2b124e..f9be02584f 100644 --- a/vue/src/apps/MealPlanView/MealPlanView.vue +++ b/vue/src/apps/MealPlanView/MealPlanView.vue @@ -129,6 +129,16 @@ > {{ $t("Edit") }} + + {{ $t("Recipe") }} + Date: Wed, 12 Jan 2022 16:15:55 +0100 Subject: [PATCH 02/29] #1093 conditional receipt link in plan --- vue/src/apps/MealPlanView/MealPlanView.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/vue/src/apps/MealPlanView/MealPlanView.vue b/vue/src/apps/MealPlanView/MealPlanView.vue index f9be02584f..7976a0d048 100644 --- a/vue/src/apps/MealPlanView/MealPlanView.vue +++ b/vue/src/apps/MealPlanView/MealPlanView.vue @@ -130,6 +130,7 @@ {{ $t("Edit") }} Date: Thu, 13 Jan 2022 21:26:15 +0100 Subject: [PATCH 04/29] Added config.yml for FAQ link --- .github/ISSUE_TEMPLATE/config.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..f867d5c8de --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: true +contact_links: + - name: FAQs + url: https://docs.tandoor.dev/faq/ + about: Please take a look at the FAQs before creating a bug ticket. From b3f05b0bfdf5bc3e77a154cdaea6d520bb5d50e8 Mon Sep 17 00:00:00 2001 From: smilerz Date: Thu, 13 Jan 2022 16:50:15 -0600 Subject: [PATCH 05/29] fix bug creating food with create form --- cookbook/models.py | 5 ++++- cookbook/serializer.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cookbook/models.py b/cookbook/models.py index cfe4ab8149..1f4562c058 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -77,7 +77,10 @@ def get_or_create(self, *args, **kwargs): for field in many_to_many: field_model = getattr(obj, field).model for related_obj in many_to_many[field]: - getattr(obj, field).add(field_model.objects.get(**dict(related_obj))) + if isinstance(related_obj, User): + getattr(obj, field).add(field_model.objects.get(id=related_obj.id)) + else: + getattr(obj, field).add(field_model.objects.get(**dict(related_obj))) return obj, True except IntegrityError as e: if 'Key (path)' in e.args[0]: diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 48236f399b..0fa2ee21a5 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -394,15 +394,20 @@ def create(self, validated_data): validated_data['supermarket_category'], sc_created = SupermarketCategory.objects.get_or_create( name=validated_data.pop('supermarket_category')['name'], space=self.context['request'].space) - onhand = validated_data.get('food_onhand', None) + onhand = validated_data.pop('food_onhand', None) # assuming if on hand for user also onhand for shopping_share users if not onhand is None: shared_users = [user := self.context['request'].user] + list(user.userpreference.shopping_share.all()) + if self.instance: + onhand_users = self.instance.onhand_users.all() + else: + onhand_users = [] if onhand: - validated_data['onhand_users'] = list(self.instance.onhand_users.all()) + shared_users + validated_data['onhand_users'] = list(onhand_users) + shared_users else: - validated_data['onhand_users'] = list(set(self.instance.onhand_users.all()) - set(shared_users)) + validated_data['onhand_users'] = list(set(onhand_users) - set(shared_users)) + obj, created = Food.objects.get_or_create(**validated_data) return obj From 0e1153ce3a818f2367f868587846b23f2bdd9c2f Mon Sep 17 00:00:00 2001 From: smilerz Date: Thu, 13 Jan 2022 17:40:26 -0600 Subject: [PATCH 06/29] deleted extraneous emit --- vue/src/components/GenericHorizontalCard.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/vue/src/components/GenericHorizontalCard.vue b/vue/src/components/GenericHorizontalCard.vue index 39a31d9072..8f130b474c 100644 --- a/vue/src/components/GenericHorizontalCard.vue +++ b/vue/src/components/GenericHorizontalCard.vue @@ -238,7 +238,6 @@ export default { }) popper.update() this.over = false - this.$emit({ action: "drop", target: this.item, source: this.source }) } else { this.isError = true } From 2927333bf14f2f75fca4f1363cc8b59a249f7a26 Mon Sep 17 00:00:00 2001 From: Marcus Wolschon Date: Fri, 14 Jan 2022 13:52:42 +0100 Subject: [PATCH 07/29] #1093 code cleanup --- vue/src/apps/MealPlanView/MealPlanView.vue | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/vue/src/apps/MealPlanView/MealPlanView.vue b/vue/src/apps/MealPlanView/MealPlanView.vue index 7976a0d048..66c74ae8ee 100644 --- a/vue/src/apps/MealPlanView/MealPlanView.vue +++ b/vue/src/apps/MealPlanView/MealPlanView.vue @@ -132,11 +132,11 @@ {{ $t("Recipe") }} @@ -275,7 +275,7 @@ import moment from "moment" import draggable from "vuedraggable" import VueCookies from "vue-cookies" -import { ApiMixin, StandardToasts, ResolveUrlMixin } from "@/utils/utils" +import { ApiMixin, StandardToasts, ResolveUrlMixin, resolveDjangoUrl } from "@/utils/utils" import { CalendarView, CalendarMathMixin } from "vue-simple-calendar/src/components/bundle" import { ApiApiFactory } from "@/utils/openapi/api" @@ -422,8 +422,8 @@ export default { }, }, methods: { - navigateToURL: function(url) { - window.open(url) + openReceipt: function(recipe) { + window.open(resolveDjangoUrl('view_recipe', recipe.id)) }, addToShopping(entry) { if (entry.originalItem.entry.recipe !== null) { From 934eeee5c4779fec09cb608f5274f2473bc0d686 Mon Sep 17 00:00:00 2001 From: Marcus Wolschon Date: Fri, 14 Jan 2022 13:56:46 +0100 Subject: [PATCH 08/29] #1093 code cleanup --- vue/src/apps/MealPlanView/MealPlanView.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vue/src/apps/MealPlanView/MealPlanView.vue b/vue/src/apps/MealPlanView/MealPlanView.vue index 66c74ae8ee..07b6168515 100644 --- a/vue/src/apps/MealPlanView/MealPlanView.vue +++ b/vue/src/apps/MealPlanView/MealPlanView.vue @@ -275,7 +275,7 @@ import moment from "moment" import draggable from "vuedraggable" import VueCookies from "vue-cookies" -import { ApiMixin, StandardToasts, ResolveUrlMixin, resolveDjangoUrl } from "@/utils/utils" +import { ApiMixin, StandardToasts, ResolveUrlMixin } from "@/utils/utils" import { CalendarView, CalendarMathMixin } from "vue-simple-calendar/src/components/bundle" import { ApiApiFactory } from "@/utils/openapi/api" @@ -423,7 +423,7 @@ export default { }, methods: { openReceipt: function(recipe) { - window.open(resolveDjangoUrl('view_recipe', recipe.id)) + window.open(this.resolveDjangoUrl('view_recipe', recipe.id)) }, addToShopping(entry) { if (entry.originalItem.entry.recipe !== null) { From 01d5ab92c5883c030873312ced62047abdbb0761 Mon Sep 17 00:00:00 2001 From: Tiago Rascazzi Date: Thu, 6 Jan 2022 16:30:49 +0000 Subject: [PATCH 09/29] Translated using Weblate (French) Currently translated at 72.6% (202 of 278 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/ --- vue/src/locales/fr.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/fr.json b/vue/src/locales/fr.json index c686f08e14..6eb6dee0f8 100644 --- a/vue/src/locales/fr.json +++ b/vue/src/locales/fr.json @@ -192,5 +192,13 @@ "Edit_Recipe": "Modifier une Recette", "Move_Up": "Monter", "Time": "Temps", - "Coming_Soon": "Bientôt disponible" + "Coming_Soon": "Bientôt disponible", + "Create_New_Shopping Category": "Ajouter une catégorie de courses", + "success_moving_resource": "Ressource correctement déplacée !", + "err_moving_resource": "Il y a eu une erreur pour déplacer une ressource !", + "err_merging_resource": "Il y a eu une erreur pour fusionner une ressource !", + "success_merging_resource": "Ressource correctement fusionnée !", + "Added_by": "Ajouter par", + "Added_on": "Ajouter le", + "Shopping_Categories": "Catégories de courses" } From 91fcb1b822b5bacc7d90245232ff14d21db7fe08 Mon Sep 17 00:00:00 2001 From: Tomasz Klimczak Date: Thu, 6 Jan 2022 12:50:29 +0000 Subject: [PATCH 10/29] Translated using Weblate (Polish) Currently translated at 80.9% (225 of 278 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/pl/ --- vue/src/locales/pl.json | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/vue/src/locales/pl.json b/vue/src/locales/pl.json index 759237a9e0..959ed23bbe 100644 --- a/vue/src/locales/pl.json +++ b/vue/src/locales/pl.json @@ -1,5 +1,5 @@ { - "warning_feature_beta": "Ta funkcja jest obecnie w wersji BETA (testowej). Podczas korzystania z tej funkcji należy spodziewać się błędów i ewentualnych zmian w przyszłości (prawdopodobna utrata danych powiązanych z tą funkcją).", + "warning_feature_beta": "Ta funkcja jest obecnie w wersji BETA (testowej). Podczas korzystania z tej funkcji mogą wystąpić błędy, a w przyszłości zmiany funkcjonalności (możliwa utrata danych powiązanych z tą funkcją).", "err_fetching_resource": "Wystąpił błąd podczas pobierania zasobu!", "err_creating_resource": "Wystąpił błąd podczas tworzenia zasobu!", "err_updating_resource": "Wystąpił błąd podczas aktualizowania zasobu!", @@ -207,5 +207,22 @@ "Auto_Planner": "Plan automatyczny", "New_Cookbook": "Nowa książka kucharska", "Hide_Keyword": "Ukryj słowa kluczowe", - "Clear": "Wyczyść" + "Clear": "Wyczyść", + "err_moving_resource": "Wystąpił błąd podczas przenoszenia zasobu!", + "err_merging_resource": "Wystąpił błąd podczas scalania zasobu!", + "success_moving_resource": "Pomyślnie przeniesiono zasób!", + "success_merging_resource": "Pomyślnie scalono zasób!", + "Added_by": "Dodane przez", + "Added_on": "Dodano dnia", + "IngredientInShopping": "Ten składnik znajduje się na Twojej liście zakupów.", + "NotInShopping": "{food} nie ma na Twojej liście zakupów.", + "OnHand": "Obecnie pod ręką", + "FoodNotOnHand": "Nie masz pod ręką {food}.", + "Undefined": "Nieokreślony", + "AddFoodToShopping": "Dodaj {food} do swojej listy zakupów", + "RemoveFoodFromShopping": "Usuń {food} z listy zakupów", + "Shopping_Categories": "Kategorie zakupów", + "AddToShopping": "Dodaj do listy zakupów", + "FoodOnHand": "Masz pod ręką {food}.", + "DeleteShoppingConfirm": "Czy na pewno chcesz usunąć wszystkie {food} z listy zakupów?" } From 17ad01ae8c0ba17923dffafbac22a6d39b79ca76 Mon Sep 17 00:00:00 2001 From: Josselin du PLESSIS Date: Fri, 14 Jan 2022 22:42:42 +0000 Subject: [PATCH 11/29] Translated using Weblate (French) Currently translated at 100.0% (284 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/ --- vue/src/locales/fr.json | 85 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/fr.json b/vue/src/locales/fr.json index 6eb6dee0f8..a250b9e41c 100644 --- a/vue/src/locales/fr.json +++ b/vue/src/locales/fr.json @@ -200,5 +200,88 @@ "success_merging_resource": "Ressource correctement fusionnée !", "Added_by": "Ajouter par", "Added_on": "Ajouter le", - "Shopping_Categories": "Catégories de courses" + "Shopping_Categories": "Catégories de courses", + "Add_Servings_to_Shopping": "Ajouter {servings} partions aux courses", + "CountMore": "...+ {count} en plus", + "NoCategory": "Pas de catégorie sélectionnée.", + "OfflineAlert": "Vous êtes déconnecté, votre liste de courses peut ne pas être synchronisée.", + "shopping_share_desc": "Les utilisateurs verront tous les articles que vous ajoutez à votre liste de courses. Ils doivent vous ajouter pour que vous voyez les articles de leur liste.", + "shopping_auto_sync_desc": "Le réglage sur 0 désactive la synchronisation automatique. Lorsque vous consultez une liste de courses, celle-ci est mise à jour toutes les secondes pour synchroniser les modifications apportées par une autre personne. Cette fonction est utile lorsque vous faites des achats avec plusieurs personnes, mais elle consomme des données mobiles.", + "mealplan_autoinclude_related_desc": "Lorsque vous ajoutez un plan de repas à la liste de courses (manuellement ou automatiquement), incluez toutes les recettes associées.", + "err_move_self": "Impossible de déplacer un élément vers lui-même", + "show_sql": "Montrer le SQL", + "filter_to_supermarket_desc": "Par défaut, la liste de courses est filtrée pour n'inclure que les catégories du supermarché sélectionné.", + "CategoryInstruction": "Faites glisser les catégories pour modifier l'ordre dans lequel elles apparaissent dans la liste des courses.", + "in_shopping": "Dans la liste de courses", + "and_up": "&Au-dessus", + "Plan_Show_How_Many_Periods": "Combien de périodes montrer", + "Edit_Meal_Plan_Entry": "Modifier le plan de repas", + "Periods": "Périodes", + "Period": "Période", + "Plan_Period_To_Show": "Montrer les semaines, mois ou années", + "Auto_Planner": "Planning automatique", + "New_Cookbook": "Nouveau livres de recettes", + "Hide_Keyword": "Cacher les mots clés", + "Clear": "Supprimer", + "AddToShopping": "Ajouter à la liste de courses", + "IngredientInShopping": "Cet ingrédient est dans votre liste de courses.", + "NotInShopping": "{food} n'est pas dans votre liste de courses.", + "OnHand": "Disponible actuellement", + "FoodNotOnHand": "L'ingrédient {food} n'est pas disponible.", + "Planner": "Planificateur", + "Planner_Settings": "Paramètres du planificateur", + "AddFoodToShopping": "Ajouter l'ingrédient {food} à votre liste de courses", + "DeleteShoppingConfirm": "Etes-vous sûr que vous souhaitez retirer tous les ingrédients {food} de votre liste de courses ?", + "IgnoredFood": "L'ingrédient {food} est paramétré pour ignorer les courses.", + "Inherit": "Hériter", + "InheritFields": "Hériter les valeurs des champs", + "FoodInherit": "Ingrédient hérité", + "ShowUncategorizedFood": "Montrer ce qui est indéfini", + "GroupBy": "Grouper par", + "SupermarketCategoriesOnly": "Catégories de supermarché uniquement", + "MoveCategory": "Déplacer vers : ", + "IgnoreThis": "Ne jamais ajouter l'ingrédient {food} aux courses", + "DelayFor": "Retard de {hours} heures", + "Warning": "Avertissement", + "InheritWarning": "L'ingrédient {food} est un héritage, les changements pourraient ne pas être conservés.", + "ShowDelayed": "Afficher les éléments retardés", + "Completed": "Achevé", + "shopping_share": "Partager la liste de courses", + "shopping_auto_sync": "Autosynchronisation", + "mealplan_autoadd_shopping": "Ajout automatique d'un plan de repas", + "mealplan_autoexclude_onhand": "Exclure les aliments disponibles", + "mealplan_autoinclude_related": "Ajouter les recettes connexes", + "default_delay": "Heures de retard par défaut", + "mealplan_autoadd_shopping_desc": "Ajouter automatiquement les ingrédients du plan de repas à la liste de courses.", + "mealplan_autoexclude_onhand_desc": "Lorsque vous ajoutez un plan de repas à la liste de courses (manuellement ou automatiquement), excluez les ingrédients que vous avez déjà.", + "default_delay_desc": "Nombre d'heures par défaut pour retarder l'ajoût d'un article à la liste de courses.", + "filter_to_supermarket": "Limiter au supermarché", + "nothing": "Rien à effectuer", + "err_merge_self": "Impossible de fusionner un élément avec lui-même", + "CategoryName": "Intitulé de la catégorie", + "SupermarketName": "Nom du supermarché", + "shopping_recent_days_desc": "Jours des entrées récentes de la liste de courses à afficher.", + "shopping_recent_days": "Jours récents", + "create_shopping_new": "Ajouter à la NOUVELLE liste de courses", + "download_pdf": "Télécharger le PDF", + "download_csv": "Télécharger le CSV", + "csv_delim_help": "Délimiteur à utiliser pour les exports CSV.", + "csv_delim_label": "Délimiteur CSV", + "SuccessClipboard": "Liste de courses copiée dans le presse-papiers", + "copy_to_clipboard": "Copier dans le presse-papiers", + "csv_prefix_help": "Préfixe à ajouter lors de la copie de la liste dans le presse-papiers.", + "csv_prefix_label": "Lister les préfixes", + "copy_markdown_table": "Copier en tant que tableau Markdown", + "DelayUntil": "Retard jusqu'à", + "mark_complete": "Marque comme terminé", + "QuickEntry": "Entrée rapide", + "shopping_add_onhand_desc": "Marquer les aliments comme \"disponibles\" lorsqu'ils sont cochés sur la liste des courses.", + "shopping_add_onhand": "Disponible par défaut", + "related_recipes": "Recettes connexes", + "today_recipes": "Recettes du jour", + "Search Settings": "Paramètres de recherche", + "FoodOnHand": "L'ingrédient {food} est disponible.", + "Undefined": "Indéfini", + "Create_Meal_Plan_Entry": "Création d'un plan de repas", + "RemoveFoodFromShopping": "Retirer l'ingrédient {food} de votre liste de courses" } From 965d2c05e74127e134bd76968382d39d0d2aa46b Mon Sep 17 00:00:00 2001 From: FrenchAnon Date: Fri, 14 Jan 2022 23:17:50 +0000 Subject: [PATCH 12/29] Translated using Weblate (French) Currently translated at 100.0% (284 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/ --- vue/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue/src/locales/fr.json b/vue/src/locales/fr.json index a250b9e41c..efd715911d 100644 --- a/vue/src/locales/fr.json +++ b/vue/src/locales/fr.json @@ -37,7 +37,7 @@ "Carbohydrates": "Glucides", "Calories": "Calories", "Energy": "Energie", - "Nutrition": "Informations nutritionnelles", + "Nutrition": "Valeurs nutritionnelles", "Date": "Date", "Share": "Partager", "Export": "Exporter", From 8cebc98d3b381f4033e93ee1403297ce5b8f4af6 Mon Sep 17 00:00:00 2001 From: SMunos Date: Fri, 14 Jan 2022 23:18:38 +0000 Subject: [PATCH 13/29] Translated using Weblate (French) Currently translated at 100.0% (284 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/ --- vue/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue/src/locales/fr.json b/vue/src/locales/fr.json index efd715911d..79a446273d 100644 --- a/vue/src/locales/fr.json +++ b/vue/src/locales/fr.json @@ -219,7 +219,7 @@ "Periods": "Périodes", "Period": "Période", "Plan_Period_To_Show": "Montrer les semaines, mois ou années", - "Auto_Planner": "Planning automatique", + "Auto_Planner": "Planning Auto", "New_Cookbook": "Nouveau livres de recettes", "Hide_Keyword": "Cacher les mots clés", "Clear": "Supprimer", From f07690d7e3d033fed69c024d6f52c9eaedcf81a0 Mon Sep 17 00:00:00 2001 From: mheiland <15824364+mheiland@users.noreply.github.com> Date: Sat, 15 Jan 2022 00:24:56 +0100 Subject: [PATCH 14/29] Example for third-party authentication Providing an example to integrate Keycloak as IAM for Tandoor. Hinting that both SOCIAL* variables are required. --- docs/features/authentication.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/features/authentication.md b/docs/features/authentication.md index 6390e91ef6..0f61148890 100644 --- a/docs/features/authentication.md +++ b/docs/features/authentication.md @@ -32,7 +32,7 @@ as environment files loaded by docker compose don't support multiple lines for a Take the example configuration from the allauth docs, fill in your settings and then inline the whole object (you can use a service like [www.freeformatter.com](https://www.freeformatter.com/json-formatter.html) for formatting). -Assign it to the `SOCIALACCOUNT_PROVIDERS` variable. +Assign it to the additional `SOCIALACCOUNT_PROVIDERS` variable. ```ini SOCIALACCOUNT_PROVIDERS={"nextcloud":{"SERVER":"https://nextcloud.example.org"}} @@ -56,6 +56,25 @@ Use the superuser account to grant permissions to the newly created users. I do not have a ton of experience with using various single signon providers and also cannot test all of them. If you have any Feedback or issues let me know. +### Third-party authentication example +Keycloak is a popular IAM solution and integration is straight forward thanks to Django Allauth. This example can also be used as reference for other third-party authentication solutions, as documented by Allauth. + +At Keycloak, create a new client and assign a `Client-ID`, this client comes with a `Secret-Key`. Both values are required later on. Make sure to define the correct Redirection-URL for the service, for example `https://tandoor.example.com/*`. Depending on your Keycloak setup, you need to assign roles and groups to grant access to the service. + +To enable Keycloak as a sign in option, set those variables to define the social provider and specify its configuration: +```ini +SOCIAL_PROVIDERS=allauth.socialaccount.providers.keycloak +SOCIALACCOUNT_PROVIDERS='{ "keycloak": { "KEYCLOAK_URL": "https://auth.example.com/", "KEYCLOAK_REALM": "master" } }' +``` + +1. Restart the service, login as superuser and open the `Admin` page. +2. Make sure that the correct `Domain Name` is defined at `Sites`. +3. Select `Social Application` and chose `Keycloak` from the provider list. +4. Provide an arbitrary name for your authentication provider, and enter the `Client-ID` and `Secret Key` values obtained from Keycloak earlier. +5. Make sure to add your `Site` to the list of available sites and save the new `Social Application`. + +You are now able to sign in using Keycloak. + ### Linking accounts To link an account to an already existing normal user go to the settings page of the user and link it. Here you can also unlink your account if you no longer want to use a social login method. From 9221533ae72d705e32ae061a63d00b2eeb3aae99 Mon Sep 17 00:00:00 2001 From: MaxJa4 <74194322+MaxJa4@users.noreply.github.com> Date: Sat, 15 Jan 2022 12:56:01 +0100 Subject: [PATCH 15/29] Added Apache2 in the bug report template Added Apache2 as selectable option in the bug report template --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2fdbcc3ba1..e5e1c3beab 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -40,6 +40,7 @@ body: - SWAG - Caddy - Traefik + - Apache2 - Others (please state below) validations: required: true From 281535e756e6ecd5a7a378a1b6eb0ae0a1900a50 Mon Sep 17 00:00:00 2001 From: tomtjes Date: Sat, 15 Jan 2022 13:57:20 -0500 Subject: [PATCH 16/29] phrase FAQ as questions --- docs/faq.md | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/docs/faq.md b/docs/faq.md index 16ef0472dd..c9c5572580 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -2,7 +2,7 @@ There are several questions and issues that come up from time to time. Here are Please note that the existence of some questions is due the application not being perfect in some parts. Many of those shortcomings are planned to be fixed in future release but simply could not be addressed yet due to time limits. -## CSRF Errors +## Why am I getting CSRF Errors? If you are getting CSRF Errors this is most likely due to a reverse proxy not passing the correct headers. If you are using swag by linuxserver you might need `proxy_set_header X-Forwarded-Proto $scheme;` in your nginx config. @@ -10,15 +10,15 @@ If you are using a plain ngix you might need `proxy_set_header Host $http_host;` Further discussions can be found in this [Issue #518](https://github.com/vabene1111/recipes/issues/518) -## Images not loading -If images are not loading this might be related to the same issue as the CSRF Errors. -A discussion about that can be found [Issue #452](https://github.com/vabene1111/recipes/issues/452) +## Why are images not loading? +If images are not loading this might be related to the same issue as the CSRF errors (see above). +A discussion about that can be found at [Issue #452](https://github.com/vabene1111/recipes/issues/452) The other common issue is that the recommended nginx container is removed from the deployment stack. If removed, the nginx webserver needs to be replaced by something else that servers the /mediafiles/ directory or `GUNICORN_MEDIA` needs to be enabled to allow media serving by the application container itself. -## User Creation +## How can I create users? To create a new user click on your name (top right corner) and select system. There click on invite links and create a new invite link. It is not possible to create users through the admin because users must be assigned a default group and space. @@ -28,7 +28,7 @@ To change a users space you need to go to the admin and select User Infos. If you use an external auth provider or proxy authentication make sure to specify a default group and space in the environment configuration. -## Spaces +## What are spaces? Spaces are a feature used to separate one installation of Tandoor into several parts. In technical terms it is a multi tenant system. @@ -39,11 +39,16 @@ If you want to host the collection of your friends family or your neighbor you c Sharing between spaces is currently not possible but is planned for future releases. -## Create Admin user / reset passwords -To create a superuser or reset a lost password if access to the container is lost you need to +## How can I reset passwords? +To reset a lost password if access to the container is lost you need to 1. execute into the container using `docker-compose exec web_recipes sh` 2. activate the virtual environment `source venv/bin/activate` -3. run `python manage.py createsuperuser` and follow the steps shown. +3. run `python manage.py changepassword ` and follow the steps shown. -To change a password enter `python manage.py changepassword ` in step 3. \ No newline at end of file +## How can I add an admin user? +To create a superuser you need to + +1. execute into the container using `docker-compose exec web_recipes sh` +2. activate the virtual environment `source venv/bin/activate` +3. run `python manage.py createsuperuser` and follow the steps shown. \ No newline at end of file From 99b3ed84643386e1f18c7ad46ecbd1d8745000fd Mon Sep 17 00:00:00 2001 From: tomtjes Date: Sat, 15 Jan 2022 13:58:40 -0500 Subject: [PATCH 17/29] add FAQ for PWA --- docs/faq.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/faq.md b/docs/faq.md index c9c5572580..768f19fada 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -2,6 +2,22 @@ There are several questions and issues that come up from time to time. Here are Please note that the existence of some questions is due the application not being perfect in some parts. Many of those shortcomings are planned to be fixed in future release but simply could not be addressed yet due to time limits. +## Is there a Tandoor app? +Tandoor can be installed as a progressive web app (PWA) on mobile and desktop devices. The PWA stores recently accessed recipes locally for offline use. + +### Mobile browsers + +#### Safari (iPhone/iPad) +Open Tandoor, click Safari's share button, select `Add to Home Screen` + +### Desktop browsers + +#### Google Chrome +Open Tandoor, open the menu behind the three vertical dots at the top right, select `Install Tandoor Recipes...` + +#### Microsoft Edge +Open Tandoor, open the menu behind the three horizontal dots at the top right, select `Apps > Install Tandoor Recipes` + ## Why am I getting CSRF Errors? If you are getting CSRF Errors this is most likely due to a reverse proxy not passing the correct headers. From 24e42496a79273886b6b0ad37b7d94d29c6cba5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 16 Jan 2022 01:02:54 +0000 Subject: [PATCH 18/29] Bump follow-redirects from 1.14.6 to 1.14.7 in /vue Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.6 to 1.14.7. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.6...v1.14.7) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] --- vue/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vue/yarn.lock b/vue/yarn.lock index 05940e263b..4523eb4f01 100644 --- a/vue/yarn.lock +++ b/vue/yarn.lock @@ -5369,9 +5369,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0, follow-redirects@^1.14.4: - version "1.14.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd" - integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== + version "1.14.7" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" + integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== for-in@^1.0.2: version "1.0.2" From f11e07d347ffe5c5546de0c874acf77cce578b79 Mon Sep 17 00:00:00 2001 From: Josselin du PLESSIS Date: Fri, 14 Jan 2022 23:23:05 +0000 Subject: [PATCH 19/29] Translated using Weblate (French) Currently translated at 100.0% (509 of 509 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/fr/ --- cookbook/locale/fr/LC_MESSAGES/django.po | 461 ++++++++++++++--------- 1 file changed, 285 insertions(+), 176 deletions(-) diff --git a/cookbook/locale/fr/LC_MESSAGES/django.po b/cookbook/locale/fr/LC_MESSAGES/django.po index 01c314c7a8..b182a589a7 100644 --- a/cookbook/locale/fr/LC_MESSAGES/django.po +++ b/cookbook/locale/fr/LC_MESSAGES/django.po @@ -14,10 +14,10 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-08 16:27+0100\n" -"PO-Revision-Date: 2021-11-04 09:06+0000\n" -"Last-Translator: FrenchAnon \n" -"Language-Team: French \n" +"PO-Revision-Date: 2022-01-16 07:06+0000\n" +"Last-Translator: Josselin du PLESSIS \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,66 +33,52 @@ msgid "Ingredients" msgstr "Ingrédients" #: .\cookbook\forms.py:54 -#, fuzzy -#| msgid "Default" msgid "Default unit" -msgstr "Par défaut" +msgstr "Unité par défaut" #: .\cookbook\forms.py:55 -#, fuzzy -#| msgid "System Information" msgid "Use fractions" -msgstr "Informations système" +msgstr "Utiliser les fractions" #: .\cookbook\forms.py:56 msgid "Use KJ" -msgstr "" +msgstr "Utiliser les kJ" #: .\cookbook\forms.py:57 msgid "Theme" -msgstr "" +msgstr "Thème" #: .\cookbook\forms.py:58 msgid "Navbar color" -msgstr "" +msgstr "Couleur de la barre de navigation" #: .\cookbook\forms.py:59 msgid "Sticky navbar" -msgstr "" +msgstr "Barre de navigation permanente" #: .\cookbook\forms.py:60 -#, fuzzy -#| msgid "Default" msgid "Default page" -msgstr "Par défaut" +msgstr "Page par défaut" #: .\cookbook\forms.py:61 -#, fuzzy -#| msgid "Shopping Recipes" msgid "Show recent recipes" -msgstr "Recettes dans le panier" +msgstr "Montrer les recettes récentes" #: .\cookbook\forms.py:62 -#, fuzzy -#| msgid "Search" msgid "Search style" msgstr "Rechercher" #: .\cookbook\forms.py:63 msgid "Plan sharing" -msgstr "" +msgstr "Partage du planificateur" #: .\cookbook\forms.py:64 -#, fuzzy -#| msgid "Ingredients" msgid "Ingredient decimal places" -msgstr "Ingrédients" +msgstr "Nombre de décimales pour les ingrédients" #: .\cookbook\forms.py:65 -#, fuzzy -#| msgid "Shopping list currently empty" msgid "Shopping list auto sync period" -msgstr "La liste de courses est actuellement vide" +msgstr "Période de synchro automatique de la liste de courses" #: .\cookbook\forms.py:66 .\cookbook\templates\recipe_view.html:21 #: .\cookbook\templates\space.html:62 .\cookbook\templates\stats.html:47 @@ -124,6 +110,8 @@ msgstr "" #: .\cookbook\forms.py:76 msgid "Display nutritional energy amounts in joules instead of calories" msgstr "" +"Afficher les quantités d'énergie nutritionnelle en joules plutôt qu'en " +"calories" #: .\cookbook\forms.py:78 msgid "" @@ -242,7 +230,7 @@ msgstr "Stockage" #: .\cookbook\forms.py:260 msgid "Active" -msgstr "" +msgstr "Actif" #: .\cookbook\forms.py:265 msgid "Search String" @@ -279,16 +267,12 @@ msgid "Email address already taken!" msgstr "Adresse mail déjà utilisée !" #: .\cookbook\forms.py:367 -#, fuzzy -#| msgid "" -#| "An email address is not required but if present the invite link will be " -#| "send to the user." msgid "" "An email address is not required but if present the invite link will be sent " "to the user." msgstr "" -"Une adresse mail n'est pas requise mais le lien d'invitation sera envoyé à " -"l'utilisateur si elle est présente." +"Une adresse mail n'est pas requise mais si elle présente, le lien " +"d'invitation sera envoyé à l'utilisateur." #: .\cookbook\forms.py:382 msgid "Name already taken." @@ -303,62 +287,81 @@ msgid "" "Determines how fuzzy a search is if it uses trigram similarity matching (e." "g. low values mean more typos are ignored)." msgstr "" +"Détermine le degré de flou d'une recherche si elle utilise la correspondance " +"par similarité de trigrammes (par exemple, des valeurs faibles signifient " +"que davantage de fautes de frappe sont ignorées)." #: .\cookbook\forms.py:435 msgid "" "Select type method of search. Click here for " "full desciption of choices." msgstr "" +"Sélectionner la méthode de recherche. Cliquer ici pour une description complète des choix." #: .\cookbook\forms.py:436 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." msgstr "" +"Utilisez la correspondance floue sur les unités, les mots-clés et les " +"ingrédients lors de l'édition et de l'importation de recettes." #: .\cookbook\forms.py:438 msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" +"Champs à rechercher en ignorant les accents. La sélection de cette option " +"peut améliorer ou dégrader la qualité de la recherche en fonction de la " +"langue." #: .\cookbook\forms.py:440 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" +"Champs à rechercher pour les correspondances partielles. (par exemple, la " +"recherche de \"Tarte\" renverra \"tarte\", \"tartelette\" et \"tartes\")" #: .\cookbook\forms.py:442 msgid "" "Fields to search for beginning of word matches. (e.g. searching for 'sa' " "will return 'salad' and 'sandwich')" msgstr "" +"Champs permettant de rechercher les correspondances de début de mot (par " +"exemple, si vous recherchez \"sa\", vous obtiendrez \"salade\" et \"sandwich" +"\")." #: .\cookbook\forms.py:444 msgid "" "Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) " "Note: this option will conflict with 'web' and 'raw' methods of search." msgstr "" +"Champs pour la recherche \"floue\" (par exemple, si vous recherchez \"rectte" +"\", vous trouverez \"recette\".) Remarque : cette option est incompatible " +"avec les méthodes de recherche \"web\" et \"brute\"." #: .\cookbook\forms.py:446 msgid "" "Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods " "only function with fulltext fields." msgstr "" +"Champs de recherche en texte intégral. Remarque : les méthodes de recherche " +"\"web\", \"phrase\" et \"raw\" ne fonctionnent qu'avec des champs en texte " +"intégral." #: .\cookbook\forms.py:450 -#, fuzzy -#| msgid "Search" msgid "Search Method" -msgstr "Rechercher" +msgstr "Méthode de recherche" #: .\cookbook\forms.py:451 msgid "Fuzzy Lookups" -msgstr "" +msgstr "Recherches floues" #: .\cookbook\forms.py:452 msgid "Ignore Accent" -msgstr "" +msgstr "Ignorer les accents" #: .\cookbook\forms.py:453 msgid "Partial Match" @@ -369,16 +372,12 @@ msgid "Starts Wtih" msgstr "Commence par" #: .\cookbook\forms.py:455 -#, fuzzy -#| msgid "Search" msgid "Fuzzy Search" -msgstr "Rechercher" +msgstr "Recherche floue" #: .\cookbook\forms.py:456 -#, fuzzy -#| msgid "Text" msgid "Full Text" -msgstr "Texte" +msgstr "Plein texte" #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" @@ -495,19 +494,21 @@ msgstr "Rubrique" #: .\cookbook\management\commands\rebuildindex.py:14 msgid "Rebuilds full text search index on Recipe" -msgstr "" +msgstr "Reconstruction de l'index de recherche plein texte de Tandoor" #: .\cookbook\management\commands\rebuildindex.py:18 msgid "Only Postgress databases use full text search, no index to rebuild" msgstr "" +"Seules les bases de données Postgres utilisent la recherche en texte " +"intégral, sans index à reconstruire" #: .\cookbook\management\commands\rebuildindex.py:29 msgid "Recipe index rebuild complete." -msgstr "" +msgstr "La reconstruction de l'index des recettes est terminée." #: .\cookbook\management\commands\rebuildindex.py:31 msgid "Recipe index rebuild failed." -msgstr "" +msgstr "La reconstruction de l'index des recettes a échoué." #: .\cookbook\migrations\0047_auto_20200602_1133.py:14 msgid "Breakfast" @@ -560,11 +561,11 @@ msgstr "Grand" #: .\cookbook\models.py:212 .\cookbook\templates\generic\new_template.html:6 #: .\cookbook\templates\generic\new_template.html:14 msgid "New" -msgstr "Nouveau/Nouvelle" +msgstr "Nouveau" #: .\cookbook\models.py:396 msgid " is part of a recipe step and cannot be deleted" -msgstr "" +msgstr " fait partie d'une étape de la recette et ne peut être supprimé" #: .\cookbook\models.py:441 .\cookbook\templates\url_import.html:42 msgid "Text" @@ -587,37 +588,31 @@ msgstr "Recette" #: .\cookbook\models.py:871 .\cookbook\templates\search_info.html:28 msgid "Simple" -msgstr "" +msgstr "Simple" #: .\cookbook\models.py:872 .\cookbook\templates\search_info.html:33 msgid "Phrase" -msgstr "" +msgstr "Phrase" #: .\cookbook\models.py:873 .\cookbook\templates\search_info.html:38 msgid "Web" -msgstr "" +msgstr "Internet" #: .\cookbook\models.py:874 .\cookbook\templates\search_info.html:47 msgid "Raw" -msgstr "" +msgstr "Brut" #: .\cookbook\models.py:912 -#, fuzzy -#| msgid "Food" msgid "Food Alias" -msgstr "Aliment" +msgstr "Ingrédient équivalent" #: .\cookbook\models.py:912 -#, fuzzy -#| msgid "Units" msgid "Unit Alias" -msgstr "Unités" +msgstr "Unité" #: .\cookbook\models.py:912 -#, fuzzy -#| msgid "Keywords" msgid "Keyword Alias" -msgstr "Mots-clés" +msgstr "Alias de mot-clé" #: .\cookbook\serializer.py:157 msgid "File uploads are not enabled for this Space." @@ -744,7 +739,8 @@ msgid "" "for user %(user_display)s\n" " ." msgstr "" -"Confirmez que est une adresse mail de " +"Confirmez SVP que\n" +" est une adresse mail de " "l'utilisateur %(user_display)s." #: .\cookbook\templates\account\email_confirm.html:22 @@ -759,8 +755,9 @@ msgid "" " issue a new e-mail confirmation " "request." msgstr "" -"Ce lien de confirmation par mail est expiré ou invalide. Veuillez demander une nouvelle vérification par mail." +"Ce lien de confirmation reçu par mail est expiré ou invalide. Veuillez\n" +" demander une nouvelle vérification " +"par mail." #: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:289 msgid "Login" @@ -856,10 +853,8 @@ msgstr "" "minutes à suivre." #: .\cookbook\templates\account\password_reset_from_key.html:13 -#, fuzzy -#| msgid "API Token" msgid "Bad Token" -msgstr "Jeton API" +msgstr "Mauvais jeton" #: .\cookbook\templates\account\password_reset_from_key.html:25 #, python-format @@ -869,17 +864,19 @@ msgid "" " Please request a new " "password reset." msgstr "" +"Le lien de changement du mot de passe est invalide, probablement parce qu'il " +"a déjà été utilisé.\n" +" Merci de demander un nouveau changement de mot de passe." #: .\cookbook\templates\account\password_reset_from_key.html:33 -#, fuzzy -#| msgid "Change Password" msgid "change password" -msgstr "Modifier le mot de passe" +msgstr "modifier le mot de passe" #: .\cookbook\templates\account\password_reset_from_key.html:36 #: .\cookbook\templates\account\password_reset_from_key_done.html:19 msgid "Your password is now changed." -msgstr "" +msgstr "Votre mot de passe a été changé." #: .\cookbook\templates\account\password_set.html:6 #: .\cookbook\templates\account\password_set.html:16 @@ -959,16 +956,12 @@ msgid "Supermarket" msgstr "Supermarché" #: .\cookbook\templates\base.html:163 -#, fuzzy -#| msgid "Supermarket" msgid "Supermarket Category" -msgstr "Supermarché" +msgstr "Catégorie Supermarché" #: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 -#, fuzzy -#| msgid "Information" msgid "Automations" -msgstr "Information" +msgstr "Automatisations" #: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 msgid "Files" @@ -1029,7 +1022,7 @@ msgstr "GitHub" #: .\cookbook\templates\base.html:277 msgid "Translate Tandoor" -msgstr "" +msgstr "Traduire Tandoor" #: .\cookbook\templates\base.html:281 msgid "API Browser" @@ -1084,26 +1077,20 @@ msgid "Save" msgstr "Sauvegarder" #: .\cookbook\templates\batch\monitor.html:21 -#, fuzzy -#| msgid "Manage Email Settings" msgid "Manage External Storage" -msgstr "Gérer les paramètres de mails" +msgstr "Gérer le stockage externe" #: .\cookbook\templates\batch\monitor.html:28 msgid "Sync Now!" msgstr "Lancer la synchro !" #: .\cookbook\templates\batch\monitor.html:29 -#, fuzzy -#| msgid "Shopping Recipes" msgid "Show Recipes" msgstr "Recettes dans le panier" #: .\cookbook\templates\batch\monitor.html:30 -#, fuzzy -#| msgid "Show Links" msgid "Show Log" -msgstr "Afficher les liens" +msgstr "Afficher le journal" #: .\cookbook\templates\batch\waiting.html:4 #: .\cookbook\templates\batch\waiting.html:10 @@ -1152,8 +1139,8 @@ msgstr "" "\n" " Le formulaire suivant est utile lorsqu'il y a des doublons dans les " "unités ou les ingrédients.\n" -"Il fusionne deux unités ou ingrédients et met à jour toutes les recettes les " -"utilisant.\n" +" Il fusionne deux unités ou ingrédients et met à jour toutes les " +"recettes les utilisant.\n" " " #: .\cookbook\templates\forms\ingredients.html:26 @@ -1176,15 +1163,15 @@ msgstr "Êtes-vous certain de vouloir supprimer %(title)s : %(object)s " #: .\cookbook\templates\generic\delete_template.html:26 msgid "Protected" -msgstr "" +msgstr "Protégé" #: .\cookbook\templates\generic\delete_template.html:41 msgid "Cascade" -msgstr "" +msgstr "Cascade" #: .\cookbook\templates\generic\delete_template.html:72 msgid "Cancel" -msgstr "" +msgstr "Annuler" #: .\cookbook\templates\generic\edit_template.html:32 msgid "View" @@ -1269,9 +1256,9 @@ msgstr "" "\n" " Les champs Mot de passe et Token sont stockés en texte " "brutdans la base de données.\n" -"C'est nécessaire car ils sont utilisés pour faire des requêtes API, mais " -"cela accroît le risque que quelqu'un les vole.
\n" -"Pour limiter les risques, des tokens ou comptes avec un accès limité " +" C'est nécessaire car ils sont utilisés pour faire des requêtes API, " +"mais cela accroît le risque que quelqu'un les vole.
\n" +" Pour limiter les risques, des tokens ou comptes avec un accès limité " "devraient être utilisés.\n" " " @@ -1327,13 +1314,14 @@ msgstr "" "\n" " Markdown est un langage de balisage léger utilisé pour formatter du " "texte facilement.\n" -"Ce site utilise la bibliothèque Python Markdown pour convertir votre texte en un " -"joli format HTML. Sa documentation complète est consultable ici.\n" -"Une documentation incomplète mais probablement suffisante se trouve plus " -"bas.\n" +" Ce site utilise la bibliothèque Python Markdown \n" +" pour convertir votre texte en un joli format HTML. Sa documentation " +"complète est consultable\n" +" ici.\n" +" Une documentation incomplète mais probablement suffisante se trouve " +"plus bas.\n" " " #: .\cookbook\templates\markdown_info.html:25 @@ -1621,10 +1609,8 @@ msgstr "Page d'accueil" #: .\cookbook\templates\search_info.html:5 #: .\cookbook\templates\search_info.html:9 #: .\cookbook\templates\settings.html:165 -#, fuzzy -#| msgid "Search String" msgid "Search Settings" -msgstr "Texte recherché" +msgstr "Paramètres de recherche" #: .\cookbook\templates\search_info.html:10 msgid "" @@ -1637,12 +1623,19 @@ msgid "" "only available if you are using Postgres for your database.\n" " " msgstr "" +"\n" +" La création d'une expérience de recherche optimale est complexe et " +"dépend fortement de votre configuration personnelle. \n" +" La modification de l'un des paramètres de recherche peut avoir un " +"impact significatif sur la vitesse et la qualité des résultats.\n" +" Les configurations Méthodes de recherche, Trigrammes et Recherche " +"texte intégral ne sont disponibles que si vous utilisez Postgres comme base " +"de données.\n" +" " #: .\cookbook\templates\search_info.html:19 -#, fuzzy -#| msgid "Search" msgid "Search Methods" -msgstr "Rechercher" +msgstr "Méthodes de recherche" #: .\cookbook\templates\search_info.html:23 msgid "" @@ -1658,6 +1651,18 @@ msgid "" "html#TEXTSEARCH-PARSING-QUERIES>Postgresql's website.\n" " " msgstr "" +" \n" +" Les recherches en texte intégral tentent de normaliser les mots " +"fournis pour qu'ils correspondent aux variantes courantes. Par exemple : " +"\"forked\", \"forking\", \"forks\" seront tous normalisés en \"fork\".\n" +" Il existe plusieurs méthodes, décrites ci-dessous, qui " +"permettent de contrôler la façon dont la recherche doit réagir lorsque " +"plusieurs mots sont recherchés.\n" +" Des détails techniques complets sur leur fonctionnement peuvent " +"être consultés sur le site Postgresql's website." +"\n" +" " #: .\cookbook\templates\search_info.html:29 msgid "" @@ -1669,6 +1674,14 @@ msgid "" "selected for a full text search.\n" " " msgstr "" +" \n" +" Les recherches simples ignorent la ponctuation et les mots " +"courants tels que \"le\", \"a\", \"et\", et traiteront les mots séparés " +"comme il se doit.\n" +" Si vous recherchez \"pomme ou farine\", vous obtiendrez toutes " +"les recettes qui contiennent à la fois \"pomme\" et \"farine\" dans les " +"champs sélectionnés pour la recherche en texte intégral.\n" +" " #: .\cookbook\templates\search_info.html:34 msgid "" @@ -1680,6 +1693,13 @@ msgid "" "been selected for a full text search.\n" " " msgstr "" +" \n" +" Les recherches de phrases ignorent la ponctuation, mais " +"recherchent tous les mots dans l'ordre exact indiqué.\n" +" La recherche de \"pomme ou farine\" ne donnera que les recettes " +"qui contiennent l'expression exacte \"pomme ou farine\" dans l'un des champs " +"sélectionnés pour la recherche en texte intégral.\n" +" " #: .\cookbook\templates\search_info.html:39 msgid "" @@ -1699,6 +1719,24 @@ msgid "" "recipe that has the word 'butter' in any field included.\n" " " msgstr "" +" \n" +" Les recherches sur le Web simulent la fonctionnalité que l'on " +"trouve sur de nombreux sites de recherche sur le Web qui prennent en charge " +"une syntaxe spéciale.\n" +" En plaçant des guillemets autour de plusieurs mots, ces derniers " +"seront convertis en une phrase.\n" +" Le terme \"ou\" signifie que l'on recherche le mot (ou " +"l'expression) qui précède immédiatement \"ou\" OU le mot (ou l'expression) " +"qui suit immédiatement.\n" +" Le signe \"-\" indique que la recherche porte sur des recettes " +"qui ne comprennent pas le mot (ou la phrase) qui suit immédiatement. \n" +" Par exemple, si vous recherchez \"tarte aux pommes\" ou cerise -" +"beurre, vous obtiendrez toutes les recettes contenant l'expression \"tarte " +"aux pommes\" ou le mot \"cerise\". \n" +" dans tous les champs inclus dans la recherche en texte intégral, " +"mais exclure toute recette comportant le mot \"beurre\" dans tous les champs " +"inclus.\n" +" " #: .\cookbook\templates\search_info.html:48 msgid "" @@ -1707,6 +1745,11 @@ msgid "" "operators such as '|', '&' and '()'\n" " " msgstr "" +" \n" +" La recherche brute est similaire à la recherche sur le Web, mais " +"elle prend en compte les opérateurs de ponctuation tels que \"|\", \"&\" et " +"\"()\".\n" +" " #: .\cookbook\templates\search_info.html:59 msgid "" @@ -1722,12 +1765,21 @@ msgid "" "methods.\n" " " msgstr "" +" \n" +" Une autre approche de la recherche qui nécessite également " +"Postgresql est la recherche floue ou la similarité des trigrammes. Un " +"trigramme est un groupe de trois caractères consécutifs.\n" +" Par exemple, la recherche de \"apple\" créera x trigrammes \"app" +"\", \"ppl\", \"ple\" et créera un score de la proximité des mots avec les " +"trigrammes générés.\n" +" L'un des avantages de la recherche par trigamme est qu'une " +"recherche sur \"sandwich\" permet de trouver des mots mal orthographiés tels " +"que \"sandwhich\", qui ne seraient pas détectés par d'autres méthodes.\n" +" " #: .\cookbook\templates\search_info.html:69 -#, fuzzy -#| msgid "Search Recipe" msgid "Search Fields" -msgstr "Rechercher une recette" +msgstr "Champs de recherche" #: .\cookbook\templates\search_info.html:73 msgid "" @@ -1763,12 +1815,46 @@ msgid "" "full text results, it does match the trigram results.\n" " " msgstr "" +" \n" +" Unaccent est un cas particulier car il permet de rechercher un " +"champ \"non accentué\" pour chaque style de recherche qui tente d'ignorer " +"les valeurs accentuées. \n" +" Par exemple, si vous activez l'option \"non accentué\" pour \"Nom" +"\", toute recherche (commence par, contient, trigramme) tentera d'ignorer " +"les caractères accentués.\n" +" \n" +" Pour les autres options, vous pouvez activer la recherche sur un " +"ou tous les champs et ils seront combinés ensemble avec un 'OR' présumé.\n" +" Par exemple, si vous activez l'option \"Nom\" pour l'option " +"\"Commence par\", \"Nom\" et \"Description\" pour l'option \"Correspondance " +"partielle\" et \"Ingrédients\" et \"Mots-clés\" pour l'option \"Recherche " +"complète\".\n" +" et que vous recherchez \"pomme\", vous obtiendrez les recettes " +"qui ont.. :\n" +" - un nom de recette qui commence par \"pomme\".\n" +" - OU un nom de recette qui contient 'pomme'.\n" +" - OU une description de recette qui contient 'pomme'.\n" +" - OU une recette qui aura une correspondance de recherche en " +"texte intégral ('pomme' ou 'pommes') dans les ingrédients\n" +" - OU une recette qui aura une correspondance de recherche en " +"texte intégral dans les mots-clés.\n" +"\n" +" La combinaison d'un trop grand nombre de champs dans un trop " +"grand nombre de types de recherche peut avoir un impact négatif sur les " +"performances, créer des résultats en double ou renvoyer des résultats " +"inattendus.\n" +" Par exemple, l'activation de la recherche floue ou des " +"correspondances partielles interfère avec les méthodes de recherche sur le " +"Web. \n" +" La recherche de \"apple -pie\" à l'aide d'une recherche floue et " +"d'une recherche en texte intégral donnera la recette de la tarte aux " +"pommes. Bien qu'elle ne soit pas incluse dans les résultats du texte " +"intégral, elle correspond aux résultats de la recherche par trigramme.\n" +" " #: .\cookbook\templates\search_info.html:95 -#, fuzzy -#| msgid "Search" msgid "Search Index" -msgstr "Rechercher" +msgstr "Index de recherche" #: .\cookbook\templates\search_info.html:99 msgid "" @@ -1782,6 +1868,17 @@ msgid "" "the management command 'python manage.py rebuildindex'\n" " " msgstr "" +" \n" +" La recherche par trigramme et la recherche en texte intégral " +"reposent toutes deux sur les index de la base de données pour fonctionner " +"efficacement. \n" +" Vous pouvez reconstruire les index de tous les champs dans la " +"page d'administration des recettes, en sélectionnant toutes les recettes et " +"en exécutant la commande \"rebuild index for selected recipes\".\n" +" Vous pouvez également reconstruire les index en ligne de " +"commande en exécutant la commande de gestion \"python manage.py " +"rebuildindex\".\n" +" " #: .\cookbook\templates\settings.html:28 msgid "Account" @@ -1796,10 +1893,8 @@ msgid "API-Settings" msgstr "Paramètres d'API" #: .\cookbook\templates\settings.html:49 -#, fuzzy -#| msgid "Search String" msgid "Search-Settings" -msgstr "Texte recherché" +msgstr "Paramètres de recherche" #: .\cookbook\templates\settings.html:58 msgid "Name Settings" @@ -1855,22 +1950,29 @@ msgid "" "There are many options to configure the search depending on your personal " "preferences." msgstr "" +"Il existe de nombreuses options pour configurer la recherche en fonction de " +"vos préférences personnelles." #: .\cookbook\templates\settings.html:167 msgid "" "Usually you do not need to configure any of them and can just stick " "with either the default or one of the following presets." msgstr "" +"En général, vous n'avez pas besoin de configurer l'un d'entre eux et " +"pouvez simplement vous en tenir à la valeur par défaut ou à l'un des " +"préréglages suivants." #: .\cookbook\templates\settings.html:168 msgid "" "If you do want to configure the search you can read about the different " "options here." msgstr "" +"Si vous souhaitez configurer la recherche, vous pouvez consulter les " +"différentes options ici." #: .\cookbook\templates\settings.html:173 msgid "Fuzzy" -msgstr "" +msgstr "Flou" #: .\cookbook\templates\settings.html:174 msgid "" @@ -1878,29 +1980,34 @@ msgid "" "return more results than needed to make sure you find what you are looking " "for." msgstr "" +"Trouvez ce dont vous avez besoin même si votre recherche ou la recette " +"contient des fautes de frappe. Il se peut que vous obteniez plus de " +"résultats que nécessaire pour être sûr de trouver ce que vous cherchez." #: .\cookbook\templates\settings.html:175 msgid "This is the default behavior" -msgstr "" +msgstr "C'est le comportement par défaut" #: .\cookbook\templates\settings.html:176 #: .\cookbook\templates\settings.html:184 msgid "Apply" -msgstr "" +msgstr "Appliquer" #: .\cookbook\templates\settings.html:181 msgid "Precise" -msgstr "" +msgstr "Préciser" #: .\cookbook\templates\settings.html:182 msgid "" "Allows fine control over search results but might not return results if too " "many spelling mistakes are made." msgstr "" +"Permet un contrôle fin des résultats de la recherche mais peut ne pas donner " +"de résultats si trop de fautes d'orthographe sont commises." #: .\cookbook\templates\settings.html:183 msgid "Perfect for large Databases" -msgstr "" +msgstr "Parfait pour les grandes bases de données" #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" @@ -1928,10 +2035,8 @@ msgid "Shopping List" msgstr "Liste de courses" #: .\cookbook\templates\shopping_list.html:34 -#, fuzzy -#| msgid "Open Shopping List" msgid "Try the new shopping list" -msgstr "Ouvrir la liste de courses" +msgstr "Essayer la nouvelle liste de courses" #: .\cookbook\templates\shopping_list.html:63 msgid "Search Recipe" @@ -2008,8 +2113,8 @@ msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" msgstr "" -"Vous pouvez vous connecter à votre compte en utilisant un des comptes tiers " -"suivants :" +"Vous pouvez vous connecter à votre compte en utilisant un des \n" +" comptes tiers suivants :" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" @@ -2033,8 +2138,9 @@ msgid "" " %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" -"Vous êtes sur le point d'utiliser votre compte %(provider_name)s pour vous " -"connecter à %(site_name)s. Pour finaliser la requête, veuillez compléter le " +"Vous êtes sur le point d'utiliser\n" +" votre compte %(provider_name)s pour vous connecter à\n" +" %(site_name)s. Pour finaliser la requête, veuillez compléter le " "formulaire suivant :" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 @@ -2190,8 +2296,9 @@ msgid "" msgstr "" "Publier les médias directement avec gunicorn/python n'est pas recommandé !\n" -"Veuillez suivre les étapes décrites ici pour mettre à jour votre installation.\n" +" Veuillez suivre les étapes décrites ici \n" +" pour mettre à jour votre installation.\n" " " #: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 @@ -2216,10 +2323,12 @@ msgid "" " " msgstr "" "\n" -" Vous n'avez pas de SECRET_KEY configurée dans votre " -"fichier.env. Django utilise par défaut la clé standard fournie " -"avec l'application qui est connue publiquement et non sécurisée ! Veuillez " -"définir SECRET_KEY dans le fichier.env\n" +" Vous n'avez pas de SECRET_KEY configuré dans votre " +"fichier.env. Django utilise par défaut\n" +" la clé standard fournie avec l'application qui est connue " +"publiquement et non sécurisée ! \n" +" Veuillez définir SECRET_KEY dans le fichier." +"env\n" " " #: .\cookbook\templates\system.html:78 @@ -2238,8 +2347,9 @@ msgid "" msgstr "" "\n" " Cette application est toujours en mode debug. Ce n'est sûrement " -"pas nécessaire. Désactivez le mode debug en définissant DEBUG=0 " -"dans le fichier .env.\n" +"pas nécessaire. Désactivez le mode debug\n" +" en définissant DEBUG=0 dans le fichier ." +"env.\n" " " #: .\cookbook\templates\system.html:93 @@ -2260,8 +2370,9 @@ msgid "" msgstr "" "\n" " Cette application ne tourne pas sur une base de données " -"Postgres. Ce n'est pas grave mais déconseillé car certaines fonctionnalités " -"ne fonctionnent qu'avec une base de données Postgres.\n" +"Postgres. Ce n'est pas grave mais déconseillé\n" +" car certaines fonctionnalités ne fonctionnent qu'avec une base " +"de données Postgres.\n" " " #: .\cookbook\templates\url_import.html:6 @@ -2279,11 +2390,11 @@ msgstr "Mettez-moi en favori !" #: .\cookbook\templates\url_import.html:36 msgid "URL" -msgstr "" +msgstr "URL" #: .\cookbook\templates\url_import.html:38 msgid "App" -msgstr "" +msgstr "App" #: .\cookbook\templates\url_import.html:62 msgid "Enter website URL" @@ -2440,12 +2551,14 @@ msgid "" "data feel free to post an example in the\n" " github issues." msgstr "" -" Seuls les sites webs contenant des données ld+json ou microdatas peuvent " -"actuellement être importés.\n" -"C'est le cas de la plupart des grands sites web. Si votre site ne peut pas " -"être importé alors qu'il est censé disposer\n" +" Seuls les sites webs contenant des données ld+json ou microdatas peuvent\n" +" actuellement être importés.\n" +" C'est le cas de la plupart des " +"grands sites web. Si votre site ne peut pas être importé\n" +" alors qu'il est censé disposer " "de données correctement structurées,\n" -"n'hésitez pas à publier un exemple dans un ticket sur GitHub." +" n'hésitez pas à publier un " +"exemple dans un ticket sur GitHub." #: .\cookbook\templates\url_import.html:641 msgid "Google ld+json Info" @@ -2466,7 +2579,7 @@ msgstr "Le paramètre « update_at » n'est pas correctement formatté" #: .\cookbook\views\api.py:152 #, python-brace-format msgid "No {self.basename} with id {pk} exists" -msgstr "" +msgstr "Il n'existe pas de {self.basename} avec l'identifiant {pk}" #: .\cookbook\views\api.py:156 msgid "Cannot merge with the same object!" @@ -2475,58 +2588,58 @@ msgstr "Un objet ne peut être fusionné avec lui-même !" #: .\cookbook\views\api.py:163 #, python-brace-format msgid "No {self.basename} with id {target} exists" -msgstr "" +msgstr "Il n'existe pas de {self.basename} avec l'id {target}" #: .\cookbook\views\api.py:168 -#, fuzzy -#| msgid "Cannot merge with the same object!" msgid "Cannot merge with child object!" -msgstr "Un objet ne peut être fusionné avec lui-même !" +msgstr "Impossible de fusionner avec l'objet enfant !" #: .\cookbook\views\api.py:201 #, python-brace-format msgid "{source.name} was merged successfully with {target.name}" -msgstr "" +msgstr "{source.name} a été fusionné avec succès avec {target.name}" #: .\cookbook\views\api.py:205 #, python-brace-format msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" +"Une erreur s'est produite lors de la tentative de fusion de {source.name} " +"avec {target.name}" #: .\cookbook\views\api.py:249 #, python-brace-format msgid "No {self.basename} with id {child} exists" -msgstr "" +msgstr "Il n'existe pas de {self.basename} avec l'id {child}" #: .\cookbook\views\api.py:258 #, python-brace-format msgid "{child.name} was moved successfully to the root." -msgstr "" +msgstr "{child.name} a été déplacé avec succès vers la racine." #: .\cookbook\views\api.py:261 .\cookbook\views\api.py:279 msgid "An error occurred attempting to move " -msgstr "" +msgstr "Une erreur s'est produite en essayant de déplacer " #: .\cookbook\views\api.py:264 msgid "Cannot move an object to itself!" -msgstr "" +msgstr "Impossible de déplacer un objet vers lui-même !" #: .\cookbook\views\api.py:270 #, python-brace-format msgid "No {self.basename} with id {parent} exists" -msgstr "" +msgstr "Il n'existe pas de {self.basename} avec l'id {parent}" #: .\cookbook\views\api.py:276 #, python-brace-format msgid "{child.name} was moved successfully to parent {parent.name}" -msgstr "" +msgstr "{child.name} a été déplacé avec succès vers le parent {parent.name}" #: .\cookbook\views\api.py:723 .\cookbook\views\data.py:42 #: .\cookbook\views\edit.py:129 .\cookbook\views\new.py:95 -#, fuzzy -#| msgid "This feature is not available in the demo version!" msgid "This feature is not yet available in the hosted version of tandoor!" -msgstr "Cette fonctionnalité n'est pas disponible dans la version d'essai !" +msgstr "" +"Cette fonctionnalité n'est pas encore disponible dans la version hébergée de " +"Tandoor !" #: .\cookbook\views\api.py:745 msgid "Sync successful!" @@ -2655,28 +2768,20 @@ msgid "Shopping Lists" msgstr "Listes de course" #: .\cookbook\views\lists.py:129 -#, fuzzy -#| msgid "Food" msgid "Foods" -msgstr "Aliment" +msgstr "Aliments" #: .\cookbook\views\lists.py:163 -#, fuzzy -#| msgid "Supermarket" msgid "Supermarkets" -msgstr "Supermarché" +msgstr "Supermarchés" #: .\cookbook\views\lists.py:179 -#, fuzzy -#| msgid "Shopping Recipes" msgid "Shopping Categories" -msgstr "Recettes dans le panier" +msgstr "Catégories de courses" #: .\cookbook\views\lists.py:232 -#, fuzzy -#| msgid "Shopping List" msgid "New Shopping List" -msgstr "Liste de courses" +msgstr "Nouvelle liste de courses" #: .\cookbook\views\new.py:126 msgid "Imported new recipe!" @@ -2766,16 +2871,20 @@ msgstr "Cette fonctionnalité n'est pas disponible dans la version d'essai !" #: .\cookbook\views\views.py:340 msgid "You must select at least one field to search!" msgstr "" +"Vous devez sélectionner au moins un champ pour effectuer une recherche !" #: .\cookbook\views\views.py:345 msgid "" "To use this search method you must select at least one full text search " "field!" msgstr "" +"Pour utiliser cette méthode de recherche, vous devez sélectionner au moins " +"un champ de recherche en texte intégral !" #: .\cookbook\views\views.py:349 msgid "Fuzzy search is not compatible with this search method!" msgstr "" +"La recherche floue n'est pas compatible avec cette méthode de recherche !" #: .\cookbook\views\views.py:452 msgid "" From 968b710b4971659cbfc1f25930fb0b523a4333e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B3=96=E5=A4=9A?= <1365143958@qq.com> Date: Sat, 15 Jan 2022 06:19:48 +0000 Subject: [PATCH 20/29] Translated using Weblate (Chinese (Simplified)) Currently translated at 28.6% (146 of 509 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/zh_Hans/ --- cookbook/locale/zh_CN/LC_MESSAGES/django.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cookbook/locale/zh_CN/LC_MESSAGES/django.po b/cookbook/locale/zh_CN/LC_MESSAGES/django.po index 215748f5b8..a1f38d6af0 100644 --- a/cookbook/locale/zh_CN/LC_MESSAGES/django.po +++ b/cookbook/locale/zh_CN/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-08 16:27+0100\n" -"PO-Revision-Date: 2021-08-20 19:28+0000\n" -"Last-Translator: Danny Tsui \n" +"PO-Revision-Date: 2022-01-16 07:06+0000\n" +"Last-Translator: 糖多 <1365143958@qq.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7.2\n" +"X-Generator: Weblate 4.8\n" #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\templates\forms\ingredients.html:34 @@ -1173,12 +1173,12 @@ msgstr "" #: .\cookbook\templates\include\log_cooking.html:19 msgid "Rating" -msgstr "" +msgstr "评分" #: .\cookbook\templates\include\log_cooking.html:27 #: .\cookbook\templates\include\recipe_open_modal.html:18 msgid "Close" -msgstr "" +msgstr "关闭" #: .\cookbook\templates\include\recipe_open_modal.html:32 msgid "Open Recipe" From 9b182f607627751a950304bd528424228858cef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B3=96=E5=A4=9A?= <1365143958@qq.com> Date: Sat, 15 Jan 2022 06:09:40 +0000 Subject: [PATCH 21/29] Translated using Weblate (Chinese (Simplified)) Currently translated at 32.0% (91 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/ --- vue/src/locales/zh_Hans.json | 56 ++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/vue/src/locales/zh_Hans.json b/vue/src/locales/zh_Hans.json index 46f921a1ef..3ae2529e0a 100644 --- a/vue/src/locales/zh_Hans.json +++ b/vue/src/locales/zh_Hans.json @@ -7,41 +7,41 @@ "success_creating_resource": "", "success_updating_resource": "", "success_deleting_resource": "", - "import_running": "", - "all_fields_optional": "", - "convert_internal": "", - "show_only_internal": "", + "import_running": "正在导入,请稍候!", + "all_fields_optional": "所有字段都是可选的,可以留空。", + "convert_internal": "转换为内部菜谱", + "show_only_internal": "仅显示内部菜谱", "Log_Recipe_Cooking": "", "External_Recipe_Image": "外部菜谱图像", "Add_to_Shopping": "添加到购物", "Add_to_Plan": "添加到计划", "Step_start_time": "", - "Sort_by_new": "", + "Sort_by_new": "按新旧排序", "Recipes_per_page": "", "Manage_Books": "管理书籍", - "Meal_Plan": "", - "Select_Book": "", + "Meal_Plan": "用餐计划", + "Select_Book": "选择书籍", "Recipe_Image": "菜谱图像", "Import_finished": "导入完成", - "View_Recipes": "", + "View_Recipes": "查看菜谱", "Log_Cooking": "", "New_Recipe": "新菜谱", "Url_Import": "导入网址", "Reset_Search": "重置搜索", "Recently_Viewed": "最近浏览", "Load_More": "加载更多", - "Keywords": "关键字", + "Keywords": "关键词", "Books": "书籍", "Proteins": "蛋白质", "Fats": "脂肪", "Carbohydrates": "碳水化合物", "Calories": "卡路里", - "Energy": "", + "Energy": "能量", "Nutrition": "营养", "Date": "日期", "Share": "分享", "Export": "导出", - "Copy": "拷贝", + "Copy": "复制", "Rating": "评分", "Close": "关闭", "Link": "链接", @@ -66,8 +66,8 @@ "Cancel": "取消", "Delete": "删除", "Open": "打开", - "Ok": "打开", - "Save": "储存", + "Ok": "", + "Save": "保存", "Step": "步骤", "Search": "搜索", "Import": "导入", @@ -75,7 +75,33 @@ "Settings": "设置", "or": "或", "and": "与", - "Information": "更多资讯", + "Information": "更多信息", "Download": "下载", - "Create": "创立" + "Create": "创建", + "Table_of_Contents": "目录", + "Delete_Keyword": "删除关键词", + "Edit_Keyword": "编辑关键词", + "New_Keyword": "新关键词", + "Select_File": "选择文件", + "Merge_Keyword": "合并关键词", + "Hide_Keywords": "隐藏关键词", + "Image": "图片", + "Recipes": "菜谱", + "Move": "移动", + "Merge": "合并", + "confirm_delete": "您确定要删除 {object} 吗?", + "Save_and_View": "保存并查看", + "Edit_Recipe": "编辑菜谱", + "Move_Up": "上移", + "show_split_screen": "拆分视图", + "Move_Keyword": "移动关键词", + "Hide_Recipes": "隐藏菜谱", + "Move_Down": "下移", + "Step_Name": "步骤名称", + "Step_Type": "步骤类型", + "Enable_Amount": "启用金额", + "Disable_Amount": "禁用金额", + "Add_Step": "添加步骤", + "delete_confirmation": "你确定要删除 {source} 吗?", + "Search Settings": "搜索设置" } From 528767a8351ce25fe56331cb17c3cc5b388e5709 Mon Sep 17 00:00:00 2001 From: Josselin du PLESSIS Date: Fri, 14 Jan 2022 23:20:10 +0000 Subject: [PATCH 22/29] Translated using Weblate (French) Currently translated at 100.0% (284 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/ --- vue/src/locales/fr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vue/src/locales/fr.json b/vue/src/locales/fr.json index 79a446273d..58f2693acb 100644 --- a/vue/src/locales/fr.json +++ b/vue/src/locales/fr.json @@ -121,7 +121,7 @@ "del_confirmation_tree": "Êtes-vous sûr de vouloir supprimer {source} et tous ses enfants ?", "warning_feature_beta": "Cette fonctionnalité est actuellement en phase BETA (test). Veuillez vous attendre à des bugs et éventuellement à des changements avenir (éventuellement la perte de données liées aux fonctionnalités) lorsque vous utilisez cette fonctionnalité.", "confirm_delete": "Voulez-vous vraiment supprimer {objet} ?", - "Note": "Noter", + "Note": "Notes", "Add_Step": "Ajouter une étape", "Step_Name": "Nom de l'étape", "Parameter": "Paramètre", @@ -220,7 +220,7 @@ "Period": "Période", "Plan_Period_To_Show": "Montrer les semaines, mois ou années", "Auto_Planner": "Planning Auto", - "New_Cookbook": "Nouveau livres de recettes", + "New_Cookbook": "Nouveau livre de recettes", "Hide_Keyword": "Cacher les mots clés", "Clear": "Supprimer", "AddToShopping": "Ajouter à la liste de courses", From c2a763fa4cc09edf46048cd21f736261c20748e6 Mon Sep 17 00:00:00 2001 From: SMunos Date: Fri, 14 Jan 2022 23:19:21 +0000 Subject: [PATCH 23/29] Translated using Weblate (French) Currently translated at 100.0% (284 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/fr/ --- vue/src/locales/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vue/src/locales/fr.json b/vue/src/locales/fr.json index 58f2693acb..24f4fb2d88 100644 --- a/vue/src/locales/fr.json +++ b/vue/src/locales/fr.json @@ -221,7 +221,7 @@ "Plan_Period_To_Show": "Montrer les semaines, mois ou années", "Auto_Planner": "Planning Auto", "New_Cookbook": "Nouveau livre de recettes", - "Hide_Keyword": "Cacher les mots clés", + "Hide_Keyword": "masquer les mots clefs", "Clear": "Supprimer", "AddToShopping": "Ajouter à la liste de courses", "IngredientInShopping": "Cet ingrédient est dans votre liste de courses.", From fed9cfeeb74fb630cd2bc14785042213e562e325 Mon Sep 17 00:00:00 2001 From: Oliver Cervera Date: Sun, 16 Jan 2022 15:44:28 +0000 Subject: [PATCH 24/29] Translated using Weblate (Italian) Currently translated at 96.6% (492 of 509 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/it/ --- cookbook/locale/it/LC_MESSAGES/django.po | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/cookbook/locale/it/LC_MESSAGES/django.po b/cookbook/locale/it/LC_MESSAGES/django.po index 761e133a3a..1abfc620e9 100644 --- a/cookbook/locale/it/LC_MESSAGES/django.po +++ b/cookbook/locale/it/LC_MESSAGES/django.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-11-07 17:31+0100\n" -"PO-Revision-Date: 2021-11-12 20:06+0000\n" +"PO-Revision-Date: 2022-01-17 07:56+0000\n" "Last-Translator: Oliver Cervera \n" "Language-Team: Italian \n" @@ -260,10 +260,6 @@ msgid "Email address already taken!" msgstr "Questo indirizzo email è già in uso!" #: .\cookbook\forms.py:367 -#, fuzzy -#| msgid "" -#| "An email address is not required but if present the invite link will be " -#| "send to the user." msgid "" "An email address is not required but if present the invite link will be sent " "to the user." @@ -840,6 +836,10 @@ msgid "" " Please request a new " "password reset." msgstr "" +"Il link per il reset della password non è corretto, probabilmente perché è " +"stato già utilizzato.\n" +" Puoi richiedere un nuovo reset della password." #: .\cookbook\templates\account\password_reset_from_key.html:33 msgid "change password" @@ -932,10 +932,8 @@ msgid "Supermarket Category" msgstr "Categoria Supermercato" #: .\cookbook\templates\base.html:175 .\cookbook\views\lists.py:195 -#, fuzzy -#| msgid "Information" msgid "Automations" -msgstr "Informazioni" +msgstr "Automazioni" #: .\cookbook\templates\base.html:189 .\cookbook\views\lists.py:215 msgid "Files" @@ -1842,6 +1840,9 @@ msgid "" "return more results than needed to make sure you find what you are looking " "for." msgstr "" +"Cerca quello che ti serve anche se la ricerca o la ricetta contengono " +"errori. Potrebbe mostrare più risultati di quelli necessari per mostrarti " +"quello che stai cercando." #: .\cookbook\templates\settings.html:175 msgid "This is the default behavior" @@ -1864,7 +1865,7 @@ msgstr "" #: .\cookbook\templates\settings.html:183 msgid "Perfect for large Databases" -msgstr "" +msgstr "Perfetto per database grandi" #: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5 msgid "Cookbook Setup" From 0c603e36658eb1f96ec0460e3a29a6767db5334e Mon Sep 17 00:00:00 2001 From: Oliver Cervera Date: Sun, 16 Jan 2022 15:21:49 +0000 Subject: [PATCH 25/29] Translated using Weblate (Italian) Currently translated at 84.1% (239 of 284 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/it/ --- vue/src/locales/it.json | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/vue/src/locales/it.json b/vue/src/locales/it.json index bbd90a7645..b9f365ac1c 100644 --- a/vue/src/locales/it.json +++ b/vue/src/locales/it.json @@ -1,8 +1,8 @@ { - "err_fetching_resource": "Si è verificato un errore nel recupero della risorsa!", + "err_fetching_resource": "Si è verificato un errore durante il recupero di una risorsa!", "err_creating_resource": "Si è verificato un errore durante la creazione di una risorsa!", - "err_updating_resource": "Si è verificato un errore durante l'aggiornamento della risorsa!", - "err_deleting_resource": "Si è verificato un errore durante la cancellazione della risorsa!", + "err_updating_resource": "Si è verificato un errore durante l'aggiornamento di una risorsa!", + "err_deleting_resource": "Si è verificato un errore durante la cancellazione di una risorsa!", "success_fetching_resource": "Risorsa recuperata con successo!", "success_creating_resource": "Risorsa creata con successo!", "success_updating_resource": "Risorsa aggiornata con successo!", @@ -208,5 +208,37 @@ "New_Cookbook": "Nuovo libro di ricette", "Hide_Keyword": "Nascondi parole chiave", "Clear": "Pulisci", - "Shopping_List_Empty": "La tua lista della spesa è vuota, puoi aggiungere elementi dal menù contestuale di una voce nel piano alimentare (clicca con il tasto destro sulla scheda o clicca con il tasto sinistro sull'icona del menù)" + "Shopping_List_Empty": "La tua lista della spesa è vuota, puoi aggiungere elementi dal menù contestuale di una voce nel piano alimentare (clicca con il tasto destro sulla scheda o clicca con il tasto sinistro sull'icona del menù)", + "success_moving_resource": "Risorsa spostata con successo!", + "Shopping_Categories": "Categorie di spesa", + "IngredientInShopping": "Questo ingrediente è nella tua lista della spesa.", + "RemoveFoodFromShopping": "Rimuovi {food} dalla tua lista della spesa", + "DelayFor": "Ritarda per {hours} ore", + "OfflineAlert": "Sei offline, le liste della spesa potrebbero non sincronizzarsi.", + "err_moving_resource": "Si è verificato un errore durante lo spostamento di una risorsa!", + "err_merging_resource": "Si è verificato un errore durante l'unione di una risorsa!", + "success_merging_resource": "Risorsa unita con successo!", + "Added_by": "Aggiunto da", + "Added_on": "Aggiunto il", + "AddToShopping": "Aggiungi a lista della spesa", + "NotInShopping": "{food} non è nella tua lista della spesa.", + "Undefined": "Non definito", + "AddFoodToShopping": "Aggiungi {food} alla tua lista della spesa", + "DeleteShoppingConfirm": "Sei sicuro di voler rimuovere tutto {food} dalla lista della spesa?", + "Add_Servings_to_Shopping": "Aggiungi {servings} porzioni alla spesa", + "Inherit": "Eredita", + "InheritFields": "Eredita i valori dei campi", + "ShowUncategorizedFood": "Mostra non definiti", + "GroupBy": "Raggruppa per", + "MoveCategory": "Sposta in: ", + "Warning": "Attenzione", + "NoCategory": "Nessuna categoria selezionata.", + "ShowDelayed": "Mostra elementi ritardati", + "Completed": "Completato", + "shopping_share": "Condividi lista della spesa", + "shopping_auto_sync": "Sincronizzazione automatica", + "err_move_self": "Non è possibile muovere un elemento in sé stesso", + "nothing": "Nulla da fare", + "show_sql": "Mostra SQL", + "Search Settings": "Impostazioni di ricerca" } From b3e971fe09b96a4b877501611ec424157a4f579f Mon Sep 17 00:00:00 2001 From: Matthias Lohr Date: Mon, 17 Jan 2022 11:21:36 +0100 Subject: [PATCH 26/29] allow to specify an actual path using DATABASE_URL --- recipes/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recipes/settings.py b/recipes/settings.py index dcbbfc07e0..e528327144 100644 --- a/recipes/settings.py +++ b/recipes/settings.py @@ -258,7 +258,7 @@ # Load settings from env files if os.getenv('DATABASE_URL'): match = re.match( - r'(?P\w+):\/\/(?P[\w\d_-]+)(:(?P[^@]+))?@(?P[^:/]+)(:(?P\d+))?(\/(?P[\w\d_-]+))?', + r'(?P\w+):\/\/(?P[\w\d_-]+)(:(?P[^@]+))?@(?P[^:/]+)(:(?P\d+))?(\/(?P[\w\d\/\._-]+))?', os.getenv('DATABASE_URL') ) settings = match.groupdict() From 745bb58c7ec8e4026a48fceca0baf20af9cbdd50 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Sun, 9 Jan 2022 18:25:38 +0100 Subject: [PATCH 27/29] fixed valid filter on invite link counter --- cookbook/forms.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cookbook/forms.py b/cookbook/forms.py index 37a3263834..e47acac0da 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -1,3 +1,5 @@ +from datetime import datetime + from django import forms from django.conf import settings from django.core.exceptions import ValidationError @@ -350,7 +352,7 @@ def __init__(self, *args, **kwargs): def clean(self): space = self.cleaned_data['space'] if space.max_users != 0 and (UserPreference.objects.filter(space=space).count() + InviteLink.objects.filter( - space=space).count()) >= space.max_users: + space=space).filter(valid_until__gte=datetime.today()).count()) >= space.max_users: raise ValidationError(_('Maximum number of users for this space reached.')) def clean_email(self): From 8a7c4e11c924acaed05bc8935eb0ed8cd2de720a Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 15:16:13 +0100 Subject: [PATCH 28/29] fixed invite link counting --- cookbook/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cookbook/forms.py b/cookbook/forms.py index e47acac0da..26e5188527 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -351,8 +351,8 @@ def __init__(self, *args, **kwargs): def clean(self): space = self.cleaned_data['space'] - if space.max_users != 0 and (UserPreference.objects.filter(space=space).count() + InviteLink.objects.filter( - space=space).filter(valid_until__gte=datetime.today()).count()) >= space.max_users: + if space.max_users != 0 and (UserPreference.objects.filter(space=space).count() + + InviteLink.objects.filter(valid_until__gte=datetime.today(), used_by=None, space=space).count()) >= space.max_users: raise ValidationError(_('Maximum number of users for this space reached.')) def clean_email(self): From d3b71e40c746a8f1c964135938e7f5695684e9af Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 17 Jan 2022 15:43:35 +0100 Subject: [PATCH 29/29] cleand up context menu code --- vue/src/apps/MealPlanView/MealPlanView.vue | 135 +++++++++++++-------- 1 file changed, 84 insertions(+), 51 deletions(-) diff --git a/vue/src/apps/MealPlanView/MealPlanView.vue b/vue/src/apps/MealPlanView/MealPlanView.vue index 07b6168515..85485d4e75 100644 --- a/vue/src/apps/MealPlanView/MealPlanView.vue +++ b/vue/src/apps/MealPlanView/MealPlanView.vue @@ -54,14 +54,20 @@
{{ $t("Planner_Settings") }}
- - + + - - + + - - + + @@ -73,19 +79,25 @@
{{ $t("Meal_Types") }}
- - + +
- +
- {{ meal_type.icon }} {{ meal_type.name + {{ meal_type.icon }} {{ + meal_type.name }} + >
@@ -93,20 +105,29 @@
- +
- +
- +
- + {{ $t("Default") }} - - + +
@@ -127,18 +148,15 @@ openEntryEdit(contextData.originalItem.entry) " > - {{ $t("Edit") }} + {{ + $t("Edit") + }} - {{ $t("Recipe") }} + @click="$refs.menu.close();openRecipe(contextData.originalItem.entry.recipe)"> + + {{ $t("Recipe") }} - {{ $t("Move") }} + + {{ $t("Move") }} - {{ $t("Move") }} + + {{ $t("Move") }} - {{ $t("Add_to_Shopping") }} + + {{ $t("Add_to_Shopping") }} - {{ $t("Delete") }} + + {{ $t("Delete") }} @@ -209,10 +231,12 @@
+ > {{ $t("Open") }} - {{ $t("Clear") }} + + {{ $t("Clear") }} +
@@ -220,37 +244,46 @@
-
+
- +
- +
-
- + - + - +
@@ -261,7 +294,7 @@