From e23d514d894f299d003767bbdb829d2c6c495e0d Mon Sep 17 00:00:00 2001 From: smilerz Date: Wed, 6 Jul 2022 16:16:53 -0500 Subject: [PATCH 01/76] fix bookmarklet --- cookbook/helper/recipe_html_import.py | 13 +++--- cookbook/helper/scrapers/scrapers.py | 13 ++++-- cookbook/serializer.py | 35 ++++++++-------- cookbook/views/api.py | 59 +++++++++++++-------------- 4 files changed, 65 insertions(+), 55 deletions(-) diff --git a/cookbook/helper/recipe_html_import.py b/cookbook/helper/recipe_html_import.py index 1b5d37ad..48dc4c11 100644 --- a/cookbook/helper/recipe_html_import.py +++ b/cookbook/helper/recipe_html_import.py @@ -6,7 +6,7 @@ from urllib.parse import unquote from bs4 import BeautifulSoup from bs4.element import Tag from recipe_scrapers import scrape_html, scrape_me -from recipe_scrapers._exceptions import NoSchemaFoundInWildMode +from recipe_scrapers._exceptions import NoSchemaFoundInWildMode, WebsiteNotImplementedError from recipe_scrapers._utils import get_host_name, normalize_string from cookbook.helper import recipe_url_import as helper @@ -68,11 +68,14 @@ def get_recipe_from_source(text, url, request): text = unquote(text) scrape = None - if url: + if url and not text: try: - scrape = scrape_me(url_path=url, wild_mode=True) - except(NoSchemaFoundInWildMode): - pass + scrape = scrape_me(url_path=url) + except WebsiteNotImplementedError: + try: + scrape = scrape_me(url_path=url, wild_mode=True) + except(NoSchemaFoundInWildMode): + pass if not scrape: try: parse_list.append(remove_graph(json.loads(text))) diff --git a/cookbook/helper/scrapers/scrapers.py b/cookbook/helper/scrapers/scrapers.py index eb93cc2c..94e3daea 100644 --- a/cookbook/helper/scrapers/scrapers.py +++ b/cookbook/helper/scrapers/scrapers.py @@ -1,6 +1,7 @@ -from bs4 import BeautifulSoup from json import JSONDecodeError -from recipe_scrapers import SCRAPERS + +from bs4 import BeautifulSoup +from recipe_scrapers import SCRAPERS, get_host_name from recipe_scrapers._factory import SchemaScraperFactory from recipe_scrapers._schemaorg import SchemaOrg @@ -15,7 +16,13 @@ SCRAPERS.update(CUSTOM_SCRAPERS) def text_scraper(text, url=None): - scraper_class = SchemaScraperFactory.SchemaScraper + domain = None + if url: + domain = get_host_name(url) + if domain in SCRAPERS: + scraper_class = SCRAPERS[domain] + else: + scraper_class = SchemaScraperFactory.SchemaScraper class TextScraper(scraper_class): def __init__( diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 1e386c5d..a4b8b2fe 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -1,12 +1,11 @@ import traceback -from datetime import timedelta, datetime +from datetime import datetime, timedelta from decimal import Decimal from gettext import gettext as _ from html import escape from smtplib import SMTPException -from PIL import Image -from django.contrib.auth.models import User, Group +from django.contrib.auth.models import Group, User from django.core.mail import send_mail from django.db.models import Avg, Q, QuerySet, Sum from django.http import BadHeaderError @@ -14,6 +13,7 @@ from django.urls import reverse from django.utils import timezone from django_scopes import scopes_disabled from drf_writable_nested import UniqueFieldsMixin, WritableNestedModelSerializer +from PIL import Image from rest_framework import serializers from rest_framework.exceptions import NotFound, ValidationError @@ -22,14 +22,14 @@ from cookbook.helper.HelperFunctions import str2bool from cookbook.helper.permission_helper import above_space_limit from cookbook.helper.shopping_helper import RecipeShoppingEditor from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, CustomFilter, - ExportLog, Food, FoodInheritField, ImportLog, Ingredient, Keyword, - MealPlan, MealType, NutritionInformation, Recipe, RecipeBook, + ExportLog, Food, FoodInheritField, ImportLog, Ingredient, InviteLink, + Keyword, MealPlan, MealType, NutritionInformation, Recipe, RecipeBook, RecipeBookEntry, RecipeImport, ShareLink, ShoppingList, - ShoppingListEntry, ShoppingListRecipe, Step, Storage, Supermarket, - SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit, - UserFile, UserPreference, ViewLog, Space, UserSpace, InviteLink) + ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage, + Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, + SyncLog, Unit, UserFile, UserPreference, UserSpace, ViewLog) from cookbook.templatetags.custom_tags import markdown -from recipes.settings import MEDIA_URL, AWS_ENABLED +from recipes.settings import AWS_ENABLED, MEDIA_URL class ExtendedRecipeMixin(serializers.ModelSerializer): @@ -193,7 +193,8 @@ class SpaceSerializer(WritableNestedModelSerializer): class Meta: model = Space - fields = ('id', 'name', 'created_by', 'created_at', 'message', 'max_recipes', 'max_file_storage_mb', 'max_users', 'allow_sharing', 'demo', 'food_inherit', 'show_facet_count', 'user_count', 'recipe_count', 'file_size_mb',) + fields = ('id', 'name', 'created_by', 'created_at', 'message', 'max_recipes', 'max_file_storage_mb', 'max_users', + 'allow_sharing', 'demo', 'food_inherit', 'show_facet_count', 'user_count', 'recipe_count', 'file_size_mb',) read_only_fields = ('id', 'created_by', 'created_at', 'max_recipes', 'max_file_storage_mb', 'max_users', 'allow_sharing', 'demo',) @@ -815,7 +816,7 @@ class RecipeBookEntrySerializer(serializers.ModelSerializer): book = validated_data['book'] recipe = validated_data['recipe'] if not book.get_owner() == self.context['request'].user and not self.context[ - 'request'].user in book.get_shared(): + 'request'].user in book.get_shared(): raise NotFound(detail=None, code=None) obj, created = RecipeBookEntry.objects.get_or_create(book=book, recipe=recipe) return obj @@ -871,11 +872,11 @@ class ShoppingListRecipeSerializer(serializers.ModelSerializer): value = value.quantize( Decimal(1)) if value == value.to_integral() else value.normalize() # strips trailing zero return ( - obj.name - or getattr(obj.mealplan, 'title', None) - or (d := getattr(obj.mealplan, 'date', None)) and ': '.join([obj.mealplan.recipe.name, str(d)]) - or obj.recipe.name - ) + f' ({value:.2g})' + obj.name + or getattr(obj.mealplan, 'title', None) + or (d := getattr(obj.mealplan, 'date', None)) and ': '.join([obj.mealplan.recipe.name, str(d)]) + or obj.recipe.name + ) + f' ({value:.2g})' def update(self, instance, validated_data): # TODO remove once old shopping list @@ -1232,6 +1233,6 @@ class FoodShoppingUpdateSerializer(serializers.ModelSerializer): # non model serializers class RecipeFromSourceSerializer(serializers.Serializer): - url = serializers.CharField(max_length=4096, required=False, allow_null=True) + url = serializers.CharField(max_length=4096, required=False, allow_null=True, allow_blank=True) data = serializers.CharField(required=False, allow_null=True, allow_blank=True) bookmarklet = serializers.IntegerField(required=False, allow_null=True, ) diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 7a49261b..9b077b5c 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -9,16 +9,14 @@ from zipfile import ZipFile import requests import validators -from PIL import UnidentifiedImageError from annoying.decorators import ajax_request from annoying.functions import get_object_or_None from django.contrib import messages -from django.contrib.auth.models import User, Group +from django.contrib.auth.models import Group, User from django.contrib.postgres.search import TrigramSimilarity from django.core.exceptions import FieldError, ValidationError from django.core.files import File -from django.db.models import (Case, Count, Exists, OuterRef, ProtectedError, Q, - Subquery, Value, When) +from django.db.models import Case, Count, Exists, OuterRef, ProtectedError, Q, Subquery, Value, When from django.db.models.fields.related import ForeignObjectRel from django.db.models.functions import Coalesce, Lower from django.http import FileResponse, HttpResponse, JsonResponse @@ -27,6 +25,7 @@ from django.urls import reverse from django.utils.translation import gettext as _ from django_scopes import scopes_disabled from icalendar import Calendar, Event +from PIL import UnidentifiedImageError from requests.exceptions import MissingSchema from rest_framework import decorators, status, viewsets from rest_framework.authtoken.models import Token @@ -45,39 +44,42 @@ from cookbook.helper.HelperFunctions import str2bool from cookbook.helper.image_processing import handle_image from cookbook.helper.ingredient_parser import IngredientParser from cookbook.helper.permission_helper import (CustomIsAdmin, CustomIsGuest, CustomIsOwner, - CustomIsShare, CustomIsShared, CustomIsUser, - group_required, CustomIsSpaceOwner, switch_user_active_space, is_space_owner, CustomIsOwnerReadOnly) + CustomIsOwnerReadOnly, CustomIsShare, CustomIsShared, + CustomIsSpaceOwner, CustomIsUser, group_required, + is_space_owner, switch_user_active_space) from cookbook.helper.recipe_html_import import get_recipe_from_source from cookbook.helper.recipe_search import RecipeFacet, RecipeSearch, old_search from cookbook.helper.recipe_url_import import get_from_youtube_scraper from cookbook.helper.shopping_helper import RecipeShoppingEditor, shopping_helper from cookbook.models import (Automation, BookmarkletImport, CookLog, CustomFilter, ExportLog, Food, - FoodInheritField, ImportLog, Ingredient, Keyword, MealPlan, MealType, - Recipe, RecipeBook, RecipeBookEntry, ShareLink, ShoppingList, - ShoppingListEntry, ShoppingListRecipe, Step, Storage, Supermarket, - SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit, - UserFile, UserPreference, ViewLog, Space, UserSpace, InviteLink) + FoodInheritField, ImportLog, Ingredient, InviteLink, Keyword, MealPlan, + MealType, Recipe, RecipeBook, RecipeBookEntry, ShareLink, ShoppingList, + ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage, + Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, + SyncLog, Unit, UserFile, UserPreference, UserSpace, ViewLog) from cookbook.provider.dropbox import Dropbox from cookbook.provider.local import Local from cookbook.provider.nextcloud import Nextcloud from cookbook.schemas import FilterSchema, QueryParam, QueryParamAutoSchema, TreeSchema -from cookbook.serializer import (AutomationSerializer, BookmarkletImportSerializer, - CookLogSerializer, CustomFilterSerializer, ExportLogSerializer, +from cookbook.serializer import (AutomationSerializer, BookmarkletImportListSerializer, + BookmarkletImportSerializer, CookLogSerializer, + CustomFilterSerializer, ExportLogSerializer, FoodInheritFieldSerializer, FoodSerializer, - FoodShoppingUpdateSerializer, ImportLogSerializer, - IngredientSerializer, KeywordSerializer, MealPlanSerializer, + FoodShoppingUpdateSerializer, GroupSerializer, ImportLogSerializer, + IngredientSerializer, IngredientSimpleSerializer, + InviteLinkSerializer, KeywordSerializer, MealPlanSerializer, MealTypeSerializer, RecipeBookEntrySerializer, - RecipeBookSerializer, RecipeImageSerializer, - RecipeOverviewSerializer, RecipeSerializer, + RecipeBookSerializer, RecipeFromSourceSerializer, + RecipeImageSerializer, RecipeOverviewSerializer, RecipeSerializer, RecipeShoppingUpdateSerializer, RecipeSimpleSerializer, ShoppingListAutoSyncSerializer, ShoppingListEntrySerializer, ShoppingListRecipeSerializer, ShoppingListSerializer, - StepSerializer, StorageSerializer, + SpaceSerializer, StepSerializer, StorageSerializer, SupermarketCategoryRelationSerializer, SupermarketCategorySerializer, SupermarketSerializer, SyncLogSerializer, SyncSerializer, UnitSerializer, UserFileSerializer, UserNameSerializer, UserPreferenceSerializer, - ViewLogSerializer, IngredientSimpleSerializer, BookmarkletImportListSerializer, RecipeFromSourceSerializer, SpaceSerializer, UserSpaceSerializer, GroupSerializer, InviteLinkSerializer) + UserSpaceSerializer, ViewLogSerializer) from recipes import settings @@ -713,7 +715,7 @@ class RecipeViewSet(viewsets.ModelViewSet): 'Query string matched (fuzzy) against recipe name. In the future also fulltext search.')), QueryParam(name='keywords', description=_( 'ID of keyword a recipe should have. For multiple repeat parameter. Equivalent to keywords_or'), - qtype='int'), + qtype='int'), QueryParam(name='keywords_or', description=_('Keyword IDs, repeat for multiple. Return recipes with any of the keywords'), qtype='int'), @@ -1118,25 +1120,22 @@ def recipe_from_source(request): """ serializer = RecipeFromSourceSerializer(data=request.data) if serializer.is_valid(): - try: - if bookmarklet := BookmarkletImport.objects.filter(pk=serializer.validated_data['bookmarklet']).first(): - serializer.validated_data['url'] = bookmarklet.url - serializer.validated_data['data'] = bookmarklet.html - bookmarklet.delete() - except KeyError: - pass - # headers to use for request to external sites external_request_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"} - if not 'url' in serializer.validated_data and not 'data' in serializer.validated_data: + if (b_pk := serializer.validated_data.get('bookmarklet', None)) and (bookmarklet := BookmarkletImport.objects.filter(pk=b_pk).first()): + serializer.validated_data['url'] = bookmarklet.url + serializer.validated_data['data'] = bookmarklet.html + bookmarklet.delete() + + elif not 'url' in serializer.validated_data and not 'data' in serializer.validated_data: return Response({ 'error': True, 'msg': _('Nothing to do.') }, status=status.HTTP_400_BAD_REQUEST) # in manual mode request complete page to return it later - if 'url' in serializer.validated_data: + elif 'url' in serializer.validated_data and serializer.validated_data['url'] != '': if re.match('^(https?://)?(www\.youtube\.com|youtu\.be)/.+$', serializer.validated_data['url']): if validators.url(serializer.validated_data['url'], public=True): return Response({ From 25a41bd293873febcb57febdd0fb378852cc7086 Mon Sep 17 00:00:00 2001 From: smilerz Date: Thu, 7 Jul 2022 06:43:07 -0500 Subject: [PATCH 02/76] reverting scraper to just using wildmode --- cookbook/helper/recipe_html_import.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cookbook/helper/recipe_html_import.py b/cookbook/helper/recipe_html_import.py index 48dc4c11..c97629ef 100644 --- a/cookbook/helper/recipe_html_import.py +++ b/cookbook/helper/recipe_html_import.py @@ -6,7 +6,7 @@ from urllib.parse import unquote from bs4 import BeautifulSoup from bs4.element import Tag from recipe_scrapers import scrape_html, scrape_me -from recipe_scrapers._exceptions import NoSchemaFoundInWildMode, WebsiteNotImplementedError +from recipe_scrapers._exceptions import NoSchemaFoundInWildMode from recipe_scrapers._utils import get_host_name, normalize_string from cookbook.helper import recipe_url_import as helper @@ -70,12 +70,9 @@ def get_recipe_from_source(text, url, request): if url and not text: try: - scrape = scrape_me(url_path=url) - except WebsiteNotImplementedError: - try: - scrape = scrape_me(url_path=url, wild_mode=True) - except(NoSchemaFoundInWildMode): - pass + scrape = scrape_me(url_path=url, wild_mode=True) + except(NoSchemaFoundInWildMode): + pass if not scrape: try: parse_list.append(remove_graph(json.loads(text))) From b1c0334947d6b6c8c0fd59efff70ebda3984729e Mon Sep 17 00:00:00 2001 From: smilerz Date: Thu, 7 Jul 2022 07:50:57 -0500 Subject: [PATCH 03/76] quick hack to allow scraper to work correctly --- cookbook/helper/recipe_html_import.py | 2 ++ cookbook/views/api.py | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cookbook/helper/recipe_html_import.py b/cookbook/helper/recipe_html_import.py index c97629ef..62a057e2 100644 --- a/cookbook/helper/recipe_html_import.py +++ b/cookbook/helper/recipe_html_import.py @@ -73,6 +73,7 @@ def get_recipe_from_source(text, url, request): scrape = scrape_me(url_path=url, wild_mode=True) except(NoSchemaFoundInWildMode): pass + if not scrape: try: parse_list.append(remove_graph(json.loads(text))) @@ -101,6 +102,7 @@ def get_recipe_from_source(text, url, request): recipe_json = helper.get_from_scraper(scrape, request) + # TODO: DEPRECATE recipe_tree & html_data. first validate it isn't used anywhere for el in parse_list: temp_tree = [] if isinstance(el, Tag): diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 9b077b5c..4325fe38 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -1120,7 +1120,7 @@ def recipe_from_source(request): """ serializer = RecipeFromSourceSerializer(data=request.data) if serializer.is_valid(): - # headers to use for request to external sites + # headers to use for request to external sites - DEPRECATE external_request_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"} if (b_pk := serializer.validated_data.get('bookmarklet', None)) and (bookmarklet := BookmarkletImport.objects.filter(pk=b_pk).first()): @@ -1144,9 +1144,11 @@ def recipe_from_source(request): 'recipe_html': '', 'recipe_images': [], }, status=status.HTTP_200_OK) + ####### + # this section is redundant to scrape_me. REFACTOR to catch errors from scrape_me try: if validators.url(serializer.validated_data['url'], public=True): - serializer.validated_data['data'] = requests.get(serializer.validated_data['url'], headers=external_request_headers).content + requests.get(serializer.validated_data['url'], headers=external_request_headers).content else: return Response({ 'error': True, @@ -1162,6 +1164,7 @@ def recipe_from_source(request): 'error': True, 'msg': _('Bad URL Schema.') }, status=status.HTTP_400_BAD_REQUEST) + ####### recipe_json, recipe_tree, recipe_html, recipe_images = get_recipe_from_source(serializer.validated_data['data'], serializer.validated_data['url'], request) if len(recipe_tree) == 0 and len(recipe_json) == 0: From e40b73f420564dd927bd692f6d4df1055e30de07 Mon Sep 17 00:00:00 2001 From: smilerz Date: Thu, 7 Jul 2022 15:09:22 -0500 Subject: [PATCH 04/76] deprecate get_recipe_from_source --- cookbook/helper/recipe_html_import.py | 336 ++++++++++++------------- cookbook/helper/recipe_url_import.py | 35 ++- cookbook/helper/scrapers/scrapers.py | 10 +- cookbook/integration/cookbookapp.py | 9 +- cookbook/integration/copymethat.py | 3 +- cookbook/views/api.py | 95 ++++--- vue/src/apps/ImportView/ImportView.vue | 12 +- 7 files changed, 272 insertions(+), 228 deletions(-) diff --git a/cookbook/helper/recipe_html_import.py b/cookbook/helper/recipe_html_import.py index 62a057e2..95f115b7 100644 --- a/cookbook/helper/recipe_html_import.py +++ b/cookbook/helper/recipe_html_import.py @@ -1,191 +1,191 @@ -import json -import re -from json import JSONDecodeError -from urllib.parse import unquote +# import json +# import re +# from json import JSONDecodeError +# from urllib.parse import unquote -from bs4 import BeautifulSoup -from bs4.element import Tag -from recipe_scrapers import scrape_html, scrape_me -from recipe_scrapers._exceptions import NoSchemaFoundInWildMode -from recipe_scrapers._utils import get_host_name, normalize_string +# from bs4 import BeautifulSoup +# from bs4.element import Tag +# from recipe_scrapers import scrape_html, scrape_me +# from recipe_scrapers._exceptions import NoSchemaFoundInWildMode +# from recipe_scrapers._utils import get_host_name, normalize_string -from cookbook.helper import recipe_url_import as helper -from cookbook.helper.scrapers.scrapers import text_scraper +# from cookbook.helper import recipe_url_import as helper +# from cookbook.helper.scrapers.scrapers import text_scraper -def get_recipe_from_source(text, url, request): - def build_node(k, v): - if isinstance(v, dict): - node = { - 'name': k, - 'value': k, - 'children': get_children_dict(v) - } - elif isinstance(v, list): - node = { - 'name': k, - 'value': k, - 'children': get_children_list(v) - } - else: - node = { - 'name': k + ": " + normalize_string(str(v)), - 'value': normalize_string(str(v)) - } - return node +# def get_recipe_from_source(text, url, request): +# def build_node(k, v): +# if isinstance(v, dict): +# node = { +# 'name': k, +# 'value': k, +# 'children': get_children_dict(v) +# } +# elif isinstance(v, list): +# node = { +# 'name': k, +# 'value': k, +# 'children': get_children_list(v) +# } +# else: +# node = { +# 'name': k + ": " + normalize_string(str(v)), +# 'value': normalize_string(str(v)) +# } +# return node - def get_children_dict(children): - kid_list = [] - for k, v in children.items(): - kid_list.append(build_node(k, v)) - return kid_list +# def get_children_dict(children): +# kid_list = [] +# for k, v in children.items(): +# kid_list.append(build_node(k, v)) +# return kid_list - def get_children_list(children): - kid_list = [] - for kid in children: - if type(kid) == list: - node = { - 'name': "unknown list", - 'value': "unknown list", - 'children': get_children_list(kid) - } - kid_list.append(node) - elif type(kid) == dict: - for k, v in kid.items(): - kid_list.append(build_node(k, v)) - else: - kid_list.append({ - 'name': normalize_string(str(kid)), - 'value': normalize_string(str(kid)) - }) - return kid_list +# def get_children_list(children): +# kid_list = [] +# for kid in children: +# if type(kid) == list: +# node = { +# 'name': "unknown list", +# 'value': "unknown list", +# 'children': get_children_list(kid) +# } +# kid_list.append(node) +# elif type(kid) == dict: +# for k, v in kid.items(): +# kid_list.append(build_node(k, v)) +# else: +# kid_list.append({ +# 'name': normalize_string(str(kid)), +# 'value': normalize_string(str(kid)) +# }) +# return kid_list - recipe_tree = [] - parse_list = [] - soup = BeautifulSoup(text, "html.parser") - html_data = get_from_html(soup) - images = get_images_from_source(soup, url) - text = unquote(text) - scrape = None +# recipe_tree = [] +# parse_list = [] +# soup = BeautifulSoup(text, "html.parser") +# html_data = get_from_html(soup) +# images = get_images_from_source(soup, url) +# text = unquote(text) +# scrape = None - if url and not text: - try: - scrape = scrape_me(url_path=url, wild_mode=True) - except(NoSchemaFoundInWildMode): - pass +# if url and not text: +# try: +# scrape = scrape_me(url_path=url, wild_mode=True) +# except(NoSchemaFoundInWildMode): +# pass - if not scrape: - try: - parse_list.append(remove_graph(json.loads(text))) - if not url and 'url' in parse_list[0]: - url = parse_list[0]['url'] - scrape = text_scraper("", url=url) +# if not scrape: +# try: +# parse_list.append(remove_graph(json.loads(text))) +# if not url and 'url' in parse_list[0]: +# url = parse_list[0]['url'] +# scrape = text_scraper("", url=url) - except JSONDecodeError: - for el in soup.find_all('script', type='application/ld+json'): - el = remove_graph(el) - if not url and 'url' in el: - url = el['url'] - if type(el) == list: - for le in el: - parse_list.append(le) - elif type(el) == dict: - parse_list.append(el) - for el in soup.find_all(type='application/json'): - el = remove_graph(el) - if type(el) == list: - for le in el: - parse_list.append(le) - elif type(el) == dict: - parse_list.append(el) - scrape = text_scraper(text, url=url) +# except JSONDecodeError: +# for el in soup.find_all('script', type='application/ld+json'): +# el = remove_graph(el) +# if not url and 'url' in el: +# url = el['url'] +# if type(el) == list: +# for le in el: +# parse_list.append(le) +# elif type(el) == dict: +# parse_list.append(el) +# for el in soup.find_all(type='application/json'): +# el = remove_graph(el) +# if type(el) == list: +# for le in el: +# parse_list.append(le) +# elif type(el) == dict: +# parse_list.append(el) +# scrape = text_scraper(text, url=url) - recipe_json = helper.get_from_scraper(scrape, request) +# recipe_json = helper.get_from_scraper(scrape, request) - # TODO: DEPRECATE recipe_tree & html_data. first validate it isn't used anywhere - for el in parse_list: - temp_tree = [] - if isinstance(el, Tag): - try: - el = json.loads(el.string) - except TypeError: - continue +# # TODO: DEPRECATE recipe_tree & html_data. first validate it isn't used anywhere +# for el in parse_list: +# temp_tree = [] +# if isinstance(el, Tag): +# try: +# el = json.loads(el.string) +# except TypeError: +# continue - for k, v in el.items(): - if isinstance(v, dict): - node = { - 'name': k, - 'value': k, - 'children': get_children_dict(v) - } - elif isinstance(v, list): - node = { - 'name': k, - 'value': k, - 'children': get_children_list(v) - } - else: - node = { - 'name': k + ": " + normalize_string(str(v)), - 'value': normalize_string(str(v)) - } - temp_tree.append(node) +# for k, v in el.items(): +# if isinstance(v, dict): +# node = { +# 'name': k, +# 'value': k, +# 'children': get_children_dict(v) +# } +# elif isinstance(v, list): +# node = { +# 'name': k, +# 'value': k, +# 'children': get_children_list(v) +# } +# else: +# node = { +# 'name': k + ": " + normalize_string(str(v)), +# 'value': normalize_string(str(v)) +# } +# temp_tree.append(node) - if '@type' in el and el['@type'] == 'Recipe': - recipe_tree += [{'name': 'ld+json', 'children': temp_tree}] - else: - recipe_tree += [{'name': 'json', 'children': temp_tree}] +# if '@type' in el and el['@type'] == 'Recipe': +# recipe_tree += [{'name': 'ld+json', 'children': temp_tree}] +# else: +# recipe_tree += [{'name': 'json', 'children': temp_tree}] - return recipe_json, recipe_tree, html_data, images +# return recipe_json, recipe_tree, html_data, images -def get_from_html(soup): - INVISIBLE_ELEMS = ('style', 'script', 'head', 'title') - html = [] - for s in soup.strings: - if ((s.parent.name not in INVISIBLE_ELEMS) and (len(s.strip()) > 0)): - html.append(s) - return html +# def get_from_html(soup): +# INVISIBLE_ELEMS = ('style', 'script', 'head', 'title') +# html = [] +# for s in soup.strings: +# if ((s.parent.name not in INVISIBLE_ELEMS) and (len(s.strip()) > 0)): +# html.append(s) +# return html -def get_images_from_source(soup, url): - sources = ['src', 'srcset', 'data-src'] - images = [] - img_tags = soup.find_all('img') - if url: - site = get_host_name(url) - prot = url.split(':')[0] +# def get_images_from_source(soup, url): +# sources = ['src', 'srcset', 'data-src'] +# images = [] +# img_tags = soup.find_all('img') +# if url: +# site = get_host_name(url) +# prot = url.split(':')[0] - urls = [] - for img in img_tags: - for src in sources: - try: - urls.append(img[src]) - except KeyError: - pass +# urls = [] +# for img in img_tags: +# for src in sources: +# try: +# urls.append(img[src]) +# except KeyError: +# pass - for u in urls: - u = u.split('?')[0] - filename = re.search(r'/([\w_-]+[.](jpg|jpeg|gif|png))$', u) - if filename: - if (('http' not in u) and (url)): - # sometimes an image source can be relative - # if it is provide the base url - u = '{}://{}{}'.format(prot, site, u) - if 'http' in u: - images.append(u) - return images +# for u in urls: +# u = u.split('?')[0] +# filename = re.search(r'/([\w_-]+[.](jpg|jpeg|gif|png))$', u) +# if filename: +# if (('http' not in u) and (url)): +# # sometimes an image source can be relative +# # if it is provide the base url +# u = '{}://{}{}'.format(prot, site, u) +# if 'http' in u: +# images.append(u) +# return images -def remove_graph(el): - # recipes type might be wrapped in @graph type - if isinstance(el, Tag): - try: - el = json.loads(el.string) - if '@graph' in el: - for x in el['@graph']: - if '@type' in x and x['@type'] == 'Recipe': - el = x - except (TypeError, JSONDecodeError): - pass - return el +# def remove_graph(el): +# # recipes type might be wrapped in @graph type +# if isinstance(el, Tag): +# try: +# el = json.loads(el.string) +# if '@graph' in el: +# for x in el['@graph']: +# if '@type' in x and x['@type'] == 'Recipe': +# el = x +# except (TypeError, JSONDecodeError): +# pass +# return el diff --git a/cookbook/helper/recipe_url_import.py b/cookbook/helper/recipe_url_import.py index aa3cc5cf..cec57e72 100644 --- a/cookbook/helper/recipe_url_import.py +++ b/cookbook/helper/recipe_url_import.py @@ -1,21 +1,19 @@ import random import re from html import unescape - -from pytube import YouTube from unicodedata import decomposition from django.utils.dateparse import parse_duration from django.utils.translation import gettext as _ from isodate import parse_duration as iso_parse_duration from isodate.isoerror import ISO8601Error -from recipe_scrapers._utils import get_minutes +from pytube import YouTube +from recipe_scrapers._utils import get_host_name, get_minutes from cookbook.helper import recipe_url_import as helper from cookbook.helper.ingredient_parser import IngredientParser from cookbook.models import Keyword - # from recipe_scrapers._utils import get_minutes ## temporary until/unless upstream incorporates get_minutes() PR @@ -369,3 +367,32 @@ def iso_duration_to_minutes(string): string ).groupdict() return int(match['days'] or 0) * 24 * 60 + int(match['hours'] or 0) * 60 + int(match['minutes'] or 0) + + +def get_images_from_soup(soup, url): + sources = ['src', 'srcset', 'data-src'] + images = [] + img_tags = soup.find_all('img') + if url: + site = get_host_name(url) + prot = url.split(':')[0] + + urls = [] + for img in img_tags: + for src in sources: + try: + urls.append(img[src]) + except KeyError: + pass + + for u in urls: + u = u.split('?')[0] + filename = re.search(r'/([\w_-]+[.](jpg|jpeg|gif|png))$', u) + if filename: + if (('http' not in u) and (url)): + # sometimes an image source can be relative + # if it is provide the base url + u = '{}://{}{}'.format(prot, site, u) + if 'http' in u: + images.append(u) + return images diff --git a/cookbook/helper/scrapers/scrapers.py b/cookbook/helper/scrapers/scrapers.py index 94e3daea..7d6c08b1 100644 --- a/cookbook/helper/scrapers/scrapers.py +++ b/cookbook/helper/scrapers/scrapers.py @@ -27,17 +27,17 @@ def text_scraper(text, url=None): class TextScraper(scraper_class): def __init__( self, - page_data, - url=None + html=None, + url=None, ): self.wild_mode = False self.meta_http_equiv = False - self.soup = BeautifulSoup(page_data, "html.parser") + self.soup = BeautifulSoup(html, "html.parser") self.url = url self.recipe = None try: - self.schema = SchemaOrg(page_data) + self.schema = SchemaOrg(html) except (JSONDecodeError, AttributeError): pass - return TextScraper(text, url) + return TextScraper(url=url, html=text) diff --git a/cookbook/integration/cookbookapp.py b/cookbook/integration/cookbookapp.py index f22e9d45..7ff50ab6 100644 --- a/cookbook/integration/cookbookapp.py +++ b/cookbook/integration/cookbookapp.py @@ -10,8 +10,8 @@ import validators import yaml from cookbook.helper.ingredient_parser import IngredientParser -from cookbook.helper.recipe_html_import import get_recipe_from_source -from cookbook.helper.recipe_url_import import iso_duration_to_minutes +from cookbook.helper.recipe_url_import import get_images_from_soup, iso_duration_to_minutes +from cookbook.helper.scrapers.scrapers import text_scraper from cookbook.integration.integration import Integration from cookbook.models import Ingredient, Keyword, Recipe, Step @@ -24,7 +24,10 @@ class CookBookApp(Integration): def get_recipe_from_file(self, file): recipe_html = file.getvalue().decode("utf-8") - recipe_json, recipe_tree, html_data, images = get_recipe_from_source(recipe_html, 'CookBookApp', self.request) + # recipe_json, recipe_tree, html_data, images = get_recipe_from_source(recipe_html, 'CookBookApp', self.request) + scrape = text_scraper(text=data) + recipe_json = helper.get_from_scraper(scrape, request) + images = list(dict.fromkeys(get_images_from_soup(scrape.soup, url))) recipe = Recipe.objects.create( name=recipe_json['name'].strip(), diff --git a/cookbook/integration/copymethat.py b/cookbook/integration/copymethat.py index 7a2a532f..2a9c5652 100644 --- a/cookbook/integration/copymethat.py +++ b/cookbook/integration/copymethat.py @@ -3,10 +3,9 @@ from io import BytesIO from zipfile import ZipFile from bs4 import BeautifulSoup - from django.utils.translation import gettext as _ + from cookbook.helper.ingredient_parser import IngredientParser -from cookbook.helper.recipe_html_import import get_recipe_from_source from cookbook.helper.recipe_url_import import iso_duration_to_minutes, parse_servings from cookbook.integration.integration import Integration from cookbook.models import Ingredient, Keyword, Recipe, Step diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 4325fe38..54df51bf 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -5,6 +5,8 @@ import re import traceback import uuid from collections import OrderedDict +from json import JSONDecodeError +from urllib.parse import unquote from zipfile import ZipFile import requests @@ -26,6 +28,8 @@ from django.utils.translation import gettext as _ from django_scopes import scopes_disabled from icalendar import Calendar, Event from PIL import UnidentifiedImageError +from recipe_scrapers import scrape_html, scrape_me +from recipe_scrapers._exceptions import NoSchemaFoundInWildMode from requests.exceptions import MissingSchema from rest_framework import decorators, status, viewsets from rest_framework.authtoken.models import Token @@ -40,6 +44,7 @@ from rest_framework.throttling import AnonRateThrottle from rest_framework.viewsets import ViewSetMixin from treebeard.exceptions import InvalidMoveToDescendant, InvalidPosition, PathOverflow +from cookbook.helper import recipe_url_import as helper from cookbook.helper.HelperFunctions import str2bool from cookbook.helper.image_processing import handle_image from cookbook.helper.ingredient_parser import IngredientParser @@ -47,9 +52,9 @@ from cookbook.helper.permission_helper import (CustomIsAdmin, CustomIsGuest, Cus CustomIsOwnerReadOnly, CustomIsShare, CustomIsShared, CustomIsSpaceOwner, CustomIsUser, group_required, is_space_owner, switch_user_active_space) -from cookbook.helper.recipe_html_import import get_recipe_from_source from cookbook.helper.recipe_search import RecipeFacet, RecipeSearch, old_search -from cookbook.helper.recipe_url_import import get_from_youtube_scraper +from cookbook.helper.recipe_url_import import get_from_youtube_scraper, get_images_from_soup +from cookbook.helper.scrapers.scrapers import text_scraper from cookbook.helper.shopping_helper import RecipeShoppingEditor, shopping_helper from cookbook.models import (Automation, BookmarkletImport, CookLog, CustomFilter, ExportLog, Food, FoodInheritField, ImportLog, Ingredient, InviteLink, Keyword, MealPlan, @@ -1116,69 +1121,79 @@ def recipe_from_source(request): - url: url to use for importing recipe - data: if no url is given recipe is imported from provided source data - (optional) bookmarklet: id of bookmarklet import to use, overrides URL and data attributes - :return: JsonResponse containing the parsed json, original html,json and images + :return: JsonResponse containing the parsed json and images """ + scrape = None serializer = RecipeFromSourceSerializer(data=request.data) if serializer.is_valid(): - # headers to use for request to external sites - DEPRECATE - external_request_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"} if (b_pk := serializer.validated_data.get('bookmarklet', None)) and (bookmarklet := BookmarkletImport.objects.filter(pk=b_pk).first()): serializer.validated_data['url'] = bookmarklet.url serializer.validated_data['data'] = bookmarklet.html bookmarklet.delete() - elif not 'url' in serializer.validated_data and not 'data' in serializer.validated_data: + url = serializer.validated_data.get('url', None) + data = unquote(serializer.validated_data.get('data', None)) + if not url and not data: return Response({ 'error': True, 'msg': _('Nothing to do.') }, status=status.HTTP_400_BAD_REQUEST) - # in manual mode request complete page to return it later - elif 'url' in serializer.validated_data and serializer.validated_data['url'] != '': - if re.match('^(https?://)?(www\.youtube\.com|youtu\.be)/.+$', serializer.validated_data['url']): - if validators.url(serializer.validated_data['url'], public=True): + elif url and not data: + if re.match('^(https?://)?(www\.youtube\.com|youtu\.be)/.+$', url): + if validators.url(url, public=True): return Response({ - 'recipe_json': get_from_youtube_scraper(serializer.validated_data['url'], request), - 'recipe_tree': '', - 'recipe_html': '', + 'recipe_json': get_from_youtube_scraper(url, request), + # 'recipe_tree': '', + # 'recipe_html': '', 'recipe_images': [], }, status=status.HTTP_200_OK) - ####### - # this section is redundant to scrape_me. REFACTOR to catch errors from scrape_me - try: - if validators.url(serializer.validated_data['url'], public=True): - requests.get(serializer.validated_data['url'], headers=external_request_headers).content - else: + else: + try: + if validators.url(url, public=True): + scrape = scrape_me(url_path=url, wild_mode=True) + + else: + return Response({ + 'error': True, + 'msg': _('Invalid Url') + }, status=status.HTTP_400_BAD_REQUEST) + except NoSchemaFoundInWildMode: + pass + except requests.exceptions.ConnectionError: return Response({ 'error': True, - 'msg': _('Invalid Url') + 'msg': _('Connection Refused.') }, status=status.HTTP_400_BAD_REQUEST) - except requests.exceptions.ConnectionError: - return Response({ - 'error': True, - 'msg': _('Connection Refused.') - }, status=status.HTTP_400_BAD_REQUEST) - except requests.exceptions.MissingSchema: - return Response({ - 'error': True, - 'msg': _('Bad URL Schema.') - }, status=status.HTTP_400_BAD_REQUEST) - ####### + except requests.exceptions.MissingSchema: + return Response({ + 'error': True, + 'msg': _('Bad URL Schema.') + }, status=status.HTTP_400_BAD_REQUEST) + else: + try: + json.loads(data) + data = "" + except JSONDecodeError: + pass + scrape = text_scraper(text=data, url=url) + if not url and (found_url := scrape.schema.data.get('url', None)): + scrape = text_scraper(text=data, url=found_url) - recipe_json, recipe_tree, recipe_html, recipe_images = get_recipe_from_source(serializer.validated_data['data'], serializer.validated_data['url'], request) - if len(recipe_tree) == 0 and len(recipe_json) == 0: + if scrape: + return Response({ + 'recipe_json': helper.get_from_scraper(scrape, request), + # 'recipe_tree': recipe_tree, + # 'recipe_html': recipe_html, + 'recipe_images': list(dict.fromkeys(get_images_from_soup(scrape.soup, url))), + }, status=status.HTTP_200_OK) + + else: return Response({ 'error': True, 'msg': _('No usable data could be found.') }, status=status.HTTP_400_BAD_REQUEST) - else: - return Response({ - 'recipe_json': recipe_json, - 'recipe_tree': recipe_tree, - 'recipe_html': recipe_html, - 'recipe_images': list(dict.fromkeys(recipe_images)), - }, status=status.HTTP_200_OK) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) diff --git a/vue/src/apps/ImportView/ImportView.vue b/vue/src/apps/ImportView/ImportView.vue index 40766492..4b2ed0ff 100644 --- a/vue/src/apps/ImportView/ImportView.vue +++ b/vue/src/apps/ImportView/ImportView.vue @@ -461,8 +461,8 @@ export default { recent_urls: [], source_data: '', recipe_json: undefined, - recipe_html: undefined, - recipe_tree: undefined, + // recipe_html: undefined, + // recipe_tree: undefined, recipe_images: [], imported_recipes: [], failed_imports: [], @@ -593,9 +593,9 @@ export default { } // reset all variables - this.recipe_html = undefined + // this.recipe_html = undefined this.recipe_json = undefined - this.recipe_tree = undefined + // this.recipe_tree = undefined this.recipe_images = [] // load recipe @@ -621,8 +621,8 @@ export default { return x }) - this.recipe_tree = response.data['recipe_tree']; - this.recipe_html = response.data['recipe_html']; + // this.recipe_tree = response.data['recipe_tree']; + // this.recipe_html = response.data['recipe_html']; this.recipe_images = response.data['recipe_images'] !== undefined ? response.data['recipe_images'] : []; if (!silent) { From b44bb552e0aefe7770f5b8f1ff806919f6733fd3 Mon Sep 17 00:00:00 2001 From: Kalli_1 Date: Sat, 9 Jul 2022 07:51:04 +0000 Subject: [PATCH 05/76] Translated using Weblate (German) Currently translated at 96.9% (414 of 427 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/ --- vue/src/locales/de.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/de.json b/vue/src/locales/de.json index bcab6ff3..ac12cfe0 100644 --- a/vue/src/locales/de.json +++ b/vue/src/locales/de.json @@ -406,5 +406,12 @@ "Import_Error": "Es ist ein Fehler beim Importieren aufgetreten. Bitte sieh dir die ausgeklappten Details unten auf der Seite an.", "Warning_Delete_Supermarket_Category": "Die Löschung einer Supermarktkategorie werden auch alle Beziehungen zu Lebensmitteln gelöscht. Bist du dir sicher?", "New_Supermarket": "Erstelle einen neuen Supermarkt", - "New_Supermarket_Category": "Erstelle eine neue Supermarktkategorie" + "New_Supermarket_Category": "Erstelle eine neue Supermarktkategorie", + "warning_space_delete": "Sie können ihren Space mit allen Rezepten, Einkaufslisten, Essensplänen und allem andren löschen. Dieser Vorgang kann nicht Rückgängig gemacht werden! Sind Sie sicher?", + "Copy Link": "Link kopieren", + "Users": "Benutzer", + "facet_count_info": "Die Anzahl an Rezepten im Suchfilter anzeigen.", + "Copy Token": "Token kopieren", + "Invites": "Einladungen", + "Message": "Nachricht" } From 9eaf0f9530426f5644cd1b8ceefc9bbd95e9df81 Mon Sep 17 00:00:00 2001 From: Mike Miller Date: Sat, 9 Jul 2022 07:52:36 +0000 Subject: [PATCH 06/76] Translated using Weblate (German) Currently translated at 96.9% (414 of 427 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/ --- vue/src/locales/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/de.json b/vue/src/locales/de.json index ac12cfe0..e397f094 100644 --- a/vue/src/locales/de.json +++ b/vue/src/locales/de.json @@ -413,5 +413,7 @@ "facet_count_info": "Die Anzahl an Rezepten im Suchfilter anzeigen.", "Copy Token": "Token kopieren", "Invites": "Einladungen", - "Message": "Nachricht" + "Message": "Nachricht", + "Bookmarklet": "Lesezeichen", + "substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen." } From 608039b7e40b783c78c258e439524c6d4109c06f Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 11 Jul 2022 14:46:54 +0200 Subject: [PATCH 07/76] cookbookapp importer more or less broken (more) --- cookbook/integration/cookbookapp.py | 9 ++++--- .../ImportResponseView/ImportResponseView.vue | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/cookbook/integration/cookbookapp.py b/cookbook/integration/cookbookapp.py index 7ff50ab6..46e6d7bf 100644 --- a/cookbook/integration/cookbookapp.py +++ b/cookbook/integration/cookbookapp.py @@ -10,7 +10,7 @@ import validators import yaml from cookbook.helper.ingredient_parser import IngredientParser -from cookbook.helper.recipe_url_import import get_images_from_soup, iso_duration_to_minutes +from cookbook.helper.recipe_url_import import get_images_from_soup, iso_duration_to_minutes, get_from_scraper from cookbook.helper.scrapers.scrapers import text_scraper from cookbook.integration.integration import Integration from cookbook.models import Ingredient, Keyword, Recipe, Step @@ -25,9 +25,9 @@ class CookBookApp(Integration): recipe_html = file.getvalue().decode("utf-8") # recipe_json, recipe_tree, html_data, images = get_recipe_from_source(recipe_html, 'CookBookApp', self.request) - scrape = text_scraper(text=data) - recipe_json = helper.get_from_scraper(scrape, request) - images = list(dict.fromkeys(get_images_from_soup(scrape.soup, url))) + scrape = text_scraper(text=recipe_html) + recipe_json = get_from_scraper(scrape, self.request) + images = list(dict.fromkeys(get_images_from_soup(scrape.soup, None))) recipe = Recipe.objects.create( name=recipe_json['name'].strip(), @@ -45,6 +45,7 @@ class CookBookApp(Integration): except Exception: pass + step = Step.objects.create(instruction=recipe_json['recipeInstructions'], space=self.request.space, ) if 'nutrition' in recipe_json: diff --git a/vue/src/apps/ImportResponseView/ImportResponseView.vue b/vue/src/apps/ImportResponseView/ImportResponseView.vue index 9101e745..e51b4b57 100644 --- a/vue/src/apps/ImportResponseView/ImportResponseView.vue +++ b/vue/src/apps/ImportResponseView/ImportResponseView.vue @@ -69,7 +69,9 @@ v-if="recipe.imported !== undefined && recipe.imported" target="_blank">{{ recipe.recipe_name - }} {{ recipe.recipe_name }} + }} {{ recipe.recipe_name }} {{ index + 1 }}

@@ -212,16 +214,19 @@ export default { } if (out.info !== '') { let items = out.info.split(/:(.*)/s)[1] - items = items.split(",") - out.duplicates_total = items.length - out.recipes.forEach((recipe) => { - recipe.imported = true - items.forEach((item) => { - if (recipe.recipe_name === item.trim()) { - recipe.imported = false - } + if (items !== undefined) { + items = items.split(",") + out.duplicates_total = items.length + out.recipes.forEach((recipe) => { + recipe.imported = true + items.forEach((item) => { + if (recipe.recipe_name === item.trim()) { + recipe.imported = false + } + }) }) - }) + } + } else { if (out.imported_total > 0) { out.recipes.forEach((recipe) => { From 17f3da5a37fdb31ed1523596d218eed20da4ac24 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 11 Jul 2022 14:54:00 +0200 Subject: [PATCH 08/76] removed dead invite link button from system page --- cookbook/templates/system.html | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/cookbook/templates/system.html b/cookbook/templates/system.html index 1d0424da..dd219577 100644 --- a/cookbook/templates/system.html +++ b/cookbook/templates/system.html @@ -11,19 +11,7 @@ {% block content %}

{% trans 'System' %}

- -
-
-
- -
-
-

{% trans 'Invite Links' %}

- {% trans 'Show Links' %} - -
-
- +


From eb0f231a80ac8927df02d7db055c8bc9654e901a Mon Sep 17 00:00:00 2001 From: Mikhail5555 Date: Mon, 11 Jul 2022 23:09:41 +0200 Subject: [PATCH 09/76] Create migration_sqlite-postgres.md --- docs/system/migration_sqlite-postgres.md | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docs/system/migration_sqlite-postgres.md diff --git a/docs/system/migration_sqlite-postgres.md b/docs/system/migration_sqlite-postgres.md new file mode 100644 index 00000000..9f9f87fe --- /dev/null +++ b/docs/system/migration_sqlite-postgres.md @@ -0,0 +1,44 @@ +# How to migrate from sqlite3 database to postgresql +This migration was written while using the unraid template (docker) for TandoorRecipes, version 1.3.0. +While some commands are unraid specific, it should in general work for any setup. + +1. Make a backup of your `/mnt/user/appdata/recipes` dir. + +2. Without changing any settings, get a shell into the docker through the WEB-UI or by running `docker exec -it TandoorRecipes /bin/sh` +```cmd +cd /opt/recipes +./venv/bin/python manage.py export -a > /data/dump.json +``` + +3. Create a Postgresql database (With a new user & database for recipes) + +I used the `postgresql14` template. + +```cmd +psql -U postgres +postgres=# create database tandoor; +postgres=# create user tandoor with encrypted password 'yoursupersecretpassworddontusethisone'; +postgres=# grant all privileges on database tandoor to tandoor; +``` + +4. Now its time to change some enviourment variables in TandoorRecipes template: +```env +DB_ENGINE=django.db.backends.postgresql // Database Engine, previous value: `django.db.backends.sqlite3` +POSTGRES_HOST= // PostgreSQL Host +POSTGRES_PORT=5432 // PostgreSQL Host +POSTGRES_USER=tandoor //PostgreSQL User +POSTGRES_PASSWORD=yoursupersecretpassworddyoudidntcopy // PostgreSQL Password +POSTGRES_DB=tandoor // Database, previous value: `/data/recipes.db` +``` + +5. Save it, and start the container once. + +It will perform all database migrations once for the postgresql database. + +6. Get a shell into the docker through the WEB-UI or by running `docker exec -it TandoorRecipes /bin/sh` +```cmd +cd /opt/recipes +./venv/bin/python manage.py import /data/dump.json +``` + +7. Enjoy your new fuzzy search options and SLIGHTLY performance increase! From aaa0520a6db363a37a01622667abdfc0870715eb Mon Sep 17 00:00:00 2001 From: Mikhail5555 Date: Mon, 11 Jul 2022 23:12:42 +0200 Subject: [PATCH 10/76] Update migration_sqlite-postgres.md --- docs/system/migration_sqlite-postgres.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system/migration_sqlite-postgres.md b/docs/system/migration_sqlite-postgres.md index 9f9f87fe..04dbc49c 100644 --- a/docs/system/migration_sqlite-postgres.md +++ b/docs/system/migration_sqlite-postgres.md @@ -4,7 +4,7 @@ While some commands are unraid specific, it should in general work for any setup 1. Make a backup of your `/mnt/user/appdata/recipes` dir. -2. Without changing any settings, get a shell into the docker through the WEB-UI or by running `docker exec -it TandoorRecipes /bin/sh` +2. Without changing any settings, get a shell into the TandoorRecipes docker through the Web-UI or by running `docker exec -it TandoorRecipes /bin/sh` ```cmd cd /opt/recipes ./venv/bin/python manage.py export -a > /data/dump.json From 9d6a5efa7289448c9a25089b7d3ff78ce698c0d8 Mon Sep 17 00:00:00 2001 From: Mikhail5555 Date: Mon, 11 Jul 2022 23:14:55 +0200 Subject: [PATCH 11/76] Update migration_sqlite-postgres.md --- docs/system/migration_sqlite-postgres.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/system/migration_sqlite-postgres.md b/docs/system/migration_sqlite-postgres.md index 04dbc49c..859447d3 100644 --- a/docs/system/migration_sqlite-postgres.md +++ b/docs/system/migration_sqlite-postgres.md @@ -23,12 +23,12 @@ postgres=# grant all privileges on database tandoor to tandoor; 4. Now its time to change some enviourment variables in TandoorRecipes template: ```env -DB_ENGINE=django.db.backends.postgresql // Database Engine, previous value: `django.db.backends.sqlite3` -POSTGRES_HOST= // PostgreSQL Host -POSTGRES_PORT=5432 // PostgreSQL Host -POSTGRES_USER=tandoor //PostgreSQL User -POSTGRES_PASSWORD=yoursupersecretpassworddyoudidntcopy // PostgreSQL Password -POSTGRES_DB=tandoor // Database, previous value: `/data/recipes.db` +DB_ENGINE=django.db.backends.postgresql # Database Engine, previous value: `django.db.backends.sqlite3` +POSTGRES_HOST= # PostgreSQL Host +POSTGRES_PORT=5432 # PostgreSQL Host +POSTGRES_USER=tandoor # PostgreSQL User +POSTGRES_PASSWORD=yoursupersecretpassworddyoudidntcopy # PostgreSQL Password +POSTGRES_DB=tandoor # Database, previous value: `/data/recipes.db` ``` 5. Save it, and start the container once. From 38219a22ca8592a3340e239c6958bfba4dc433ae Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Mon, 11 Jul 2022 23:42:26 +0200 Subject: [PATCH 12/76] fixed issue with social default access and multi space tennany --- cookbook/views/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cookbook/views/views.py b/cookbook/views/views.py index 6a4aac7a..b601ab74 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -127,8 +127,8 @@ def space_overview(request): if join_form.is_valid(): return HttpResponseRedirect(reverse('view_invite', args=[join_form.cleaned_data['token']])) else: - if settings.SOCIAL_DEFAULT_ACCESS: - user_space = UserSpace.objects.create(space=Space.objects.first(), user=request.user, active=True) + if settings.SOCIAL_DEFAULT_ACCESS and len(request.user.userspace_set) == 0: + user_space = UserSpace.objects.create(space=Space.objects.first(), user=request.user, active=False) user_space.groups.add(Group.objects.filter(name=settings.SOCIAL_DEFAULT_GROUP).get()) return HttpResponseRedirect(reverse('index')) if 'signup_token' in request.session: From b03fa4fdf2e839589e4a3476bfdd1f59c8e47cb4 Mon Sep 17 00:00:00 2001 From: smilerz Date: Mon, 11 Jul 2022 17:21:56 -0500 Subject: [PATCH 13/76] updated cookbookapp importer to handle multi-step recipes --- cookbook/integration/cookbookapp.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cookbook/integration/cookbookapp.py b/cookbook/integration/cookbookapp.py index 46e6d7bf..c35de64f 100644 --- a/cookbook/integration/cookbookapp.py +++ b/cookbook/integration/cookbookapp.py @@ -10,7 +10,8 @@ import validators import yaml from cookbook.helper.ingredient_parser import IngredientParser -from cookbook.helper.recipe_url_import import get_images_from_soup, iso_duration_to_minutes, get_from_scraper +from cookbook.helper.recipe_url_import import (get_from_scraper, get_images_from_soup, + iso_duration_to_minutes) from cookbook.helper.scrapers.scrapers import text_scraper from cookbook.integration.integration import Integration from cookbook.models import Ingredient, Keyword, Recipe, Step @@ -45,8 +46,8 @@ class CookBookApp(Integration): except Exception: pass - - step = Step.objects.create(instruction=recipe_json['recipeInstructions'], space=self.request.space, ) + # assuming import files only contain single step + step = Step.objects.create(instruction=recipe_json['steps'][0]['instruction'], space=self.request.space, ) if 'nutrition' in recipe_json: step.instruction = step.instruction + '\n\n' + recipe_json['nutrition'] @@ -55,11 +56,13 @@ class CookBookApp(Integration): recipe.steps.add(step) ingredient_parser = IngredientParser(self.request, True) - for ingredient in recipe_json['recipeIngredient']: - f = ingredient_parser.get_food(ingredient['ingredient']['text']) - u = ingredient_parser.get_unit(ingredient['unit']['text']) + for ingredient in recipe_json['steps'][0]['ingredients']: + f = ingredient_parser.get_food(ingredient['food']['name']) + u = None + if unit := ingredient.get('unit', None): + u = ingredient_parser.get_unit(unit.get('name', None)) step.ingredients.add(Ingredient.objects.create( - food=f, unit=u, amount=ingredient['amount'], note=ingredient['note'], space=self.request.space, + food=f, unit=u, amount=ingredient.get('amount', None), note=ingredient.get('note', None), original_text=ingredient.get('original_text', None), space=self.request.space, )) if len(images) > 0: From 4c264673dfc99415f1eeb3df0a436f9a208d6e00 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 19:20:05 +0200 Subject: [PATCH 14/76] fixed copy me that importer --- cookbook/integration/integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cookbook/integration/integration.py b/cookbook/integration/integration.py index c3dc9dfb..f2153eb0 100644 --- a/cookbook/integration/integration.py +++ b/cookbook/integration/integration.py @@ -169,7 +169,7 @@ class Integration: for z in file_list: try: - if not hasattr(z, 'filename'): + if not hasattr(z, 'filename') or type(z) == Tag: recipe = self.get_recipe_from_file(z) else: recipe = self.get_recipe_from_file(BytesIO(import_zip.read(z.filename))) From 43a082a51a2e42a2ce0ca40db26ab283550c5fc6 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 19:20:35 +0200 Subject: [PATCH 15/76] updated translations --- cookbook/locale/ar/LC_MESSAGES/django.mo | Bin 0 -> 9921 bytes cookbook/locale/ca/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/de/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/en/LC_MESSAGES/django.po | 238 ++++++++++--------- cookbook/locale/es/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/fr/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/hu_HU/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/it/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/lv/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/nl/LC_MESSAGES/django.po | 241 ++++++++++---------- cookbook/locale/pt/LC_MESSAGES/django.po | 238 ++++++++++--------- cookbook/locale/rn/LC_MESSAGES/django.po | 238 ++++++++++--------- cookbook/locale/tr/LC_MESSAGES/django.po | 238 ++++++++++--------- cookbook/locale/zh_CN/LC_MESSAGES/django.po | 241 ++++++++++---------- recipes/locale/ca/LC_MESSAGES/django.po | 2 +- recipes/locale/de/LC_MESSAGES/django.po | 2 +- recipes/locale/en/LC_MESSAGES/django.po | 2 +- recipes/locale/es/LC_MESSAGES/django.po | 2 +- recipes/locale/fr/LC_MESSAGES/django.po | 2 +- recipes/locale/hu_HU/LC_MESSAGES/django.po | 2 +- recipes/locale/it/LC_MESSAGES/django.po | 2 +- recipes/locale/lv/LC_MESSAGES/django.po | 2 +- recipes/locale/nl/LC_MESSAGES/django.po | 2 +- recipes/locale/pt/LC_MESSAGES/django.po | 2 +- recipes/locale/rn/LC_MESSAGES/django.po | 2 +- recipes/locale/tr/LC_MESSAGES/django.po | 2 +- recipes/locale/zh_CN/LC_MESSAGES/django.po | 2 +- 27 files changed, 1561 insertions(+), 1586 deletions(-) create mode 100644 cookbook/locale/ar/LC_MESSAGES/django.mo diff --git a/cookbook/locale/ar/LC_MESSAGES/django.mo b/cookbook/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0da836d50744bb5d3d5ba680c6de79b79792b03e GIT binary patch literal 9921 zcmb7|dyHJwea8woy*_z@LDt!K?V$1zrn&0xW}%f+?tVe+6pa z55Q}|e+EASz71{#{|CGp+{_~3FerY$oMRc>NPjc%0e=>J3WRm@EXbeveSQYP=fG>gAA!FJz70ase4Ihixe*lITfhPEcCa6; zfTDXG)H&yK{1Xro=5??L{xvB6e*#_yuKKv2zX8Nl=Ch#oe-2y&7Qmke_vYgf$X1hr z;^QDFddEPW^LyZ@z;A)#_aexjd7U58|65S@p4{}I%>e+5PFKl1Va0!8nCLD}nS zjH>lFfja-z9M^+dw<*V+puNJF$3fBiO_U-zXF>J90p0|DCm(+uyo3JVf#PEohiTnv zQ2pybo%^XAZvn;sT2Or432NQue0&=ye)fSI!7?a)p2+b9Q1s4%+W#sjyT1vp0k0+~ zgm;4C;|WlD8wdNq{rUX2z#{!O!CwM@3~JqV2z$*cYzE@e=GN=6DcB2s9vlHh_p9J~ z@F>Wi`7S>_;P*hq&8i!`KRpg=zMA7f@DJ$!5h%Ye;2hK7!yqh}zXatkZ}Edj=AC@} zqXc0Q zT*mwmwBV0G>G>l#B_z%D;G6n{s+JHT&%xPW;Rls@gOdBt z_>r7{4~p-%L7jgEn>T{jgW`WLDEvfCXXCN%w^_U!=+U=5VNeiPgU{skyHH*uKwSqob5ZV*>7kAcsC4R9a$ zHuxa8{Z=2(zYB`*Z-QlT0o438D0wS54Dx6Gke^lHpMqC_>uHGKe190!18MUmn)17H z1EFFbr`=8y4NUB84mh2BST8(9T8$=u+fUQ;E3{vwmDJ&Rz=NxCJM(veY^O&$TSt>F zAEQZUSJK4uowSE&va6nlJ-E0~EJ$y9K12&>+i3UE^hg)d_hxl?*3fp-wyVQ4NZUet zg7!I@o(k=L+81fksUG>7;!HNcRm>3W5!x4M_tG$^sJ>lN!zLp z&tBT+X;-O}KOtz_9q=BSVpPwl2lqRXzxN6^^lq?&NfIY!lWjJ_#8w(M34fzmNy4(( zR4Rq_)Q*HntzmO4ah3gpGz9nu?o=EycB37^VHz zY-*;l=IxF!sM_Ib5V@gRkXA}TwK`=3=4zU&GiNK&IA>Sb+puhGOvLp%W42mpq{Yt8 zIN~e_H>RSJc`!&z6Lzp%NzH?CI$_5uVYLj$NoeDGT8X2eTC_uBHj1OrjgG^8WYdYz z$s7f>&`wsWRXZBma-{(qQ(+lK8fh4m&E|<98V~Jo&}dA?3H`VlCpI2)`_s5?qu@Yg z9BJanjs{85?u=85V5oqF4a=tekcTe~a%e4V++m+=Hd31=Q*OY<&GcpnJC!xe<|GW# z(C)z=?ROM|HR5KJnl0g2(5!aQ?ujZ;ip4w@EZfNmWP|xINu{^IM&V?aR(WM{fR#&? zdRT0ev-My+>~xyYq*D!3#wt++BU`*;Y}8DXidU))nHa}_H8IwJvVAgcRztlx-APN> zI8G{I!#Mj4%3F;4mEGkts0De;Xd>7jMmL+mC>RxuMzdazlhlr(?Xe`l+fo&T)t3~-l@)2%gwPnD|8a@a+U^%DW6liNfVtCx#rYj6PW z(ZbeBHMB!p95&3>I2p&vZJ&6+Y;9uOk?^UMx2K<;vb)0|DNPuhj%cuxLDV*pWRtZ@ z-o}cmMi{okrD2;ihF4}9W?MMryfw#$ z*&YT5LL1iV>6BAxIf?6|@l!6Y2{uAMsMqlV@8xbuggm8c+(ZwT@9s=pvcH04*szGg<2kU^3|f* zN!+@hOFc*vZnuj+vooADL?r6j*{qEsCN#PoB*AwT?47K`{w^0Eitsp|iZLs}un;JdX7@dGbyk@JjdhvRC6#JVe( zG`qqQ_OM%msfOMO(j3$sCkw*EuCNx9fOmy1LIV3>bDT~iOzn=Tj#rx82|bX0(}}p8 z58B;CF+ApTjdZFS(phn7bzJ^H`@KFpk{X@&Dv+!aZ_(~kt~pQ%C!s}7xg=RTqbX~v zrZnqiQd-%D1n3kVpVA0dvUE<%mRy=8?BiOfJRMdWA?g~RNC`zew-%JcqH^L`v+8qP z=QNjGYvjaAo#3j6v0${B=G)1N@K&v)sfJ0Gct9;4RY1d3;7UU^p2RhXf0sJbAS#9I zsIgdos)^#+rPc=NJ{m8!71S`hv3F>9w+q#FL}tvFt9l7MHN$qB0)Yp~&MSO-|Opo;p}V4Q4mRxCEqlZNu)P4Dn7> zP3190FHV&DbF_O%awCdL9QKRY!i*4mV{sJ?$;hFv_j&FnO-puSATCv$ft@Yf4IuFK zs$T>kqcYVn*w1cz*g+>VtEW1t5;-{$*Ho|&+-JzHs{y_-L3t^w(kaH!%IFla?8;&B zT~y>)&NA#;xk8Xm_XX51L~${>rWD8f>Gg~Tg0yqkA6L9O)GA6%k)~j()_8wL=T3FM4pq|7BD%2#Z zP&Et~XqRbA4Gdry4|dCwl|+qmM)->lA2KzGmh2Kg8J5z*P`R)d)snmV?eM0}+crHk zX!j28+CB8h&ecA56m~SmE9C^yGs*dB7A#gAygF+!G`{E0p_j+toXUb_}lQr?1$%dUH%6j9_=F zj@&8buZPlFiSCtp6EeWSo{_DEyI0nUm9a1>3`V86ELX92lVDa4SDQ&tEpSVyHTrE- zciqOoUH4L{H8T(m4D{LuNUY2b4D|8Z=U>**00R< zY1;<+ciy}D(ZWNzi+Kg(t*AP*8;X6s#lF=hJCj|=<}Fu!(>j!$%oeg`+nQ}1wymSt zX_|W3xonYj%dJ_{I+!iAj?F%y&d##rg4U{gCOgmD`PLkC7ENn9yQpE4&1bK) zrfqhyb=WOD>^Cp4c@Fw+>xtH()(odWk5zM>J&Wu*)S7D@Y|Zeske$e0Vfl1+$~wLQ z4uI(CY(Zm-bPjU(^Xxd5oorJ<9*r(@+}Z!vMw^MBXKhYwR?HGX1{2ou?h ztYd!GGR|Sv=}1Q6kondewn1A*v}hXE{2Goto4q1>=h)#C)MY`-=4GAVI_7rU>_rZk zG1+TuKg$6+E|-@V+4n4-A+uO#?>X%4#9!oSnD-r7>1b=N=m_|sc@41=S90RYl(Vdd z>P4px4&+68g;CgDwApVn0rv}DCMg_YTGKZhe`4DiwAf&y!*Fym`?g4~xTua~{CS%# zF^aPM<`bw0|6<@3`Iq;brEEEum4UAL_8|7Kj`TV2|IUf!vnSYiMnpIpojL8Cb{#|Sg3eK3%W#)_f~L+nk{wD*PGbtxZg2KXd~g8&6wxmG&1YxumKVJ#7ZiA{W0?H} zHaqFHwk-egdYw@m%3G!B%Y;W0E5W|TdCar2;eroCsd+YgL27XBwwNuU3>TrAYEyP< zl9rw57GHDupfi10rdf+doS!V9J~EAGvzrqUgta`WVhYbY`2%k~>FuE?8lZLpS?lEjZ64hp@?D^rh?t+Ya|xdP>@7rD~ULW>`-o zDiyoz+!bXk%Z@XeJC*`kxl8J1$2@#YOREw?Wx(+#VWb(I;fhJ?FuG!eQsv3)rF;Wo zwsp;%W)Bi!q{8;%j!peQcbbB*yj%G%k0U?ZabgJJ*_z8F)=cY&@+HL40%bxO_8Hs$ z{OZnf!CuiTjM*G(2<(AL#8U#m*;4 zB+Fe2F=69bRhDyvaocYl!^E^xPWGBp-M0<<7gU{RWE zkKj=Uor^9w{vhG9un0Jp^93m{D_toNrb*nn3dxh?g@YAYC}$cu^& zZq$wg-JnikE*L^@Vw9w!Dx=$mPq@o2NS<#UG+m}}9;>vG$J5I732KMgjs-=HLJ#`X z=d=uAcc3#$?(&_0>v9drniq|EG^0eKy40Ezh!6cP{!|6X=jNq1Closr zr4M6Ez7?kRS->eP7gW`j!xCxUT?qX)G~ubOq%pK31yZuRZmaL*gc7-9Bnh;{j#tS& zTCB35M(OJg#V)((6iJ1g1YCCqGE{)vQ`vsGh2XB^CbFULT<#ercN`~8C-A&&a#tZf zKVXr&R=SS|bgXoOz{@zByUEXH$7Oj2k4XnE17C7=bisr&-me5)Hm+>PwWDjjA@Wo$ zFGz#uIoVZzZi9RXV(w=QEUEf)(eGUHxiPT|ogZ~Rp2xaA3tz%l4vUhzs@wNj;C*4* z(OuS8=Zl2Qv$h?;@{7xqeMwdSX>OCb#YIwINT_lV))7XEb6*5}OnSf2hes!YDt2A{ zp}Mifeeim=XA};tqxx!bMfTkb&p&zd{J8R-x7KG@M+k6JnQq7lUqmH zS>8FwJVB+k$6GEOa?f%%7S_M)v(F`;EjWdwb{8(s|K$w8g(@YXe`)N%y|QCoWb)Y2 zqKjh6Rn)F8C4$}6>a%u@6Yc{1oUuJ#(lc~kS}Sc!?ykzGJc=5!v$^tL#@8sKKF9lS z!?wR`DIO|5#n@>y;61KeHUgBn+*BMk%PP`_^3`%{##?TVd5XQei744Y?mXMbRe9xb zX^P|6y;45VA^%??_FbwK%^67O>a^fva!v>63PNE(YmTh@Z;5%iNtd^FU7=idRNP9< Qi@JeJ8Sh\n" "Language-Team: Catalan ." #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Iniciar Sessió" @@ -1123,7 +1123,7 @@ msgstr "Inicis Tancats" msgid "We are sorry, but the sign up is currently closed." msgstr "Inicis de Sessió tancats temporalment." -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentació API" @@ -1220,36 +1220,36 @@ msgstr "Admin" msgid "Your Spaces" msgstr "Sense Espai" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Guia Markdown" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "Tradueix Tandoor" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "Navegador API" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "Tanca sessió" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2263,19 +2263,11 @@ msgstr "Receptes sense paraules clau" msgid "Internal Recipes" msgstr "Receptes Internes" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Enllaços Invitació" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Mostra Enllaços" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Informació de Sistema" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2293,21 +2285,21 @@ msgstr "" "com/vabene1111/recipes/releases\">aquí.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Servei Mitjans" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Advertència" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Ok" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2323,16 +2315,16 @@ msgstr "" "a> per actualitzar\n" "la vostra instal·lació." -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "Tot està bé!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Paraula Clau" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2352,11 +2344,11 @@ msgstr "" "Estableix-ho\n" "SECRET_KEY al fitxer de configuració .env." -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Mode Depuració" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2372,15 +2364,15 @@ msgstr "" "configuració\n" "DEBUG = 0 al fitxer de configuració .env." -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Base de Dades" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Info" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2397,72 +2389,72 @@ msgstr "" msgid "URL Import" msgstr "Importació d’URL" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "El paràmetre updated_at té un format incorrecte" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "No {self.basename} amb id {pk} existeix" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "No es pot fusionar amb el mateix objecte!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "No {self.basename} amb id {target} existeix" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "No es pot combinar amb l'objecte fill!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} s'ha fusionat amb {target.name}" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "Error en intentar combinar {source.name} amb {target.name}" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} s'ha mogut correctament a l'arrel." -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "Error a l'intentar moure " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "No es pot moure un objecte cap a si mateix!" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "No existeix {self.basename} amb identificador {parent}" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} s'ha mogut correctament al pare {parent.name}" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} eliminat de la llista de la compra." -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "Afegit {obj.name} a la llista de la compra." -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "ID de recepta forma part d'un pas. Per a múltiples repeteix paràmetre." -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "La cadena de consulta coincideix (difusa) amb el nom de l'objecte." -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2470,7 +2462,7 @@ msgstr "" "Cadena de consulta coincideix (difusa) amb el nom de la recepta. En el futur " "també cerca text complet." -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 #, fuzzy #| msgid "ID of keyword a recipe should have. For multiple repeat parameter." msgid "" @@ -2480,173 +2472,173 @@ msgstr "" "ID de la paraula clau que hauria de tenir una recepta. Per a múltiples " "repeteix paràmetre." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" "ID d'aliments que ha de tenir una recepta. Per a múltiples repeteix " "paràmetres." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "ID d'unitat que hauria de tenir una recepta." -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" "ID del llibre hauria d'haver-hi en una recepta. Per al paràmetre de " "repetició múltiple." -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "Res a fer." -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "Connexió Refusada." -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 msgid "No usable data could be found." msgstr "No s'han trobat dades utilitzables." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" "Aquesta funció encara no està disponible a la versió allotjada de tandoor!" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Sincronització correcte" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Error de sincronització amb emmagatzematge" @@ -2736,6 +2728,10 @@ msgstr "Descobriment" msgid "Shopping List" msgstr "Llista de la Compra" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Enllaços Invitació" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "Supermercats" @@ -2844,6 +2840,9 @@ msgstr "" "L'enllaç per compartir receptes s'ha desactivat! Per obtenir informació " "addicional, poseu-vos en contacte amb l'administrador." +#~ msgid "Show Links" +#~ msgstr "Mostra Enllaços" + #~ msgid "A user is required" #~ msgstr "Usuari requerit" diff --git a/cookbook/locale/de/LC_MESSAGES/django.po b/cookbook/locale/de/LC_MESSAGES/django.po index 877174cf..7c18f791 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-05-28 16:32+0000\n" "Last-Translator: Tobias Reinmann \n" "Language-Team: German ." #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Anmelden" @@ -1141,7 +1141,7 @@ msgstr "Registrierung geschlossen" msgid "We are sorry, but the sign up is currently closed." msgstr "Es tut uns Leid, aber die Registrierung ist derzeit geschlossen." -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API-Dokumentation" @@ -1238,36 +1238,36 @@ msgstr "Admin" msgid "Your Spaces" msgstr "Kein Space" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Markdown-Anleitung" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "Tandoor übersetzen" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "API Browser" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "Ausloggen" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "Du benützt die Gratis-Version von Tandoor" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "Jetzt upgraden" @@ -2431,19 +2431,11 @@ msgstr "Rezepte ohne Schlagwort" msgid "Internal Recipes" msgstr "Interne Rezepte" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Einladungslinks" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Links anzeigen" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Systeminformation" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2461,21 +2453,21 @@ msgstr "" "github.com/vabene1111/recipes/releases\">hier.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Medien ausliefern" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Warnung" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Ok" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2490,16 +2482,16 @@ msgstr "" "Ihre Installation zu aktualisieren.\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "Alles in Ordnung!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Geheimer Schlüssel" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2519,11 +2511,11 @@ msgstr "" "Konfigurationsdatei .env.\n" " " -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Debug-Modus" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2540,15 +2532,15 @@ msgstr "" "Konfigurationsdatei .env einstellst.\n" " " -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Datenbank" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Info" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2566,250 +2558,250 @@ msgstr "" msgid "URL Import" msgstr "URL-Import" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "Der Parameter updated_at ist falsch formatiert" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "Kein {self.basename} mit der ID {pk} existiert" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "Zusammenführen mit selben Objekt nicht möglich!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "Kein {self.basename} mit der ID {target} existiert" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "Zusammenführen mit untergeordnetem Objekt nicht möglich!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} wurde erfolgreich mit {target.name} zusammengeführt" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" "Beim zusammenführen von {source.name} mit {target.name} ist ein Fehler " "aufgetreten" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} wurde erfolgreich zur Wurzel verschoben." -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "Fehler aufgetreten beim verschieben von " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "Ein Element kann nicht in sich selbst verschoben werden!" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "Kein {self.basename} mit ID {parent} existiert" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" "{child.name} wurde erfolgreich zum Überelement {parent.name} verschoben" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} wurde von der Einkaufsliste entfernt." -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} wurde der Einkaufsliste hinzugefügt." -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "ID der Einheit, die ein Rezept haben sollte." -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "Nichts zu tun." -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "Verbindung fehlgeschlagen." -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "No useable data could be found." msgid "No usable data could be found." msgstr "Es konnten keine nutzbaren Daten gefunden werden." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "Diese Funktion ist in dieser Version von Tandoor noch nicht verfügbar!" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Synchronisation erfolgreich!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Fehler beim Synchronisieren" @@ -2899,6 +2891,10 @@ msgstr "Entdecken" msgid "Shopping List" msgstr "Einkaufsliste" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Einladungslinks" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "Supermärkte" @@ -3007,6 +3003,9 @@ msgstr "" "Dieser Link wurde deaktiviert! Bitte kontaktieren sie den " "Seitenadministrator für weitere Informationen." +#~ msgid "Show Links" +#~ msgstr "Links anzeigen" + #~ msgid "A user is required" #~ msgstr "Ein Benutzername ist notwendig" diff --git a/cookbook/locale/en/LC_MESSAGES/django.po b/cookbook/locale/en/LC_MESSAGES/django.po index bfbd0c8c..822068d7 100644 --- a/cookbook/locale/en/LC_MESSAGES/django.po +++ b/cookbook/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -471,7 +471,7 @@ msgstr "" msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:560 +#: .\cookbook\helper\recipe_search.py:565 msgid "One of queryset or hash_key must be provided" msgstr "" @@ -484,12 +484,12 @@ msgstr "" msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:42 +#: .\cookbook\integration\copymethat.py:41 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:71 +#: .\cookbook\integration\copymethat.py:70 #: .\cookbook\integration\recettetek.py:54 #: .\cookbook\integration\recipekeeper.py:63 msgid "Imported from" @@ -620,119 +620,119 @@ msgstr "" msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1160 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1161 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Food Alias" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Unit Alias" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Keyword Alias" msgstr "" -#: .\cookbook\models.py:1225 +#: .\cookbook\models.py:1227 #: .\cookbook\templates\include\recipe_open_modal.html:7 #: .\cookbook\views\delete.py:36 .\cookbook\views\edit.py:251 #: .\cookbook\views\new.py:48 msgid "Recipe" msgstr "" -#: .\cookbook\models.py:1226 +#: .\cookbook\models.py:1228 msgid "Food" msgstr "" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "" -#: .\cookbook\serializer.py:204 +#: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." msgstr "" -#: .\cookbook\serializer.py:273 +#: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:284 +#: .\cookbook\serializer.py:301 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1054 +#: .\cookbook\serializer.py:1084 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1055 +#: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1056 +#: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1179 +#: .\cookbook\serializer.py:1209 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1181 +#: .\cookbook\serializer.py:1211 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1183 +#: .\cookbook\serializer.py:1213 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1192 +#: .\cookbook\serializer.py:1222 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1194 +#: .\cookbook\serializer.py:1224 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1196 +#: .\cookbook\serializer.py:1226 msgid "When set to true will delete all food from active shopping lists." msgstr "" @@ -864,7 +864,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "" @@ -1028,7 +1028,7 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" @@ -1121,36 +1121,36 @@ msgstr "" msgid "Your Spaces" msgstr "" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2091,19 +2091,11 @@ msgstr "" msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2114,21 +2106,21 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2138,16 +2130,16 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2160,11 +2152,11 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2175,15 +2167,15 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2196,245 +2188,245 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "" @@ -2517,6 +2509,10 @@ msgstr "" msgid "Shopping List" msgstr "" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "" diff --git a/cookbook/locale/es/LC_MESSAGES/django.po b/cookbook/locale/es/LC_MESSAGES/django.po index 22bcc304..c211a5d5 100644 --- a/cookbook/locale/es/LC_MESSAGES/django.po +++ b/cookbook/locale/es/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-06-25 17:32+0000\n" "Last-Translator: César Blanco Guillamon \n" "Language-Team: Spanish aquí.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Servidor multimedia" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Advertencia" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Ok" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2339,16 +2331,16 @@ msgstr "" " tu instalación.\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "¡Todo va bien!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Clave Secreta" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2370,11 +2362,11 @@ msgstr "" "env.\n" " " -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Modo Depuración" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2392,15 +2384,15 @@ msgstr "" "code>.\n" " " -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Base de Datos" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Información" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2418,253 +2410,253 @@ msgstr "" msgid "URL Import" msgstr "Importar URL" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 #, fuzzy #| msgid "Parameter filter_list incorrectly formatted" msgid "Parameter updated_at incorrectly formatted" msgstr "Parámetro filter_list formateado incorrectamente" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "¡No se puede unir con el mismo objeto!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 #, fuzzy #| msgid "Cannot merge with the same object!" msgid "Cannot merge with child object!" msgstr "¡No se puede unir con el mismo objeto!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "The requested page could not be found." msgid "No usable data could be found." msgstr "La página solicitada no pudo ser encontrada." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 #, 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 "¡Esta funcionalidad no está disponible en la versión demo!" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "¡Sincronización exitosa!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Error de sincronización con el almacenamiento" @@ -2749,6 +2741,10 @@ msgstr "Descubrimiento" msgid "Shopping List" msgstr "Lista de la Compra" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Enlaces de Invitación" + #: .\cookbook\views\lists.py:139 #, fuzzy #| msgid "Supermarket" @@ -2853,6 +2849,9 @@ msgid "" "contact the page administrator." msgstr "" +#~ msgid "Show Links" +#~ msgstr "Mostrar Enlaces" + #, fuzzy #~| msgid "Invite Links" #~ msgid "Invite User" diff --git a/cookbook/locale/fr/LC_MESSAGES/django.po b/cookbook/locale/fr/LC_MESSAGES/django.po index 9ca621d1..e9aacc1c 100644 --- a/cookbook/locale/fr/LC_MESSAGES/django.po +++ b/cookbook/locale/fr/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-02-09 01:31+0000\n" "Last-Translator: Marion Kämpfer \n" "Language-Team: French ." #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Connexion" @@ -1154,7 +1154,7 @@ msgstr "Inscriptions closes" msgid "We are sorry, but the sign up is currently closed." msgstr "Nous sommes désolés, mais les inscriptions sont closes pour le moment." -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentation API" @@ -1251,36 +1251,36 @@ msgstr "Admin" msgid "Your Spaces" msgstr "Aucun groupe" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Guide Markdown" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "Traduire Tandoor" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "Navigateur API" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "Déconnexion" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2473,19 +2473,11 @@ msgstr "Recettes sans mots-clés" msgid "Internal Recipes" msgstr "Recettes internes" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Liens d’invitation" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Afficher les liens" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Informations système" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2503,21 +2495,21 @@ msgstr "" "github.com/vabene1111/recipes/releases\">ici.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Publication des médias" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Avertissement" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "OK" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2533,16 +2525,16 @@ msgstr "" " pour mettre à jour votre installation.\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "Tout est en ordre !" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Clé secrète" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2563,11 +2555,11 @@ msgstr "" "env\n" " " -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Mode debug" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2584,15 +2576,15 @@ msgstr "" "code>.\n" " " -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Base de données" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Info" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2611,251 +2603,251 @@ msgstr "" msgid "URL Import" msgstr "Import URL" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "Le paramètre « update_at » n'est pas correctement formaté" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "Il n’existe aucun(e) {self.basename} avec l’identifiant {pk}" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "Impossible de fusionner un objet avec lui-même !" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "Il n’existe aucun(e) {self.basename} avec l’id {target}" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "Impossible de fusionner avec l’objet enfant !" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} a été fusionné avec succès avec {target.name}" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" "Une erreur est survenue lors de la tentative de fusion de {source.name} avec " "{target.name}" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} a été déplacé avec succès vers la racine." -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "Une erreur est survenue en essayant de déplacer " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "Impossible de déplacer un objet vers lui-même !" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "Il n’existe aucun(e) {self.basename} avec l’id {parent}" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} a été déplacé avec succès vers le parent {parent.name}" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} a été supprimé(e) de la liste de courses." -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} a été ajouté(e) à la liste de courses." -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "Rien à faire." -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "Connexion refusée." -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "No useable data could be found." msgid "No usable data could be found." msgstr "Aucune information utilisable n'a été trouvée." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" "Cette fonctionnalité n’est pas encore disponible dans la version hébergée de " "Tandoor !" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Synchro réussie !" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Erreur lors de la synchronisation avec le stockage" @@ -2943,6 +2935,10 @@ msgstr "Découverte" msgid "Shopping List" msgstr "Liste de courses" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Liens d’invitation" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "Supermarchés" @@ -3055,6 +3051,9 @@ msgstr "" "Le lien de partage de la recette a été désactivé ! Pour plus d’informations, " "veuillez contacter l’administrateur de la page." +#~ msgid "Show Links" +#~ msgstr "Afficher les liens" + #~ msgid "A user is required" #~ msgstr "Un utilisateur est requis" diff --git a/cookbook/locale/hu_HU/LC_MESSAGES/django.po b/cookbook/locale/hu_HU/LC_MESSAGES/django.po index 93cc4143..5d62e79b 100644 --- a/cookbook/locale/hu_HU/LC_MESSAGES/django.po +++ b/cookbook/locale/hu_HU/LC_MESSAGES/django.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-05-24 20:32+0000\n" "Last-Translator: Krisztian Doka \n" "Language-Team: Hungarian ." #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Bejelentkezés" @@ -1144,7 +1144,7 @@ msgstr "Regisztráció lezárva" msgid "We are sorry, but the sign up is currently closed." msgstr "Sajnáljuk, de a regisztráció jelenleg zárva van." -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API dokumentáció" @@ -1241,36 +1241,36 @@ msgstr "Admin" msgid "Your Spaces" msgstr "Nincs hely" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Markdown útmutató" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "Tandoor fordítása" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "API böngésző" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "Kijelentkezés" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2444,19 +2444,11 @@ msgstr "Receptek kulcsszavak nélkül" msgid "Internal Recipes" msgstr "Belső receptek" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Meghívó linkek" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Linkek megjelenítése" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Rendszerinformáció" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2474,21 +2466,21 @@ msgstr "" "vabene1111/recipes/releases\">itt.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Média kiszolgáló" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Figyelmeztetés" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Rendben" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2505,16 +2497,16 @@ msgstr "" " frissítéshez.\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "Minden rendben van!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Titkos kulcs" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2536,11 +2528,11 @@ msgstr "" "fájlban.\n" " " -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Hibakeresési mód" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2558,15 +2550,15 @@ msgstr "" "konfigurációs fájlban.\n" " " -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Adatbázis" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Információ" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2584,74 +2576,74 @@ msgstr "" msgid "URL Import" msgstr "URL importálása" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "Az updated_at paraméter helytelenül van formázva" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "Nem létezik {self.basename} azonosítóval {pk}" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "Nem egyesíthető ugyanazzal az objektummal!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "Nem létezik {self.basename} azonosítóval {target}" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "Nem lehet egyesíteni a gyermekobjektummal!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} sikeresen egyesült a {target.name} -vel" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "Hiba történt a {source.name} és a {target.name} egyesítése során" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} sikeresen átkerült a gyökérbe." -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "Hiba történt az áthelyezés közben " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "Nem lehet egy objektumot önmagába mozgatni!" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "Nem létezik {self.basename} azonosítóval {parent}" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} sikeresen átkerült a {parent.name} szülőhöz" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} lekerült a bevásárlólistáról." -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} hozzá lett adva a bevásárlólistához." -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" "A recept azonosítója, amelynek egy lépés része. Többszörös ismétlés esetén " "paraméter." -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "A lekérdezés karakterlánca az objektum nevével összevetve (fuzzy)." -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2659,7 +2651,7 @@ msgstr "" "A lekérdezési karakterláncot a recept nevével összevetve (fuzzy). A jövőben " "teljes szöveges keresés is." -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 #, fuzzy #| msgid "ID of keyword a recipe should have. For multiple repeat parameter." msgid "" @@ -2668,132 +2660,132 @@ msgid "" msgstr "" "A recept kulcsszavának azonosítója. Többszörös ismétlődő paraméter esetén." -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" "Az ételek azonosítója egy receptnek tartalmaznia kell. Többszörös ismétlődő " "paraméter esetén." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "Az egység azonosítója, amellyel a receptnek rendelkeznie kell." -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" "A könyv azonosítója, amelyben a receptnek szerepelnie kell. Többszörös " "ismétlés esetén paraméter." -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "Ha csak a belső recepteket kell visszaadni. [true/false]" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" "Az eredményeket véletlenszerű sorrendben adja vissza. [true/false]" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" "Az új találatokat adja vissza először a keresési eredmények között. [true/" "false]" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 #, fuzzy #| msgid "If only internal recipes should be returned. [true/false]" msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "Ha csak a belső recepteket kell visszaadni. [true/false]" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." @@ -2801,7 +2793,7 @@ msgstr "" "Visszaadja az id elsődleges kulccsal rendelkező bevásárlólista-bejegyzést. " "Több érték megengedett." -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." @@ -2810,44 +2802,44 @@ msgstr "" "mindkettő, legutóbbi]
– a legutóbbi a nem bejelölt és a nemrég " "befejezett elemeket tartalmazza." -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" "Visszaadja a bevásárlólista bejegyzéseit szupermarket kategóriák szerinti " "sorrendben." -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "Semmi feladat." -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "Kapcsolat megtagadva." -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "No useable data could be found." msgid "No usable data could be found." msgstr "Nem találtam használható adatokat." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "Ez a funkció még nem érhető el a tandoor hosztolt verziójában!" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Szinkronizálás sikeres!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Hiba szinkronizálás közben a tárolóval" @@ -2936,6 +2928,10 @@ msgstr "Felfedezés" msgid "Shopping List" msgstr "Bevásárlólista" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Meghívó linkek" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "Szupermarketek" @@ -3044,6 +3040,9 @@ msgstr "" "A receptmegosztó linket letiltották! További információkért kérjük, " "forduljon az oldal adminisztrátorához." +#~ msgid "Show Links" +#~ msgstr "Linkek megjelenítése" + #~ msgid "A user is required" #~ msgstr "Egy felhasználó szükséges" diff --git a/cookbook/locale/it/LC_MESSAGES/django.po b/cookbook/locale/it/LC_MESSAGES/django.po index bfbea539..20fade93 100644 --- a/cookbook/locale/it/LC_MESSAGES/django.po +++ b/cookbook/locale/it/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-06-01 22:32+0000\n" "Last-Translator: Oliver Cervera \n" "Language-Team: Italian ." #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Login" @@ -1135,7 +1135,7 @@ msgstr "Iscrizioni chiuse" msgid "We are sorry, but the sign up is currently closed." msgstr "Spiacenti, al momento le iscrizioni sono chiuse." -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "Documentazione API" @@ -1232,36 +1232,36 @@ msgstr "Amministratore" msgid "Your Spaces" msgstr "Nessuna istanza" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Informazioni su Markdown" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "Traduci Tandoor" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "Browser API" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "Esci" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2296,19 +2296,11 @@ msgstr "Ricette senza parole chiave" msgid "Internal Recipes" msgstr "Ricette interne" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Link di invito" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Mostra link" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Informazioni di sistema" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2324,21 +2316,21 @@ msgstr "" "Le ultime novità sono disponibili qui." -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "File multimediali" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Avviso" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Ok" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2353,16 +2345,16 @@ msgstr "" "qui " "per aggiornare la tua installazione." -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "È tutto ok!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Chiave segreta" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2380,11 +2372,11 @@ msgstr "" "dell'installazione che è pubblica e insicura! Sei pregato di aggiungere una\n" "SECRET_KEY nel file di configurazione .env." -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Modalità di debug" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2400,15 +2392,15 @@ msgstr "" "configurando\n" "DEBUG=0 nel file di configurazione.env." -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Database" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Info" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2425,251 +2417,251 @@ msgstr "" msgid "URL Import" msgstr "Importa da URL" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "Il parametro updated_at non è formattato correttamente" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "Non esiste nessun {self.basename} con id {pk}" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "Non è possibile unirlo con lo stesso oggetto!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "Non esiste nessun {self.basename} con id {target}" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "Non è possibile unirlo con un oggetto secondario!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} è stato unito con successo a {target.name}" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" "Si è verificato un errore durante l'unione di {source.name} con {target.name}" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} è stato spostato con successo alla radice." -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "Si è verificato un errore durante lo spostamento " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "Non è possibile muovere un oggetto a sé stesso!" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "Non esiste nessun {self.basename} con id {parent}" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} è stato spostato con successo al primario {parent.name}" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" "Filtra le ricette che possono essere preparate con alimenti già disponibili. " "[true/false]" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "Nulla da fare." -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "No useable data could be found." msgid "No usable data could be found." msgstr "Nessuna informazione utilizzabile è stata trovata." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" "Questa funzione non è ancora disponibile nella versione hostata di Tandor!" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Sincronizzazione completata con successo!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Errore di sincronizzazione con questo backend" @@ -2759,6 +2751,10 @@ msgstr "Trovate" msgid "Shopping List" msgstr "Lista della spesa" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Link di invito" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "Supermercati" @@ -2867,6 +2863,9 @@ msgstr "" "Il link per la condivisione delle ricette è stato disabilitato! Per maggiori " "informazioni contatta l'amministratore." +#~ msgid "Show Links" +#~ msgstr "Mostra link" + #~ msgid "Invite User" #~ msgstr "Invita utente" diff --git a/cookbook/locale/lv/LC_MESSAGES/django.po b/cookbook/locale/lv/LC_MESSAGES/django.po index aaf7cd07..330aa4bb 100644 --- a/cookbook/locale/lv/LC_MESSAGES/django.po +++ b/cookbook/locale/lv/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2020-06-02 19:28+0000\n" "Last-Translator: vabene1111 , 2021\n" "Language-Team: Latvian (https://www.transifex.com/django-recipes/" @@ -525,7 +525,7 @@ msgstr "" msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:560 +#: .\cookbook\helper\recipe_search.py:565 msgid "One of queryset or hash_key must be provided" msgstr "" @@ -540,12 +540,12 @@ msgstr "Jums jānorāda vismaz recepte vai nosaukums." msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:42 +#: .\cookbook\integration\copymethat.py:41 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:71 +#: .\cookbook\integration\copymethat.py:70 #: .\cookbook\integration\recettetek.py:54 #: .\cookbook\integration\recipekeeper.py:63 msgid "Imported from" @@ -681,127 +681,127 @@ msgstr "Jauns" msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1160 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1161 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 #, fuzzy #| msgid "Food" msgid "Food Alias" msgstr "Ēdiens" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 #, fuzzy #| msgid "Units" msgid "Unit Alias" msgstr "Vienības" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 #, fuzzy #| msgid "Keywords" msgid "Keyword Alias" msgstr "Atslēgvārdi" -#: .\cookbook\models.py:1225 +#: .\cookbook\models.py:1227 #: .\cookbook\templates\include\recipe_open_modal.html:7 #: .\cookbook\views\delete.py:36 .\cookbook\views\edit.py:251 #: .\cookbook\views\new.py:48 msgid "Recipe" msgstr "Recepte" -#: .\cookbook\models.py:1226 +#: .\cookbook\models.py:1228 #, fuzzy #| msgid "Food" msgid "Food" msgstr "Ēdiens" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "Atslēgvārds" -#: .\cookbook\serializer.py:204 +#: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." msgstr "" -#: .\cookbook\serializer.py:273 +#: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:284 +#: .\cookbook\serializer.py:301 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1054 +#: .\cookbook\serializer.py:1084 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1055 +#: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1056 +#: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1179 +#: .\cookbook\serializer.py:1209 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1181 +#: .\cookbook\serializer.py:1211 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1183 +#: .\cookbook\serializer.py:1213 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1192 +#: .\cookbook\serializer.py:1222 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1194 +#: .\cookbook\serializer.py:1224 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1196 +#: .\cookbook\serializer.py:1226 msgid "When set to true will delete all food from active shopping lists." msgstr "" @@ -937,7 +937,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Pieslēgties" @@ -1111,7 +1111,7 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API dokumentācija" @@ -1218,36 +1218,36 @@ msgstr "Administrators" msgid "Your Spaces" msgstr "Izveidot lietotāju" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Markdown rokasgrāmata" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "Github" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "API pārlūks" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2273,19 +2273,11 @@ msgstr "Receptes bez atslēgas vārdiem" msgid "Internal Recipes" msgstr "Iekšējās receptes" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Uzaicinājuma saites" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Rādīt saites" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Sistēmas informācija" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2303,21 +2295,21 @@ msgstr "" "recipes/releases\">šeit.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Multivides rādīšana" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Brīdinājums" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Ok" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2334,16 +2326,16 @@ msgstr "" " jūsu instalāciju.\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "Viss ir kārtībā!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Slepenā atslēga" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2365,11 +2357,11 @@ msgstr "" "code>.\n" " " -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Atkļūdošanas režīms" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2386,15 +2378,15 @@ msgstr "" " DEBUG = 0 konfigurācijas failā .env.\n" " " -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Datubāze" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Info" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2412,249 +2404,249 @@ msgstr "" msgid "URL Import" msgstr "URL importēšana" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 #, fuzzy #| msgid "Parameter filter_list incorrectly formatted" msgid "Parameter updated_at incorrectly formatted" msgstr "Parametrs filter_list ir nepareizi formatēts" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "The requested page could not be found." msgid "No usable data could be found." msgstr "Pieprasīto lapu nevarēja atrast." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Sinhronizācija ir veiksmīga!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Sinhronizējot ar krātuvi, radās kļūda" @@ -2740,6 +2732,10 @@ msgstr "Atklāšana" msgid "Shopping List" msgstr "Iepirkumu saraksts" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Uzaicinājuma saites" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "" @@ -2842,6 +2838,9 @@ msgid "" "contact the page administrator." msgstr "" +#~ msgid "Show Links" +#~ msgstr "Rādīt saites" + #, fuzzy #~| msgid "Invite Links" #~ msgid "Invite User" diff --git a/cookbook/locale/nl/LC_MESSAGES/django.po b/cookbook/locale/nl/LC_MESSAGES/django.po index 0b80fbdd..84d8bfa9 100644 --- a/cookbook/locale/nl/LC_MESSAGES/django.po +++ b/cookbook/locale/nl/LC_MESSAGES/django.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-05-31 08:32+0000\n" "Last-Translator: Jesse \n" "Language-Team: Dutch Vraag een nieuwe bevestigingslink aan." #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "Inloggen" @@ -1120,7 +1120,7 @@ msgstr "Registratie gesloten" msgid "We are sorry, but the sign up is currently closed." msgstr "Excuses, registratie is op dit moment gesloten." -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "API documentatie" @@ -1215,36 +1215,36 @@ msgstr "Beheer" msgid "Your Spaces" msgstr "Geen ruimte" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Markdown gids" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "Vertaal Tandoor" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "API Browser" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "Uitloggen" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "Je gebruikt de gratis versie van Tandoor" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "Upgrade nu" @@ -2365,19 +2365,11 @@ msgstr "Recepten zonder etiketten" msgid "Internal Recipes" msgstr "Interne recepten" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Uitnodigingslink" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Toon links" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Systeeminformatie" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2395,21 +2387,21 @@ msgstr "" "recipes/releases\">hier gevonden worden.\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "Media aanbieder" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "Waarschuwing" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "Oké" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2424,16 +2416,16 @@ msgstr "" "releases/tag/0.8.1\">hier beschreven om je installatie te updaten.\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "Alles is in orde!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "Geheime sleutel" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2453,11 +2445,11 @@ msgstr "" "configuratiebestand.\n" " " -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "Debug modus" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2475,15 +2467,15 @@ msgstr "" "passen.\n" " " -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "Database" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "Info" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2501,76 +2493,76 @@ msgstr "" msgid "URL Import" msgstr "Importeer URL" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "Parameter updatet_at is onjuist geformateerd" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "Er bestaat geen {self.basename} met id {pk}" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "Kan niet met hetzelfde object samenvoegen!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "Er bestaat geen {self.basename} met id {target}" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "Kan niet met kindobject samenvoegen!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} is succesvol samengevoegd met {target.name}" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" "Er is een error opgetreden bij het samenvoegen van {source.name} met {target." "name}" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} is succesvol verplaatst naar het hoogste niveau." -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "Er is een error opgetreden bij het verplaatsen " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "Kan object niet verplaatsen naar zichzelf!" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "Er bestaat geen {self.basename} met id {parent}" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} is succesvol verplaatst naar {parent.name}" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} is verwijderd van het boodschappenlijstje." -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} is toegevoegd aan het boodschappenlijstje." -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" "ID van het recept waar de stap onderdeel van is. Herhaal parameter voor " "meerdere." -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "Zoekterm komt overeen (fuzzy) met object naam." -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." @@ -2578,7 +2570,7 @@ msgstr "" "Zoekterm komt overeen (fuzzy) met recept naam. In de toekomst wordt zoeken " "op volledige tekst ondersteund." -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" @@ -2586,109 +2578,109 @@ msgstr "" "ID van etiket dat een recept moet hebben. Herhaal parameter voor meerdere. " "Gelijkwaardig aan keywords_or" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" "Etiket ID, herhaal voor meerdere. Geeft recepten met elk geselecteerd etiket " "weer" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" "Etiket ID, herhaal voor meerdere. Geeft recepten met alle geselecteerde " "etiketten weer." -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" "Etiket ID, herhaal voor meerdere. Sluit recepten met één van de etiketten " "uit." -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" "Etiket ID, herhaal voor meerdere. Sluit recepten met alle etiketten uit." -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" "ID van ingrediënt dat een recept moet hebben. Herhaal parameter voor " "meerdere." -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" "Ingrediënt ID, herhaal voor meerdere. Geeft recepten met elk ingrediënt weer" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" "Ingrediënt ID, herhaal voor meerdere. Geef recepten met alle ingrediënten " "weer." -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" "Ingrediënt ID, herhaal voor meerdere. sluit recepten met één van de " "ingrediënten uit." -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" "Ingrediënt ID, herhaal voor meerdere. Sluit recepten met alle ingrediënten " "uit." -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "ID van eenheid dat een recept moet hebben." -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "Een waardering van een recept gaat van 0 tot 5." -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" "ID van boek dat een recept moet hebben. Herhaal parameter voor meerdere." -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "Boek ID, herhaal voor meerdere. Geeft recepten uit alle boeken weer" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "Boek IDs, herhaal voor meerdere. Geeft recepten weer uit alle boeken." -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" "Boek IDs, herhaal voor meerdere. Sluit recepten uit elk van de boeken uit." -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "Boek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit." -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" "Wanneer alleen interne recepten gevonden moeten worden. [waar/onwaar]" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" "Geeft de resultaten in willekeurige volgorde weer. [waar/onwaar]" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "Geeft nieuwe resultaten eerst weer. [waar/onwaar]" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" @@ -2696,7 +2688,7 @@ msgstr "" "Filter recepten X maal of meer bereid. Negatieve waarden geven minder dan X " "keer bereide recepten weer" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." @@ -2704,7 +2696,7 @@ msgstr "" "Filter recepten op laatst bereid op of na JJJJ-MM-DD. Voorafgaand - filters " "op of voor datum." -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." @@ -2712,7 +2704,7 @@ msgstr "" "Filter recepten aangemaakt op of na JJJJ-MM-DD. Voorafgaand - filters op of " "voor datum." -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." @@ -2720,7 +2712,7 @@ msgstr "" "Filter recepten op geüpdatet op of na JJJJ-MM-DD. Voorafgaand - filters op " "of voor datum." -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." @@ -2728,13 +2720,13 @@ msgstr "" "Filter recepten op laatst bekeken op of na JJJJ-MM-DD. Voorafgaand - filters " "op of voor datum." -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" "Filter recepten die bereid kunnen worden met ingrediënten die op voorraad " "zijn. [waar/onwaar]" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." @@ -2742,7 +2734,7 @@ msgstr "" "Geeft het boodschappenlijstje item met een primaire sleutel van id. " "Meerdere waarden toegestaan." -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." @@ -2750,41 +2742,41 @@ msgstr "" "Filter boodschappenlijstjes op aangevinkt. [waar,onwaar,beide,recent]" "
- recent bevat niet aangevinkte en recent voltooide items." -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" "Geeft items op boodschappenlijstjes gesorteerd per supermarktcategorie weer." -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "Niks te doen." -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "Verbinding geweigerd." -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "Verkeerd URL schema." -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 msgid "No usable data could be found." msgstr "Er is geen bruikbare data gevonden." -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "Deze optie is nog niet beschikbaar in de gehoste versie van Tandoor!" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "Synchronisatie succesvol!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "Er is een fout opgetreden bij het synchroniseren met Opslag" @@ -2873,6 +2865,10 @@ msgstr "Ontdekken" msgid "Shopping List" msgstr "Boodschappenlijst" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "Uitnodigingslink" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "Supermarkten" @@ -2980,6 +2976,9 @@ msgstr "" "Links voor het delen van recepten zijn gedeactiveerd. Neem contact op met de " "paginabeheerder voor aanvullende informatie." +#~ msgid "Show Links" +#~ msgstr "Toon links" + #~ msgid "A user is required" #~ msgstr "Een gebruiker is verplicht" diff --git a/cookbook/locale/pt/LC_MESSAGES/django.po b/cookbook/locale/pt/LC_MESSAGES/django.po index 3f59ccef..4537dcd0 100644 --- a/cookbook/locale/pt/LC_MESSAGES/django.po +++ b/cookbook/locale/pt/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2021-11-12 20:06+0000\n" "Last-Translator: Henrique Silva \n" "Language-Team: Portuguese not recommend!\n" " Please follow the steps described\n" @@ -2288,16 +2280,16 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2310,11 +2302,11 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2325,15 +2317,15 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2346,245 +2338,245 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "" @@ -2667,6 +2659,10 @@ msgstr "" msgid "Shopping List" msgstr "" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "" diff --git a/cookbook/locale/rn/LC_MESSAGES/django.po b/cookbook/locale/rn/LC_MESSAGES/django.po index d074741a..4fd4253a 100644 --- a/cookbook/locale/rn/LC_MESSAGES/django.po +++ b/cookbook/locale/rn/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -471,7 +471,7 @@ msgstr "" msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:560 +#: .\cookbook\helper\recipe_search.py:565 msgid "One of queryset or hash_key must be provided" msgstr "" @@ -484,12 +484,12 @@ msgstr "" msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:42 +#: .\cookbook\integration\copymethat.py:41 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:71 +#: .\cookbook\integration\copymethat.py:70 #: .\cookbook\integration\recettetek.py:54 #: .\cookbook\integration\recipekeeper.py:63 msgid "Imported from" @@ -620,119 +620,119 @@ msgstr "" msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1160 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1161 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Food Alias" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Unit Alias" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Keyword Alias" msgstr "" -#: .\cookbook\models.py:1225 +#: .\cookbook\models.py:1227 #: .\cookbook\templates\include\recipe_open_modal.html:7 #: .\cookbook\views\delete.py:36 .\cookbook\views\edit.py:251 #: .\cookbook\views\new.py:48 msgid "Recipe" msgstr "" -#: .\cookbook\models.py:1226 +#: .\cookbook\models.py:1228 msgid "Food" msgstr "" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "" -#: .\cookbook\serializer.py:204 +#: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." msgstr "" -#: .\cookbook\serializer.py:273 +#: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:284 +#: .\cookbook\serializer.py:301 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1054 +#: .\cookbook\serializer.py:1084 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1055 +#: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1056 +#: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1179 +#: .\cookbook\serializer.py:1209 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1181 +#: .\cookbook\serializer.py:1211 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1183 +#: .\cookbook\serializer.py:1213 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1192 +#: .\cookbook\serializer.py:1222 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1194 +#: .\cookbook\serializer.py:1224 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1196 +#: .\cookbook\serializer.py:1226 msgid "When set to true will delete all food from active shopping lists." msgstr "" @@ -864,7 +864,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "" @@ -1028,7 +1028,7 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" @@ -1121,36 +1121,36 @@ msgstr "" msgid "Your Spaces" msgstr "" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2091,19 +2091,11 @@ msgstr "" msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2114,21 +2106,21 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2138,16 +2130,16 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2160,11 +2152,11 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2175,15 +2167,15 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2196,245 +2188,245 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "" @@ -2517,6 +2509,10 @@ msgstr "" msgid "Shopping List" msgstr "" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "" diff --git a/cookbook/locale/tr/LC_MESSAGES/django.po b/cookbook/locale/tr/LC_MESSAGES/django.po index e1186363..f38438e6 100644 --- a/cookbook/locale/tr/LC_MESSAGES/django.po +++ b/cookbook/locale/tr/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2020-06-02 19:28+0000\n" "Last-Translator: Emre S, 2020\n" "Language-Team: Turkish (https://www.transifex.com/django-recipes/" @@ -488,7 +488,7 @@ msgstr "" msgid "You have more users than allowed in your space." msgstr "" -#: .\cookbook\helper\recipe_search.py:560 +#: .\cookbook\helper\recipe_search.py:565 msgid "One of queryset or hash_key must be provided" msgstr "" @@ -501,12 +501,12 @@ msgstr "" msgid "Could not parse template code." msgstr "" -#: .\cookbook\integration\copymethat.py:42 +#: .\cookbook\integration\copymethat.py:41 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "" -#: .\cookbook\integration\copymethat.py:71 +#: .\cookbook\integration\copymethat.py:70 #: .\cookbook\integration\recettetek.py:54 #: .\cookbook\integration\recipekeeper.py:63 msgid "Imported from" @@ -637,119 +637,119 @@ msgstr "" msgid " is part of a recipe step and cannot be deleted" msgstr "" -#: .\cookbook\models.py:1160 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "" -#: .\cookbook\models.py:1161 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Food Alias" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Unit Alias" msgstr "" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Keyword Alias" msgstr "" -#: .\cookbook\models.py:1225 +#: .\cookbook\models.py:1227 #: .\cookbook\templates\include\recipe_open_modal.html:7 #: .\cookbook\views\delete.py:36 .\cookbook\views\edit.py:251 #: .\cookbook\views\new.py:48 msgid "Recipe" msgstr "" -#: .\cookbook\models.py:1226 +#: .\cookbook\models.py:1228 msgid "Food" msgstr "" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "" -#: .\cookbook\serializer.py:204 +#: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." msgstr "" -#: .\cookbook\serializer.py:273 +#: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." msgstr "" -#: .\cookbook\serializer.py:284 +#: .\cookbook\serializer.py:301 msgid "You have reached your file upload limit." msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "Hello" msgstr "" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "You have been invited by " msgstr "" -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " msgstr "" -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " msgstr "" -#: .\cookbook\serializer.py:1054 +#: .\cookbook\serializer.py:1084 msgid "" "If the link does not work use the following code to manually join the space: " msgstr "" -#: .\cookbook\serializer.py:1055 +#: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " msgstr "" -#: .\cookbook\serializer.py:1056 +#: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" msgstr "" -#: .\cookbook\serializer.py:1179 +#: .\cookbook\serializer.py:1209 msgid "Existing shopping list to update" msgstr "" -#: .\cookbook\serializer.py:1181 +#: .\cookbook\serializer.py:1211 msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." msgstr "" -#: .\cookbook\serializer.py:1183 +#: .\cookbook\serializer.py:1213 msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." msgstr "" -#: .\cookbook\serializer.py:1192 +#: .\cookbook\serializer.py:1222 msgid "Amount of food to add to the shopping list" msgstr "" -#: .\cookbook\serializer.py:1194 +#: .\cookbook\serializer.py:1224 msgid "ID of unit to use for the shopping list" msgstr "" -#: .\cookbook\serializer.py:1196 +#: .\cookbook\serializer.py:1226 msgid "When set to true will delete all food from active shopping lists." msgstr "" @@ -881,7 +881,7 @@ msgid "" msgstr "" #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "" @@ -1045,7 +1045,7 @@ msgstr "" msgid "We are sorry, but the sign up is currently closed." msgstr "" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "" @@ -1140,36 +1140,36 @@ msgstr "" msgid "Your Spaces" msgstr "" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2110,19 +2110,11 @@ msgstr "" msgid "Internal Recipes" msgstr "" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2133,21 +2125,21 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2157,16 +2149,16 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2179,11 +2171,11 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2194,15 +2186,15 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2215,245 +2207,245 @@ msgstr "" msgid "URL Import" msgstr "" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "" -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 msgid "No usable data could be found." msgstr "" -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "" @@ -2536,6 +2528,10 @@ msgstr "" msgid "Shopping List" msgstr "" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "" diff --git a/cookbook/locale/zh_CN/LC_MESSAGES/django.po b/cookbook/locale/zh_CN/LC_MESSAGES/django.po index bce4a1cb..5c4d3543 100644 --- a/cookbook/locale/zh_CN/LC_MESSAGES/django.po +++ b/cookbook/locale/zh_CN/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: 2022-01-22 03:30+0000\n" "Last-Translator: 糖多 <1365143958@qq.com>\n" "Language-Team: Chinese (Simplified) 发起新的电子邮件确认请求。" #: .\cookbook\templates\account\login.html:8 -#: .\cookbook\templates\base.html:339 .\cookbook\templates\openid\login.html:8 +#: .\cookbook\templates\base.html:340 .\cookbook\templates\openid\login.html:8 msgid "Login" msgstr "登录" @@ -1075,7 +1075,7 @@ msgstr "注册已关闭" msgid "We are sorry, but the sign up is currently closed." msgstr "我们很抱歉,但目前注册已经结束。" -#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:329 +#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:330 #: .\cookbook\templates\rest_framework\api.html:11 msgid "API Documentation" msgstr "应用程序接口文档" @@ -1172,36 +1172,36 @@ msgstr "管理员" msgid "Your Spaces" msgstr "没有空间" -#: .\cookbook\templates\base.html:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" msgstr "" -#: .\cookbook\templates\base.html:323 +#: .\cookbook\templates\base.html:324 msgid "Markdown Guide" msgstr "Markdown 手册" -#: .\cookbook\templates\base.html:325 +#: .\cookbook\templates\base.html:326 msgid "GitHub" msgstr "GitHub" -#: .\cookbook\templates\base.html:327 +#: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" msgstr "翻译筒状泥炉<_<" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "应用程序接口浏览器" -#: .\cookbook\templates\base.html:334 +#: .\cookbook\templates\base.html:335 msgid "Log out" msgstr "退出" -#: .\cookbook\templates\base.html:356 +#: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" msgstr "" -#: .\cookbook\templates\base.html:357 +#: .\cookbook\templates\base.html:358 msgid "Upgrade Now" msgstr "" @@ -2221,19 +2221,11 @@ msgstr "" msgid "Internal Recipes" msgstr "内部菜谱" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "邀请链接" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "显示链接" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "系统信息" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2251,21 +2243,21 @@ msgstr "" "\">这里。\n" " " -#: .\cookbook\templates\system.html:48 +#: .\cookbook\templates\system.html:36 msgid "Media Serving" msgstr "媒体服务" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 msgid "Warning" msgstr "警告" -#: .\cookbook\templates\system.html:49 .\cookbook\templates\system.html:64 -#: .\cookbook\templates\system.html:80 .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:37 .\cookbook\templates\system.html:52 +#: .\cookbook\templates\system.html:68 .\cookbook\templates\system.html:83 msgid "Ok" msgstr "好的" -#: .\cookbook\templates\system.html:51 +#: .\cookbook\templates\system.html:39 msgid "" "Serving media files directly using gunicorn/python is not recommend!\n" " Please follow the steps described\n" @@ -2279,16 +2271,16 @@ msgstr "" "tag/0.8.1\">这里 描述的步骤操作更新安装。\n" " " -#: .\cookbook\templates\system.html:57 .\cookbook\templates\system.html:73 -#: .\cookbook\templates\system.html:88 .\cookbook\templates\system.html:102 +#: .\cookbook\templates\system.html:45 .\cookbook\templates\system.html:61 +#: .\cookbook\templates\system.html:76 .\cookbook\templates\system.html:90 msgid "Everything is fine!" msgstr "一切都好!" -#: .\cookbook\templates\system.html:62 +#: .\cookbook\templates\system.html:50 msgid "Secret Key" msgstr "密钥" -#: .\cookbook\templates\system.html:66 +#: .\cookbook\templates\system.html:54 msgid "" "\n" " You do not have a SECRET_KEY configured in your " @@ -2301,11 +2293,11 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:78 +#: .\cookbook\templates\system.html:66 msgid "Debug Mode" msgstr "调试模式" -#: .\cookbook\templates\system.html:82 +#: .\cookbook\templates\system.html:70 msgid "" "\n" " This application is still running in debug mode. This is most " @@ -2316,15 +2308,15 @@ msgid "" " " msgstr "" -#: .\cookbook\templates\system.html:93 +#: .\cookbook\templates\system.html:81 msgid "Database" msgstr "数据库" -#: .\cookbook\templates\system.html:95 +#: .\cookbook\templates\system.html:83 msgid "Info" msgstr "信息" -#: .\cookbook\templates\system.html:97 +#: .\cookbook\templates\system.html:85 msgid "" "\n" " This application is not running with a Postgres database " @@ -2337,247 +2329,247 @@ msgstr "" msgid "URL Import" msgstr "链接导入" -#: .\cookbook\views\api.py:97 .\cookbook\views\api.py:189 +#: .\cookbook\views\api.py:105 .\cookbook\views\api.py:197 msgid "Parameter updated_at incorrectly formatted" msgstr "参数 updated_at 格式不正确" -#: .\cookbook\views\api.py:209 .\cookbook\views\api.py:312 +#: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" msgstr "" -#: .\cookbook\views\api.py:213 +#: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" msgstr "无法与同一对象合并!" -#: .\cookbook\views\api.py:220 +#: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" msgstr "" -#: .\cookbook\views\api.py:225 +#: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" msgstr "无法与子对象合并!" -#: .\cookbook\views\api.py:258 +#: .\cookbook\views\api.py:266 msgid "{source.name} was merged successfully with {target.name}" msgstr "{source.name} 已成功与 {target.name} 合并" -#: .\cookbook\views\api.py:263 +#: .\cookbook\views\api.py:271 msgid "An error occurred attempting to merge {source.name} with {target.name}" msgstr "视图合并 {source.name} 和 {target.name} 时出错" -#: .\cookbook\views\api.py:321 +#: .\cookbook\views\api.py:329 msgid "{child.name} was moved successfully to the root." msgstr "{child.name} 已成功移动到根目录。" -#: .\cookbook\views\api.py:324 .\cookbook\views\api.py:342 +#: .\cookbook\views\api.py:332 .\cookbook\views\api.py:350 msgid "An error occurred attempting to move " msgstr "尝试移动时出错 " -#: .\cookbook\views\api.py:327 +#: .\cookbook\views\api.py:335 msgid "Cannot move an object to itself!" msgstr "无法将对象移动到自身!" -#: .\cookbook\views\api.py:333 +#: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" msgstr "" -#: .\cookbook\views\api.py:339 +#: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" msgstr "{child.name} 成功移动到父节点 {parent.name}" -#: .\cookbook\views\api.py:534 +#: .\cookbook\views\api.py:542 msgid "{obj.name} was removed from the shopping list." msgstr "{obj.name} 已从购物清单中删除。" -#: .\cookbook\views\api.py:539 .\cookbook\views\api.py:871 -#: .\cookbook\views\api.py:884 +#: .\cookbook\views\api.py:547 .\cookbook\views\api.py:879 +#: .\cookbook\views\api.py:892 msgid "{obj.name} was added to the shopping list." msgstr "{obj.name} 已添加到购物清单中。" -#: .\cookbook\views\api.py:666 +#: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." msgstr "" -#: .\cookbook\views\api.py:712 +#: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" -#: .\cookbook\views\api.py:714 +#: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" -#: .\cookbook\views\api.py:717 +#: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" -#: .\cookbook\views\api.py:720 +#: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" -#: .\cookbook\views\api.py:728 +#: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:731 +#: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" -#: .\cookbook\views\api.py:733 +#: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:735 +#: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" -#: .\cookbook\views\api.py:737 +#: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" -#: .\cookbook\views\api.py:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." msgstr "" -#: .\cookbook\views\api.py:740 +#: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" -#: .\cookbook\views\api.py:741 +#: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." msgstr "" -#: .\cookbook\views\api.py:743 +#: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" -#: .\cookbook\views\api.py:745 +#: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:747 +#: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" -#: .\cookbook\views\api.py:749 +#: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" -#: .\cookbook\views\api.py:751 +#: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" msgstr "" -#: .\cookbook\views\api.py:753 +#: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" -#: .\cookbook\views\api.py:755 +#: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" -#: .\cookbook\views\api.py:757 +#: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" -#: .\cookbook\views\api.py:759 +#: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:761 +#: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:763 +#: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" -#: .\cookbook\views\api.py:765 +#: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" -#: .\cookbook\views\api.py:767 +#: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" -#: .\cookbook\views\api.py:934 +#: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" -#: .\cookbook\views\api.py:1134 +#: .\cookbook\views\api.py:1140 msgid "Nothing to do." msgstr "无事可做。" -#: .\cookbook\views\api.py:1153 +#: .\cookbook\views\api.py:1160 msgid "Invalid Url" msgstr "" -#: .\cookbook\views\api.py:1158 +#: .\cookbook\views\api.py:1167 msgid "Connection Refused." msgstr "连接被拒绝。" -#: .\cookbook\views\api.py:1163 +#: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." msgstr "" -#: .\cookbook\views\api.py:1170 +#: .\cookbook\views\api.py:1195 #, fuzzy #| msgid "No useable data could be found." msgid "No usable data could be found." msgstr "找不到可用的数据。" -#: .\cookbook\views\api.py:1260 .\cookbook\views\data.py:28 +#: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" msgstr "" -#: .\cookbook\views\api.py:1282 +#: .\cookbook\views\api.py:1325 msgid "Sync successful!" msgstr "同步成功!" -#: .\cookbook\views\api.py:1287 +#: .\cookbook\views\api.py:1330 msgid "Error synchronizing with Storage" msgstr "与存储同步时出错" @@ -2662,6 +2654,10 @@ msgstr "探索" msgid "Shopping List" msgstr "采购单" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "邀请链接" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "超市" @@ -2761,6 +2757,9 @@ msgid "" "contact the page administrator." msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理员联系。" +#~ msgid "Show Links" +#~ msgstr "显示链接" + #~ msgid "A user is required" #~ msgstr "需要一个用户" diff --git a/recipes/locale/ca/LC_MESSAGES/django.po b/recipes/locale/ca/LC_MESSAGES/django.po index 5e010f47..b49fd7f4 100644 --- a/recipes/locale/ca/LC_MESSAGES/django.po +++ b/recipes/locale/ca/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/de/LC_MESSAGES/django.po b/recipes/locale/de/LC_MESSAGES/django.po index 5f1ceeb8..8aab9743 100644 --- a/recipes/locale/de/LC_MESSAGES/django.po +++ b/recipes/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/en/LC_MESSAGES/django.po b/recipes/locale/en/LC_MESSAGES/django.po index 5e010f47..b49fd7f4 100644 --- a/recipes/locale/en/LC_MESSAGES/django.po +++ b/recipes/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/es/LC_MESSAGES/django.po b/recipes/locale/es/LC_MESSAGES/django.po index 5e010f47..b49fd7f4 100644 --- a/recipes/locale/es/LC_MESSAGES/django.po +++ b/recipes/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/fr/LC_MESSAGES/django.po b/recipes/locale/fr/LC_MESSAGES/django.po index c383d9d4..c4023609 100644 --- a/recipes/locale/fr/LC_MESSAGES/django.po +++ b/recipes/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/hu_HU/LC_MESSAGES/django.po b/recipes/locale/hu_HU/LC_MESSAGES/django.po index ea5a48f4..40bc1e91 100644 --- a/recipes/locale/hu_HU/LC_MESSAGES/django.po +++ b/recipes/locale/hu_HU/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/it/LC_MESSAGES/django.po b/recipes/locale/it/LC_MESSAGES/django.po index 5e010f47..b49fd7f4 100644 --- a/recipes/locale/it/LC_MESSAGES/django.po +++ b/recipes/locale/it/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/lv/LC_MESSAGES/django.po b/recipes/locale/lv/LC_MESSAGES/django.po index d017ea76..1c63fc38 100644 --- a/recipes/locale/lv/LC_MESSAGES/django.po +++ b/recipes/locale/lv/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/nl/LC_MESSAGES/django.po b/recipes/locale/nl/LC_MESSAGES/django.po index 5e010f47..b49fd7f4 100644 --- a/recipes/locale/nl/LC_MESSAGES/django.po +++ b/recipes/locale/nl/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/pt/LC_MESSAGES/django.po b/recipes/locale/pt/LC_MESSAGES/django.po index 5e010f47..b49fd7f4 100644 --- a/recipes/locale/pt/LC_MESSAGES/django.po +++ b/recipes/locale/pt/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/rn/LC_MESSAGES/django.po b/recipes/locale/rn/LC_MESSAGES/django.po index ea5a48f4..40bc1e91 100644 --- a/recipes/locale/rn/LC_MESSAGES/django.po +++ b/recipes/locale/rn/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/tr/LC_MESSAGES/django.po b/recipes/locale/tr/LC_MESSAGES/django.po index c383d9d4..c4023609 100644 --- a/recipes/locale/tr/LC_MESSAGES/django.po +++ b/recipes/locale/tr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/recipes/locale/zh_CN/LC_MESSAGES/django.po b/recipes/locale/zh_CN/LC_MESSAGES/django.po index ea5a48f4..40bc1e91 100644 --- a/recipes/locale/zh_CN/LC_MESSAGES/django.po +++ b/recipes/locale/zh_CN/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" From 5de7fa9d48045b9c2912e28c627385da252515c5 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 19:41:46 +0200 Subject: [PATCH 16/76] fixed another social auth issues --- cookbook/views/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cookbook/views/views.py b/cookbook/views/views.py index b601ab74..deb8821e 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -127,7 +127,7 @@ def space_overview(request): if join_form.is_valid(): return HttpResponseRedirect(reverse('view_invite', args=[join_form.cleaned_data['token']])) else: - if settings.SOCIAL_DEFAULT_ACCESS and len(request.user.userspace_set) == 0: + if settings.SOCIAL_DEFAULT_ACCESS and len(request.user.userspace_set.all()) == 0: user_space = UserSpace.objects.create(space=Space.objects.first(), user=request.user, active=False) user_space.groups.add(Group.objects.filter(name=settings.SOCIAL_DEFAULT_GROUP).get()) return HttpResponseRedirect(reverse('index')) From 8bb7ce20622b7c285108dfeb5aec6d864d097654 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 19:43:11 +0200 Subject: [PATCH 17/76] removed user servings feature --- cookbook/templates/recipe_view.html | 1 - cookbook/views/views.py | 15 +-------------- vue/src/apps/RecipeView/RecipeView.vue | 4 ---- 3 files changed, 1 insertion(+), 19 deletions(-) diff --git a/cookbook/templates/recipe_view.html b/cookbook/templates/recipe_view.html index 1a55fde1..b1246b5a 100644 --- a/cookbook/templates/recipe_view.html +++ b/cookbook/templates/recipe_view.html @@ -64,7 +64,6 @@ window.CUSTOM_LOCALE = '{{ request.LANGUAGE_CODE }}' window.RECIPE_ID = {{recipe.pk}}; - window.USER_SERVINGS = {{ user_servings }}; window.SHARE_UID = '{{ share }}'; window.USER_PREF = { 'use_fractions': {% if request.user.userpreference.use_fractions %} true {% else %} false {% endif %}, diff --git a/cookbook/views/views.py b/cookbook/views/views.py index deb8821e..dd2a77ca 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -190,18 +190,6 @@ def recipe_view(request, pk, share=None): comment_form = CommentForm() - user_servings = None - if request.user.is_authenticated: - user_servings = CookLog.objects.filter( - recipe=recipe, - created_by=request.user, - servings__gt=0, - space=request.space, - ).all().aggregate(Avg('servings'))['servings__avg'] - - if not user_servings: - user_servings = 0 - if request.user.is_authenticated: if not ViewLog.objects.filter(recipe=recipe, created_by=request.user, created_at__gt=(timezone.now() - timezone.timedelta(minutes=5)), @@ -209,8 +197,7 @@ def recipe_view(request, pk, share=None): ViewLog.objects.create(recipe=recipe, created_by=request.user, space=request.space) return render(request, 'recipe_view.html', - {'recipe': recipe, 'comments': comments, 'comment_form': comment_form, 'share': share, - 'user_servings': user_servings}) + {'recipe': recipe, 'comments': comments, 'comment_form': comment_form, 'share': share,}) @group_required('user') diff --git a/vue/src/apps/RecipeView/RecipeView.vue b/vue/src/apps/RecipeView/RecipeView.vue index c2774081..4968f0b4 100644 --- a/vue/src/apps/RecipeView/RecipeView.vue +++ b/vue/src/apps/RecipeView/RecipeView.vue @@ -269,10 +269,6 @@ export default { }, loadRecipe: function (recipe_id) { apiLoadRecipe(recipe_id).then((recipe) => { - if (window.USER_SERVINGS !== 0) { - recipe.servings = window.USER_SERVINGS - } - let total_time = 0 for (let step of recipe.steps) { for (let ingredient of step.ingredients) { From 5ead4967a51490d81120643d8ae5c2f7cbf8e400 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 19:54:18 +0200 Subject: [PATCH 18/76] removed ingredient list shopping --- vue/src/components/IngredientComponent.vue | 99 +++---------- vue/src/components/IngredientsCard.vue | 158 +-------------------- 2 files changed, 23 insertions(+), 234 deletions(-) diff --git a/vue/src/components/IngredientComponent.vue b/vue/src/components/IngredientComponent.vue index 0b10d4d3..3c531e77 100644 --- a/vue/src/components/IngredientComponent.vue +++ b/vue/src/components/IngredientComponent.vue @@ -7,124 +7,65 @@ diff --git a/vue/src/components/IngredientsCard.vue b/vue/src/components/IngredientsCard.vue index 27974572..e8591e63 100644 --- a/vue/src/components/IngredientsCard.vue +++ b/vue/src/components/IngredientsCard.vue @@ -6,42 +6,27 @@

{{ $t("Ingredients") }}

-
-

- - - -

-
-
-
- -
-
+
@@ -80,7 +65,6 @@ export default { servings: {type: Number, default: 1}, detailed: {type: Boolean, default: true}, header: {type: Boolean, default: false}, - add_shopping_mode: {type: Boolean, default: false}, recipe_list: {type: Number, default: undefined}, }, data() { @@ -108,145 +92,13 @@ export default { }, }, watch: { - ShoppingRecipes: function (newVal, oldVal) { - if (newVal.length === 0 || this.add_shopping_mode) { - this.selected_shoppingrecipe = this.recipe_list - } else if (newVal.length === 1) { - this.selected_shoppingrecipe = newVal[0].value - } - }, - selected_shoppingrecipe: function (newVal, oldVal) { - this.update_shopping = this.shopping_list.filter((x) => x.list_recipe === newVal).map((x) => x.ingredient) - this.$emit("change-servings", this.ShoppingRecipes.filter((x) => x.value === this.selected_shoppingrecipe)[0].servings) - }, + }, mounted() { - if (this.add_shopping_mode) { - this.show_shopping = true - this.getShopping(false) - } + }, methods: { - getShopping: function (toggle_shopping = true) { - if (toggle_shopping) { - this.show_shopping = !this.show_shopping - } - if (this.show_shopping) { - let ingredient_list = this.steps - .map((x) => x.ingredients) - .flat() - .filter((x) => (x.food !== null && x.food !== undefined)) - .map((x) => x.food.id) - - let params = { - id: ingredient_list, - checked: "false", - } - this.genericAPI(this.Models.SHOPPING_LIST, this.Actions.LIST, params).then((result) => { - this.shopping_list = result.data - - if (this.add_shopping_mode) { - if (this.recipe_list) { - this.$emit( - "starting-cart", - this.shopping_list.filter((x) => x.list_recipe === this.recipe_list).map((x) => x.ingredient) - ) - } else { - this.$emit( - "starting-cart", - this.steps - .map((x) => x.ingredients) - .flat() - .filter((x) => x?.food?.food_onhand == false && x?.food?.ignore_shopping == false) - .map((x) => x.id) - ) - } - } - }) - } - }, - saveShopping: function (del_shopping = false) { - let servings = this.servings - if (del_shopping) { - servings = -1 - } - let params = { - id: this.recipe, - list_recipe: this.selected_shoppingrecipe, - ingredients: this.update_shopping, - servings: servings, - } - this.genericAPI(this.Models.RECIPE, this.Actions.SHOPPING, params) - .then((result) => { - if (del_shopping) { - StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_DELETE) - } else if (this.selected_shoppingrecipe) { - StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE) - } else { - StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_CREATE) - } - }) - .catch((err) => { - if (del_shopping) { - StandardToasts.makeStandardToast(this, StandardToasts.FAIL_DELETE, err) - } else if (this.selected_shoppingrecipe) { - StandardToasts.makeStandardToast(this, StandardToasts.FAIL_UPDATE, err) - } else { - StandardToasts.makeStandardToast(this, StandardToasts.FAIL_CREATE, err) - } - this.$emit("shopping-failed") - }) - }, - addShopping: function (e) { - // ALERT: this will all break if ingredients are re-used between recipes - if (e.add) { - this.update_shopping.push(e.item.id) - this.shopping_list.push({ - id: Math.random(), - amount: e.item.amount, - ingredient: e.item.id, - food: e.item.food, - list_recipe: this.selected_shoppingrecipe, - }) - } else { - this.update_shopping = [...this.update_shopping.filter((x) => x !== e.item.id)] - this.shopping_list = [...this.shopping_list.filter((x) => !(x.ingredient === e.item.id && x.list_recipe === this.selected_shoppingrecipe))] - } - if (this.add_shopping_mode) { - this.$emit("add-to-shopping", e) - } - }, - prepareIngredient: function (i) { - let shopping = this.shopping_list.filter((x) => x.ingredient === i.id) - let selected_list = this.shopping_list.filter((x) => x.list_recipe === this.selected_shoppingrecipe && x.ingredient === i.id) - // checked = in the selected shopping list OR if in shoppping mode without a selected recipe, the default value true unless it is ignored or onhand - let checked = selected_list.length > 0 || (this.add_shopping_mode && !this.selected_shoppingrecipe && !i?.food?.ignore_recipe && !i?.food?.food_onhand) - - let shopping_status = false // not in shopping list - if (shopping.length > 0) { - if (selected_list.length > 0) { - shopping_status = true // in shopping list for *this* recipe - } else { - shopping_status = null // in shopping list but not *this* recipe - } - } - - return { - ...i, - shop: checked, - shopping_status: shopping_status, // possible values: true, false, null - category: i.food?.supermarket_category?.name, - shopping_list: shopping.map((x) => { - return { - mealplan: x?.recipe_mealplan?.name, - amount: x.amount, - food: x.food?.name, - unit: x.unit?.name, - } - }), - } - }, }, } From da09602834e4f0729c4075dbd2fc38f9f93c053e Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 20:05:59 +0200 Subject: [PATCH 19/76] removed old search pages --- cookbook/admin.py | 4 +- cookbook/filters.py | 62 ------------------- cookbook/forms.py | 33 +++++----- cookbook/helper/recipe_search.py | 16 +---- ...ve_userpreference_search_style_and_more.py | 21 +++++++ cookbook/models.py | 11 ---- cookbook/serializer.py | 4 +- cookbook/tables.py | 56 ----------------- cookbook/urls.py | 1 - cookbook/views/api.py | 3 +- cookbook/views/views.py | 53 ++-------------- requirements.txt | 1 - 12 files changed, 48 insertions(+), 217 deletions(-) delete mode 100644 cookbook/filters.py create mode 100644 cookbook/migrations/0178_remove_userpreference_search_style_and_more.py diff --git a/cookbook/admin.py b/cookbook/admin.py index 0e903999..f512121c 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -47,9 +47,9 @@ admin.site.register(Space, SpaceAdmin) class UserPreferenceAdmin(admin.ModelAdmin): - list_display = ('name', 'theme', 'nav_color', 'default_page', 'search_style',) # TODO add new fields + list_display = ('name', 'theme', 'nav_color', 'default_page',) search_fields = ('user__username',) - list_filter = ('theme', 'nav_color', 'default_page', 'search_style') + list_filter = ('theme', 'nav_color', 'default_page',) date_hierarchy = 'created_at' @staticmethod diff --git a/cookbook/filters.py b/cookbook/filters.py deleted file mode 100644 index ac377abc..00000000 --- a/cookbook/filters.py +++ /dev/null @@ -1,62 +0,0 @@ -import django_filters -from django.conf import settings -from django.contrib.postgres.search import TrigramSimilarity -from django.db.models import Q -from django.utils.translation import gettext as _ -from django_scopes import scopes_disabled - -from cookbook.forms import MultiSelectWidget -from cookbook.models import Food, Keyword, Recipe - -with scopes_disabled(): - class RecipeFilter(django_filters.FilterSet): - name = django_filters.CharFilter(method='filter_name') - keywords = django_filters.ModelMultipleChoiceFilter( - queryset=Keyword.objects.none(), - widget=MultiSelectWidget, - method='filter_keywords' - ) - foods = django_filters.ModelMultipleChoiceFilter( - queryset=Food.objects.none(), - widget=MultiSelectWidget, - method='filter_foods', - label=_('Ingredients') - ) - - def __init__(self, data=None, *args, **kwargs): - space = kwargs.pop('space') - super().__init__(data, *args, **kwargs) - self.filters['foods'].queryset = Food.objects.filter(space=space).all() - self.filters['keywords'].queryset = Keyword.objects.filter(space=space).all() - - @staticmethod - def filter_keywords(queryset, name, value): - if not name == 'keywords': - return queryset - for x in value: - queryset = queryset.filter(keywords=x) - return queryset - - @staticmethod - def filter_foods(queryset, name, value): - if not name == 'foods': - return queryset - for x in value: - queryset = queryset.filter(steps__ingredients__food__name=x).distinct() - return queryset - - @staticmethod - def filter_name(queryset, name, value): - if not name == 'name': - return queryset - if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', - 'django.db.backends.postgresql']: - queryset = queryset.annotate(similarity=TrigramSimilarity('name', value), ).filter( - Q(similarity__gt=0.1) | Q(name__unaccent__icontains=value)).order_by('-similarity') - else: - queryset = queryset.filter(name__icontains=value) - return queryset - - class Meta: - model = Recipe - fields = ['name', 'keywords', 'foods', 'internal'] diff --git a/cookbook/forms.py b/cookbook/forms.py index 50f88228..5ef9e6b9 100644 --- a/cookbook/forms.py +++ b/cookbook/forms.py @@ -45,8 +45,7 @@ class UserPreferenceForm(forms.ModelForm): model = UserPreference fields = ( 'default_unit', 'use_fractions', 'use_kj', 'theme', 'nav_color', - 'sticky_navbar', 'default_page', 'show_recent', 'search_style', - 'plan_share', 'ingredient_decimals', 'comments', 'left_handed', + 'sticky_navbar', 'default_page', 'plan_share', 'ingredient_decimals', 'comments', 'left_handed', ) labels = { @@ -57,8 +56,6 @@ class UserPreferenceForm(forms.ModelForm): 'nav_color': _('Navbar color'), 'sticky_navbar': _('Sticky navbar'), 'default_page': _('Default page'), - 'show_recent': _('Show recent recipes'), - 'search_style': _('Search style'), 'plan_share': _('Plan sharing'), 'ingredient_decimals': _('Ingredient decimal places'), 'shopping_auto_sync': _('Shopping list auto sync period'), @@ -68,23 +65,21 @@ class UserPreferenceForm(forms.ModelForm): help_texts = { 'nav_color': _('Color of the top navigation bar. Not all colors work with all themes, just try them out!'), - # noqa: E501 - 'default_unit': _('Default Unit to be used when inserting a new ingredient into a recipe.'), # noqa: E501 + + 'default_unit': _('Default Unit to be used when inserting a new ingredient into a recipe.'), 'use_fractions': _( 'Enables support for fractions in ingredient amounts (e.g. convert decimals to fractions automatically)'), - # noqa: E501 - 'use_kj': _('Display nutritional energy amounts in joules instead of calories'), # noqa: E501 + + 'use_kj': _('Display nutritional energy amounts in joules instead of calories'), 'plan_share': _('Users with whom newly created meal plans should be shared by default.'), 'shopping_share': _('Users with whom to share shopping lists.'), - # noqa: E501 - 'show_recent': _('Show recently viewed recipes on search page.'), # noqa: E501 - 'ingredient_decimals': _('Number of decimals to round ingredients.'), # noqa: E501 - 'comments': _('If you want to be able to create and see comments underneath recipes.'), # noqa: E501 + 'ingredient_decimals': _('Number of decimals to round ingredients.'), + 'comments': _('If you want to be able to create and see comments underneath recipes.'), 'shopping_auto_sync': _( - 'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit ' # noqa: E501 - 'of mobile data. If lower than instance limit it is reset when saving.' # noqa: E501 + 'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit ' + 'of mobile data. If lower than instance limit it is reset when saving.' ), - 'sticky_navbar': _('Makes the navbar stick to the top of the page.'), # noqa: E501 + 'sticky_navbar': _('Makes the navbar stick to the top of the page.'), 'mealplan_autoadd_shopping': _('Automatically add meal plan ingredients to shopping list.'), 'mealplan_autoexclude_onhand': _('Exclude ingredients that are on hand.'), 'left_handed': _('Will optimize the UI for use with your left hand.') @@ -336,9 +331,9 @@ class MealPlanForm(forms.ModelForm): ) help_texts = { - 'shared': _('You can list default users to share recipes with in the settings.'), # noqa: E501 + 'shared': _('You can list default users to share recipes with in the settings.'), 'note': _('You can use markdown to format this field. See the docs here') - # noqa: E501 + } widgets = { @@ -493,8 +488,8 @@ class ShoppingPreferenceForm(forms.ModelForm): help_texts = { 'shopping_share': _('Users will see all items you add to your shopping list. They must add you to see items on their list.'), 'shopping_auto_sync': _( - 'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit ' # noqa: E501 - 'of mobile data. If lower than instance limit it is reset when saving.' # noqa: E501 + 'Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but might use a little bit ' + 'of mobile data. If lower than instance limit it is reset when saving.' ), 'mealplan_autoadd_shopping': _('Automatically add meal plan ingredients to shopping list.'), 'mealplan_autoinclude_related': _('When adding a meal plan to the shopping list (manually or automatically), include all related recipes.'), diff --git a/cookbook/helper/recipe_search.py b/cookbook/helper/recipe_search.py index 3f361af0..d651a6ee 100644 --- a/cookbook/helper/recipe_search.py +++ b/cookbook/helper/recipe_search.py @@ -4,17 +4,14 @@ from datetime import date, timedelta from django.contrib.postgres.search import SearchQuery, SearchRank, SearchVector, TrigramSimilarity from django.core.cache import caches -from django.db.models import (Avg, Case, Count, Exists, F, Func, Max, OuterRef, Q, Subquery, Sum, - Value, When) +from django.db.models import (Avg, Case, Count, Exists, F, Func, Max, OuterRef, Q, Subquery, Value, When) from django.db.models.functions import Coalesce, Lower, Substr from django.utils import timezone, translation from django.utils.translation import gettext as _ -from cookbook.filters import RecipeFilter from cookbook.helper.HelperFunctions import Round, str2bool -from cookbook.helper.permission_helper import has_group_permission from cookbook.managers import DICTIONARY -from cookbook.models import (CookLog, CustomFilter, Food, Keyword, Recipe, RecipeBook, SearchFields, +from cookbook.models import (CookLog, CustomFilter, Food, Keyword, Recipe, SearchFields, SearchPreference, ViewLog) from recipes import settings @@ -759,12 +756,3 @@ class RecipeFacet(): else: return queryset.filter(depth__lte=depth).values('id', 'name', 'numchild').order_by(Lower('name').asc()) - -def old_search(request): - if has_group_permission(request.user, ('guest',)): - params = dict(request.GET) - params['internal'] = None - f = RecipeFilter(params, - queryset=Recipe.objects.filter(space=request.space).all().order_by(Lower('name').asc()), - space=request.space) - return f.qs diff --git a/cookbook/migrations/0178_remove_userpreference_search_style_and_more.py b/cookbook/migrations/0178_remove_userpreference_search_style_and_more.py new file mode 100644 index 00000000..73447a95 --- /dev/null +++ b/cookbook/migrations/0178_remove_userpreference_search_style_and_more.py @@ -0,0 +1,21 @@ +# Generated by Django 4.0.6 on 2022-07-12 18:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0177_recipe_show_ingredient_overview'), + ] + + operations = [ + migrations.RemoveField( + model_name='userpreference', + name='search_style', + ), + migrations.RemoveField( + model_name='userpreference', + name='show_recent', + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 89795be0..a0457ef2 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -355,13 +355,6 @@ class UserPreference(models.Model, PermissionModelMixin): (BOOKS, _('Books')), ) - # Search Style - SMALL = 'SMALL' - LARGE = 'LARGE' - NEW = 'NEW' - - SEARCH_STYLE = ((SMALL, _('Small')), (LARGE, _('Large')), (NEW, _('New'))) - user = AutoOneToOneField(User, on_delete=models.CASCADE, primary_key=True) theme = models.CharField(choices=THEMES, max_length=128, default=TANDOOR) nav_color = models.CharField( @@ -373,10 +366,6 @@ class UserPreference(models.Model, PermissionModelMixin): default_page = models.CharField( choices=PAGES, max_length=64, default=SEARCH ) - search_style = models.CharField( - choices=SEARCH_STYLE, max_length=64, default=NEW - ) - show_recent = models.BooleanField(default=True) plan_share = models.ManyToManyField( User, blank=True, related_name='plan_share_default' ) diff --git a/cookbook/serializer.py b/cookbook/serializer.py index a4b8b2fe..718964f1 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -258,8 +258,8 @@ class UserPreferenceSerializer(WritableNestedModelSerializer): class Meta: model = UserPreference fields = ( - 'user', 'theme', 'nav_color', 'default_unit', 'default_page', 'use_fractions', 'use_kj', 'search_style', - 'show_recent', 'plan_share', + 'user', 'theme', 'nav_color', 'default_unit', 'default_page', 'use_fractions', 'use_kj', + 'plan_share', 'ingredient_decimals', 'comments', 'shopping_auto_sync', 'mealplan_autoadd_shopping', 'food_inherit_default', 'default_delay', 'mealplan_autoinclude_related', 'mealplan_autoexclude_onhand', 'shopping_share', 'shopping_recent_days', diff --git a/cookbook/tables.py b/cookbook/tables.py index be05fb44..4fa1a731 100644 --- a/cookbook/tables.py +++ b/cookbook/tables.py @@ -1,4 +1,3 @@ - import django_tables2 as tables from django.utils.html import format_html from django.utils.translation import gettext as _ @@ -8,60 +7,6 @@ from .models import (CookLog, InviteLink, Recipe, RecipeImport, Storage, Sync, SyncLog, ViewLog) -class ImageUrlColumn(tables.Column): - def render(self, value): - if value.url: - return value.url - return None - - -class RecipeTableSmall(tables.Table): - id = tables.LinkColumn('edit_recipe', args=[A('id')]) - name = tables.LinkColumn('view_recipe', args=[A('id')]) - all_tags = tables.Column( - attrs={ - 'td': {'class': 'd-none d-lg-table-cell'}, - 'th': {'class': 'd-none d-lg-table-cell'} - } - ) - - class Meta: - model = Recipe - template_name = 'generic/table_template.html' - fields = ('id', 'name', 'all_tags') - - -class RecipeTable(tables.Table): - edit = tables.TemplateColumn( - "" + _('Edit') + "" # noqa: E501 - ) - name = tables.LinkColumn('view_recipe', args=[A('id')]) - all_tags = tables.Column( - attrs={ - 'td': {'class': 'd-none d-lg-table-cell'}, - 'th': {'class': 'd-none d-lg-table-cell'} - } - ) - image = ImageUrlColumn() - - class Meta: - model = Recipe - template_name = 'recipes_table.html' - fields = ( - 'id', 'name', 'all_tags', 'description', 'image', 'instructions', - 'working_time', 'waiting_time', 'internal' - ) - - -# class IngredientTable(tables.Table): -# id = tables.LinkColumn('edit_food', args=[A('id')]) - -# class Meta: -# model = Keyword -# template_name = 'generic/table_template.html' -# fields = ('id', 'name') - - class StorageTable(tables.Table): id = tables.LinkColumn('edit_storage', args=[A('id')]) @@ -122,7 +67,6 @@ class RecipeImportTable(tables.Table): fields = ('id', 'name', 'file_path') - class InviteLinkTable(tables.Table): link = tables.TemplateColumn( "" diff --git a/cookbook/urls.py b/cookbook/urls.py index 2c0acd29..92592681 100644 --- a/cookbook/urls.py +++ b/cookbook/urls.py @@ -63,7 +63,6 @@ urlpatterns = [ path('invite/', views.invite_link, name='view_invite'), path('system/', views.system, name='view_system'), path('search/', views.search, name='view_search'), - path('search/v2/', views.search_v2, name='view_search_v2'), path('books/', views.books, name='view_books'), path('plan/', views.meal_plan, name='view_plan'), path('plan/entry/', views.meal_plan_entry, name='view_plan_entry'), diff --git a/cookbook/views/api.py b/cookbook/views/api.py index 54df51bf..111048cf 100644 --- a/cookbook/views/api.py +++ b/cookbook/views/api.py @@ -52,7 +52,7 @@ from cookbook.helper.permission_helper import (CustomIsAdmin, CustomIsGuest, Cus CustomIsOwnerReadOnly, CustomIsShare, CustomIsShared, CustomIsSpaceOwner, CustomIsUser, group_required, is_space_owner, switch_user_active_space) -from cookbook.helper.recipe_search import RecipeFacet, RecipeSearch, old_search +from cookbook.helper.recipe_search import RecipeFacet, RecipeSearch from cookbook.helper.recipe_url_import import get_from_youtube_scraper, get_images_from_soup from cookbook.helper.scrapers.scrapers import text_scraper from cookbook.helper.shopping_helper import RecipeShoppingEditor, shopping_helper @@ -797,7 +797,6 @@ class RecipeViewSet(viewsets.ModelViewSet): if self.request.GET.get('debug', False): return JsonResponse({ 'new': str(self.get_queryset().query), - 'old': str(old_search(request).query) }) return super().list(request, *args, **kwargs) diff --git a/cookbook/views/views.py b/cookbook/views/views.py index dd2a77ca..db9266b5 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -11,28 +11,22 @@ from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth.models import Group from django.contrib.auth.password_validation import validate_password from django.core.exceptions import ValidationError -from django.db.models import Avg, Q -from django.db.models.functions import Lower +from django.db.models import Q from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse, reverse_lazy from django.utils import timezone from django.utils.translation import gettext as _ from django_scopes import scopes_disabled -from django_tables2 import RequestConfig from rest_framework.authtoken.models import Token -from cookbook.filters import RecipeFilter from cookbook.forms import (CommentForm, Recipe, SearchPreferenceForm, ShoppingPreferenceForm, - SpaceCreateForm, SpaceJoinForm, SpacePreferenceForm, User, + SpaceCreateForm, SpaceJoinForm, User, UserCreateForm, UserNameForm, UserPreference, UserPreferenceForm) from cookbook.helper.permission_helper import group_required, has_group_permission, share_link_valid, switch_user_active_space -from cookbook.models import (Comment, CookLog, Food, InviteLink, Keyword, - MealPlan, RecipeImport, SearchFields, SearchPreference, ShareLink, - Space, Unit, ViewLog, UserSpace) -from cookbook.tables import (CookLogTable, InviteLinkTable, RecipeTable, RecipeTableSmall, - ViewLogTable) -from cookbook.views.data import Object +from cookbook.models import (Comment, CookLog, InviteLink, MealPlan, SearchFields, SearchPreference, ShareLink, + Space, ViewLog, UserSpace) +from cookbook.tables import (CookLogTable, ViewLogTable) from recipes.version import BUILD_REF, VERSION_NUMBER @@ -58,46 +52,13 @@ def index(request): # TODO need to deprecate def search(request): if has_group_permission(request.user, ('guest',)): - if request.user.userpreference.search_style == UserPreference.NEW: - return search_v2(request) - f = RecipeFilter(request.GET, - queryset=Recipe.objects.filter(space=request.space).all().order_by( - Lower('name').asc()), - space=request.space) - if request.user.userpreference.search_style == UserPreference.LARGE: - table = RecipeTable(f.qs) - else: - table = RecipeTableSmall(f.qs) - RequestConfig(request, paginate={'per_page': 25}).configure(table) - - if request.GET == {} and request.user.userpreference.show_recent: - qs = Recipe.objects.filter(viewlog__created_by=request.user).filter( - space=request.space).order_by('-viewlog__created_at').all() - - recent_list = [] - for r in qs: - if r not in recent_list: - recent_list.append(r) - if len(recent_list) >= 5: - break - - last_viewed = RecipeTable(recent_list) - else: - last_viewed = None - - return render(request, 'index.html', {'recipes': table, 'filter': f, 'last_viewed': last_viewed}) + return render(request, 'search.html', {}) else: if request.user.is_authenticated: return HttpResponseRedirect(reverse('view_no_group')) else: return HttpResponseRedirect(reverse('account_login') + '?next=' + request.path) - -@group_required('guest') -def search_v2(request): - return render(request, 'search.html', {}) - - def no_groups(request): return render(request, 'no_groups_info.html') @@ -270,8 +231,6 @@ def user_settings(request): up.nav_color = form.cleaned_data['nav_color'] up.default_unit = form.cleaned_data['default_unit'] up.default_page = form.cleaned_data['default_page'] - up.show_recent = form.cleaned_data['show_recent'] - up.search_style = form.cleaned_data['search_style'] up.plan_share.set(form.cleaned_data['plan_share']) up.ingredient_decimals = form.cleaned_data['ingredient_decimals'] # noqa: E501 up.comments = form.cleaned_data['comments'] diff --git a/requirements.txt b/requirements.txt index 5004d80f..3956181a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,6 @@ django-annoying==0.10.6 django-autocomplete-light==3.9.4 django-cleanup==6.0.0 django-crispy-forms==1.14.0 -django-filter==22.1 django-tables2==2.4.1 djangorestframework==3.13.1 drf-writable-nested==0.6.3 From b78d0ec30bae8292f0e1dfff6d0e17064cb12700 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 20:37:38 +0200 Subject: [PATCH 20/76] added userspace admin --- cookbook/admin.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cookbook/admin.py b/cookbook/admin.py index f512121c..ce8cfda3 100644 --- a/cookbook/admin.py +++ b/cookbook/admin.py @@ -15,7 +15,7 @@ from .models import (BookmarkletImport, Comment, CookLog, Food, FoodInheritField Recipe, RecipeBook, RecipeBookEntry, RecipeImport, SearchPreference, ShareLink, ShoppingList, ShoppingListEntry, ShoppingListRecipe, Space, Step, Storage, Supermarket, SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, - TelegramBot, Unit, UserFile, UserPreference, ViewLog, Automation) + TelegramBot, Unit, UserFile, UserPreference, ViewLog, Automation, UserSpace) class CustomUserAdmin(UserAdmin): @@ -46,6 +46,14 @@ class SpaceAdmin(admin.ModelAdmin): admin.site.register(Space, SpaceAdmin) +class UserSpaceAdmin(admin.ModelAdmin): + list_display = ('user', 'space',) + search_fields = ('user', 'space',) + + +admin.site.register(UserSpace, UserSpaceAdmin) + + class UserPreferenceAdmin(admin.ModelAdmin): list_display = ('name', 'theme', 'nav_color', 'default_page',) search_fields = ('user__username',) From d464633c70fd1b9e8b12d004727d069f803f0542 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 20:38:18 +0200 Subject: [PATCH 21/76] removed django filters --- recipes/settings.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recipes/settings.py b/recipes/settings.py index 19e1c4e5..120a1386 100644 --- a/recipes/settings.py +++ b/recipes/settings.py @@ -99,7 +99,6 @@ INSTALLED_APPS = [ 'django_prometheus', 'django_tables2', 'corsheaders', - 'django_filters', 'crispy_forms', 'rest_framework', 'rest_framework.authtoken', From bf16e61a1f6ef6e6a2d6acc6fc0a08493462fad4 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Tue, 12 Jul 2022 20:52:32 +0200 Subject: [PATCH 22/76] removed unused stuff and fixed manifest --- cookbook/templates/manifest.json | 6 ------ cookbook/urls.py | 3 +-- cookbook/views/views.py | 21 ++++----------------- vue/src/components/RecipeCard.vue | 13 +++---------- 4 files changed, 8 insertions(+), 35 deletions(-) diff --git a/cookbook/templates/manifest.json b/cookbook/templates/manifest.json index 0cec81be..55f6b184 100644 --- a/cookbook/templates/manifest.json +++ b/cookbook/templates/manifest.json @@ -37,12 +37,6 @@ "short_name": "Shopping", "description": "View your shopping lists", "url": "./list/shopping-list/" - }, - { - "name": "Latest Shopping List", - "short_name": "Shopping List", - "description": "View the latest shopping list", - "url": "./shopping/latest/" } ] } diff --git a/cookbook/urls.py b/cookbook/urls.py index 92592681..f852846b 100644 --- a/cookbook/urls.py +++ b/cookbook/urls.py @@ -59,14 +59,13 @@ urlpatterns = [ path('space-overview', views.space_overview, name='view_space_overview'), path('space-manage/', views.space_manage, name='view_space_manage'), path('switch-space/', views.switch_space, name='view_switch_space'), + path('profile/', views.view_profile, name='view_profile'), path('no-perm', views.no_perm, name='view_no_perm'), path('invite/', views.invite_link, name='view_invite'), path('system/', views.system, name='view_system'), path('search/', views.search, name='view_search'), path('books/', views.books, name='view_books'), path('plan/', views.meal_plan, name='view_plan'), - path('plan/entry/', views.meal_plan_entry, name='view_plan_entry'), - path('shopping/latest/', lists.shopping_list, name='view_shopping_latest'), path('shopping/', lists.shopping_list, name='view_shopping'), path('settings/', views.user_settings, name='view_settings'), path('history/', views.history, name='view_history'), diff --git a/cookbook/views/views.py b/cookbook/views/views.py index db9266b5..925c2f3a 100644 --- a/cookbook/views/views.py +++ b/cookbook/views/views.py @@ -175,6 +175,10 @@ def meal_plan(request): def supermarket(request): return render(request, 'supermarket.html', {}) +@group_required('user') +def view_profile(request, user_id): + return render(request, 'supermarket.html', {}) + @group_required('user') def ingredient_editor(request): @@ -189,23 +193,6 @@ def ingredient_editor(request): return render(request, 'ingredient_editor.html', template_vars) -@group_required('user') -def meal_plan_entry(request, pk): - plan = MealPlan.objects.filter(space=request.space).get(pk=pk) - - if plan.created_by != request.user and plan.shared != request.user: - messages.add_message(request, messages.ERROR, _('You do not have the required permissions to view this page!')) - return HttpResponseRedirect(reverse_lazy('index')) - - same_day_plan = MealPlan.objects \ - .filter(date=plan.date, space=request.space) \ - .exclude(pk=plan.pk) \ - .filter(Q(created_by=request.user) | Q(shared=request.user)) \ - .order_by('meal_type').all() - - return render(request, 'meal_plan_entry.html', {'plan': plan, 'same_day_plan': same_day_plan}) - - @group_required('guest') def user_settings(request): if request.space.demo: diff --git a/vue/src/components/RecipeCard.vue b/vue/src/components/RecipeCard.vue index 6871f475..80cbcdb2 100755 --- a/vue/src/components/RecipeCard.vue +++ b/vue/src/components/RecipeCard.vue @@ -1,6 +1,6 @@ @@ -34,18 +44,26 @@ import Vue from "vue" import {BootstrapVue} from "bootstrap-vue" import "bootstrap-vue/dist/bootstrap-vue.css" -import {ApiApiFactory} from "@/utils/openapi/api" -import CookbookSlider from "@/components/CookbookSlider" -import LoadingSpinner from "@/components/LoadingSpinner" -import {StandardToasts, ApiMixin} from "@/utils/utils" import CosmeticSettingsComponent from "@/components/Settings/CosmeticSettingsComponent"; +import AccountSettingsComponent from "@/components/Settings/AccountSettingsComponent"; +import SearchSettingsComponent from "@/components/Settings/SearchSettingsComponent"; +import ShoppingSettingsComponent from "@/components/Settings/ShoppingSettingsComponent"; +import MealPlanSettingsComponent from "@/components/Settings/MealPlanSettingsComponent"; +import APISettingsComponent from "@/components/Settings/APISettingsComponent"; Vue.use(BootstrapVue) export default { name: "ProfileView", mixins: [], - components: {CosmeticSettingsComponent}, + components: { + CosmeticSettingsComponent, + AccountSettingsComponent, + SearchSettingsComponent, + ShoppingSettingsComponent, + MealPlanSettingsComponent, + APISettingsComponent + }, data() { return { visible_settings: 'cosmetic', @@ -55,9 +73,7 @@ export default { mounted() { this.$i18n.locale = window.CUSTOM_LOCALE }, - methods: { - - }, + methods: {}, } diff --git a/vue/src/apps/ShoppingListView/ShoppingListView.vue b/vue/src/apps/ShoppingListView/ShoppingListView.vue index 0587c3cd..94ceaf40 100644 --- a/vue/src/apps/ShoppingListView/ShoppingListView.vue +++ b/vue/src/apps/ShoppingListView/ShoppingListView.vue @@ -514,7 +514,7 @@ " :model="Models.USER" :initial_selection="settings.shopping_share" - label="username" + label="display_name" :multiple="true" style="flex-grow: 1; flex-shrink: 1; flex-basis: 0" :placeholder="$t('User')" @@ -868,7 +868,7 @@ export default { case "category": return item?.food?.supermarket_category?.name ?? x case "created_by": - return item?.created_by?.username ?? x + return item?.created_by?.display_name ?? x case "recipe": return item?.recipe_mealplan?.recipe_name ?? x } diff --git a/vue/src/components/CookbookEditCard.vue b/vue/src/components/CookbookEditCard.vue index 7f3be8a5..644291f0 100644 --- a/vue/src/components/CookbookEditCard.vue +++ b/vue/src/components/CookbookEditCard.vue @@ -5,7 +5,7 @@ {{ book_copy.icon }} {{ book_copy.name }} - {{ u.username }} + {{ u.display_name }}
@@ -25,7 +25,7 @@ @change="book_copy.shared = $event.val" parent_variable="book.shared" :initial_selection="book.shared" - :label="'username'" + :label="'display_name'" :model="Models.USER_NAME" style="flex-grow: 1; flex-shrink: 1; flex-basis: 0" v-bind:placeholder="$t('Share')" diff --git a/vue/src/components/MealPlanEditModal.vue b/vue/src/components/MealPlanEditModal.vue index 33e095a8..2c84eb58 100644 --- a/vue/src/components/MealPlanEditModal.vue +++ b/vue/src/components/MealPlanEditModal.vue @@ -64,7 +64,7 @@ required @change="entryEditing.shared = $event.val" parent_variable="entryEditing.shared" - :label="'username'" + :label="'display_name'" :model="Models.USER_NAME" style="flex-grow: 1; flex-shrink: 1; flex-basis: 0" v-bind:placeholder="$t('Share')" diff --git a/vue/src/components/Settings/APISettingsComponent.vue b/vue/src/components/Settings/APISettingsComponent.vue new file mode 100644 index 00000000..d96cc888 --- /dev/null +++ b/vue/src/components/Settings/APISettingsComponent.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/vue/src/components/Settings/AccountSettingsComponent.vue b/vue/src/components/Settings/AccountSettingsComponent.vue new file mode 100644 index 00000000..2df3c9af --- /dev/null +++ b/vue/src/components/Settings/AccountSettingsComponent.vue @@ -0,0 +1,78 @@ + + + + + \ No newline at end of file diff --git a/vue/src/components/Settings/MealPlanSettingsComponent.vue b/vue/src/components/Settings/MealPlanSettingsComponent.vue new file mode 100644 index 00000000..04e1539b --- /dev/null +++ b/vue/src/components/Settings/MealPlanSettingsComponent.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/vue/src/components/Settings/SearchSettingsComponent.vue b/vue/src/components/Settings/SearchSettingsComponent.vue new file mode 100644 index 00000000..72d639ed --- /dev/null +++ b/vue/src/components/Settings/SearchSettingsComponent.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/vue/src/components/Settings/ShoppingSettingsComponent.vue b/vue/src/components/Settings/ShoppingSettingsComponent.vue new file mode 100644 index 00000000..7455cd7d --- /dev/null +++ b/vue/src/components/Settings/ShoppingSettingsComponent.vue @@ -0,0 +1,59 @@ + + + + + \ No newline at end of file diff --git a/vue/src/components/ShoppingLineItem.vue b/vue/src/components/ShoppingLineItem.vue index 4b7c5544..ee57c92c 100644 --- a/vue/src/components/ShoppingLineItem.vue +++ b/vue/src/components/ShoppingLineItem.vue @@ -385,7 +385,7 @@ export default { return [item?.recipe_mealplan?.mealplan_note, item?.ingredient_note].filter(String) }, formatOneCreatedBy: function (item) { - return [this.$t("Added_by"), item?.created_by.username, "@", this.formatDate(item.created_at)].join(" ") + return [this.$t("Added_by"), item?.created_by.display_name, "@", this.formatDate(item.created_at)].join(" ") }, openRecipeCard: function (e, item) { this.genericAPI(this.Models.RECIPE, this.Actions.FETCH, {id: item.recipe_mealplan.recipe}).then((result) => { diff --git a/vue/src/utils/models.js b/vue/src/utils/models.js index 813fd12a..94d28713 100644 --- a/vue/src/utils/models.js +++ b/vue/src/utils/models.js @@ -591,7 +591,7 @@ export class Models { type: "lookup", field: "shared", list: "USER", - list_label: "username", + list_label: "display_name", label: "shared_with", multiple: true, }, diff --git a/vue/src/utils/openapi/api.ts b/vue/src/utils/openapi/api.ts index c2b7f786..094ca2ef 100644 --- a/vue/src/utils/openapi/api.ts +++ b/vue/src/utils/openapi/api.ts @@ -279,11 +279,29 @@ export interface CustomFilterShared { */ id?: number; /** - * + * Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. * @type {string} * @memberof CustomFilterShared */ username?: string; + /** + * + * @type {string} + * @memberof CustomFilterShared + */ + first_name?: string; + /** + * + * @type {string} + * @memberof CustomFilterShared + */ + last_name?: string; + /** + * + * @type {string} + * @memberof CustomFilterShared + */ + display_name?: string; } /** * @@ -2592,11 +2610,29 @@ export interface ShoppingListCreatedBy { */ id?: number; /** - * + * Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. * @type {string} * @memberof ShoppingListCreatedBy */ username?: string; + /** + * + * @type {string} + * @memberof ShoppingListCreatedBy + */ + first_name?: string; + /** + * + * @type {string} + * @memberof ShoppingListCreatedBy + */ + last_name?: string; + /** + * + * @type {string} + * @memberof ShoppingListCreatedBy + */ + display_name?: string; } /** * @@ -3491,6 +3527,43 @@ export interface Unit { */ description?: string | null; } +/** + * + * @export + * @interface User + */ +export interface User { + /** + * + * @type {number} + * @memberof User + */ + id?: number; + /** + * Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. + * @type {string} + * @memberof User + */ + username?: string; + /** + * + * @type {string} + * @memberof User + */ + first_name?: string; + /** + * + * @type {string} + * @memberof User + */ + last_name?: string; + /** + * + * @type {string} + * @memberof User + */ + display_name?: string; +} /** * * @export @@ -3534,25 +3607,6 @@ export interface UserFile { */ file_size_kb?: number; } -/** - * - * @export - * @interface UserName - */ -export interface UserName { - /** - * - * @type {number} - * @memberof UserName - */ - id?: number; - /** - * - * @type {string} - * @memberof UserName - */ - username?: string; -} /** * * @export @@ -4664,6 +4718,39 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration) options: localVarRequestOptions, }; }, + /** + * + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createUser: async (user?: User, options: any = {}): Promise => { + const localVarPath = `/api/user/`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(user, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {string} name @@ -5646,6 +5733,39 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration) + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + destroyUser: async (id: string, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('destroyUser', 'id', id) + const localVarPath = `/api/user/{id}/` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; @@ -7045,7 +7165,7 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration) * @throws {RequiredError} */ listUsers: async (options: any = {}): Promise => { - const localVarPath = `/api/user-name/`; + const localVarPath = `/api/user/`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); let baseOptions; @@ -8303,6 +8423,43 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration) options: localVarRequestOptions, }; }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + partialUpdateUser: async (id: string, user?: User, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('partialUpdateUser', 'id', id) + const localVarPath = `/api/user/{id}/` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PATCH', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(user, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -9484,7 +9641,7 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration) retrieveUser: async (id: string, options: any = {}): Promise => { // verify required parameter 'id' is not null or undefined assertParamExists('retrieveUser', 'id', id) - const localVarPath = `/api/user-name/{id}/` + const localVarPath = `/api/user/{id}/` .replace(`{${"id"}}`, encodeURIComponent(String(id))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); @@ -10705,6 +10862,43 @@ export const ApiApiAxiosParamCreator = function (configuration?: Configuration) options: localVarRequestOptions, }; }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateUser: async (id: string, user?: User, options: any = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('updateUser', 'id', id) + const localVarPath = `/api/user/{id}/` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + + + localVarHeaderParameter['Content-Type'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(user, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -11073,6 +11267,16 @@ export const ApiApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.createUnit(unit, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async createUser(user?: User, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.createUser(user, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {string} name @@ -11368,6 +11572,16 @@ export const ApiApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.destroyUnit(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async destroyUser(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.destroyUser(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -11765,7 +11979,7 @@ export const ApiApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async listUsers(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + async listUsers(options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { const localVarAxiosArgs = await localVarAxiosParamCreator.listUsers(options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -12135,6 +12349,17 @@ export const ApiApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.partialUpdateUnit(id, unit, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async partialUpdateUser(id: string, user?: User, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.partialUpdateUser(id, user, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -12490,7 +12715,7 @@ export const ApiApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async retrieveUser(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + async retrieveUser(id: string, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { const localVarAxiosArgs = await localVarAxiosParamCreator.retrieveUser(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, @@ -12851,6 +13076,17 @@ export const ApiApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.updateUnit(id, unit, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async updateUser(id: string, user?: User, options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.updateUser(id, user, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -13113,6 +13349,15 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?: createUnit(unit?: Unit, options?: any): AxiosPromise { return localVarFp.createUnit(unit, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + createUser(user?: User, options?: any): AxiosPromise { + return localVarFp.createUser(user, options).then((request) => request(axios, basePath)); + }, /** * * @param {string} name @@ -13379,6 +13624,15 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?: destroyUnit(id: string, options?: any): AxiosPromise { return localVarFp.destroyUnit(id, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + destroyUser(id: string, options?: any): AxiosPromise { + return localVarFp.destroyUser(id, options).then((request) => request(axios, basePath)); + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -13740,7 +13994,7 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - listUsers(options?: any): AxiosPromise> { + listUsers(options?: any): AxiosPromise> { return localVarFp.listUsers(options).then((request) => request(axios, basePath)); }, /** @@ -14076,6 +14330,16 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?: partialUpdateUnit(id: string, unit?: Unit, options?: any): AxiosPromise { return localVarFp.partialUpdateUnit(id, unit, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + partialUpdateUser(id: string, user?: User, options?: any): AxiosPromise { + return localVarFp.partialUpdateUser(id, user, options).then((request) => request(axios, basePath)); + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -14397,7 +14661,7 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?: * @param {*} [options] Override http request option. * @throws {RequiredError} */ - retrieveUser(id: string, options?: any): AxiosPromise { + retrieveUser(id: string, options?: any): AxiosPromise { return localVarFp.retrieveUser(id, options).then((request) => request(axios, basePath)); }, /** @@ -14724,6 +14988,16 @@ export const ApiApiFactory = function (configuration?: Configuration, basePath?: updateUnit(id: string, unit?: Unit, options?: any): AxiosPromise { return localVarFp.updateUnit(id, unit, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + updateUser(id: string, user?: User, options?: any): AxiosPromise { + return localVarFp.updateUser(id, user, options).then((request) => request(axios, basePath)); + }, /** * * @param {string} id A unique integer value identifying this user file. @@ -15034,6 +15308,17 @@ export class ApiApi extends BaseAPI { return ApiApiFp(this.configuration).createUnit(unit, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ApiApi + */ + public createUser(user?: User, options?: any) { + return ApiApiFp(this.configuration).createUser(user, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {string} name @@ -15358,6 +15643,17 @@ export class ApiApi extends BaseAPI { return ApiApiFp(this.configuration).destroyUnit(id, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ApiApi + */ + public destroyUser(id: string, options?: any) { + return ApiApiFp(this.configuration).destroyUser(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {string} id A unique integer value identifying this user file. @@ -16195,6 +16491,18 @@ export class ApiApi extends BaseAPI { return ApiApiFp(this.configuration).partialUpdateUnit(id, unit, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ApiApi + */ + public partialUpdateUser(id: string, user?: User, options?: any) { + return ApiApiFp(this.configuration).partialUpdateUser(id, user, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {string} id A unique integer value identifying this user file. @@ -16979,6 +17287,18 @@ export class ApiApi extends BaseAPI { return ApiApiFp(this.configuration).updateUnit(id, unit, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {string} id A unique integer value identifying this user. + * @param {User} [user] + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof ApiApi + */ + public updateUser(id: string, user?: User, options?: any) { + return ApiApiFp(this.configuration).updateUser(id, user, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {string} id A unique integer value identifying this user file. From 5ff91ee47fe9cc00ce1cb1f178a9d56a2639428a Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 15 Jul 2022 17:39:44 +0200 Subject: [PATCH 36/76] more settings in --- .../Settings/AccountSettingsComponent.vue | 18 ++++++++--- .../Settings/ShoppingSettingsComponent.vue | 31 ++++++++++++++++++- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/vue/src/components/Settings/AccountSettingsComponent.vue b/vue/src/components/Settings/AccountSettingsComponent.vue index 2df3c9af..27900bd3 100644 --- a/vue/src/components/Settings/AccountSettingsComponent.vue +++ b/vue/src/components/Settings/AccountSettingsComponent.vue @@ -1,15 +1,22 @@ {% endblock %} diff --git a/cookbook/templates/shoppinglist_template.html b/cookbook/templates/shoppinglist_template.html index 51e9a652..c8c1d3f5 100644 --- a/cookbook/templates/shoppinglist_template.html +++ b/cookbook/templates/shoppinglist_template.html @@ -19,6 +19,7 @@ {% render_bundle 'shopping_list_view' %} {% endblock %} diff --git a/cookbook/templates/user_settings.html b/cookbook/templates/user_settings.html index 2ffb9b7a..15861f8b 100644 --- a/cookbook/templates/user_settings.html +++ b/cookbook/templates/user_settings.html @@ -29,6 +29,7 @@ diff --git a/vue/src/components/Settings/ShoppingSettingsComponent.vue b/vue/src/components/Settings/ShoppingSettingsComponent.vue index 29ae5f84..af0052d4 100644 --- a/vue/src/components/Settings/ShoppingSettingsComponent.vue +++ b/vue/src/components/Settings/ShoppingSettingsComponent.vue @@ -1,32 +1,92 @@ @@ -50,6 +110,7 @@ export default { data() { return { user_preferences: undefined, + SHOPPING_MIN_AUTOSYNC_INTERVAL: window.SHOPPING_MIN_AUTOSYNC_INTERVAL, languages: [], } }, @@ -69,9 +130,10 @@ export default { }, updateSettings: function (reload) { let apiFactory = new ApiApiFactory() + this.$emit('updated', this.user_preferences) apiFactory.partialUpdateUserPreference(this.user_id.toString(), this.user_preferences).then(result => { StandardToasts.makeStandardToast(this, StandardToasts.SUCCESS_UPDATE) - if (reload !== undefined) { + if (reload) { location.reload() } }).catch(err => { diff --git a/vue/src/locales/en.json b/vue/src/locales/en.json index 3b3c34ad..9214740e 100644 --- a/vue/src/locales/en.json +++ b/vue/src/locales/en.json @@ -169,6 +169,8 @@ "tree_root": "Root of Tree", "Icon": "Icon", "Unit": "Unit", + "Decimals": "Decimals", + "Default_Unit": "Default Unit", "No_Results": "No Results", "New_Unit": "New Unit", "Create_New_Shopping Category": "Create New Shopping Category", @@ -219,6 +221,8 @@ "Title_or_Recipe_Required": "Title or recipe selection required", "Color": "Color", "New_Meal_Type": "New Meal type", + "Use_Fractions": "Use Fractions", + "Use_Fractions_Help": "Automatically convert decimals to fractions when viewing a recipe.", "AddFoodToShopping": "Add {food} to your shopping list", "RemoveFoodFromShopping": "Remove {food} from your shopping list", "DeleteShoppingConfirm": "Are you sure that you want to remove all {food} from the shopping list?", @@ -241,6 +245,8 @@ "FoodInherit": "Food Inheritable Fields", "ShowUncategorizedFood": "Show Undefined", "GroupBy": "Group By", + "Language": "Language", + "Theme": "Theme", "SupermarketCategoriesOnly": "Supermarket Categories Only", "MoveCategory": "Move To: ", "CountMore": "...+{count} more", @@ -259,6 +265,7 @@ "mealplan_autoexclude_onhand": "Exclude Food On Hand", "mealplan_autoinclude_related": "Add Related Recipes", "default_delay": "Default Delay Hours", + "plan_share_desc": "New Meal Plan entries will automatically be shared with selected users.", "shopping_share_desc": "Users will see all items you add to your shopping list. They must add you to see items on their list.", "shopping_auto_sync_desc": "Setting to 0 will disable auto sync. When viewing a shopping list the list is updated every set seconds to sync changes someone else might have made. Useful when shopping with multiple people but will use mobile data.", "mealplan_autoadd_shopping_desc": "Automatically add meal plan ingredients to shopping list.", @@ -270,6 +277,12 @@ "Auto_Planner": "Auto-Planner", "New_Cookbook": "New cookbook", "Hide_Keyword": "Hide keywords", + "Hour": "Hour", + "Hours": "Hours", + "Day": "Day", + "Days": "Days", + "Second": "Second", + "Seconds": "Seconds", "Clear": "Clear", "Users": "Users", "Invites": "Invites", @@ -310,6 +323,9 @@ "shopping_category_help": "Supermarkets can be ordered and filtered by Shopping Category according to the layout of the aisles.", "food_recipe_help": "Linking a recipe here will include the linked recipe in any other recipe that use this food", "Foods": "Foods", + "Account": "Account", + "Cosmetic": "Cosmetic", + "API": "API", "enable_expert": "Enable Expert Mode", "expert_mode": "Expert Mode", "simple_mode": "Simple Mode", @@ -353,6 +369,12 @@ "App": "App", "Message": "Message", "Bookmarklet": "Bookmarklet", + "Sticky_Nav": "Sticky Navigation", + "Sticky_Nav_Help": "Always show the navigation menu at the top of the screen.", + "Nav_Color": "Navigation Color", + "Nav_Color_Help": "Change navigation color.", + "Use_Kj": "Use kJ instead of kcal", + "Comments_setting": "Show Comments", "click_image_import": "Click the image you want to import for this recipe", "no_more_images_found": "No additional images found on Website.", "import_duplicates": "To prevent duplicates recipes with the same name as existing ones are ignored. Check this box to import everything.", @@ -391,6 +413,9 @@ "Ratings": "Ratings", "Internal": "Internal", "Units": "Units", + "Manage_Emails": "Manage Emails", + "Change_Password": "Change Password", + "Social_Authentication": "Social Authentication", "Random Recipes": "Random Recipes", "parameter_count": "Parameter {count}", "select_keyword": "Select Keyword", @@ -404,12 +429,17 @@ "Select": "Select", "Supermarkets": "Supermarkets", "User": "User", + "Username": "Username", + "First_name": "First Name", + "Last_name": "Last Name", "Keyword": "Keyword", "Advanced": "Advanced", "Page": "Page", "Single": "Single", "Multiple": "Multiple", "Reset": "Reset", + "Disabled": "Disabled", + "Disable": "Disable", "Options": "Options", "Create Food": "Create Food", "create_food_desc": "Create a food and link it to this recipe.", From 904358bb003ab581da2f4219f90e55a010bb426c Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 5 Aug 2022 17:13:27 +0200 Subject: [PATCH 61/76] allow changing gunicorn settings --- .env.template | 4 ++++ boot.sh | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.env.template b/.env.template index c76e7c8d..8bf5b484 100644 --- a/.env.template +++ b/.env.template @@ -68,6 +68,10 @@ SHOPPING_MIN_AUTOSYNC_INTERVAL=5 # when unset: 1 (true) - this is temporary until an appropriate amount of time has passed for everyone to migrate GUNICORN_MEDIA=0 +# GUNICORN SERVER RELATED SETTINGS (see https://docs.gunicorn.org/en/stable/design.html#how-many-workers for recommended settings) +# GUNICORN_WORKERS=1 +# GUNICORN_THREADS=1 + # S3 Media settings: store mediafiles in s3 or any compatible storage backend (e.g. minio) # as long as S3_ACCESS_KEY is not set S3 features are disabled # S3_ACCESS_KEY= diff --git a/boot.sh b/boot.sh index e4fa160e..fc9f44ee 100644 --- a/boot.sh +++ b/boot.sh @@ -2,6 +2,8 @@ source venv/bin/activate TANDOOR_PORT="${TANDOOR_PORT:-8080}" +GUNICORN_WORKERS="${GUNICORN_WORKERS:1}" +GUNICORN_THREADS="${GUNICORN_THREADS:1}" NGINX_CONF_FILE=/opt/recipes/nginx/conf.d/Recipes.conf display_warning() { @@ -63,4 +65,4 @@ echo "Done" chmod -R 755 /opt/recipes/mediafiles -exec gunicorn -b :$TANDOOR_PORT --access-logfile - --error-logfile - --log-level INFO recipes.wsgi +exec gunicorn -b :$TANDOOR_PORT -workers :$GUNICORN_WORKERS --threads :GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi From a898d722d6e1ad858276eacc7a5ee35256dd76ce Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 5 Aug 2022 17:21:59 +0200 Subject: [PATCH 62/76] fixed typo --- boot.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.sh b/boot.sh index fc9f44ee..2f48b617 100644 --- a/boot.sh +++ b/boot.sh @@ -65,4 +65,4 @@ echo "Done" chmod -R 755 /opt/recipes/mediafiles -exec gunicorn -b :$TANDOOR_PORT -workers :$GUNICORN_WORKERS --threads :GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi +exec gunicorn -b :$TANDOOR_PORT --workers :$GUNICORN_WORKERS --threads :GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi From 6e4ea518d979e35c53459df7ec2f1c8ae00db21f Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 5 Aug 2022 17:36:00 +0200 Subject: [PATCH 63/76] boot.sh --- boot.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.sh b/boot.sh index 2f48b617..6e6a863a 100644 --- a/boot.sh +++ b/boot.sh @@ -65,4 +65,4 @@ echo "Done" chmod -R 755 /opt/recipes/mediafiles -exec gunicorn -b :$TANDOOR_PORT --workers :$GUNICORN_WORKERS --threads :GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi +exec gunicorn -b :$TANDOOR_PORT --workers $GUNICORN_WORKERS --threads GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi From 2eed5143fe26bd0f0e7af04d881d268e1aba1b8b Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 5 Aug 2022 17:43:59 +0200 Subject: [PATCH 64/76] boot.sh --- boot.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/boot.sh b/boot.sh index 6e6a863a..1191c598 100644 --- a/boot.sh +++ b/boot.sh @@ -2,8 +2,8 @@ source venv/bin/activate TANDOOR_PORT="${TANDOOR_PORT:-8080}" -GUNICORN_WORKERS="${GUNICORN_WORKERS:1}" -GUNICORN_THREADS="${GUNICORN_THREADS:1}" +GUNICORN_WORKERS="${GUNICORN_WORKERS}" +GUNICORN_THREADS="${GUNICORN_THREADS}" NGINX_CONF_FILE=/opt/recipes/nginx/conf.d/Recipes.conf display_warning() { From c7f75fe58f199f92f048bf5bf180869732006832 Mon Sep 17 00:00:00 2001 From: vabene1111 Date: Fri, 5 Aug 2022 17:55:25 +0200 Subject: [PATCH 65/76] boot.sh --- boot.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.sh b/boot.sh index 1191c598..be117d7a 100644 --- a/boot.sh +++ b/boot.sh @@ -65,4 +65,4 @@ echo "Done" chmod -R 755 /opt/recipes/mediafiles -exec gunicorn -b :$TANDOOR_PORT --workers $GUNICORN_WORKERS --threads GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi +exec gunicorn -b :$TANDOOR_PORT --workers $GUNICORN_WORKERS --threads $GUNICORN_THREADS --access-logfile - --error-logfile - --log-level INFO recipes.wsgi From 71c5adda793ead327d949581627362d8138307e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Aug 2022 15:25:12 +0000 Subject: [PATCH 66/76] Bump django from 4.0.6 to 4.0.7 Bumps [django](https://github.com/django/django) from 4.0.6 to 4.0.7. - [Release notes](https://github.com/django/django/releases) - [Commits](https://github.com/django/django/compare/4.0.6...4.0.7) --- updated-dependencies: - dependency-name: django dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d4f597f0..e895c4e7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==4.0.6 +Django==4.0.7 cryptography==37.0.2 django-annoying==0.10.6 django-autocomplete-light==3.9.4 From dc2f62dc9da8bbcd37966e3433b81e62fbd34ca6 Mon Sep 17 00:00:00 2001 From: Thorin Date: Thu, 11 Aug 2022 21:00:12 +0000 Subject: [PATCH 67/76] Translated using Weblate (Spanish) Currently translated at 53.0% (278 of 524 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/es/ --- cookbook/locale/es/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/locale/es/LC_MESSAGES/django.po b/cookbook/locale/es/LC_MESSAGES/django.po index c211a5d5..754c9b2f 100644 --- a/cookbook/locale/es/LC_MESSAGES/django.po +++ b/cookbook/locale/es/LC_MESSAGES/django.po @@ -14,8 +14,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-06-25 17:32+0000\n" -"Last-Translator: César Blanco Guillamon \n" +"PO-Revision-Date: 2022-08-12 21:32+0000\n" +"Last-Translator: Thorin \n" "Language-Team: Spanish \n" "Language: es\n" @@ -68,7 +68,7 @@ msgstr "Estilo de búsqueda" #: .\cookbook\forms.py:62 msgid "Plan sharing" -msgstr "" +msgstr "Compartir régimen" #: .\cookbook\forms.py:63 msgid "Ingredient decimal places" From e124c211ac34274d93b3bb881b1e72966cf1f82d Mon Sep 17 00:00:00 2001 From: Thorin Date: Thu, 11 Aug 2022 21:02:22 +0000 Subject: [PATCH 68/76] Translated using Weblate (Spanish) Currently translated at 73.2% (315 of 430 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/es/ --- vue/src/locales/es.json | 311 +++++++++++++++++++++------------------- 1 file changed, 161 insertions(+), 150 deletions(-) diff --git a/vue/src/locales/es.json b/vue/src/locales/es.json index 2e3941f1..80c25ac8 100644 --- a/vue/src/locales/es.json +++ b/vue/src/locales/es.json @@ -25,7 +25,7 @@ "External_Recipe_Image": "Imagen externa de la receta", "Add_to_Shopping": "Añadir a la cesta", "Add_to_Plan": "Añadir a regimen", - "Step_start_time": "", + "Step_start_time": "Hora de inicio", "Sort_by_new": "Ordenar por novedades", "Table_of_Contents": "Tabla de contenido", "Recipes_per_page": "Recetas por página", @@ -36,17 +36,17 @@ "Copy_template_reference": "Copiar patrón", "Save_and_View": "Grabar y mostrar", "Manage_Books": "Manejar libros", - "Meal_Plan": "", + "Meal_Plan": "Régimen de comida", "Select_Book": "Seleccionar libro", "Select_File": "Seleccionar archivo", "Recipe_Image": "Imagen de la receta", - "Import_finished": "", + "Import_finished": "Importación finalizada", "View_Recipes": "Mostrar recetas", - "Log_Cooking": "", + "Log_Cooking": "Registrar Cocinada", "New_Recipe": "Nueva receta", - "Url_Import": "", + "Url_Import": "Importar desde url", "Reset_Search": "Resetear busqueda", - "Recently_Viewed": "", + "Recently_Viewed": "Visto recientemente", "Load_More": "Cargar más", "New_Keyword": "Añadir palabra clave", "Delete_Keyword": "Eliminar palabra clave", @@ -58,10 +58,10 @@ "Hide_Recipes": "Esconder recetas", "Move_Up": "mover arriba", "Move_Down": "mover abajo", - "Step_Name": "", - "Step_Type": "", - "Make_Header": "", - "Make_Ingredient": "", + "Step_Name": "Nombre Paso", + "Step_Type": "Tipo Paso", + "Make_Header": "Establecer Cabecera", + "Make_Ingredient": "Establecer Ingrediente", "Enable_Amount": "Habilitar cantidad", "Disable_Amount": "Deshabilitar cantidad", "Ingredient Editor": "Ingredientes", @@ -76,11 +76,11 @@ "Nutrition": "Nutricion", "Date": "Fecha", "Share": "Compartir", - "Automation": "", + "Automation": "Automatización", "Parameter": "Parametro", - "Export": "", + "Export": "Exportar", "Copy": "Copiar", - "Rating": "", + "Rating": "Puntuación", "Close": "Cerrar", "Cancel": "Cancelar", "Link": "Enlace", @@ -123,176 +123,176 @@ "View": "Mostrar", "Recipes": "Recetas", "Move": "Mover", - "Merge": "", + "Merge": "Unificar", "Parent": "Padre", - "delete_confirmation": "", - "move_confirmation": "", - "merge_confirmation": "", - "create_rule": "", - "move_selection": "", - "merge_selection": "", - "Root": "", - "Ignore_Shopping": "", - "Shopping_Category": "", - "Shopping_Categories": "", + "delete_confirmation": "¿Estás seguro de que deseas eliminar {source}?", + "move_confirmation": "Mover {child} a {parent}", + "merge_confirmation": "Reemplazar {source} con {target}", + "create_rule": "y crear automatización", + "move_selection": "Selecciona un padre {type} para mover {source} a el.", + "merge_selection": "Reemplaza todas las ocurrencias de {source} con el {type} seleccionado.", + "Root": "Raíz", + "Ignore_Shopping": "Ignorar Lista Compra", + "Shopping_Category": "Categoría Compras", + "Shopping_Categories": "Categorías Compras", "Edit_Food": "Editar ingediente", "Move_Food": "Mover ingediente", "New_Food": "Nuevo ingrediente", "Hide_Food": "Esconder ingrediente", - "Food_Alias": "", + "Food_Alias": "Alias de la comida", "Unit_Alias": "Unidad alias", - "Keyword_Alias": "", + "Keyword_Alias": "Alias Etiquetas", "Delete_Food": "Eliminar Ingrediente", - "No_ID": "", - "Meal_Plan_Days": "", - "merge_title": "", - "move_title": "", + "No_ID": "No se ha encontrado el ID, no se puede borrar.", + "Meal_Plan_Days": "Planes de comida a futuro", + "merge_title": "Unificar {type}", + "move_title": "Mover {type}", "Food": "Ingrediente", "Recipe_Book": "Libro de recetas", - "del_confirmation_tree": "", - "delete_title": "", + "del_confirmation_tree": "Estas seguro que quieres eliminar {source} y todos sus elementos hijos?", + "delete_title": "Eliminar {type}", "create_title": "Nuevo {type}", "edit_title": "Editar {type}", "Name": "Nombre", "Type": "Tipo", "Description": "Descripción", "Recipe": "Receta", - "tree_root": "", - "Icon": "", + "tree_root": "Raíz del Árbol", + "Icon": "Icono", "Unit": "Unidad", "No_Results": "No hay resutado", "New_Unit": "Nueva unidad", - "Create_New_Shopping Category": "", + "Create_New_Shopping Category": "Crear nueva Categoría de Compras", "Create_New_Food": "Añadir ingrediente nuevo", - "Create_New_Keyword": "", + "Create_New_Keyword": "Añadir nueva Etiqueta", "Create_New_Unit": "Añadir nueva unidad", - "Create_New_Meal_Type": "", + "Create_New_Meal_Type": "Añadir nuevo Tipo de Comida", "and_up": "", "and_down": "", "Instructions": "Instrucciones", - "Unrated": "", - "Automate": "", + "Unrated": "Sin puntuar", + "Automate": "Automatizar", "Empty": "Vacio", - "Key_Ctrl": "", - "Key_Shift": "", - "Time": "", + "Key_Ctrl": "Ctrl", + "Key_Shift": "Shift", + "Time": "Tiempo", "Text": "Texto", - "Shopping_list": "", - "Added_by": "", - "Added_on": "", - "AddToShopping": "", - "IngredientInShopping": "", - "NotInShopping": "", - "OnHand": "", - "FoodOnHand": "", - "FoodNotOnHand": "", + "Shopping_list": "Lista de la Compra", + "Added_by": "Añadido por", + "Added_on": "Añadido el", + "AddToShopping": "Añadir a la lista de la compra", + "IngredientInShopping": "Este ingrediente ya esta en la lista de la compra.", + "NotInShopping": "{food} no esta en tu lista de la compra.", + "OnHand": "Actualmente en Posesión", + "FoodOnHand": "Ya tienes {food} comprado.", + "FoodNotOnHand": "No tienes {food} comprado.", "Undefined": "Indefinido", - "Create_Meal_Plan_Entry": "", - "Edit_Meal_Plan_Entry": "", + "Create_Meal_Plan_Entry": "Crear entrada del régimen de comidas", + "Edit_Meal_Plan_Entry": "Eliminar entrada del régimen de comidas", "Title": "Titulo", "Week": "Semana", "Month": "Mes", "Year": "Año", - "Planner": "", - "Planner_Settings": "", - "Period": "", - "Plan_Period_To_Show": "", - "Periods": "", - "Plan_Show_How_Many_Periods": "", - "Starting_Day": "", - "Meal_Types": "", - "Meal_Type": "", - "New_Entry": "", - "Clone": "", - "Drag_Here_To_Delete": "", - "Meal_Type_Required": "", - "Title_or_Recipe_Required": "", + "Planner": "Planificador", + "Planner_Settings": "Opciones del planificador", + "Period": "Periodo", + "Plan_Period_To_Show": "Mostrar semanas, meses o años", + "Periods": "Periódos", + "Plan_Show_How_Many_Periods": "Cuantos periodos mostrar", + "Starting_Day": "Día de comienzo de la semana", + "Meal_Types": "Tipos de comida", + "Meal_Type": "Tipo de comida", + "New_Entry": "Nueva entrada", + "Clone": "Clonar", + "Drag_Here_To_Delete": "Arrastrar aquí para eliminar", + "Meal_Type_Required": "El Tipo es obligatorio", + "Title_or_Recipe_Required": "Es necesario especificar un título o elegir una receta", "Color": "Color", - "New_Meal_Type": "", - "AddFoodToShopping": "", - "RemoveFoodFromShopping": "", - "DeleteShoppingConfirm": "", - "IgnoredFood": "", - "Add_Servings_to_Shopping": "", + "New_Meal_Type": "Nuevo Tipo de comida", + "AddFoodToShopping": "Añadir {food} a la lista de la compra", + "RemoveFoodFromShopping": "Eliminar {food} de la lista de la compra", + "DeleteShoppingConfirm": "¿Estas seguro de que quieres eliminar {food} de la lista de la compra?", + "IgnoredFood": "{food} esta marcado para ser ignorado en las listas de la compra.", + "Add_Servings_to_Shopping": "Añadir {servings} raciones a la compra", "Week_Numbers": "numero de semana", - "Show_Week_Numbers": "", - "Export_As_ICal": "", - "Export_To_ICal": "", - "Cannot_Add_Notes_To_Shopping": "", - "Added_To_Shopping_List": "", - "Shopping_List_Empty": "", - "Next_Period": "", - "Previous_Period": "", - "Current_Period": "", - "Next_Day": "", - "Previous_Day": "", - "Inherit": "", - "InheritFields": "", - "FoodInherit": "", - "ShowUncategorizedFood": "", - "GroupBy": "", - "SupermarketCategoriesOnly": "", - "MoveCategory": "", - "CountMore": "", - "IgnoreThis": "", - "DelayFor": "", + "Show_Week_Numbers": "¿Mostrar números de la semana?", + "Export_As_ICal": "Exportar el periodo actual en formato iCal", + "Export_To_ICal": "Exportar .ics", + "Cannot_Add_Notes_To_Shopping": "Las notas no pueden añadirse a la lista de la compra", + "Added_To_Shopping_List": "Añadido a la lista de la compra", + "Shopping_List_Empty": "Tu lista de la compra esta actualmente vacía, puedes añadir nuevos elementos mediante el menú de un régimen de comidas (click derecho en la tarjeta o click sobre el menú de la misma)", + "Next_Period": "Siguiente Período", + "Previous_Period": "Período Anterior", + "Current_Period": "Período Actual", + "Next_Day": "Siguiente Día", + "Previous_Day": "Día Anterior", + "Inherit": "Heredar", + "InheritFields": "Heredar valores campos", + "FoodInherit": "Campos heredables", + "ShowUncategorizedFood": "Mostrar campos sin definir", + "GroupBy": "Agrupar por", + "SupermarketCategoriesOnly": "Sólo categorías de supermercado", + "MoveCategory": "Mover a: ", + "CountMore": "....+{count} mas", + "IgnoreThis": "No añadir {food} automáticamente a la compra", + "DelayFor": "Retrasar por {hours} horas", "Warning": "Advertencia", - "NoCategory": "", - "InheritWarning": "", - "ShowDelayed": "", - "Completed": "", - "OfflineAlert": "", - "shopping_share": "", - "shopping_auto_sync": "", - "one_url_per_line": "", - "mealplan_autoadd_shopping": "", - "mealplan_autoexclude_onhand": "", - "mealplan_autoinclude_related": "", - "default_delay": "", - "shopping_share_desc": "", - "shopping_auto_sync_desc": "", - "mealplan_autoadd_shopping_desc": "", - "mealplan_autoexclude_onhand_desc": "", - "mealplan_autoinclude_related_desc": "", - "default_delay_desc": "", - "filter_to_supermarket": "", - "Coming_Soon": "", - "Auto_Planner": "", - "New_Cookbook": "", - "Hide_Keyword": "", - "Clear": "", - "err_move_self": "", - "nothing": "", - "err_merge_self": "", - "show_sql": "", - "filter_to_supermarket_desc": "", - "CategoryName": "", + "NoCategory": "No se ha seleccionado categoría.", + "InheritWarning": "{food} esta marcada para heredar, los cambios podrían no almacenarse.", + "ShowDelayed": "Mostrar elementos retrasados", + "Completed": "Completado", + "OfflineAlert": "Estas desconectado, la lista de la compra puede no sincronizarse.", + "shopping_share": "Compartir lista de la compra", + "shopping_auto_sync": "Sincr. Automáticamente", + "one_url_per_line": "Una URL por línea", + "mealplan_autoadd_shopping": "Añadir Régimen de Comidas Automáticamente", + "mealplan_autoexclude_onhand": "Excluir ingrediente en posesion", + "mealplan_autoinclude_related": "Añadir recetas relacionadas", + "default_delay": "Horas de Retraso por defecto", + "shopping_share_desc": "Los usuarios verán todos los elementos de tu lista de la compra. Ellos tendrán que añadirte a ti para que puedas ver las suyas.", + "shopping_auto_sync_desc": "Establecer a 0 para deshabilitar Sincr. Auto. Cuando se esta visualizando una lista de la compra esta se guarda cada pocos segundos para recargar los cambios de otros usuarios. Es útil para listas compartidas pero utiliza mas datos móviles.", + "mealplan_autoadd_shopping_desc": "Añadir todos los ingredientes del régimen a la lista de la compra.", + "mealplan_autoexclude_onhand_desc": "Al añadir algo a la lista de la compra (manual o automáticamente), excluir aquellos ingredientes ya en posesión.", + "mealplan_autoinclude_related_desc": "Al añadir algo a la lista de la compra (manual o automáticamente), incluir todas las recetas relacionadas.", + "default_delay_desc": "Número de horas por defecto para retrasar una entrada de la lista de la compra.", + "filter_to_supermarket": "Filtrar por Supermercado", + "Coming_Soon": "Próximamente", + "Auto_Planner": "Planificador Automático", + "New_Cookbook": "Nuevo libro de recetas", + "Hide_Keyword": "Ocultar etiquetas", + "Clear": "Limpiar", + "err_move_self": "No puedes mover un elemento a sí mismo", + "nothing": "Nada que hacer", + "err_merge_self": "No puedes unificar un elemento con él mismo", + "show_sql": "Mostrar SQL", + "filter_to_supermarket_desc": "Por defecto, filtrar la lista de la compra para únicamente incluir categorías del supermercado seleccionado.", + "CategoryName": "Nombre Categoría", "SupermarketName": "Nombre del Supermercado", - "CategoryInstruction": "", - "shopping_recent_days_desc": "", - "shopping_recent_days": "", - "download_pdf": "", - "download_csv": "", - "csv_delim_help": "", - "csv_delim_label": "", - "SuccessClipboard": "", - "copy_to_clipboard": "", - "csv_prefix_help": "", - "csv_prefix_label": "", - "copy_markdown_table": "", - "in_shopping": "", - "DelayUntil": "", - "Pin": "", - "mark_complete": "", - "QuickEntry": "", - "shopping_add_onhand_desc": "", - "shopping_add_onhand": "", - "related_recipes": "", - "today_recipes": "", - "sql_debug": "", - "remember_search": "", - "remember_hours": "", - "tree_select": "", + "CategoryInstruction": "Arrastrar categorías para cambiar su orden de aparición en la lista de la compra.", + "shopping_recent_days_desc": "Días a mostrar entradas recientes de la lista de la compra.", + "shopping_recent_days": "Días recientes", + "download_pdf": "Descargar PDF", + "download_csv": "Descargar CSV", + "csv_delim_help": "Delimitador utilizado en las exportaciones CSV.", + "csv_delim_label": "Delimitador CSV", + "SuccessClipboard": "Lista de la compra copiada al portapapeles", + "copy_to_clipboard": "Copiar al portapapeles", + "csv_prefix_help": "Prefijo a añadir al copiar una lista al portapapeles.", + "csv_prefix_label": "Prefijo Lista", + "copy_markdown_table": "Copiar como Tabla Markdown", + "in_shopping": "En la Lista de la Compra", + "DelayUntil": "Retrasar hasta", + "Pin": "Fijar", + "mark_complete": "Marcar como Completado", + "QuickEntry": "Entrada Rápida", + "shopping_add_onhand_desc": "Marcar comida como 'en posesión' cuando se 'checkea' en la lista de la compra.", + "shopping_add_onhand": "Auto 'en posesión'", + "related_recipes": "Recetas Relacionadas", + "today_recipes": "Recetas del día", + "sql_debug": "Depuración SQL", + "remember_search": "Recordar Búsqueda", + "remember_hours": "Horas a Recordar", + "tree_select": "Usar Selección en Árbol", "OnHand_help": "", "ignore_shopping_help": "", "shopping_category_help": "", @@ -411,5 +411,16 @@ "Warning_Delete_Supermarket_Category": "", "New_Supermarket": "Crear nuevo supermercado", "New_Supermarket_Category": "", - "Are_You_Sure": "" + "Are_You_Sure": "", + "warning_space_delete": "Puedes borrar tu espacio incluyendo todas las recetas, listas de la compra, regímenes de comidas y cualquier otra cosa creada. ¡Esto no puede deshacerse! ¿Estás seguro de que quieres hacerlo?", + "Private_Recipe": "Receta Privada", + "Private_Recipe_Help": "La receta solo podrás verla tu y la gente con la que esta compartida.", + "reusable_help_text": "El link de invitación podrá ser usado por mas de un usuario", + "Users": "Usuarios", + "Invites": "Invitaciones", + "food_inherit_info": "Campos que han de ser heredados por defecto.", + "facet_count_info": "Mostrar contadores de receta en los filtros de búsqueda.", + "Copy Link": "Copiar Enlace", + "Copy Token": "Copiar Token", + "Create_New_Shopping_Category": "Añadir nueva Categoría de Compras" } From 0cc3df71d2c92ff140f7c9e2d4059a95ef84a6d5 Mon Sep 17 00:00:00 2001 From: Mathias Rasmussen Date: Sat, 13 Aug 2022 16:19:25 +0000 Subject: [PATCH 69/76] Translated using Weblate (Danish) Currently translated at 100.0% (460 of 460 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/da/ --- vue/src/locales/da.json | 48 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/da.json b/vue/src/locales/da.json index 5252414c..098b39f2 100644 --- a/vue/src/locales/da.json +++ b/vue/src/locales/da.json @@ -412,5 +412,51 @@ "New_Supermarket_Category": "Opret ny supermarkedskategori", "Are_You_Sure": "Er du sikker?", "New_Entry": "Nyt punkt", - "Create_New_Shopping_Category": "Opret ny indkøbskategori" + "Create_New_Shopping_Category": "Opret ny indkøbskategori", + "Decimals": "Decimaler", + "Default_Unit": "Standardenhed", + "Use_Fractions": "Benyt brøker", + "Language": "Sprog", + "Theme": "Tema", + "plan_share_desc": "Nye punkter på madplanen bliver automatisk delt med de valgte brugere.", + "Hour": "Time", + "Hours": "Timer", + "Day": "Dag", + "Second": "Sekund", + "Seconds": "Sekunder", + "Users": "Brugere", + "Invites": "Invitationer", + "Account": "Bruger", + "Cosmetic": "Udsmykning", + "API": "API", + "Sticky_Nav_Help": "Vis altid navigationsmenuen øverst på skærmen.", + "Nav_Color": "Navigationsfarve", + "Nav_Color_Help": "Skift navigationsfarve.", + "Use_Kj": "Brug kJ i stedet for kcal", + "Comments_setting": "Vis kommentarer", + "reset_food_inheritance_info": "Nulstil alt mad til standard nedarvede felter og deres forældres værdier.", + "Manage_Emails": "Håndter Emails", + "Change_Password": "Skift kodeord", + "Social_Authentication": "Social authenticering", + "Username": "Brugernavn", + "First_name": "Fornavn", + "Last_name": "Efternavn", + "Disabled": "Slået fra", + "Disable": "Slå fra", + "Valid Until": "Gyldig indtil", + "Private_Recipe_Help": "Opskriften er kun synlig for dig, og dem som den er delt med.", + "food_inherit_info": "Felter på mad som skal nedarves automatisk.", + "facet_count_info": "Vis opskriftsantal på søgeresultater.", + "Copy Link": "Kopier link", + "Copy Token": "Kopier token", + "show_ingredient_overview": "Vis en liste af alle ingredienser i starten af en opskrift.", + "Ingredient Overview": "Ingrediensoversigt", + "warning_space_delete": "Du kan slette dit rum inklusiv alle opskrifter, indkøbslister, madplaner og alt andet du har oprettet. Dette kan ikke gøres om! Er du sikker på at du vil gøre dette?", + "Private_Recipe": "Privat opskrift", + "reusable_help_text": "Om invitationslinket skal kunne bruges af mere end en bruger.", + "Use_Fractions_Help": "Konverter automatisk decimaler til brøker når du viser en opskrift.", + "Days": "Dage", + "Message": "Besked", + "Sticky_Nav": "Fastlåst navigation", + "reset_food_inheritance": "Nulstil nedarvning" } From 2a1b2c18fc958cb212244194c2f2a4a80e114f19 Mon Sep 17 00:00:00 2001 From: Mathias Rasmussen Date: Wed, 17 Aug 2022 14:07:14 +0000 Subject: [PATCH 70/76] Translated using Weblate (Danish) Currently translated at 100.0% (528 of 528 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/da/ --- cookbook/locale/da/LC_MESSAGES/django.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cookbook/locale/da/LC_MESSAGES/django.po b/cookbook/locale/da/LC_MESSAGES/django.po index cedc8395..ebe0c1cc 100644 --- a/cookbook/locale/da/LC_MESSAGES/django.po +++ b/cookbook/locale/da/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-04-29 18:42+0200\n" -"PO-Revision-Date: 2022-05-10 15:32+0000\n" +"PO-Revision-Date: 2022-08-18 14:32+0000\n" "Last-Translator: Mathias Rasmussen \n" "Language-Team: Danish \n" @@ -2377,9 +2377,9 @@ msgid "" " " msgstr "" "At servere mediefiler direkte med gunicorn/python er ikke anbefalet!\n" -" Følg venligst trinne beskrevet\n" +" Følg venligst trinnene beskrevet\n" " here for at opdtere\n" +">her for at opdatere\n" " din installation.\n" " " From 09929beeb913fcb2e5278c00324af6f2124e09cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=A5=AA?= Date: Mon, 22 Aug 2022 09:22:50 +0000 Subject: [PATCH 71/76] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.6% (454 of 460 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/ --- vue/src/locales/zh_Hans.json | 182 ++++++++++++++++++++++++++++++++++- 1 file changed, 180 insertions(+), 2 deletions(-) diff --git a/vue/src/locales/zh_Hans.json b/vue/src/locales/zh_Hans.json index dce50072..e33625a2 100644 --- a/vue/src/locales/zh_Hans.json +++ b/vue/src/locales/zh_Hans.json @@ -256,7 +256,7 @@ "nothing": "无事可做", "show_sql": "显示 SQL", "filter_to_supermarket_desc": "默认情况下,过滤购物清单只包括所选超市的类别。", - "shopping_recent_days_desc": "显示最近几天的购物清单条目。", + "shopping_recent_days_desc": "显示最近几天的购物清单列表。", "shopping_recent_days": "最近几天", "create_shopping_new": "添加到新的购物清单", "download_pdf": "下载 PDF", @@ -275,5 +275,183 @@ "shopping_add_onhand": "自动入手", "related_recipes": "相关的菜谱", "today_recipes": "今日菜谱", - "sql_debug": "调试 SQL" + "sql_debug": "调试 SQL", + "OnHand_help": "食物在库存中时,不会自动添加到购物清单中。 并且现有状态会与购物用户共享。", + "view_recipe": "查看菜谱", + "date_created": "创建日期", + "show_sortby": "显示排序方式", + "shared_with": "一起分享", + "asc": "升序", + "sort_by": "排序方式", + "err_deleting_protected_resource": "您尝试删除的对象正在使用中,无法删除。", + "Show_as_header": "显示标题", + "Ingredient Editor": "材料编辑器", + "Protected": "受保护", + "merge_selection": "将所有出现的 {source} 替换为 {type}。", + "New_Entry": "新条目", + "Language": "语言", + "InheritWarning": "{food} 设置为继承, 更改可能无法保存。", + "Auto_Planner": "自动计划", + "Decimals": "小数", + "Default_Unit": "默认单位", + "Seconds": "秒", + "and_down": "& Down", + "ignore_shopping_help": "请不要将食物添加到购物列表中(例如水)", + "Use_Fractions_Help": "查看菜谱时自动将小数转换为分数。", + "Foods": "食物", + "Use_Fractions": "使用分数", + "simple_mode": "简单模式", + "left_handed": "左手模式", + "left_handed_help": "将使用左手模式优化界面显示。", + "desc": "降序", + "review_shopping": "保存前查看购物列表", + "Nav_Color_Help": "改变导航栏颜色。", + "Theme": "主题", + "SupermarketCategoriesOnly": "仅限超市类别", + "CountMore": "...+{count} 更多", + "one_url_per_line": "每行一个 URL", + "plan_share_desc": "新的膳食计划条目将自动与选定的用户共享。", + "paste_json": "在此处粘贴 json 或 html 源代码以加载菜谱。", + "Hour": "小数", + "Hours": "小时", + "Day": "天", + "Days": "天", + "Second": "秒", + "filter_to_supermarket": "按超市筛选", + "Clear": "清除", + "Users": "用户", + "Invites": "邀请", + "warning_duplicate_filter": "警告:由于技术限制,使用相同组合(和/或/不)的多个过滤器可能会产生意想不到的结果。", + "Account": "账户", + "Cosmetic": "化妆品", + "API": "API", + "enable_expert": "启用专家模式", + "expert_mode": "专家模式", + "advanced": "高级", + "fields": "字段", + "show_keywords": "显示关键字", + "show_foods": "显示食物", + "show_books": "显示书籍", + "show_units": "显示单位", + "show_filters": "显示过滤器", + "filter_name": "过滤器名称", + "food_recipe_help": "在此处链接菜谱可以在使用此食物的任何菜谱中包含此菜谱的链接", + "date_viewed": "最后查看", + "paste_ingredients_placeholder": "在此处粘贴成分表...", + "Bookmarklet": "书签", + "Sticky_Nav_Help": "始终在屏幕顶部显示导航菜单。", + "Nav_Color": "导航栏颜色", + "Comments_setting": "显示评论", + "no_more_images_found": "没有在网站上找到其他图片。", + "Click_To_Edit": "点击编辑", + "search_no_recipes": "找不到任何菜谱!", + "search_import_help_text": "从外部网站或应用程序导入菜谱。", + "search_create_help_text": "直接在 Tandoor 中创建新菜谱。", + "reset_children": "重置子继承", + "reset_food_inheritance": "重置继承", + "reset_food_inheritance_info": "将所有食物重置为默认继承字段及其父值。", + "select_food": "选择食物", + "Sticky_Nav": "粘性导航", + "Use_Kj": "使用千焦代替千卡", + "import_duplicates": "为防止配方与现有配方同名,将被忽略。 选中此框以导入所有内容。", + "ChildInheritFields_help": "默认情况下,子项将继承这些字段。", + "InheritFields_help": "这些字段的值将从父级继承(例外:不会继承空的购物类别)", + "Planned": "计划", + "Manage_Emails": "管理电子邮件", + "Change_Password": "更改密码", + "select_recipe": "选择菜谱", + "select_unit": "选择单位", + "remove_selection": "取消选择", + "empty_list": "列表为空。", + "Select": "选择", + "Username": "用户名", + "First_name": "名", + "substitute_children_help": "所有与这种食物相同子级的食物都被视作替代品。", + "substitute_children": "代替子级", + "SubstituteOnHand": "你手头有一个替代品。", + "ChildInheritFields": "子级继承字段", + "Social_Authentication": "社交认证", + "show_rating": "显示评分", + "Last_name": "姓", + "Keyword": "关键字", + "Reset": "重置", + "Disabled": "禁用", + "Disable": "禁用", + "Options": "选项", + "Export_Supported": "导出支持", + "Toggle": "切换", + "Importer_Help": "有关此进口商的更多信息和帮助:", + "created_on": "创建于", + "Create Food": "创建食物", + "create_food_desc": "创建食物并将其链接到此菜谱。", + "additional_options": "附加选项", + "Documentation": "文档", + "Select_App_To_Import": "请选择一个要导入的应用", + "Import_Error": "导入时发生错误。 请跳转至页面底部的详细信息进行查看。", + "Import_Not_Yet_Supported": "导入尚未支持", + "Export_Not_Yet_Supported": "导入尚未支持", + "Recipes_In_Import": "从文件中导入菜谱", + "New_Supermarket_Category": "新建超市类别", + "Are_You_Sure": "你确定吗?", + "Import_Result_Info": "导入 {imported} 个,共 {total} 个食谱已导入", + "Valid Until": "有效期限", + "Import_Supported": "支持导入", + "move_selection": "选择要将 {source} 移动到的父级 {type}。", + "and_up": "& Up", + "last_cooked": "最后烹饪", + "click_image_import": "单击此处为配方导入图像", + "substitute_help": "搜索可以用现有原料制作的菜谱时,会考虑替代品。", + "substitute_siblings_help": "所有与这种食物相同父级的食物都被视作替代品。", + "Private_Recipe": "私人菜谱", + "Private_Recipe_Help": "菜谱只有你和共享的人会显示。", + "reusable_help_text": "邀请链接是否可用于多个用户。", + "Copy Link": "复制链接", + "Copy Token": "复制令牌", + "Create_New_Shopping_Category": "添加新的购物类别", + "merge_confirmation": "将 {source} 替换为 {target}", + "save_filter": "保存过滤器", + "not": "不", + "Warning_Delete_Supermarket_Category": "删除超市类别也会删除与食品的所有关系。 你确定吗?", + "New_Supermarket": "创建新超市", + "warning_space_delete": "您可以删除您的空间,包括所有食谱、购物清单、膳食计划以及您创建的任何其他内容。 这不能被撤消! 你确定要这么做吗 ?", + "facet_count_info": "在搜索过滤器上显示食谱总数。", + "Hide_as_header": "隐藏标题", + "food_inherit_info": "默认情况下应继承的食物上的字段。", + "Custom Filter": "自定义过滤器", + "search_rank": "搜索排行", + "make_now": "立即制作", + "recipe_filter": "菜谱过滤器", + "copy_to_new": "复制到新菜谱", + "recipe_name": "菜谱名字", + "ingredient_list": "成分列表", + "filter": "筛选", + "Website": "网站", + "App": "应用", + "Message": "信息", + "paste_ingredients": "糊状材料", + "explain": "解释", + "Supermarkets": "超市", + "User": "用户", + "Advanced": "高级", + "Ingredient Overview": "成分概述", + "last_viewed": "最后查看", + "updatedon": "更新时间", + "advanced_search_settings": "高级搜索设置", + "nothing_planned_today": "你今天没有任何计划!", + "no_pinned_recipes": "你没有固定的菜谱!", + "Units": "单位", + "Random Recipes": "随机菜谱", + "parameter_count": "参数 {count}", + "select_keyword": "选择关键字", + "add_keyword": "添加关键字", + "select_file": "选择文件", + "show_ingredient_overview": "在开始时显示菜谱中所有材料的列表。", + "Imported_From": "导入", + "Pinned": "固定", + "Imported": "导入", + "Quick actions": "快捷操作", + "Ratings": "等级", + "Page": "页", + "Single": "单个", + "Multiple": "多个" } From f8793f3ec899b85218bee0319cfbe60ce1223af2 Mon Sep 17 00:00:00 2001 From: Kirstin Seidel-Gebert Date: Sun, 21 Aug 2022 17:14:34 +0000 Subject: [PATCH 72/76] Translated using Weblate (German) Currently translated at 99.6% (522 of 524 strings) Translation: Tandoor/Recipes Backend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-backend/de/ --- cookbook/locale/de/LC_MESSAGES/django.po | 227 +++++++++++------------ 1 file changed, 106 insertions(+), 121 deletions(-) diff --git a/cookbook/locale/de/LC_MESSAGES/django.po b/cookbook/locale/de/LC_MESSAGES/django.po index 7c18f791..043f391f 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -15,10 +15,10 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-05-28 16:32+0000\n" -"Last-Translator: Tobias Reinmann \n" -"Language-Team: German \n" +"PO-Revision-Date: 2022-08-23 13:32+0000\n" +"Last-Translator: Kirstin Seidel-Gebert \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -370,8 +370,6 @@ msgid "Partial Match" msgstr "Teilweise Übereinstimmung" #: .\cookbook\forms.py:467 -#, fuzzy -#| msgid "Starts Wtih" msgid "Starts With" msgstr "Beginnt mit" @@ -463,8 +461,6 @@ msgid "Default Delay Hours" msgstr "Standardmäßige Verzögerung in Stunden" #: .\cookbook\forms.py:517 -#, fuzzy -#| msgid "Select Supermarket" msgid "Filter to Supermarket" msgstr "Supermarkt filtern" @@ -630,11 +626,9 @@ msgid "Rebuilds full text search index on Recipe" msgstr "Generiert den Index für die Rezept-Volltextsuche neu" #: .\cookbook\management\commands\rebuildindex.py:18 -#, fuzzy -#| msgid "Only Postgress databases use full text search, no index to rebuild" msgid "Only Postgresql databases use full text search, no index to rebuild" msgstr "" -"Nur PostgreSQL Datenbanken verwenden Volltextsuche, kein Index muss neu " +"Nur PostgreSQL Datenbanken verwenden Volltextsuche, es muss kein Index neu " "generiert werden" #: .\cookbook\management\commands\rebuildindex.py:29 @@ -737,8 +731,6 @@ msgid "Recipe" msgstr "Rezept" #: .\cookbook\models.py:1228 -#, fuzzy -#| msgid "Foods" msgid "Food" msgstr "Lebensmittel" @@ -748,7 +740,7 @@ msgstr "Schlagwort" #: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." -msgstr "" +msgstr "Die Eigentumsberechtigung am Space kann nicht geändert werden." #: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." @@ -826,11 +818,10 @@ msgid "ID of unit to use for the shopping list" msgstr "ID der Einheit, die für die Einkaufsliste verwendet werden soll" #: .\cookbook\serializer.py:1226 -#, fuzzy msgid "When set to true will delete all food from active shopping lists." msgstr "" -"Wenn diese Option auf wahr gesetzt ist, werden alle Lebensmittel aus den " -"aktiven Einkaufslisten gelöscht." +"Wenn diese Option aktiviert ist, werden alle Lebensmittel aus den aktiven " +"Einkaufslisten gelöscht." #: .\cookbook\tables.py:36 .\cookbook\templates\generic\edit_template.html:6 #: .\cookbook\templates\generic\edit_template.html:14 @@ -1193,10 +1184,8 @@ msgstr "Verlauf" #: .\cookbook\templates\base.html:252 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 -#, fuzzy -#| msgid "Ingredients" msgid "Ingredient Editor" -msgstr "Zutaten" +msgstr "Zutateneditor" #: .\cookbook\templates\base.html:264 #: .\cookbook\templates\export_response.html:7 @@ -1233,15 +1222,13 @@ msgstr "Admin" #: .\cookbook\templates\base.html:309 #: .\cookbook\templates\space_overview.html:25 -#, fuzzy -#| msgid "No Space" msgid "Your Spaces" -msgstr "Kein Space" +msgstr "Deine Spaces" #: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" -msgstr "" +msgstr "Übersicht" #: .\cookbook\templates\base.html:324 msgid "Markdown Guide" @@ -1408,7 +1395,7 @@ msgstr "" #: .\cookbook\templates\generic\delete_template.html:22 msgid "This cannot be undone!" -msgstr "" +msgstr "Dies kann nicht rückgängig gemacht werden!" #: .\cookbook\templates\generic\delete_template.html:27 msgid "Protected" @@ -1574,10 +1561,8 @@ msgstr "Zeilenumbrüche entstehen durch zwei Leerzeichen am ende einer Zeile" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 -#, fuzzy -#| msgid "or by leaving a blank line inbetween." msgid "or by leaving a blank line in between." -msgstr "oder durch eine leere Zeile dazwischen." +msgstr "oder durch eine Leerzeile dazwischen." #: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:74 @@ -1599,16 +1584,12 @@ msgid "Lists" msgstr "Listen" #: .\cookbook\templates\markdown_info.html:85 -#, fuzzy -#| msgid "" -#| "Lists can ordered or unorderd. It is important to leave a blank line " -#| "before the list!" msgid "" "Lists can ordered or unordered. It is important to leave a blank line " "before the list!" msgstr "" -"Liste können sortiert oder unsortiert sein. Es ist wichtig das eine leere " -"Zeile vor der Liste frei gelassen wird!" +"Listen können sortiert oder unsortiert sein. Es ist wichtig, dass vor der " +"Liste eine Zeile frei gelassen wird!" #: .\cookbook\templates\markdown_info.html:87 #: .\cookbook\templates\markdown_info.html:108 @@ -1851,15 +1832,6 @@ msgstr "" " " #: .\cookbook\templates\search_info.html:29 -#, fuzzy -#| msgid "" -#| " \n" -#| " Simple searches ignore punctuation and common words such as " -#| "'the', 'a', 'and'. And will treat seperate words as required.\n" -#| " Searching for 'apple or flour' will return any recipe that " -#| "includes both 'apple' and 'flour' anywhere in the fields that have been " -#| "selected for a full text search.\n" -#| " " msgid "" " \n" " Simple searches ignore punctuation and common words such as " @@ -1870,11 +1842,10 @@ msgid "" " " msgstr "" " \n" -" Einfache Suchen ignorieren Satzzeichen und Stoppwörter wie \"und" -"\", \"der\", \"doch\". Getrennte Wörter werden als erforderlich gewertet.\n" +" Einfache Suchen ignorieren Satzzeichen und Füllwörter wie \"und\"" +", \"der\", \"ein\". Alle anderen Wörter werden als erforderlich gewertet.\n" " Eine Suche nach \"Der Apfel und Mehl\" wird alle Rezepte liefern " -"die \"Apfel\" oder \"Mehl\" in einem der ausgewählten Suchfeldern " -"enthalten.\n" +"die \"Apfel\" und \"Mehl\" in einem der ausgewählten Suchfeldern enthalten.\n" " " #: .\cookbook\templates\search_info.html:34 @@ -1895,23 +1866,6 @@ msgstr "" " " #: .\cookbook\templates\search_info.html:39 -#, fuzzy -#| msgid "" -#| " \n" -#| " Web searches simulate functionality found on many web search " -#| "sites supporting special syntax.\n" -#| " Placing quotes around several words will convert those words " -#| "into a phrase.\n" -#| " 'or' is recongized as searching for the word (or phrase) " -#| "immediately before 'or' OR the word (or phrase) directly after.\n" -#| " '-' is recognized as searching for recipes that do not " -#| "include the word (or phrase) that comes immediately after. \n" -#| " For example searching for 'apple pie' or cherry -butter will " -#| "return any recipe that includes the phrase 'apple pie' or the word " -#| "'cherry' \n" -#| " in any field included in the full text search but exclude any " -#| "recipe that has the word 'butter' in any field included.\n" -#| " " msgid "" " \n" " Web searches simulate functionality found on many web search " @@ -1931,18 +1885,19 @@ msgid "" msgstr "" " \n" " Der Suchtyp \"Web\" simuliert die Funktion vieler " -"Internetsuchmaschinen mit speziellem Syntax.\n" -" Anführungszeichen um mehrere Wörter verwandeln diese in eine " -"Phrase.\n" -" \"or\" versteht sich als \"oder\", sprich es muss das Wort (oder " -"die Phrase) vor dem \"or\" oder nach dem \"or\" enthalten sein.\n" -" '-' ist als Ausschluss nutzbar, so werden nur Rezepte gefunden " -"die nicht das folgende Wort (oder die Phrase) enthalten. \n" +"Internetsuchmaschinen und unterstützt eine ähnliche Syntax.\n" +" Einfache Anführungszeichen (') um mehrere Wörter verwandeln " +"diese in einen zusammenhängenden Suchbegriff.\n" +" \"or\" (oder) verknüpft zwei Suchbegriffe. Mindestens einer der " +"beiden Begriffe (oder beide) muss enthalten sein.\n" +" \"-\" kann verwendet werden, um Begriffe auszuschließen. Es " +"werden nur Rezepte gefunden die nicht den darauf folgenden Begriff enthalten." +"\n" " Beispiel: Eine Suche nach \"'Apfelkuchen mit Sahne' or Torte -" -"Butter\" liefert alle Suchergebnisse die entweder \"Apfelkuchen mit Sahne" -"\" \n" -" oder Torte enthalten, schließt aber Ergebnisse welche Butter " -"enthalten aus.\n" +"Butter\" liefert alle Suchergebnisse die entweder \"Apfelkuchen mit Sahne\" " +"\n" +" oder Torte (oder beides) enthalten, schließt aber Ergebnisse " +"welche Butter enthalten aus.\n" " " #: .\cookbook\templates\search_info.html:48 @@ -1958,19 +1913,6 @@ msgstr "" " " #: .\cookbook\templates\search_info.html:59 -#, fuzzy -#| msgid "" -#| " \n" -#| " Another approach to searching that also requires Postgresql " -#| "is fuzzy search or trigram similarity. A trigram is a group of three " -#| "consecutive characters.\n" -#| " For example searching for 'apple' will create x trigrams " -#| "'app', 'ppl', 'ple' and will create a score of how closely words match " -#| "the generated trigrams.\n" -#| " One benefit of searching trigams is that a search for " -#| "'sandwich' will find mispelled words such as 'sandwhich' that would be " -#| "missed by other methods.\n" -#| " " msgid "" " \n" " Another approach to searching that also requires Postgresql is " @@ -1986,12 +1928,12 @@ msgid "" msgstr "" " \n" " Eine weitere Suchmethode (welche ebenfalls PostgreSQL erfordert) " -"ist die Unscharfe Suche oder Trigramm Suche. Ein Trigramm sind 3 " +"ist die unscharfe Suche oder Trigramm-Suche. Ein Trigramm sind 3 " "aufeinanderfolgende Zeichen.\n" -" Beispiel: Die Suche nach \"Apfel\" erzeugt die Trigramme \"Apf" -"\", \"pfl\" und \"fel\". Die Suchergebnisse erhalten dann eine Wertung " +" Beispiel: Die Suche nach \"Apfel\" erzeugt die Trigramme \"Apf\"" +", \"pfl\" und \"fel\". Die Suchergebnisse erhalten dann eine Wertung " "abhängig davon wie gut sie mit den Trigrammen übereinstimmen.\n" -" Ein Vorteil der Trigramm Suche ist das korrekte Suchwörter wie " +" Ein Vorteil der Trigramm-Suche ist das korrekte Suchwörter wie " "\"Apfel\", Tippfehler in Suchfeldern (wie z.B. \"Afpel\") finden.\n" " " @@ -2241,17 +2183,14 @@ msgstr "Administrator-Account Erstellen" #: .\cookbook\templates\socialaccount\authentication_error.html:7 #: .\cookbook\templates\socialaccount\authentication_error.html:23 -#, fuzzy -#| msgid "Social Login" msgid "Social Network Login Failure" -msgstr "Social Login" +msgstr "Fehler beim Anmelden via sozialem Netzwerk" #: .\cookbook\templates\socialaccount\authentication_error.html:25 -#, fuzzy -#| msgid "An error occurred attempting to move " msgid "" "An error occurred while attempting to login via your social network account." -msgstr "Fehler aufgetreten beim verschieben von " +msgstr "" +"Es ist ein Fehler aufgetreten bei der Anmeldung über dein soziales Netzwerk." #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 @@ -2284,26 +2223,26 @@ msgstr "Registrierung" #: .\cookbook\templates\socialaccount\login.html:9 #, python-format msgid "Connect %(provider)s" -msgstr "" +msgstr "Verbinde zu %(provider)s" #: .\cookbook\templates\socialaccount\login.html:11 #, python-format msgid "You are about to connect a new third party account from %(provider)s." -msgstr "" +msgstr "Die Anmeldung über %(provider)s wird eingerichtet." #: .\cookbook\templates\socialaccount\login.html:13 #, python-format msgid "Sign In Via %(provider)s" -msgstr "" +msgstr "Über %(provider)s anmelden" #: .\cookbook\templates\socialaccount\login.html:15 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." -msgstr "" +msgstr "Die Anmeldung erfolgt über %(provider)s." #: .\cookbook\templates\socialaccount\login.html:20 msgid "Continue" -msgstr "" +msgstr "Weiter" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -2342,10 +2281,8 @@ msgid "Manage Subscription" msgstr "Tarif verwalten" #: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216 -#, fuzzy -#| msgid "Space:" msgid "Space" -msgstr "Instanz:" +msgstr "Space" #: .\cookbook\templates\space_overview.html:17 msgid "" @@ -2364,13 +2301,11 @@ msgstr "" #: .\cookbook\templates\space_overview.html:45 msgid "Owner" -msgstr "" +msgstr "Eigentümer" #: .\cookbook\templates\space_overview.html:49 -#, fuzzy -#| msgid "Create Space" msgid "Leave Space" -msgstr "Space erstellen" +msgstr "Space verlassen" #: .\cookbook\templates\space_overview.html:70 #: .\cookbook\templates\space_overview.html:80 @@ -2621,62 +2556,85 @@ msgstr "{obj.name} wurde der Einkaufsliste hinzugefügt." #: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." msgstr "" +"ID des Rezeptes zu dem ein Schritt gehört. Kann mehrfach angegeben werden." #: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." -msgstr "" +msgstr "Abfragezeichenfolge, die mit dem Objektnamen übereinstimmt (ungenau)." #: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." msgstr "" +"Suchbegriff wird mit dem Rezeptnamen abgeglichen. In Zukunft auch " +"Volltextsuche." #: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" msgstr "" +"ID des Stichwortes, das ein Rezept haben muss. Kann mehrfach angegeben " +"werden. Äquivalent zu keywords_or" #: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" msgstr "" +"Stichwort IDs. Kann mehrfach angegeben werden. Listet Rezepte zu jedem der " +"angegebenen Stichwörter" #: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." msgstr "" +"Stichwort IDs. Kann mehrfach angegeben werden. Listet Rezepte mit allen " +"angegebenen Stichwörtern." #: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." msgstr "" +"Stichwort ID. Kann mehrfach angegeben werden. Schließt Rezepte einem der " +"angegebenen Stichwörtern aus." #: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." msgstr "" +"Stichwort IDs. Kann mehrfach angegeben werden. Schließt Rezepte mit allen " +"angegebenen Stichwörtern aus." #: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." msgstr "" +"ID einer Zutat, zu der Rezepte gelistet werden sollen. Kann mehrfach " +"angegeben werden." #: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" msgstr "" +"Zutat ID. Kann mehrfach angegeben werden. Listet Rezepte mindestens einer " +"der Zutaten" #: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." msgstr "" +"Zutat ID. Kann mehrfach angegeben werden. Listet Rezepte mit allen " +"angegebenen Zutaten." #: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." msgstr "" +"Zutat ID. Kann mehrfach angegeben werden. Schließt Rezepte aus, die eine der " +"angegebenen Zutaten enthalten." #: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." msgstr "" +"Zutat ID. Kann mehrfach angegeben werden. Schließt Rezepte aus, die alle " +"angegebenen Zutaten enthalten." #: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." @@ -2687,88 +2645,119 @@ msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." msgstr "" +"Mindestbewertung eines Rezeptes (0-5). Negative Werte filtern nach " +"Maximalbewertung." #: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." -msgstr "" +msgstr "Buch ID, in dem das Rezept ist. Kann mehrfach angegeben werden." #: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" msgstr "" +"Buch ID. Kann mehrfach angegeben werden. Listet alle Rezepte aus den " +"angegebenen Büchern" #: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." msgstr "" +"Buch ID. Kann mehrfach angegeben werden. Listet die Rezepte, die in allen " +"Büchern enthalten sind." #: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." msgstr "" +"Buch IDs. Kann mehrfach angegeben werden. Schließt Rezepte aus den " +"angegebenen Büchern aus." #: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." msgstr "" +"Buch IDs. Kann mehrfach angegeben werden. Schließt Rezepte aus, die in allen " +"angegebenen Büchern enthalten sind." #: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" -msgstr "" +msgstr "Nur interne Rezepte sollen gelistet werden. [ja/nein]" #: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" msgstr "" +"Die Suchergebnisse sollen in zufälliger Reihenfolge gelistet werden. [ja/" +"nein]" #: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" msgstr "" +"Die neuesten Suchergebnisse sollen zuerst angezeigt werden. [ja/nein]" #: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" msgstr "" +"Rezepte listen, die mindestens x-mal gekocht wurden. Eine negative Zahl " +"listet Rezepte, die weniger als x-mal gekocht wurden" #: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" +"Rezepte listen, die zuletzt am angegebenen Datum oder später gekocht wurden. " +"Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet." #: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" +"Rezepte listen, die am angegebenen Datum oder später erstellt wurden. Wenn - " +"vorangestellt wird, wird am oder vor dem Datum gelistet." #: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." msgstr "" +"Rezepte listen, die am angegebenen Datum oder später aktualisiert wurden. " +"Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet." #: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." msgstr "" +"Rezepte listen, die am angegebenen Datum oder später zuletzt angesehen " +"wurden. Wenn - vorangestellt wird, wird am oder vor dem Datum gelistet." #: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" msgstr "" +"Rezepte listen, die mit vorhandenen Zutaten gekocht werden können. [ja/" +"nein]" #: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." msgstr "" +"Zeigt denjenigen Eintrag auf der Einkaufliste mit der angegebenen ID. Kann " +"mehrfach angegeben werden." #: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." msgstr "" +"Einkaufslisteneinträge nach Häkchen filtern. [ja, nein, beides, " +"kürzlich]
- kürzlich enthält nicht abgehakte Einträge und " +"kürzlich abgeschlossene Einträge." #: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." msgstr "" +"Listet die Einträge der Einkaufsliste sortiert nach Supermarktkategorie." #: .\cookbook\views\api.py:1140 msgid "Nothing to do." @@ -2776,7 +2765,7 @@ msgstr "Nichts zu tun." #: .\cookbook\views\api.py:1160 msgid "Invalid Url" -msgstr "" +msgstr "Ungültige URL" #: .\cookbook\views\api.py:1167 msgid "Connection Refused." @@ -2784,7 +2773,7 @@ msgstr "Verbindung fehlgeschlagen." #: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." -msgstr "" +msgstr "Ungültiges URL Schema." #: .\cookbook\views\api.py:1195 #, fuzzy @@ -2842,10 +2831,8 @@ msgid "Invite Link" msgstr "Einladungslink" #: .\cookbook\views\delete.py:200 -#, fuzzy -#| msgid "Members" msgid "Space Membership" -msgstr "Mitglieder" +msgstr "Space-Mitgliedschaft" #: .\cookbook\views\edit.py:116 msgid "You cannot edit this storage!" @@ -2904,10 +2891,8 @@ msgid "Shopping Categories" msgstr "Einkaufskategorien" #: .\cookbook\views\lists.py:187 -#, fuzzy -#| msgid "Filter" msgid "Custom Filters" -msgstr "Filter" +msgstr "Benutzerdefinierte Filter" #: .\cookbook\views\lists.py:224 msgid "Steps" From 726157a062a8fd1b6d049fc4e48bb4f9328a80c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=A5=AA?= Date: Mon, 22 Aug 2022 13:06:00 +0000 Subject: [PATCH 73/76] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (524 of 524 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 | 339 ++++++++++---------- 1 file changed, 175 insertions(+), 164 deletions(-) diff --git a/cookbook/locale/zh_CN/LC_MESSAGES/django.po b/cookbook/locale/zh_CN/LC_MESSAGES/django.po index 5c4d3543..e505429a 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: 2022-07-12 19:20+0200\n" -"PO-Revision-Date: 2022-01-22 03:30+0000\n" -"Last-Translator: 糖多 <1365143958@qq.com>\n" +"PO-Revision-Date: 2022-08-23 13:32+0000\n" +"Last-Translator: 吕楪 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -17,12 +17,12 @@ 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.8\n" +"X-Generator: Weblate 4.10.1\n" #: .\cookbook\filters.py:23 .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\stats.html:28 msgid "Ingredients" -msgstr "材料" +msgstr "食材" #: .\cookbook\forms.py:53 msgid "Default unit" @@ -66,7 +66,7 @@ msgstr "计划分享" #: .\cookbook\forms.py:63 msgid "Ingredient decimal places" -msgstr "材料小数位" +msgstr "食材小数位" #: .\cookbook\forms.py:64 msgid "Shopping list auto sync period" @@ -79,7 +79,7 @@ msgstr "评论" #: .\cookbook\forms.py:66 msgid "Left-handed mode" -msgstr "" +msgstr "左手模式" #: .\cookbook\forms.py:70 msgid "" @@ -90,13 +90,13 @@ msgstr "" #: .\cookbook\forms.py:72 msgid "Default Unit to be used when inserting a new ingredient into a recipe." -msgstr "在配方中插入新原料时使用的默认单位。" +msgstr "在菜谱中插入新食材时使用的默认单位。" #: .\cookbook\forms.py:74 msgid "" "Enables support for fractions in ingredient amounts (e.g. convert decimals " "to fractions automatically)" -msgstr "启用对原料数量的分数支持(例如自动将小数转换为分数)" +msgstr "启用对食材数量的分数支持(例如自动将小数转换为分数)" #: .\cookbook\forms.py:76 msgid "Display nutritional energy amounts in joules instead of calories" @@ -104,7 +104,7 @@ msgstr "用焦耳来显示营养能量而不是卡路里" #: .\cookbook\forms.py:77 msgid "Users with whom newly created meal plans should be shared by default." -msgstr "默认情况下,新创建的膳食计划应与之共享的用户。" +msgstr "默认情况下,将自动与用户共享新创建的膳食计划。" #: .\cookbook\forms.py:78 msgid "Users with whom to share shopping lists." @@ -116,7 +116,7 @@ msgstr "在搜索页面上显示最近查看的菜谱。" #: .\cookbook\forms.py:81 msgid "Number of decimals to round ingredients." -msgstr "四舍五入成分的小数点数目。" +msgstr "四舍五入食材的小数点数量。" #: .\cookbook\forms.py:82 msgid "If you want to be able to create and see comments underneath recipes." @@ -139,15 +139,15 @@ msgstr "使导航栏悬浮在页面的顶部。" #: .\cookbook\forms.py:88 .\cookbook\forms.py:499 msgid "Automatically add meal plan ingredients to shopping list." -msgstr "自动将膳食计划原料添加到购物清单中。" +msgstr "自动将膳食计划食材添加到购物清单中。" #: .\cookbook\forms.py:89 msgid "Exclude ingredients that are on hand." -msgstr "排除现有材料。" +msgstr "排除现有食材。" #: .\cookbook\forms.py:90 msgid "Will optimize the UI for use with your left hand." -msgstr "" +msgstr "将使用左手模式优化界面显示。" #: .\cookbook\forms.py:107 msgid "" @@ -274,18 +274,16 @@ msgstr "" "错误)。" #: .\cookbook\forms.py:448 -#, fuzzy msgid "" "Select type method of search. Click here for " "full description of choices." -msgstr "" -"选择搜索类型方法。点击此处 查看选项的完整说明。" +msgstr "选择搜索类型方法。 点击此处 查看选项的完整说明。" #: .\cookbook\forms.py:449 msgid "" "Use fuzzy matching on units, keywords and ingredients when editing and " "importing recipes." -msgstr "编辑和导入菜谱时,对单位、关键词和材料使用模糊匹配。" +msgstr "编辑和导入菜谱时,对单位、关键词和食材使用模糊匹配。" #: .\cookbook\forms.py:451 msgid "" @@ -336,8 +334,6 @@ msgid "Partial Match" msgstr "部分匹配" #: .\cookbook\forms.py:467 -#, fuzzy -#| msgid "Starts Wtih" msgid "Starts With" msgstr "起始于" @@ -361,13 +357,13 @@ msgstr "" msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "include all related recipes." -msgstr "将膳食计划(手动或自动)添加到购物清单时,包括所有相关菜谱。" +msgstr "将膳食计划(手动或自动)添加到购物清单时,包括所有相关食谱。" #: .\cookbook\forms.py:501 msgid "" "When adding a meal plan to the shopping list (manually or automatically), " "exclude ingredients that are on hand." -msgstr "将膳食计划(手动或自动)添加到购物清单时,排除现有材料。" +msgstr "将膳食计划(手动或自动)添加到购物清单时,排除现有食材。" #: .\cookbook\forms.py:502 msgid "Default number of hours to delay a shopping list entry." @@ -375,12 +371,11 @@ msgstr "延迟购物清单条目的默认小时数。" #: .\cookbook\forms.py:503 msgid "Filter shopping list to only include supermarket categories." -msgstr "筛选购物清单仅包括超市类型。" +msgstr "筛选购物清单仅包含超市分类。" #: .\cookbook\forms.py:504 -#, fuzzy msgid "Days of recent shopping list entries to display." -msgstr "显示最近几天的购物清单条目。" +msgstr "显示最近几天的购物清单列表。" #: .\cookbook\forms.py:505 msgid "Mark food 'On Hand' when checked off shopping list." @@ -419,10 +414,8 @@ msgid "Default Delay Hours" msgstr "默认延迟时间" #: .\cookbook\forms.py:517 -#, fuzzy -#| msgid "Supermarket" msgid "Filter to Supermarket" -msgstr "筛选到超市" +msgstr "按超市筛选" #: .\cookbook\forms.py:518 msgid "Recent Days" @@ -454,7 +447,7 @@ msgstr "默认情况下应继承的食物上的字段。" #: .\cookbook\forms.py:545 msgid "Show recipe counts on search filters" -msgstr "显示搜索筛选器上的菜谱计数" +msgstr "显示搜索筛选器上的食谱计数" #: .\cookbook\helper\AllAuthCustomAdapter.py:36 msgid "" @@ -499,10 +492,8 @@ msgid "One of queryset or hash_key must be provided" msgstr "必须提供 queryset 或 hash_key 之一" #: .\cookbook\helper\shopping_helper.py:152 -#, fuzzy -#| msgid "You must supply a created_by" msgid "You must supply a servings size" -msgstr "你必须提供创建者" +msgstr "你必须提供一些份量" #: .\cookbook\helper\template_helper.py:64 #: .\cookbook\helper\template_helper.py:66 @@ -512,15 +503,13 @@ msgstr "无法解析模板代码。" #: .\cookbook\integration\copymethat.py:41 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" -msgstr "" +msgstr "喜欢" #: .\cookbook\integration\copymethat.py:70 #: .\cookbook\integration\recettetek.py:54 #: .\cookbook\integration\recipekeeper.py:63 -#, fuzzy -#| msgid "Import Log" msgid "Imported from" -msgstr "导入日志" +msgstr "导入" #: .\cookbook\integration\integration.py:223 msgid "" @@ -582,10 +571,8 @@ msgid "Rebuilds full text search index on Recipe" msgstr "在菜谱上重建全文搜索索引" #: .\cookbook\management\commands\rebuildindex.py:18 -#, fuzzy -#| msgid "Only Postgress databases use full text search, no index to rebuild" msgid "Only Postgresql databases use full text search, no index to rebuild" -msgstr "仅 Postgress 数据库使用全文搜索,没有重建索引" +msgstr "仅 PostgreSQL 数据库使用全文搜索,没有重建索引" #: .\cookbook\management\commands\rebuildindex.py:29 msgid "Recipe index rebuild complete." @@ -685,8 +672,6 @@ msgid "Recipe" msgstr "菜谱" #: .\cookbook\models.py:1228 -#, fuzzy -#| msgid "Foods" msgid "Food" msgstr "食物" @@ -696,7 +681,7 @@ msgstr "关键词" #: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." -msgstr "" +msgstr "无法修改空间所有者权限。" #: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." @@ -712,20 +697,20 @@ msgstr "你好" #: .\cookbook\serializer.py:1081 msgid "You have been invited by " -msgstr "" +msgstr "您已被邀请至 " #: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " -msgstr "" +msgstr " 加入他们的泥炉食谱空间 " #: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " -msgstr "" +msgstr "点击以下链接激活您的帐户: " #: .\cookbook\serializer.py:1084 msgid "" "If the link does not work use the following code to manually join the space: " -msgstr "" +msgstr "如果链接不起作用,请使用下面的代码手动加入空间: " #: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " @@ -734,11 +719,11 @@ msgstr "邀请有效期至 " #: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " -msgstr "" +msgstr "泥炉食谱是一个开源食谱管理器。 在 GitHub 上查看 " #: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" -msgstr "" +msgstr "泥炉食谱邀请" #: .\cookbook\serializer.py:1209 msgid "Existing shopping list to update" @@ -748,7 +733,7 @@ msgstr "要更新现有的购物清单" msgid "" "List of ingredient IDs from the recipe to add, if not provided all " "ingredients will be added." -msgstr "要添加的菜谱中材料识别符列表,不提供则添加所有材料。" +msgstr "要添加的食谱中食材识别符列表,不提供则添加所有食材。" #: .\cookbook\serializer.py:1213 msgid "" @@ -828,14 +813,12 @@ msgid "Unverified" msgstr "未验证" #: .\cookbook\templates\account\email.html:40 -#, fuzzy msgid "Primary" -msgstr "初选" +msgstr "主要" #: .\cookbook\templates\account\email.html:47 -#, fuzzy msgid "Make Primary" -msgstr "做出初选" +msgstr "当做主要" #: .\cookbook\templates\account\email.html:49 msgid "Re-send Verification" @@ -999,7 +982,6 @@ msgid "" msgstr "我们已经向你发送了一封电子邮件。如果你在几分钟内没有收到,请联系我们。" #: .\cookbook\templates\account\password_reset_from_key.html:13 -#, fuzzy msgid "Bad Token" msgstr "坏令牌" @@ -1127,10 +1109,8 @@ msgstr "历史" #: .\cookbook\templates\base.html:252 #: .\cookbook\templates\ingredient_editor.html:7 #: .\cookbook\templates\ingredient_editor.html:13 -#, fuzzy -#| msgid "Ingredients" msgid "Ingredient Editor" -msgstr "材料" +msgstr "食材编辑器" #: .\cookbook\templates\base.html:264 #: .\cookbook\templates\export_response.html:7 @@ -1167,15 +1147,13 @@ msgstr "管理员" #: .\cookbook\templates\base.html:309 #: .\cookbook\templates\space_overview.html:25 -#, fuzzy -#| msgid "No Space" msgid "Your Spaces" -msgstr "没有空间" +msgstr "你的空间" #: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" -msgstr "" +msgstr "概述" #: .\cookbook\templates\base.html:324 msgid "Markdown Guide" @@ -1187,7 +1165,7 @@ msgstr "GitHub" #: .\cookbook\templates\base.html:328 msgid "Translate Tandoor" -msgstr "翻译筒状泥炉<_<" +msgstr "翻译泥炉" #: .\cookbook\templates\base.html:332 msgid "API Browser" @@ -1199,11 +1177,11 @@ msgstr "退出" #: .\cookbook\templates\base.html:357 msgid "You are using the free version of Tandor" -msgstr "" +msgstr "你正在使用免费版的泥炉" #: .\cookbook\templates\base.html:358 msgid "Upgrade Now" -msgstr "" +msgstr "现在升级" #: .\cookbook\templates\batch\edit.html:6 msgid "Batch edit Category" @@ -1293,7 +1271,7 @@ msgstr "编辑菜谱" #: .\cookbook\templates\forms\ingredients.html:15 msgid "Edit Ingredients" -msgstr "编辑材料" +msgstr "编辑食材" #: .\cookbook\templates\forms\ingredients.html:16 msgid "" @@ -1306,8 +1284,9 @@ msgid "" " " msgstr "" "\n" -" 如果两个(或更多)单位或材料应该是相同的,则可使用以下形式。\n" -" 它合并了两个单位或材料,并使用它们更新所有菜谱。\n" +" 如果意外创建两个(或更多)单位的相同食材,则可以使用下面的\n" +" 表格。\n" +" 可以合并两个单位的食材并使用它们更新所有菜谱。\n" " " #: .\cookbook\templates\forms\ingredients.html:26 @@ -1321,7 +1300,7 @@ msgstr "合并" #: .\cookbook\templates\forms\ingredients.html:36 msgid "Are you sure that you want to merge these two ingredients?" -msgstr "你确定要合并这两种材料吗?" +msgstr "你确定要合并这两种食材吗?" #: .\cookbook\templates\generic\delete_template.html:21 #, python-format @@ -1330,7 +1309,7 @@ msgstr "你确定要删除 %(title)s:%(object)s " #: .\cookbook\templates\generic\delete_template.html:22 msgid "This cannot be undone!" -msgstr "" +msgstr "这个不能撤销!" #: .\cookbook\templates\generic\delete_template.html:27 msgid "Protected" @@ -1492,8 +1471,6 @@ msgstr "通过在行尾后添加两个空格插入换行符" #: .\cookbook\templates\markdown_info.html:57 #: .\cookbook\templates\markdown_info.html:73 -#, fuzzy -#| msgid "or by leaving a blank line inbetween." msgid "or by leaving a blank line in between." msgstr "或者在中间留一个空行。" @@ -1517,10 +1494,6 @@ msgid "Lists" msgstr "列表" #: .\cookbook\templates\markdown_info.html:85 -#, fuzzy -#| msgid "" -#| "Lists can ordered or unorderd. It is important to leave a blank line " -#| "before the list!" msgid "" "Lists can ordered or unordered. It is important to leave a blank line " "before the list!" @@ -1671,7 +1644,7 @@ msgstr "" #: .\cookbook\templates\openid\login.html:27 #: .\cookbook\templates\socialaccount\authentication_error.html:27 msgid "Back" -msgstr "" +msgstr "返回" #: .\cookbook\templates\recipe_view.html:26 msgid "by" @@ -1760,15 +1733,6 @@ msgstr "" " " #: .\cookbook\templates\search_info.html:29 -#, fuzzy -#| msgid "" -#| " \n" -#| " Simple searches ignore punctuation and common words such as " -#| "'the', 'a', 'and'. And will treat seperate words as required.\n" -#| " Searching for 'apple or flour' will return any recipe that " -#| "includes both 'apple' and 'flour' anywhere in the fields that have been " -#| "selected for a full text search.\n" -#| " " msgid "" " \n" " Simple searches ignore punctuation and common words such as " @@ -1779,10 +1743,8 @@ msgid "" " " msgstr "" " \n" -" 简单搜索会忽略标点符号和常用词,如“the”、“a”、“and”。并将根据需要" -"处理单独的单词。\n" -" 搜索“apple or flour”将会在全文搜索中返回任意包" -"含“apple”和“flour”的菜谱。\n" +" 简单搜索会忽略标点符号和常用词,如“the”、“a”、“and”。并将根据需要处理单独的单词。\n" +" 搜索“apple or flour”将会在全文搜索中返回任意包含“apple”和“flour”的菜谱。\n" " " #: .\cookbook\templates\search_info.html:34 @@ -1795,6 +1757,10 @@ msgid "" "been selected for a full text search.\n" " " msgstr "" +" \n" +" 短语搜索会忽略标点符号,但会按照搜索顺序查询所有单词。\n" +" 搜索“苹果或面粉”将只返回一个食谱,这个食谱包含进行全文搜索时准确的字段短语“苹果或面粉”。\n" +" " #: .\cookbook\templates\search_info.html:39 msgid "" @@ -1814,6 +1780,14 @@ msgid "" "recipe that has the word 'butter' in any field included.\n" " " msgstr "" +" \n" +" 网页搜索模拟许多支持特殊语法的网页搜索站点上的功能。\n" +" 在几个单词周围加上引号会将这些单词转换为一个短语。\n" +" 'or' 被识别为搜索紧接在 'or' 之前的单词(或短语)或紧随其后的单词(或短语)。\n" +" '-' 被识别为搜索不包含紧随其后的单词(或短语)的食谱。 \n" +" 例如,搜索 “苹果派” 或“樱桃 -黄油” 将返回任何包含短语“苹果派”或“樱桃”的食谱 \n" +" 与在全文搜索中包含的任何 “樱桃” 字段中,但排除包含单词“黄油”的任何食谱。\n" +" " #: .\cookbook\templates\search_info.html:48 msgid "" @@ -1822,6 +1796,9 @@ msgid "" "operators such as '|', '&' and '()'\n" " " msgstr "" +" \n" +" 原始搜索与网页类似,不同的是会采用标点运算符,例如 '|', '&' 和 '()'\n" +" " #: .\cookbook\templates\search_info.html:59 msgid "" @@ -1837,6 +1814,12 @@ msgid "" "methods.\n" " " msgstr "" +" \n" +" 另一种也需要 PostgreSQL 的搜索方法是模糊搜索或三元组。 三元组是一组三个连续的字符。\n" +" 例如,搜索“apple”将创建 x 个三元组“app”、“ppl”、“ple”,并将创建单词与生成的三元组匹配程度的分数。\n" +" 使用模糊搜索或三元组一个好处是搜索“sandwich”会找到拼写错误的单词,例如“sandwhich”,而其他方法会漏掉这些单词。" +"\n" +" " #: .\cookbook\templates\search_info.html:69 msgid "Search Fields" @@ -1876,6 +1859,23 @@ msgid "" "full text results, it does match the trigram results.\n" " " msgstr "" +" \n" +" 不重音 是一种特殊情况,因为它可以为每个尝试忽略重音值的搜索进行搜索“不重音”字段。 \n" +" 例如,当您为“名字”启用不重音时,任何搜索(开头、包含、三元组)都将尝试搜索忽略重音字符。\n" +" \n" +" 对于其他选项,您可以在任一或所有字段上启用搜索,它们将与假定的“or”组合在一起。\n" +" 例如,为 起始于 启用“名字”,为 部分匹配 启用“名字”和“描述”,为 全文搜索 启用“食材”和“关键字”\n" +" 并搜索“苹果”将生成一个搜索,该搜索将返回具有以下内容的食谱:\n" +" - 以“苹果”开头的食谱名称\n" +" - 或包含“苹果”的食谱名称\n" +" - 或包含“苹果”的食谱描述\n" +" - 或在食材中具有全文搜索匹配(“苹果”或“很多苹果”)的食谱\n" +" - 或将在关键字中进行全文搜索匹配的食谱\n" +"\n" +" 在多种类型搜索中组合大量字段可能会对性能产生负面影响、创建重复结果或返回意外结果。\n" +" 例如,启用模糊搜索或部分匹配会干扰网络搜索算法。 \n" +" 使用模糊搜索或全文搜索进行搜索“苹果 -派”将返回食谱 苹果派。虽然它不包含在全文结果中,但它确实与三元组结果匹配。\n" +" " #: .\cookbook\templates\search_info.html:95 msgid "Search Index" @@ -1893,10 +1893,15 @@ msgid "" "the management command 'python manage.py rebuildindex'\n" " " msgstr "" +" \n" +" 三元搜索和全文搜索都依赖于数据库索引执行。 \n" +" 你可以在“食谱”的“管理”页面中的所有字段上重建索引并选择任一食谱运行“为所选食谱重建索引”\n" +" 你还可以通过执行管理命令“python manage.py rebuildindex”在命令行重建索引\n" +" " #: .\cookbook\templates\settings.html:28 msgid "Account" -msgstr "帐号" +msgstr "账户" #: .\cookbook\templates\settings.html:35 msgid "Preferences" @@ -1955,7 +1960,7 @@ msgstr "" msgid "" "Use the token as an Authorization header prefixed by the word token as shown " "in the following examples:" -msgstr "" +msgstr "使用令牌作为授权标头,前缀为单词令牌,如以下示例所示:" #: .\cookbook\templates\settings.html:162 msgid "or" @@ -2042,17 +2047,13 @@ msgstr "创建超级用户帐号" #: .\cookbook\templates\socialaccount\authentication_error.html:7 #: .\cookbook\templates\socialaccount\authentication_error.html:23 -#, fuzzy -#| msgid "Social Login" msgid "Social Network Login Failure" -msgstr "关联登录" +msgstr "社交网络登录失败" #: .\cookbook\templates\socialaccount\authentication_error.html:25 -#, fuzzy -#| msgid "An error occurred attempting to move " msgid "" "An error occurred while attempting to login via your social network account." -msgstr "尝试移动时出错 " +msgstr "尝试通过您的社交网络帐户登录时出错。" #: .\cookbook\templates\socialaccount\connections.html:4 #: .\cookbook\templates\socialaccount\connections.html:15 @@ -2063,7 +2064,9 @@ msgstr "帐号连接" msgid "" "You can sign in to your account using any of the following third party\n" " accounts:" -msgstr "你可以使用以下任何第三方帐号登录你的帐号:" +msgstr "" +"你可以使用以下任何第三方登录您的帐户\n" +" 账户:" #: .\cookbook\templates\socialaccount\connections.html:52 msgid "" @@ -2082,26 +2085,26 @@ msgstr "注册" #: .\cookbook\templates\socialaccount\login.html:9 #, python-format msgid "Connect %(provider)s" -msgstr "" +msgstr "连接 %(provider)s" #: .\cookbook\templates\socialaccount\login.html:11 #, python-format msgid "You are about to connect a new third party account from %(provider)s." -msgstr "" +msgstr "你即将从 %(provider)s 连接一个新的第三方帐户。" #: .\cookbook\templates\socialaccount\login.html:13 #, python-format msgid "Sign In Via %(provider)s" -msgstr "" +msgstr "通过 %(provider)s 登录" #: .\cookbook\templates\socialaccount\login.html:15 #, python-format msgid "You are about to sign in using a third party account from %(provider)s." -msgstr "" +msgstr "你即将使用 %(provider)s 的第三方帐户登录。" #: .\cookbook\templates\socialaccount\login.html:20 msgid "Continue" -msgstr "" +msgstr "继续" #: .\cookbook\templates\socialaccount\signup.html:10 #, python-format @@ -2110,6 +2113,9 @@ msgid "" " %(provider_name)s account to login to\n" " %(site_name)s. As a final step, please complete the following form:" msgstr "" +"你即将使用你的\n" +" %(provider_name)s 账户登录\n" +" %(site_name)s。 最后一步, 请填写以下表单:" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:23 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:31 @@ -2126,7 +2132,7 @@ msgstr "" #: .\cookbook\templates\socialaccount\snippets\provider_list.html:119 #: .\cookbook\templates\socialaccount\snippets\provider_list.html:127 msgid "Sign in using" -msgstr "" +msgstr "登录使用" #: .\cookbook\templates\space_manage.html:26 msgid "Space:" @@ -2137,10 +2143,8 @@ msgid "Manage Subscription" msgstr "管理订阅" #: .\cookbook\templates\space_overview.html:13 .\cookbook\views\delete.py:216 -#, fuzzy -#| msgid "Space:" msgid "Space" -msgstr "空间:" +msgstr "空间" #: .\cookbook\templates\space_overview.html:17 msgid "" @@ -2155,13 +2159,11 @@ msgstr "你可以被邀请进入现有空间,也可以创建自己的空间。 #: .\cookbook\templates\space_overview.html:45 msgid "Owner" -msgstr "" +msgstr "所有者" #: .\cookbook\templates\space_overview.html:49 -#, fuzzy -#| msgid "Create Space" msgid "Leave Space" -msgstr "创建空间" +msgstr "留出空间" #: .\cookbook\templates\space_overview.html:70 #: .\cookbook\templates\space_overview.html:80 @@ -2203,19 +2205,19 @@ msgstr "统计数据" #: .\cookbook\templates\stats.html:19 msgid "Number of objects" -msgstr "" +msgstr "对象数" #: .\cookbook\templates\stats.html:30 msgid "Recipe Imports" -msgstr "" +msgstr "食谱导入" #: .\cookbook\templates\stats.html:38 msgid "Objects stats" -msgstr "" +msgstr "对象统计" #: .\cookbook\templates\stats.html:41 msgid "Recipes without Keywords" -msgstr "" +msgstr "菜谱没有关键字" #: .\cookbook\templates\stats.html:45 msgid "Internal Recipes" @@ -2292,6 +2294,13 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" 您没有在 .env 文件中配置 SECRET_KEY。 Django " +"默认为\n" +" 标准键\n" +" 提供公开但并不安全的安装! 请设置\n" +" SECRET_KEY.env 文件中配置。\n" +" " #: .\cookbook\templates\system.html:66 msgid "Debug Mode" @@ -2307,6 +2316,11 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" 此应用程序仍在调试模式下运行。 这是不必要的。 调试模式由\n" +" 设置\n" +" DEBUG=0.env 文件中配置\n" +" " #: .\cookbook\templates\system.html:81 msgid "Database" @@ -2324,6 +2338,10 @@ msgid "" " features only work with postgres databases.\n" " " msgstr "" +"\n" +" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这是不推荐的,\n" +" 因为有些功能仅适用于 PostgreSQL 数据库。\n" +" " #: .\cookbook\templates\url_import.html:8 msgid "URL Import" @@ -2335,7 +2353,7 @@ msgstr "参数 updated_at 格式不正确" #: .\cookbook\views\api.py:217 .\cookbook\views\api.py:320 msgid "No {self.basename} with id {pk} exists" -msgstr "" +msgstr "不存在ID是 {pk} 的 {self.basename}" #: .\cookbook\views\api.py:221 msgid "Cannot merge with the same object!" @@ -2343,7 +2361,7 @@ msgstr "无法与同一对象合并!" #: .\cookbook\views\api.py:228 msgid "No {self.basename} with id {target} exists" -msgstr "" +msgstr "不存在 ID 为 {pk} 的 {self.basename}" #: .\cookbook\views\api.py:233 msgid "Cannot merge with child object!" @@ -2371,7 +2389,7 @@ msgstr "无法将对象移动到自身!" #: .\cookbook\views\api.py:341 msgid "No {self.basename} with id {parent} exists" -msgstr "" +msgstr "不存在 ID 为 {parent} 的 {self.basename}" #: .\cookbook\views\api.py:347 msgid "{child.name} was moved successfully to parent {parent.name}" @@ -2388,155 +2406,155 @@ msgstr "{obj.name} 已添加到购物清单中。" #: .\cookbook\views\api.py:674 msgid "ID of recipe a step is part of. For multiple repeat parameter." -msgstr "" +msgstr "食谱中的步骤ID。 对于多个重复参数。" #: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." -msgstr "" +msgstr "请求参数与对象名称匹配(模糊)。" #: .\cookbook\views\api.py:720 msgid "" "Query string matched (fuzzy) against recipe name. In the future also " "fulltext search." -msgstr "" +msgstr "请求参数与食谱名称匹配(模糊)。 未来会添加全文搜索。" #: .\cookbook\views\api.py:722 msgid "" "ID of keyword a recipe should have. For multiple repeat parameter. " "Equivalent to keywords_or" -msgstr "" +msgstr "菜谱应包含的关键字 ID。 对于多个重复参数。 相当于keywords_or" #: .\cookbook\views\api.py:725 msgid "" "Keyword IDs, repeat for multiple. Return recipes with any of the keywords" -msgstr "" +msgstr "允许多个关键字 ID。 返回带有任一关键字的食谱" #: .\cookbook\views\api.py:728 msgid "" "Keyword IDs, repeat for multiple. Return recipes with all of the keywords." -msgstr "" +msgstr "允许多个关键字 ID。 返回带有所有关键字的食谱。" #: .\cookbook\views\api.py:731 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." -msgstr "" +msgstr "允许多个关键字 ID。 排除带有任一关键字的食谱。" #: .\cookbook\views\api.py:734 msgid "" "Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." -msgstr "" +msgstr "允许多个关键字 ID。 排除带有所有关键字的食谱。" #: .\cookbook\views\api.py:736 msgid "ID of food a recipe should have. For multiple repeat parameter." -msgstr "" +msgstr "食谱中食物带有ID。并可添加多个食物。" #: .\cookbook\views\api.py:739 msgid "Food IDs, repeat for multiple. Return recipes with any of the foods" -msgstr "" +msgstr "食谱中食物带有ID。并可添加多个食物" #: .\cookbook\views\api.py:741 msgid "Food IDs, repeat for multiple. Return recipes with all of the foods." -msgstr "" +msgstr "食谱中食物带有ID。返回包含任何食物的食谱。" #: .\cookbook\views\api.py:743 msgid "Food IDs, repeat for multiple. Exclude recipes with any of the foods." -msgstr "" +msgstr "食谱中食物带有ID。排除包含任一食物的食谱。" #: .\cookbook\views\api.py:745 msgid "Food IDs, repeat for multiple. Exclude recipes with all of the foods." -msgstr "" +msgstr "食谱中食物带有ID。排除包含所有食物的食谱。" #: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." -msgstr "" +msgstr "食谱应具有单一ID。" #: .\cookbook\views\api.py:748 msgid "" "Rating a recipe should have or greater. [0 - 5] Negative value filters " "rating less than." -msgstr "" +msgstr "配方的评分范围从 0 到 5。" #: .\cookbook\views\api.py:749 msgid "ID of book a recipe should be in. For multiple repeat parameter." -msgstr "" +msgstr "烹饪书应该在食谱中具有ID。并且可以添加多本。" #: .\cookbook\views\api.py:751 msgid "Book IDs, repeat for multiple. Return recipes with any of the books" -msgstr "" +msgstr "书的ID允许多个。返回包含任一书籍的食谱" #: .\cookbook\views\api.py:753 msgid "Book IDs, repeat for multiple. Return recipes with all of the books." -msgstr "" +msgstr "书的ID允许多个。返回包含所有书籍的食谱。" #: .\cookbook\views\api.py:755 msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." -msgstr "" +msgstr "书的ID允许多个。排除包含任一书籍的食谱。" #: .\cookbook\views\api.py:757 msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." -msgstr "" +msgstr "书的ID允许多个。排除包含所有书籍的食谱。" #: .\cookbook\views\api.py:759 msgid "If only internal recipes should be returned. [true/false]" -msgstr "" +msgstr "只返回内部食谱。 [true/false]" #: .\cookbook\views\api.py:761 msgid "Returns the results in randomized order. [true/false]" -msgstr "" +msgstr "按随机排序返回结果。 [true/ false ]" #: .\cookbook\views\api.py:763 msgid "Returns new results first in search results. [true/false]" -msgstr "" +msgstr "在搜索结果中首先返回新结果。 [是/]" #: .\cookbook\views\api.py:765 msgid "" "Filter recipes cooked X times or more. Negative values returns cooked less " "than X times" -msgstr "" +msgstr "筛选烹饪 X 次或更多次的食谱。 负值返回烹饪少于 X 次" #: .\cookbook\views\api.py:767 msgid "" "Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " "or before date." -msgstr "" +msgstr "筛选最后烹饪在 YYYY-MM-DD 当天或之后的食谱。 前置 - 在日期或日期之前筛选。" #: .\cookbook\views\api.py:769 msgid "" "Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " "before date." -msgstr "" +msgstr "筛选在 YYYY-MM-DD 或之后创建的食谱。 前置 - 在日期或日期之前过滤。" #: .\cookbook\views\api.py:771 msgid "" "Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " "before date." -msgstr "" +msgstr "筛选在 YYYY-MM-DD 或之后更新的食谱。 前置 - 在日期或日期之前筛选。" #: .\cookbook\views\api.py:773 msgid "" "Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " "or before date." -msgstr "" +msgstr "筛选最后查看时间是在 YYYY-MM-DD 或之后的食谱。 前置 - 在日期或日期之前筛选。" #: .\cookbook\views\api.py:775 msgid "Filter recipes that can be made with OnHand food. [true/false]" -msgstr "" +msgstr "筛选可以直接用手制作的食谱。 [真/]" #: .\cookbook\views\api.py:937 msgid "" "Returns the shopping list entry with a primary key of id. Multiple values " "allowed." -msgstr "" +msgstr "返回主键为 id 的购物清单条目。 允许多个值。" #: .\cookbook\views\api.py:942 msgid "" "Filter shopping list entries on checked. [true, false, both, recent]" "
- recent includes unchecked items and recently completed items." -msgstr "" +msgstr "在选中时筛选购物清单列表。 [真, 假, 两者都有, 最近]
- 最近包括未选中的项目和最近完成的项目。" #: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." -msgstr "" +msgstr "返回按超市分类排序的购物清单列表。" #: .\cookbook\views\api.py:1140 msgid "Nothing to do." @@ -2544,7 +2562,7 @@ msgstr "无事可做。" #: .\cookbook\views\api.py:1160 msgid "Invalid Url" -msgstr "" +msgstr "无效网址" #: .\cookbook\views\api.py:1167 msgid "Connection Refused." @@ -2552,18 +2570,16 @@ msgstr "连接被拒绝。" #: .\cookbook\views\api.py:1172 msgid "Bad URL Schema." -msgstr "" +msgstr "错误的 URL Schema。" #: .\cookbook\views\api.py:1195 -#, fuzzy -#| msgid "No useable data could be found." msgid "No usable data could be found." msgstr "找不到可用的数据。" #: .\cookbook\views\api.py:1303 .\cookbook\views\data.py:28 #: .\cookbook\views\edit.py:120 .\cookbook\views\new.py:90 msgid "This feature is not yet available in the hosted version of tandoor!" -msgstr "" +msgstr "此功能在泥炉的托管版本中尚不可用!" #: .\cookbook\views\api.py:1325 msgid "Sync successful!" @@ -2591,7 +2607,7 @@ msgstr "存储后端" #: .\cookbook\views\delete.py:132 msgid "" "Could not delete this storage backend as it is used in at least one monitor." -msgstr "" +msgstr "无法删除此存储后端,因为它至少在一台显示器中使用。" #: .\cookbook\views\delete.py:155 msgid "Recipe Book" @@ -2606,8 +2622,6 @@ msgid "Invite Link" msgstr "邀请链接" #: .\cookbook\views\delete.py:200 -#, fuzzy -#| msgid "Members" msgid "Space Membership" msgstr "成员" @@ -2616,9 +2630,8 @@ msgid "You cannot edit this storage!" msgstr "你不能编辑此存储空间!" #: .\cookbook\views\edit.py:140 -#, fuzzy msgid "Storage saved!" -msgstr "存储已存储!" +msgstr "存储已保存!" #: .\cookbook\views\edit.py:146 msgid "There was an error updating this storage backend!" @@ -2667,10 +2680,8 @@ msgid "Shopping Categories" msgstr "购物类别" #: .\cookbook\views\lists.py:187 -#, fuzzy -#| msgid "Filter" msgid "Custom Filters" -msgstr "筛选" +msgstr "自定义筛选" #: .\cookbook\views\lists.py:224 msgid "Steps" @@ -2688,11 +2699,11 @@ msgstr "导入此菜谱时出错!" msgid "" "You have successfully created your own recipe space. Start by adding some " "recipes or invite other people to join you." -msgstr "" +msgstr "你已成功创建自己的菜谱空间。 首先添加一些菜谱或邀请其他人加入。" #: .\cookbook\views\views.py:178 msgid "You do not have the required permissions to perform this action!" -msgstr "" +msgstr "您没有执行此操作所需的权限!" #: .\cookbook\views\views.py:189 msgid "Comment saved!" From 3d95657b8a3b24c15b10a6be9f44ed323580a01a Mon Sep 17 00:00:00 2001 From: Kirstin Seidel-Gebert Date: Sun, 21 Aug 2022 16:58:53 +0000 Subject: [PATCH 74/76] Translated using Weblate (German) Currently translated at 99.7% (459 of 460 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/ --- vue/src/locales/de.json | 46 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/de.json b/vue/src/locales/de.json index e397f094..4ac3ac4c 100644 --- a/vue/src/locales/de.json +++ b/vue/src/locales/de.json @@ -415,5 +415,49 @@ "Invites": "Einladungen", "Message": "Nachricht", "Bookmarklet": "Lesezeichen", - "substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen." + "substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen.", + "substitute_children": "Ersatzkinder", + "Decimals": "Nachkommastellen", + "Default_Unit": "Standardeinheit", + "Use_Fractions": "Bruchschreibweise verwenden", + "Use_Fractions_Help": "Nachkommastellen automatisch in Bruchschreibweise konvertieren, wenn ein Rezept angeschaut wird.", + "Language": "Sprache", + "Theme": "Thema", + "Hour": "Stunde", + "Day": "Tag", + "Days": "Tage", + "Second": "Sekunde", + "Seconds": "Sekunden", + "API": "API", + "Nav_Color": "Farbe der Navigationsleiste", + "Nav_Color_Help": "Farbe der Navigationsleiste ändern.", + "Use_Kj": "kJ anstelle von kcal verwenden", + "Manage_Emails": "E-Mails verwalten", + "Social_Authentication": "Authentifizierung über ein soziales Netzwerk", + "Disabled": "Deaktiviert", + "Disable": "Deaktivieren", + "substitute_siblings": "Ersatzgeschwister", + "Private_Recipe": "Privates Rezept", + "Private_Recipe_Help": "Dieses Rezept ist nur für dich und Personen mit denen du es geteilt hast sichtbar.", + "reusable_help_text": "Soll der Einladungslink für mehr als eine Person nutzbar sein.", + "ChildInheritFields": "Kindelemente erben Felder", + "reset_food_inheritance_info": "Alle Lebensmittel auf ihre standardmäßig vererbten Felder und die Werte ihres Elternelementes zurücksetzen.", + "ChildInheritFields_help": "Kindelemente erben diese Felder standardmäßig.", + "Ingredient Overview": "Zutatenübersicht", + "Change_Password": "Kennwort ändern", + "Valid Until": "Gültig bis", + "plan_share_desc": "Neue Einträge im Essensplan werden automatisch mit den ausgewählten Benutzern geteilt.", + "Hours": "Stunden", + "Account": "Konto", + "Username": "Benutzerkennung", + "InheritFields_help": "Die Werte dieser Felder werden vom Elternelement vererbt (Ausnahme: Leere Einkaufskategorien werden nicht vererbt)", + "show_ingredient_overview": "Zeige eine Liste aller Zutaten am Anfang des Rezeptes.", + "Cosmetic": "Kosmetisch", + "Sticky_Nav": "Navigationsleiste immer sichtbar (sticky navigation)", + "Sticky_Nav_Help": "Navigationsleiste immer im Seitenkopf anzeigen.", + "First_name": "Vorname", + "Last_name": "Nachname", + "Comments_setting": "Kommentare anzeigen", + "reset_food_inheritance": "Vererbung zurücksetzen", + "food_inherit_info": "Datenfelder des Lebensmittels, die standardmäßig vererbt werden sollen." } From 0ab430ea82bac4c2c60100aac6c123274c4dd37a Mon Sep 17 00:00:00 2001 From: Mike Miller Date: Sun, 21 Aug 2022 17:12:09 +0000 Subject: [PATCH 75/76] Translated using Weblate (German) Currently translated at 99.7% (459 of 460 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/de/ --- vue/src/locales/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vue/src/locales/de.json b/vue/src/locales/de.json index 4ac3ac4c..b5f4d5d0 100644 --- a/vue/src/locales/de.json +++ b/vue/src/locales/de.json @@ -459,5 +459,6 @@ "Last_name": "Nachname", "Comments_setting": "Kommentare anzeigen", "reset_food_inheritance": "Vererbung zurücksetzen", - "food_inherit_info": "Datenfelder des Lebensmittels, die standardmäßig vererbt werden sollen." + "food_inherit_info": "Datenfelder des Lebensmittels, die standardmäßig vererbt werden sollen.", + "Are_You_Sure": "Bist du dir sicher?" } From e6f79a6fa373eda1ed846b3b916a37e6b85d4d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=A5=AA?= Date: Mon, 22 Aug 2022 13:13:34 +0000 Subject: [PATCH 76/76] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (460 of 460 strings) Translation: Tandoor/Recipes Frontend Translate-URL: http://translate.tandoor.dev/projects/tandoor/recipes-frontend/zh_Hans/ --- vue/src/locales/zh_Hans.json | 126 ++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 60 deletions(-) diff --git a/vue/src/locales/zh_Hans.json b/vue/src/locales/zh_Hans.json index e33625a2..5a57b5b8 100644 --- a/vue/src/locales/zh_Hans.json +++ b/vue/src/locales/zh_Hans.json @@ -9,23 +9,23 @@ "success_deleting_resource": "已成功删除资源!", "import_running": "正在导入,请稍候!", "all_fields_optional": "所有字段都是可选的,可以留空。", - "convert_internal": "转换为内部菜谱", - "show_only_internal": "仅显示内部菜谱", - "Log_Recipe_Cooking": "菜谱烹饪记录", - "External_Recipe_Image": "外部菜谱图像", + "convert_internal": "转换为内部食谱", + "show_only_internal": "仅显示内部食谱", + "Log_Recipe_Cooking": "食谱烹饪记录", + "External_Recipe_Image": "外部食谱图像", "Add_to_Shopping": "添加到购物", "Add_to_Plan": "添加到计划", "Step_start_time": "步骤开始时间", "Sort_by_new": "按新旧排序", - "Recipes_per_page": "每页菜谱数量", + "Recipes_per_page": "每页食谱数量", "Manage_Books": "管理书籍", "Meal_Plan": "用餐计划", "Select_Book": "选择书籍", - "Recipe_Image": "菜谱图像", + "Recipe_Image": "食谱图像", "Import_finished": "导入完成", - "View_Recipes": "查看菜谱", + "View_Recipes": "查看食谱", "Log_Cooking": "烹饪记录", - "New_Recipe": "新菜谱", + "New_Recipe": "新食谱", "Url_Import": "导入网址", "Reset_Search": "重置搜索", "Recently_Viewed": "最近浏览", @@ -49,7 +49,7 @@ "New": "新", "Success": "成功", "Failure": "失败", - "Ingredients": "材料", + "Ingredients": "食材", "Supermarket": "超市", "Categories": "分类", "Category": "分类", @@ -86,16 +86,16 @@ "Merge_Keyword": "合并关键词", "Hide_Keywords": "隐藏关键词", "Image": "图片", - "Recipes": "菜谱", + "Recipes": "食谱", "Move": "移动", "Merge": "合并", "confirm_delete": "您确定要删除 {object} 吗?", "Save_and_View": "保存并查看", - "Edit_Recipe": "编辑菜谱", + "Edit_Recipe": "编辑食谱", "Move_Up": "上移", "show_split_screen": "拆分视图", "Move_Keyword": "移动关键词", - "Hide_Recipes": "隐藏菜谱", + "Hide_Recipes": "隐藏食谱", "Move_Down": "下移", "Step_Name": "步骤名", "Step_Type": "步骤类型", @@ -119,8 +119,8 @@ "Create_New_Unit": "添加新的单位", "Create_New_Food": "添加新的食物", "warning_feature_beta": "此功能目前处于测试状态。在使用此功能时,请做好将来会出现错误和破坏性更改(可能会丢失与功能相关的数据)的准备。", - "Add_nutrition_recipe": "将营养信息添加到菜谱中", - "Remove_nutrition_recipe": "从菜谱中删除营养信息", + "Add_nutrition_recipe": "将营养信息添加到食谱中", + "Remove_nutrition_recipe": "从食谱中删除营养信息", "Keyword_Alias": "关键词别名", "Create_New_Meal_Type": "添加新的用餐类型", "Time": "时间", @@ -134,7 +134,7 @@ "Create_New_Keyword": "添加新的关键词", "Added_by": "添加者", "Shopping_list": "采购单", - "Recipe": "菜谱", + "Recipe": "食谱", "file_upload_disabled": "你的空间未启用文件上传。", "delete_title": "删除 {type}", "tree_root": "树根", @@ -160,7 +160,7 @@ "No_ID": "未找到标识,不能删除。", "Meal_Plan_Days": "未来的用餐计划", "Food": "食物", - "Recipe_Book": "菜谱书", + "Recipe_Book": "食谱书", "Icon": "图标", "Create_New_Shopping Category": "创建新的购物类别", "Automate": "自动化", @@ -186,14 +186,14 @@ "Starting_Day": "一周中的第一天", "Meal_Types": "用餐类型", "Make_Header": "显示注意事项", - "Make_Ingredient": "显示材料", + "Make_Ingredient": "制作食材", "Color": "颜色", "New_Meal_Type": "新用餐类型", "Pin": "固定", "Planner_Settings": "计划者设置", "Meal_Type": "用餐类型", "Clone": "复制", - "Title_or_Recipe_Required": "需要选择标题或菜谱", + "Title_or_Recipe_Required": "需要标题或食谱选择", "Export_As_ICal": "将当前周期导出为 iCal 格式", "Week_Numbers": "周数", "Show_Week_Numbers": "显示周数?", @@ -214,7 +214,7 @@ "Note": "笔记", "Added_on": "添加到", "AddToShopping": "添加到购物清单", - "IngredientInShopping": "此材料已在购物清单。", + "IngredientInShopping": "此食材已在购物清单中。", "OnHand": "目前", "FoodOnHand": "你手上有 {food}。", "FoodNotOnHand": "你还没有 {food}。", @@ -246,11 +246,11 @@ "shopping_share": "分享购物清单", "shopping_auto_sync": "自动同步", "mealplan_autoadd_shopping": "自动添加用餐计划", - "mealplan_autoinclude_related": "添加相关的菜谱", + "mealplan_autoinclude_related": "添加相关的食谱", "default_delay": "默认延迟时间", - "mealplan_autoadd_shopping_desc": "自动将用餐计划配料添加到购物清单中。", - "mealplan_autoexclude_onhand_desc": "将用餐计划添加到购物清单时(手动或自动),排除当前手头上的配料。", - "mealplan_autoinclude_related_desc": "将用餐计划(手动或自动)添加到购物清单时,包括所有相关菜谱。", + "mealplan_autoadd_shopping_desc": "自动将膳食计划食材添加到购物清单中。", + "mealplan_autoexclude_onhand_desc": "将膳食计划添加到购物清单时(手动或自动),排除当前手头上的食材。", + "mealplan_autoinclude_related_desc": "将膳食计划(手动或自动)添加到购物清单时,包括所有相关食谱。", "default_delay_desc": "延迟购物清单条目的默认小时数。", "err_move_self": "无法将项目移动到自身", "nothing": "无事可做", @@ -273,11 +273,11 @@ "QuickEntry": "快速入口", "shopping_add_onhand_desc": "在核对购物清单时,将食物标记为“入手”。", "shopping_add_onhand": "自动入手", - "related_recipes": "相关的菜谱", - "today_recipes": "今日菜谱", + "related_recipes": "相关的食谱", + "today_recipes": "今日食谱", "sql_debug": "调试 SQL", "OnHand_help": "食物在库存中时,不会自动添加到购物清单中。 并且现有状态会与购物用户共享。", - "view_recipe": "查看菜谱", + "view_recipe": "查看食谱", "date_created": "创建日期", "show_sortby": "显示排序方式", "shared_with": "一起分享", @@ -285,8 +285,8 @@ "sort_by": "排序方式", "err_deleting_protected_resource": "您尝试删除的对象正在使用中,无法删除。", "Show_as_header": "显示标题", - "Ingredient Editor": "材料编辑器", - "Protected": "受保护", + "Ingredient Editor": "食材编辑器", + "Protected": "受保护的", "merge_selection": "将所有出现的 {source} 替换为 {type}。", "New_Entry": "新条目", "Language": "语言", @@ -297,7 +297,7 @@ "Seconds": "秒", "and_down": "& Down", "ignore_shopping_help": "请不要将食物添加到购物列表中(例如水)", - "Use_Fractions_Help": "查看菜谱时自动将小数转换为分数。", + "Use_Fractions_Help": "查看食谱时自动将小数转换为分数。", "Foods": "食物", "Use_Fractions": "使用分数", "simple_mode": "简单模式", @@ -311,7 +311,7 @@ "CountMore": "...+{count} 更多", "one_url_per_line": "每行一个 URL", "plan_share_desc": "新的膳食计划条目将自动与选定的用户共享。", - "paste_json": "在此处粘贴 json 或 html 源代码以加载菜谱。", + "paste_json": "在此处粘贴 json 或 html 源代码以加载食谱。", "Hour": "小数", "Hours": "小时", "Day": "天", @@ -321,7 +321,7 @@ "Clear": "清除", "Users": "用户", "Invites": "邀请", - "warning_duplicate_filter": "警告:由于技术限制,使用相同组合(和/或/不)的多个过滤器可能会产生意想不到的结果。", + "warning_duplicate_filter": "警告:由于技术限制,使用相同组合(和/或/不)的多个筛选器可能会产生意想不到的结果。", "Account": "账户", "Cosmetic": "化妆品", "API": "API", @@ -333,33 +333,33 @@ "show_foods": "显示食物", "show_books": "显示书籍", "show_units": "显示单位", - "show_filters": "显示过滤器", - "filter_name": "过滤器名称", - "food_recipe_help": "在此处链接菜谱可以在使用此食物的任何菜谱中包含此菜谱的链接", + "show_filters": "显示筛选器", + "filter_name": "筛选器名称", + "food_recipe_help": "在此处链接食谱可以在使用此食物的任何食谱中包含此食谱的链接", "date_viewed": "最后查看", - "paste_ingredients_placeholder": "在此处粘贴成分表...", + "paste_ingredients_placeholder": "在此处粘贴食材表...", "Bookmarklet": "书签", "Sticky_Nav_Help": "始终在屏幕顶部显示导航菜单。", "Nav_Color": "导航栏颜色", "Comments_setting": "显示评论", "no_more_images_found": "没有在网站上找到其他图片。", "Click_To_Edit": "点击编辑", - "search_no_recipes": "找不到任何菜谱!", - "search_import_help_text": "从外部网站或应用程序导入菜谱。", - "search_create_help_text": "直接在 Tandoor 中创建新菜谱。", + "search_no_recipes": "找不到任何食谱!", + "search_import_help_text": "从外部网站或应用程序导入食谱。", + "search_create_help_text": "直接在泥炉中创建新食谱。", "reset_children": "重置子继承", "reset_food_inheritance": "重置继承", "reset_food_inheritance_info": "将所有食物重置为默认继承字段及其父值。", "select_food": "选择食物", "Sticky_Nav": "粘性导航", "Use_Kj": "使用千焦代替千卡", - "import_duplicates": "为防止配方与现有配方同名,将被忽略。 选中此框以导入所有内容。", + "import_duplicates": "为防止食谱与现有食谱同名,将被忽略。 选中此框以导入所有内容。", "ChildInheritFields_help": "默认情况下,子项将继承这些字段。", "InheritFields_help": "这些字段的值将从父级继承(例外:不会继承空的购物类别)", "Planned": "计划", "Manage_Emails": "管理电子邮件", "Change_Password": "更改密码", - "select_recipe": "选择菜谱", + "select_recipe": "选择食谱", "select_unit": "选择单位", "remove_selection": "取消选择", "empty_list": "列表为空。", @@ -373,7 +373,7 @@ "Social_Authentication": "社交认证", "show_rating": "显示评分", "Last_name": "姓", - "Keyword": "关键字", + "Keyword": "关键词", "Reset": "重置", "Disabled": "禁用", "Disable": "禁用", @@ -383,14 +383,14 @@ "Importer_Help": "有关此进口商的更多信息和帮助:", "created_on": "创建于", "Create Food": "创建食物", - "create_food_desc": "创建食物并将其链接到此菜谱。", + "create_food_desc": "创建食物并将其链接到此食谱。", "additional_options": "附加选项", "Documentation": "文档", "Select_App_To_Import": "请选择一个要导入的应用", "Import_Error": "导入时发生错误。 请跳转至页面底部的详细信息进行查看。", "Import_Not_Yet_Supported": "导入尚未支持", "Export_Not_Yet_Supported": "导入尚未支持", - "Recipes_In_Import": "从文件中导入菜谱", + "Recipes_In_Import": "从文件中导入食谱", "New_Supermarket_Category": "新建超市类别", "Are_You_Sure": "你确定吗?", "Import_Result_Info": "导入 {imported} 个,共 {total} 个食谱已导入", @@ -399,53 +399,53 @@ "move_selection": "选择要将 {source} 移动到的父级 {type}。", "and_up": "& Up", "last_cooked": "最后烹饪", - "click_image_import": "单击此处为配方导入图像", - "substitute_help": "搜索可以用现有原料制作的菜谱时,会考虑替代品。", + "click_image_import": "单击此处为食谱导入图像", + "substitute_help": "搜索可以用现有食材制作的食谱时,会考虑替代品。", "substitute_siblings_help": "所有与这种食物相同父级的食物都被视作替代品。", - "Private_Recipe": "私人菜谱", - "Private_Recipe_Help": "菜谱只有你和共享的人会显示。", + "Private_Recipe": "私人食谱", + "Private_Recipe_Help": "食谱只有你和共享的人会显示。", "reusable_help_text": "邀请链接是否可用于多个用户。", "Copy Link": "复制链接", "Copy Token": "复制令牌", "Create_New_Shopping_Category": "添加新的购物类别", "merge_confirmation": "将 {source} 替换为 {target}", - "save_filter": "保存过滤器", + "save_filter": "保存筛选器", "not": "不", "Warning_Delete_Supermarket_Category": "删除超市类别也会删除与食品的所有关系。 你确定吗?", "New_Supermarket": "创建新超市", "warning_space_delete": "您可以删除您的空间,包括所有食谱、购物清单、膳食计划以及您创建的任何其他内容。 这不能被撤消! 你确定要这么做吗 ?", - "facet_count_info": "在搜索过滤器上显示食谱总数。", + "facet_count_info": "在搜索筛选器上显示食谱计数。", "Hide_as_header": "隐藏标题", "food_inherit_info": "默认情况下应继承的食物上的字段。", - "Custom Filter": "自定义过滤器", + "Custom Filter": "自定义筛选器", "search_rank": "搜索排行", "make_now": "立即制作", - "recipe_filter": "菜谱过滤器", - "copy_to_new": "复制到新菜谱", - "recipe_name": "菜谱名字", - "ingredient_list": "成分列表", + "recipe_filter": "食谱筛选器", + "copy_to_new": "复制到新食谱", + "recipe_name": "食谱名字", + "ingredient_list": "食材列表", "filter": "筛选", "Website": "网站", "App": "应用", "Message": "信息", - "paste_ingredients": "糊状材料", + "paste_ingredients": "糊状食材", "explain": "解释", "Supermarkets": "超市", "User": "用户", "Advanced": "高级", - "Ingredient Overview": "成分概述", + "Ingredient Overview": "食材概述", "last_viewed": "最后查看", "updatedon": "更新时间", "advanced_search_settings": "高级搜索设置", "nothing_planned_today": "你今天没有任何计划!", - "no_pinned_recipes": "你没有固定的菜谱!", + "no_pinned_recipes": "你没有固定的食谱!", "Units": "单位", - "Random Recipes": "随机菜谱", + "Random Recipes": "随机食谱", "parameter_count": "参数 {count}", "select_keyword": "选择关键字", "add_keyword": "添加关键字", "select_file": "选择文件", - "show_ingredient_overview": "在开始时显示菜谱中所有材料的列表。", + "show_ingredient_overview": "在开始时显示食谱中所有食材的列表。", "Imported_From": "导入", "Pinned": "固定", "Imported": "导入", @@ -453,5 +453,11 @@ "Ratings": "等级", "Page": "页", "Single": "单个", - "Multiple": "多个" + "Multiple": "多个", + "shopping_category_help": "超市可以按购物分类进行筛选使其与商店的内部布局相匹配。", + "times_cooked": "烹饪时间", + "reset_children_help": "用继承字段中的值覆盖所有子项。 继承的子字段将设置为继承,除非它们已设置为继承。", + "substitute_siblings": "代替品", + "book_filter_help": "除手动选择的食谱外,还包括筛选中的食谱。", + "Internal": "内部" }