diff --git a/.env.template b/.env.template index 9b09e8a3..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= @@ -77,6 +81,7 @@ GUNICORN_MEDIA=0 # S3_QUERYSTRING_AUTH=1 # default true, set to 0 to serve media from a public bucket without signed urls # S3_QUERYSTRING_EXPIRE=3600 # number of seconds querystring are valid for # S3_ENDPOINT_URL= # when using a custom endpoint like minio +# S3_CUSTOM_DOMAIN= # when using a CDN/proxy to S3 (see https://github.com/TandoorRecipes/recipes/issues/1943) # Email Settings, see https://docs.djangoproject.com/en/3.2/ref/settings/#email-host # Required for email confirmation and password reset (automatically activates if host is set) diff --git a/boot.sh b/boot.sh index e4fa160e..be117d7a 100644 --- a/boot.sh +++ b/boot.sh @@ -2,6 +2,8 @@ source venv/bin/activate TANDOOR_PORT="${TANDOOR_PORT:-8080}" +GUNICORN_WORKERS="${GUNICORN_WORKERS}" +GUNICORN_THREADS="${GUNICORN_THREADS}" 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 diff --git a/cookbook/admin.py b/cookbook/admin.py index 0e903999..4b0d1acd 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,15 +46,23 @@ 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_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 def name(obj): - return obj.user.get_user_name() + return obj.user.get_user_display_name() admin.site.register(UserPreference, UserPreferenceAdmin) @@ -67,7 +75,7 @@ class SearchPreferenceAdmin(admin.ModelAdmin): @staticmethod def name(obj): - return obj.user.get_user_name() + return obj.user.get_user_display_name() admin.site.register(SearchPreference, SearchPreferenceAdmin) @@ -169,7 +177,7 @@ class RecipeAdmin(admin.ModelAdmin): @staticmethod def created_by(obj): - return obj.created_by.get_user_name() + return obj.created_by.get_user_display_name() if settings.DATABASES['default']['ENGINE'] in ['django.db.backends.postgresql_psycopg2', 'django.db.backends.postgresql']: actions = [rebuild_index] @@ -208,7 +216,7 @@ class CommentAdmin(admin.ModelAdmin): @staticmethod def name(obj): - return obj.created_by.get_user_name() + return obj.created_by.get_user_display_name() admin.site.register(Comment, CommentAdmin) @@ -227,7 +235,7 @@ class RecipeBookAdmin(admin.ModelAdmin): @staticmethod def user_name(obj): - return obj.created_by.get_user_name() + return obj.created_by.get_user_display_name() admin.site.register(RecipeBook, RecipeBookAdmin) @@ -245,7 +253,7 @@ class MealPlanAdmin(admin.ModelAdmin): @staticmethod def user(obj): - return obj.created_by.get_user_name() + return obj.created_by.get_user_display_name() admin.site.register(MealPlan, MealPlanAdmin) 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/AllAuthCustomAdapter.py b/cookbook/helper/AllAuthCustomAdapter.py index a78f6072..4975251a 100644 --- a/cookbook/helper/AllAuthCustomAdapter.py +++ b/cookbook/helper/AllAuthCustomAdapter.py @@ -14,7 +14,7 @@ class AllAuthCustomAdapter(DefaultAccountAdapter): def is_open_for_signup(self, request): """ - Whether to allow sign ups. + Whether to allow sign-ups. """ signup_token = False if 'signup_token' in request.session and InviteLink.objects.filter(valid_until__gte=datetime.datetime.today(), used_by=None, uuid=request.session['signup_token']).exists(): @@ -31,7 +31,10 @@ class AllAuthCustomAdapter(DefaultAccountAdapter): default = datetime.datetime.now() c = caches['default'].get_or_set(email, default, timeout=360) if c == default: - super(AllAuthCustomAdapter, self).send_mail(template_prefix, email, context) + try: + super(AllAuthCustomAdapter, self).send_mail(template_prefix, email, context) + except Exception: # dont fail signup just because confirmation mail could not be send + pass else: messages.add_message(self.request, messages.ERROR, _('In order to prevent spam, the requested email was not send. Please wait a few minutes and try again.')) else: diff --git a/cookbook/helper/context_processors.py b/cookbook/helper/context_processors.py index 449ccbf5..30e704c1 100644 --- a/cookbook/helper/context_processors.py +++ b/cookbook/helper/context_processors.py @@ -10,4 +10,5 @@ def context_settings(request): 'TERMS_URL': settings.TERMS_URL, 'PRIVACY_URL': settings.PRIVACY_URL, 'IMPRINT_URL': settings.IMPRINT_URL, + 'SHOPPING_MIN_AUTOSYNC_INTERVAL': settings.SHOPPING_MIN_AUTOSYNC_INTERVAL, } diff --git a/cookbook/helper/permission_helper.py b/cookbook/helper/permission_helper.py index 1837f1a2..82464b11 100644 --- a/cookbook/helper/permission_helper.py +++ b/cookbook/helper/permission_helper.py @@ -6,10 +6,12 @@ from django.core.exceptions import ValidationError, ObjectDoesNotExist from django.http import HttpResponseRedirect from django.urls import reverse, reverse_lazy from django.utils.translation import gettext as _ +from oauth2_provider.contrib.rest_framework import TokenHasScope, TokenHasReadWriteScope +from oauth2_provider.models import AccessToken from rest_framework import permissions from rest_framework.permissions import SAFE_METHODS -from cookbook.models import ShareLink, Recipe, UserPreference, UserSpace +from cookbook.models import ShareLink, Recipe, UserSpace def get_allowed_groups(groups_required): @@ -299,6 +301,73 @@ class CustomIsShare(permissions.BasePermission): return False +class CustomRecipePermission(permissions.BasePermission): + """ + Custom permission class for recipe api endpoint + """ + message = _('You do not have the required permissions to view this page!') + + def has_permission(self, request, view): # user is either at least a guest or a share link is given and the request is safe + share = request.query_params.get('share', None) + return has_group_permission(request.user, ['guest']) or (share and request.method in SAFE_METHODS and 'pk' in view.kwargs) + + def has_object_permission(self, request, view, obj): + share = request.query_params.get('share', None) + if share: + return share_link_valid(obj, share) + else: + if obj.private: + return ((obj.created_by == request.user) or (request.user in obj.shared.all())) and obj.space == request.space + else: + return has_group_permission(request.user, ['guest']) and obj.space == request.space + + +class CustomUserPermission(permissions.BasePermission): + """ + Custom permission class for user api endpoint + """ + message = _('You do not have the required permissions to view this page!') + + def has_permission(self, request, view): # a space filtered user list is visible for everyone + return has_group_permission(request.user, ['guest']) + + def has_object_permission(self, request, view, obj): # object write permissions are only available for user + if request.method in SAFE_METHODS and 'pk' in view.kwargs and has_group_permission(request.user, ['guest']) and request.space in obj.userspace_set.all(): + return True + elif request.user == obj: + return True + else: + return False + + +class CustomTokenHasScope(TokenHasScope): + """ + Custom implementation of Django OAuth Toolkit TokenHasScope class + Only difference: if any other authentication method except OAuth2Authentication is used the scope check is ignored + IMPORTANT: do not use this class without any other permission class as it will not check anything besides token scopes + """ + + def has_permission(self, request, view): + if type(request.auth) == AccessToken: + return super().has_permission(request, view) + else: + return request.user.is_authenticated + + +class CustomTokenHasReadWriteScope(TokenHasReadWriteScope): + """ + Custom implementation of Django OAuth Toolkit TokenHasReadWriteScope class + Only difference: if any other authentication method except OAuth2Authentication is used the scope check is ignored + IMPORTANT: do not use this class without any other permission class as it will not check anything besides token scopes + """ + + def has_permission(self, request, view): + if type(request.auth) == AccessToken: + return super().has_permission(request, view) + else: + return True + + def above_space_limit(space): # TODO add file storage limit """ Test if the space has reached any limit (e.g. max recipes, users, ..) diff --git a/cookbook/helper/recipe_html_import.py b/cookbook/helper/recipe_html_import.py index 1b5d37ad..95f115b7 100644 --- a/cookbook/helper/recipe_html_import.py +++ b/cookbook/helper/recipe_html_import.py @@ -1,189 +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: - 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 url and not text: +# try: +# scrape = scrape_me(url_path=url, wild_mode=True) +# except(NoSchemaFoundInWildMode): +# pass - 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) +# 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) - recipe_json = helper.get_from_scraper(scrape, request) +# 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) - for el in parse_list: - temp_tree = [] - if isinstance(el, Tag): - try: - el = json.loads(el.string) - except TypeError: - continue +# recipe_json = helper.get_from_scraper(scrape, request) - 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) +# # 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 - if '@type' in el and el['@type'] == 'Recipe': - recipe_tree += [{'name': 'ld+json', 'children': temp_tree}] - else: - recipe_tree += [{'name': 'json', 'children': temp_tree}] +# 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) - return recipe_json, recipe_tree, html_data, images +# 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 -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_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/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/scope_middleware.py b/cookbook/helper/scope_middleware.py index c3700e03..a0218f08 100644 --- a/cookbook/helper/scope_middleware.py +++ b/cookbook/helper/scope_middleware.py @@ -1,5 +1,6 @@ from django.urls import reverse from django_scopes import scope, scopes_disabled +from oauth2_provider.contrib.rest_framework import OAuth2Authentication from rest_framework.authentication import TokenAuthentication from rest_framework.authtoken.models import Token from rest_framework.exceptions import AuthenticationFailed @@ -55,7 +56,7 @@ class ScopeMiddleware: else: if request.path.startswith(prefix + '/api/'): try: - if auth := TokenAuthentication().authenticate(request): + if auth := OAuth2Authentication().authenticate(request): user_space = auth[0].userspace_set.filter(active=True).first() if user_space: request.space = user_space.space diff --git a/cookbook/helper/scrapers/scrapers.py b/cookbook/helper/scrapers/scrapers.py index eb93cc2c..7d6c08b1 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,22 +16,28 @@ 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__( 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..c35de64f 100644 --- a/cookbook/integration/cookbookapp.py +++ b/cookbook/integration/cookbookapp.py @@ -10,8 +10,9 @@ 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_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 @@ -24,7 +25,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=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(), @@ -42,7 +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'] @@ -51,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: diff --git a/cookbook/integration/copymethat.py b/cookbook/integration/copymethat.py index 7a2a532f..421c967d 100644 --- a/cookbook/integration/copymethat.py +++ b/cookbook/integration/copymethat.py @@ -2,11 +2,10 @@ import re from io import BytesIO from zipfile import ZipFile -from bs4 import BeautifulSoup - +from bs4 import BeautifulSoup, Tag 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 @@ -22,18 +21,21 @@ class CopyMeThat(Integration): def get_recipe_from_file(self, file): # 'file' comes is as a beautifulsoup object - recipe = Recipe.objects.create(name=file.find("div", {"id": "name"}).text.strip(), created_by=self.request.user, internal=True, space=self.request.space, ) + try: + source = file.find("a", {"id": "original_link"}).text + except AttributeError: + source = None + + recipe = Recipe.objects.create(name=file.find("div", {"id": "name"}).text.strip()[:128], source_url=source, created_by=self.request.user, internal=True, space=self.request.space, ) for category in file.find_all("span", {"class": "recipeCategory"}): keyword, created = Keyword.objects.get_or_create(name=category.text, space=self.request.space) recipe.keywords.add(keyword) - + try: recipe.servings = parse_servings(file.find("a", {"id": "recipeYield"}).text.strip()) recipe.working_time = iso_duration_to_minutes(file.find("span", {"meta": "prepTime"}).text.strip()) recipe.waiting_time = iso_duration_to_minutes(file.find("span", {"meta": "cookTime"}).text.strip()) - recipe.description = (file.find("div ", {"id": "description"}).text.strip())[:512] - except AttributeError: pass @@ -43,36 +45,65 @@ class CopyMeThat(Integration): except AttributeError: pass - step = Step.objects.create(instruction='', space=self.request.space, ) - - ingredient_parser = IngredientParser(self.request, True) - for ingredient in file.find_all("li", {"class": "recipeIngredient"}): - if ingredient.text == "": - continue - amount, unit, food, note = ingredient_parser.parse(ingredient.text.strip()) - f = ingredient_parser.get_food(food) - u = ingredient_parser.get_unit(unit) - step.ingredients.add(Ingredient.objects.create( - food=f, unit=u, amount=amount, note=note, original_text=ingredient.text.strip(), space=self.request.space, - )) - - for s in file.find_all("li", {"class": "instruction"}): - if s.text == "": - continue - step.instruction += s.text.strip() + ' \n\n' - - for s in file.find_all("li", {"class": "recipeNote"}): - if s.text == "": - continue - step.instruction += s.text.strip() + ' \n\n' - try: - if file.find("a", {"id": "original_link"}).text != '': - step.instruction += "\n\n" + _("Imported from") + ": " + file.find("a", {"id": "original_link"}).text - step.save() + if len(file.find("span", {"id": "made_this"}).text.strip()) > 0: + recipe.keywords.add(Keyword.objects.get_or_create(space=self.request.space, name=_('I made this'))[0]) except AttributeError: pass + step = Step.objects.create(instruction='', space=self.request.space, ) + + ingredient_parser = IngredientParser(self.request, True) + + ingredients = file.find("ul", {"id": "recipeIngredients"}) + if isinstance(ingredients, Tag): + for ingredient in ingredients.children: + if not isinstance(ingredient, Tag) or not ingredient.text.strip() or "recipeIngredient_spacer" in ingredient['class']: + continue + if any(x in ingredient['class'] for x in ["recipeIngredient_subheader", "recipeIngredient_note"]): + step.ingredients.add(Ingredient.objects.create(is_header=True, note=ingredient.text.strip()[:256], original_text=ingredient.text.strip(), space=self.request.space, )) + else: + amount, unit, food, note = ingredient_parser.parse(ingredient.text.strip()) + f = ingredient_parser.get_food(food) + u = ingredient_parser.get_unit(unit) + step.ingredients.add(Ingredient.objects.create(food=f, unit=u, amount=amount, note=note, original_text=ingredient.text.strip(), space=self.request.space, )) + + instructions = file.find("ol", {"id": "recipeInstructions"}) + if isinstance(instructions, Tag): + for instruction in instructions.children: + if not isinstance(instruction, Tag) or instruction.text == "": + continue + if "instruction_subheader" in instruction['class']: + if step.instruction: + step.save() + recipe.steps.add(step) + step = Step.objects.create(instruction='', space=self.request.space, ) + + step.name = instruction.text.strip()[:128] + else: + step.instruction += instruction.text.strip() + ' \n\n' + + notes = file.find_all("li", {"class": "recipeNote"}) + if notes: + step.instruction += '*Notes:* \n\n' + + for n in notes: + if n.text == "": + continue + step.instruction += '*' + n.text.strip() + '* \n\n' + + description = '' + try: + description = file.find("div", {"id": "description"}).text.strip() + except AttributeError: + pass + if len(description) <= 512: + recipe.description = description + else: + recipe.description = description[:480] + ' ... (full description below)' + step.instruction += '*Description:* \n\n*' + description + '* \n\n' + + step.save() recipe.steps.add(step) # import the Primary recipe image that is stored in the Zip diff --git a/cookbook/integration/integration.py b/cookbook/integration/integration.py index c3dc9dfb..b54e7e56 100644 --- a/cookbook/integration/integration.py +++ b/cookbook/integration/integration.py @@ -43,7 +43,7 @@ class Integration: self.export_type = export_type self.ignored_recipes = [] - description = f'Imported by {request.user.get_user_name()} at {date_format(datetime.datetime.now(), "DATETIME_FORMAT")}. Type: {export_type}' + description = f'Imported by {request.user.get_user_display_name()} at {date_format(datetime.datetime.now(), "DATETIME_FORMAT")}. Type: {export_type}' icon = '📥' try: @@ -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))) diff --git a/cookbook/locale/ar/LC_MESSAGES/django.mo b/cookbook/locale/ar/LC_MESSAGES/django.mo new file mode 100644 index 00000000..0da836d5 Binary files /dev/null and b/cookbook/locale/ar/LC_MESSAGES/django.mo differ diff --git a/cookbook/locale/ca/LC_MESSAGES/django.po b/cookbook/locale/ca/LC_MESSAGES/django.po index 8e5a719e..a209f581 100644 --- a/cookbook/locale/ca/LC_MESSAGES/django.po +++ b/cookbook/locale/ca/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-22 11:20+0000\n" "Last-Translator: Ramon Aixa Juan \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/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" " " diff --git a/cookbook/locale/de/LC_MESSAGES/django.po b/cookbook/locale/de/LC_MESSAGES/django.po index 877174cf..043f391f 100644 --- a/cookbook/locale/de/LC_MESSAGES/django.po +++ b/cookbook/locale/de/LC_MESSAGES/django.po @@ -14,11 +14,11 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" -"PO-Revision-Date: 2022-05-28 16:32+0000\n" -"Last-Translator: Tobias Reinmann \n" -"Language-Team: German \n" +"POT-Creation-Date: 2022-07-12 19:20+0200\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" @@ -542,7 +538,7 @@ msgstr "Du hast die maximale Anzahl an Rezepten für Deinen Space erreicht." msgid "You have more users than allowed in your space." msgstr "Du hast mehr Benutzer in Deinem Space als erlaubt." -#: .\cookbook\helper\recipe_search.py:560 +#: .\cookbook\helper\recipe_search.py:565 msgid "One of queryset or hash_key must be provided" msgstr "Es muss die Abfrage oder der Hash_Key angeben werden" @@ -555,12 +551,12 @@ msgstr "Sie müssen eine Portionsgröße angeben" msgid "Could not parse template code." msgstr "Konnte den Template code nicht verarbeiten." -#: .\cookbook\integration\copymethat.py:42 +#: .\cookbook\integration\copymethat.py:41 #: .\cookbook\integration\melarecipes.py:37 msgid "Favorite" msgstr "Favorit" -#: .\cookbook\integration\copymethat.py:71 +#: .\cookbook\integration\copymethat.py:70 #: .\cookbook\integration\recettetek.py:54 #: .\cookbook\integration\recipekeeper.py:63 msgid "Imported from" @@ -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 @@ -701,106 +695,104 @@ msgstr "Neu" msgid " is part of a recipe step and cannot be deleted" msgstr " ist Teil eines Rezepts und kann nicht gelöscht werden" -#: .\cookbook\models.py:1160 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Einfach" -#: .\cookbook\models.py:1161 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Satz" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Rohdaten" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Food Alias" msgstr "Lebensmittel Alias" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Unit Alias" msgstr "Einheiten Alias" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Keyword Alias" msgstr "Stichwort Alias" -#: .\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 "Rezept" -#: .\cookbook\models.py:1226 -#, fuzzy -#| msgid "Foods" +#: .\cookbook\models.py:1228 msgid "Food" msgstr "Lebensmittel" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "Schlagwort" -#: .\cookbook\serializer.py:204 +#: .\cookbook\serializer.py:207 msgid "Cannot modify Space owner permission." -msgstr "" +msgstr "Die Eigentumsberechtigung am Space kann nicht geändert werden." -#: .\cookbook\serializer.py:273 +#: .\cookbook\serializer.py:290 msgid "File uploads are not enabled for this Space." msgstr "Datei-Uploads sind in diesem Space nicht aktiviert." -#: .\cookbook\serializer.py:284 +#: .\cookbook\serializer.py:301 msgid "You have reached your file upload limit." msgstr "Du hast Dein Datei-Uploadlimit erreicht." -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "Hello" msgstr "Hallo" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "You have been invited by " msgstr "Du wurdest eingeladen von " -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " msgstr " um deren Tandoor Recipes Instanz beizutreten " -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " msgstr "Klicke auf den folgenden Link, um deinen Account zu aktivieren: " -#: .\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 "" "Falls der Link nicht funktioniert, benutze den folgenden Code um dem Space " "manuell beizutreten: " -#: .\cookbook\serializer.py:1055 +#: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " msgstr "Die Einladung ist gültig bis " -#: .\cookbook\serializer.py:1056 +#: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" "Tandoor Recipes ist ein Open-Source Rezept-Manager. Mehr Informationen sind " "auf GitHub zu finden " -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" msgstr "Tandoor Recipes Einladung" -#: .\cookbook\serializer.py:1179 +#: .\cookbook\serializer.py:1209 msgid "Existing shopping list to update" msgstr "Bestehende Einkaufliste, die aktualisiert werden soll" -#: .\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." @@ -808,7 +800,7 @@ msgstr "" "Liste der Zutaten-IDs aus dem Rezept, wenn keine Angabe erfolgt, werden alle " "Zutaten hinzugefügt." -#: .\cookbook\serializer.py:1183 +#: .\cookbook\serializer.py:1213 #, fuzzy msgid "" "Providing a list_recipe ID and servings of 0 will delete that shopping list." @@ -816,21 +808,20 @@ msgstr "" "Wenn Sie eine \"list_recipe\"-ID, sowie 0 Portionen angeben, wird diese " "Einkaufsliste gelöscht." -#: .\cookbook\serializer.py:1192 +#: .\cookbook\serializer.py:1222 msgid "Amount of food to add to the shopping list" msgstr "" "Menge des Lebensmittels, welches der Einkaufsliste hinzugefügt werden soll" -#: .\cookbook\serializer.py:1194 +#: .\cookbook\serializer.py:1224 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:1196 -#, fuzzy +#: .\cookbook\serializer.py:1226 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 @@ -970,7 +961,7 @@ msgstr "" "Bestätigungslink." #: .\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 +1132,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" @@ -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,41 +1222,39 @@ 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:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" -msgstr "" +msgstr "Übersicht" -#: .\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" @@ -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 @@ -2431,19 +2366,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 +2388,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 +2417,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 +2446,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 +2467,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 +2493,304 @@ 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 "" +"ID des Rezeptes zu dem ein Schritt gehört. Kann mehrfach angegeben werden." -#: .\cookbook\views\api.py:668 +#: .\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:712 +#: .\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:714 +#: .\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:717 +#: .\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:720 +#: .\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:723 +#: .\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:726 +#: .\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:728 +#: .\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:731 +#: .\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:733 +#: .\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:735 +#: .\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:737 +#: .\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: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 -msgid "ID of book a recipe should be in. For multiple repeat parameter." -msgstr "" - -#: .\cookbook\views\api.py:743 -msgid "Book IDs, repeat for multiple. Return recipes with any of the books" -msgstr "" - -#: .\cookbook\views\api.py:745 -msgid "Book IDs, repeat for multiple. Return recipes with all of the books." -msgstr "" - -#: .\cookbook\views\api.py:747 -msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." -msgstr "" +"Mindestbewertung eines Rezeptes (0-5). Negative Werte filtern nach " +"Maximalbewertung." #: .\cookbook\views\api.py:749 -msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." -msgstr "" +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "Buch ID, in dem das Rezept ist. Kann mehrfach angegeben werden." #: .\cookbook\views\api.py:751 -msgid "If only internal recipes should be returned. [true/false]" +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 "Returns the results in randomized order. [true/false]" +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 "Returns new results first in search results. [true/false]" +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 "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:759 +#: .\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:761 +#: .\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:763 +#: .\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:765 +#: .\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:767 +#: .\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:929 +#: .\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: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 "" +"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:937 +#: .\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: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 "" +msgstr "Ungültige URL" -#: .\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 "" +msgstr "Ungültiges URL Schema." -#: .\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" @@ -2850,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!" @@ -2899,6 +2878,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" @@ -2908,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" @@ -3007,6 +2988,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..754c9b2f 100644 --- a/cookbook/locale/es/LC_MESSAGES/django.po +++ b/cookbook/locale/es/LC_MESSAGES/django.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" -"PO-Revision-Date: 2022-06-25 17:32+0000\n" -"Last-Translator: César Blanco Guillamon \n" +"POT-Creation-Date: 2022-07-12 19:20+0200\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" @@ -518,7 +518,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 "" @@ -531,12 +531,12 @@ msgstr "Debe proporcionar un tamaño de porción" 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" @@ -669,125 +669,125 @@ msgstr "Nuevo" 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 "Alias de la Comida" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 #, fuzzy #| msgid "Units" msgid "Unit Alias" msgstr "Unidades" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 #, fuzzy #| msgid "Keywords" msgid "Keyword Alias" msgstr "Palabras clave" -#: .\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 "Receta" -#: .\cookbook\models.py:1226 +#: .\cookbook\models.py:1228 #, fuzzy #| msgid "Food" msgid "Food" msgstr "Comida" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "Palabra clave" -#: .\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 "" @@ -921,7 +921,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 "Iniciar sesión" @@ -1096,7 +1096,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 "Documentación de API" @@ -1203,36 +1203,36 @@ msgstr "Administrador" msgid "Your Spaces" msgstr "Crear Usuario" -#: .\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 "" -#: .\cookbook\templates\base.html:331 +#: .\cookbook\templates\base.html:332 msgid "API Browser" msgstr "Explorador de API" -#: .\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 "" @@ -2278,19 +2278,11 @@ msgstr "Recetas sin palabras clave" msgid "Internal Recipes" msgstr "Recetas Internas" -#: .\cookbook\templates\system.html:21 .\cookbook\views\lists.py:76 -msgid "Invite Links" -msgstr "Enlaces de Invitación" - -#: .\cookbook\templates\system.html:22 -msgid "Show Links" -msgstr "Mostrar Enlaces" - -#: .\cookbook\templates\system.html:32 +#: .\cookbook\templates\system.html:20 msgid "System Information" msgstr "Información del Sistema" -#: .\cookbook\templates\system.html:34 +#: .\cookbook\templates\system.html:22 msgid "" "\n" " Django Recipes is an open source free software application. It can " @@ -2308,21 +2300,21 @@ msgstr "" "github.com/vabene1111/recipes/releases\">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..cb71656e 100644 --- a/cookbook/locale/it/LC_MESSAGES/django.po +++ b/cookbook/locale/it/LC_MESSAGES/django.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" -"PO-Revision-Date: 2022-06-01 22:32+0000\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\n" +"PO-Revision-Date: 2022-08-04 11:32+0000\n" "Last-Translator: Oliver Cervera \n" "Language-Team: Italian \n" @@ -330,12 +330,16 @@ msgid "" "Fields to search ignoring accents. Selecting this option can improve or " "degrade search quality depending on language" msgstr "" +"Campi da cercare ignorando gli accenti. A seconda alla lingua utilizzata, " +"questa opzione può migliorare o peggiorare la ricerca" #: .\cookbook\forms.py:453 msgid "" "Fields to search for partial matches. (e.g. searching for 'Pie' will return " "'pie' and 'piece' and 'soapie')" msgstr "" +"Campi da cercare con corrispondenza parziale. (ad esempio, cercando \"Torta" +"\" verranno mostrati \"torta\", \"tortino\" e \"contorta\")" #: .\cookbook\forms.py:455 msgid "" @@ -543,7 +547,7 @@ msgstr "Hai raggiunto il numero massimo di ricette nella tua istanza." msgid "You have more users than allowed in your space." msgstr "Hai più utenti di quanti permessi nella tua istanza." -#: .\cookbook\helper\recipe_search.py:560 +#: .\cookbook\helper\recipe_search.py:565 msgid "One of queryset or hash_key must be provided" msgstr "" @@ -558,12 +562,12 @@ msgstr "Devi fornire almeno una ricetta o un titolo." msgid "Could not parse template code." msgstr "Impossibile elaborare il codice del template." -#: .\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" @@ -704,125 +708,125 @@ msgstr "Nuovo" msgid " is part of a recipe step and cannot be deleted" msgstr " è parte dello step di una ricetta e non può essere eliminato" -#: .\cookbook\models.py:1160 .\cookbook\templates\search_info.html:28 +#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:28 msgid "Simple" msgstr "Semplice" -#: .\cookbook\models.py:1161 .\cookbook\templates\search_info.html:33 +#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:33 msgid "Phrase" msgstr "Frase" -#: .\cookbook\models.py:1162 .\cookbook\templates\search_info.html:38 +#: .\cookbook\models.py:1164 .\cookbook\templates\search_info.html:38 msgid "Web" msgstr "Web" -#: .\cookbook\models.py:1163 .\cookbook\templates\search_info.html:47 +#: .\cookbook\models.py:1165 .\cookbook\templates\search_info.html:47 msgid "Raw" msgstr "Raw" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Food Alias" msgstr "Alias Alimento" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Unit Alias" msgstr "Alias Unità" -#: .\cookbook\models.py:1201 +#: .\cookbook\models.py:1203 msgid "Keyword Alias" msgstr "Alias Parola Chiave" -#: .\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 "Ricetta" -#: .\cookbook\models.py:1226 +#: .\cookbook\models.py:1228 #, fuzzy #| msgid "Foods" msgid "Food" msgstr "Alimenti" -#: .\cookbook\models.py:1227 .\cookbook\templates\base.html:138 +#: .\cookbook\models.py:1229 .\cookbook\templates\base.html:138 msgid "Keyword" msgstr "Parola chiave" -#: .\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 "Il caricamento dei file non è abilitato in questa istanza." -#: .\cookbook\serializer.py:284 +#: .\cookbook\serializer.py:301 msgid "You have reached your file upload limit." msgstr "Hai raggiungo il limite per il caricamento dei file." -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "Hello" msgstr "Ciao" -#: .\cookbook\serializer.py:1051 +#: .\cookbook\serializer.py:1081 msgid "You have been invited by " msgstr "Sei stato invitato da " -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " msgstr " per entrare nella sua istanza di Tandoor Recipes " -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " msgstr "Clicca il link qui di seguito per attivare il tuo account: " -#: .\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 "" "Se il link non funziona, usa il seguente codice per entrare manualmente " "nell'istanza: " -#: .\cookbook\serializer.py:1055 +#: .\cookbook\serializer.py:1085 msgid "The invitation is valid until " msgstr "L'invito è valido fino al " -#: .\cookbook\serializer.py:1056 +#: .\cookbook\serializer.py:1086 msgid "" "Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub " msgstr "" "Tandoor Recipes è un gestore di ricette Open Source. Dagli una occhiata su " "GitHub " -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" msgstr "Invito per Tandoor Recipes" -#: .\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 "" @@ -963,7 +967,7 @@ msgstr "" "a>." #: .\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 +1139,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 +1236,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 +2300,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 +2320,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 +2349,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 +2376,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 +2396,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 +2421,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 +2755,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 +2867,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..e505429a 100644 --- a/cookbook/locale/zh_CN/LC_MESSAGES/django.po +++ b/cookbook/locale/zh_CN/LC_MESSAGES/django.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-06-26 12:09+0200\n" -"PO-Revision-Date: 2022-01-22 03:30+0000\n" -"Last-Translator: 糖多 <1365143958@qq.com>\n" +"POT-Creation-Date: 2022-07-12 19:20+0200\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 "" @@ -494,33 +487,29 @@ 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 "必须提供 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 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 "" +msgstr "喜欢" -#: .\cookbook\integration\copymethat.py:71 +#: .\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." @@ -649,121 +636,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 -#, fuzzy -#| msgid "Foods" +#: .\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 "" +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 "" +msgstr "您已被邀请至 " -#: .\cookbook\serializer.py:1052 +#: .\cookbook\serializer.py:1082 msgid " to join their Tandoor Recipes space " -msgstr "" +msgstr " 加入他们的泥炉食谱空间 " -#: .\cookbook\serializer.py:1053 +#: .\cookbook\serializer.py:1083 msgid "Click the following link to activate your account: " -msgstr "" +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 "" +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 "" +msgstr "泥炉食谱是一个开源食谱管理器。 在 GitHub 上查看 " -#: .\cookbook\serializer.py:1059 +#: .\cookbook\serializer.py:1089 msgid "Tandoor Recipes Invite" -msgstr "" +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 "要添加的菜谱中材料识别符列表,不提供则添加所有材料。" +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 "提供一个菜谱列表识别符或份数为0将删除该购物清单。" -#: .\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 "当设置为 true 时,将从活动的购物列表中删除所有食物。" @@ -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" @@ -905,7 +888,7 @@ 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 "登录" @@ -999,7 +982,6 @@ msgid "" msgstr "我们已经向你发送了一封电子邮件。如果你在几分钟内没有收到,请联系我们。" #: .\cookbook\templates\account\password_reset_from_key.html:13 -#, fuzzy msgid "Bad Token" msgstr "坏令牌" @@ -1075,7 +1057,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 "应用程序接口文档" @@ -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,43 +1147,41 @@ 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:319 +#: .\cookbook\templates\base.html:320 #: .\cookbook\templates\space_overview.html:6 msgid "Overview" -msgstr "" +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 "翻译筒状泥炉<_<" +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 -msgid "You are using the free version of Tandor" -msgstr "" - #: .\cookbook\templates\base.html:357 +msgid "You are using the free version of Tandor" +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,37 +2205,29 @@ 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" 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 +2245,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 +2273,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 " @@ -2300,12 +2294,19 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" 您没有在 .env 文件中配置 SECRET_KEY。 Django " +"默认为\n" +" 标准键\n" +" 提供公开但并不安全的安装! 请设置\n" +" SECRET_KEY.env 文件中配置。\n" +" " -#: .\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 " @@ -2315,16 +2316,21 @@ msgid "" "file.\n" " " msgstr "" +"\n" +" 此应用程序仍在调试模式下运行。 这是不必要的。 调试模式由\n" +" 设置\n" +" DEBUG=0.env 文件中配置\n" +" " -#: .\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 " @@ -2332,252 +2338,254 @@ msgid "" " features only work with postgres databases.\n" " " msgstr "" +"\n" +" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这是不推荐的,\n" +" 因为有些功能仅适用于 PostgreSQL 数据库。\n" +" " #: .\cookbook\templates\url_import.html:8 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 "" +msgstr "不存在ID是 {pk} 的 {self.basename}" -#: .\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 "" +msgstr "不存在 ID 为 {pk} 的 {self.basename}" -#: .\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 "" +msgstr "不存在 ID 为 {parent} 的 {self.basename}" -#: .\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 "" +msgstr "食谱中的步骤ID。 对于多个重复参数。" -#: .\cookbook\views\api.py:668 +#: .\cookbook\views\api.py:676 msgid "Query string matched (fuzzy) against object name." -msgstr "" - -#: .\cookbook\views\api.py:712 -msgid "" -"Query string matched (fuzzy) against recipe name. In the future also " -"fulltext search." -msgstr "" - -#: .\cookbook\views\api.py:714 -msgid "" -"ID of keyword a recipe should have. For multiple repeat parameter. " -"Equivalent to keywords_or" -msgstr "" - -#: .\cookbook\views\api.py:717 -msgid "" -"Keyword IDs, repeat for multiple. Return recipes with any of the keywords" -msgstr "" +msgstr "请求参数与对象名称匹配(模糊)。" #: .\cookbook\views\api.py:720 msgid "" -"Keyword IDs, repeat for multiple. Return recipes with all of the keywords." -msgstr "" +"Query string matched (fuzzy) against recipe name. In the future also " +"fulltext search." +msgstr "请求参数与食谱名称匹配(模糊)。 未来会添加全文搜索。" -#: .\cookbook\views\api.py:723 +#: .\cookbook\views\api.py:722 msgid "" -"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." -msgstr "" +"ID of keyword a recipe should have. For multiple repeat parameter. " +"Equivalent to keywords_or" +msgstr "菜谱应包含的关键字 ID。 对于多个重复参数。 相当于keywords_or" -#: .\cookbook\views\api.py:726 +#: .\cookbook\views\api.py:725 msgid "" -"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." -msgstr "" +"Keyword IDs, repeat for multiple. Return recipes with any of the keywords" +msgstr "允许多个关键字 ID。 返回带有任一关键字的食谱" #: .\cookbook\views\api.py:728 -msgid "ID of food a recipe should have. For multiple repeat parameter." -msgstr "" +msgid "" +"Keyword IDs, repeat for multiple. Return recipes with all of the keywords." +msgstr "允许多个关键字 ID。 返回带有所有关键字的食谱。" #: .\cookbook\views\api.py:731 +msgid "" +"Keyword IDs, repeat for multiple. Exclude recipes with any of the keywords." +msgstr "允许多个关键字 ID。 排除带有任一关键字的食谱。" + +#: .\cookbook\views\api.py:734 +msgid "" +"Keyword IDs, repeat for multiple. Exclude recipes with all of the keywords." +msgstr "允许多个关键字 ID。 排除带有所有关键字的食谱。" + +#: .\cookbook\views\api.py:736 +msgid "ID of food a recipe should have. For multiple repeat parameter." +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:733 +#: .\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:735 +#: .\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:737 +#: .\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:738 +#: .\cookbook\views\api.py:746 msgid "ID of unit a recipe should have." -msgstr "" +msgstr "食谱应具有单一ID。" -#: .\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 -msgid "ID of book a recipe should be in. For multiple repeat parameter." -msgstr "" - -#: .\cookbook\views\api.py:743 -msgid "Book IDs, repeat for multiple. Return recipes with any of the books" -msgstr "" - -#: .\cookbook\views\api.py:745 -msgid "Book IDs, repeat for multiple. Return recipes with all of the books." -msgstr "" - -#: .\cookbook\views\api.py:747 -msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." -msgstr "" +msgstr "配方的评分范围从 0 到 5。" #: .\cookbook\views\api.py:749 -msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." -msgstr "" +msgid "ID of book a recipe should be in. For multiple repeat parameter." +msgstr "烹饪书应该在食谱中具有ID。并且可以添加多本。" #: .\cookbook\views\api.py:751 -msgid "If only internal recipes should be returned. [true/false]" -msgstr "" +msgid "Book IDs, repeat for multiple. Return recipes with any of the books" +msgstr "书的ID允许多个。返回包含任一书籍的食谱" #: .\cookbook\views\api.py:753 -msgid "Returns the results in randomized order. [true/false]" -msgstr "" +msgid "Book IDs, repeat for multiple. Return recipes with all of the books." +msgstr "书的ID允许多个。返回包含所有书籍的食谱。" #: .\cookbook\views\api.py:755 -msgid "Returns new results first in search results. [true/false]" -msgstr "" +msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books." +msgstr "书的ID允许多个。排除包含任一书籍的食谱。" #: .\cookbook\views\api.py:757 -msgid "" -"Filter recipes cooked X times or more. Negative values returns cooked less " -"than X times" -msgstr "" +msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books." +msgstr "书的ID允许多个。排除包含所有书籍的食谱。" #: .\cookbook\views\api.py:759 -msgid "" -"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " -"or before date." -msgstr "" +msgid "If only internal recipes should be returned. [true/false]" +msgstr "只返回内部食谱。 [true/false]" #: .\cookbook\views\api.py:761 -msgid "" -"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " -"before date." -msgstr "" +msgid "Returns the results in randomized order. [true/false]" +msgstr "按随机排序返回结果。 [true/ false ]" #: .\cookbook\views\api.py:763 -msgid "" -"Filter recipes updated on or after YYYY-MM-DD. Prepending - filters on or " -"before date." -msgstr "" +msgid "Returns new results first in search results. [true/false]" +msgstr "在搜索结果中首先返回新结果。 [是/]" #: .\cookbook\views\api.py:765 msgid "" -"Filter recipes lasts viewed on or after YYYY-MM-DD. Prepending - filters on " -"or before date." -msgstr "" +"Filter recipes cooked X times or more. Negative values returns cooked less " +"than X times" +msgstr "筛选烹饪 X 次或更多次的食谱。 负值返回烹饪少于 X 次" #: .\cookbook\views\api.py:767 -msgid "Filter recipes that can be made with OnHand food. [true/false]" -msgstr "" +msgid "" +"Filter recipes last cooked on or after YYYY-MM-DD. Prepending - filters on " +"or before date." +msgstr "筛选最后烹饪在 YYYY-MM-DD 当天或之后的食谱。 前置 - 在日期或日期之前筛选。" -#: .\cookbook\views\api.py:929 +#: .\cookbook\views\api.py:769 +msgid "" +"Filter recipes created on or after YYYY-MM-DD. Prepending - filters on or " +"before date." +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 "筛选在 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 "筛选最后查看时间是在 YYYY-MM-DD 或之后的食谱。 前置 - 在日期或日期之前筛选。" + +#: .\cookbook\views\api.py:775 +msgid "Filter recipes that can be made with OnHand food. [true/false]" +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: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 "" +msgstr "在选中时筛选购物清单列表。 [真, 假, 两者都有, 最近]
- 最近包括未选中的项目和最近完成的项目。" -#: .\cookbook\views\api.py:937 +#: .\cookbook\views\api.py:945 msgid "Returns the shopping list entries sorted by supermarket category order." -msgstr "" +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 "" +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 "" +msgstr "错误的 URL Schema。" -#: .\cookbook\views\api.py:1170 -#, fuzzy -#| msgid "No useable data could be found." +#: .\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 "" +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 "与存储同步时出错" @@ -2599,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" @@ -2614,8 +2622,6 @@ msgid "Invite Link" msgstr "邀请链接" #: .\cookbook\views\delete.py:200 -#, fuzzy -#| msgid "Members" msgid "Space Membership" msgstr "成员" @@ -2624,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!" @@ -2662,6 +2667,10 @@ msgstr "探索" msgid "Shopping List" msgstr "采购单" +#: .\cookbook\views\lists.py:76 +msgid "Invite Links" +msgstr "邀请链接" + #: .\cookbook\views\lists.py:139 msgid "Supermarkets" msgstr "超市" @@ -2671,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" @@ -2692,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!" @@ -2761,6 +2768,9 @@ msgid "" "contact the page administrator." msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理员联系。" +#~ msgid "Show Links" +#~ msgstr "显示链接" + #~ msgid "A user is required" #~ msgstr "需要一个用户" 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/migrations/0179_recipe_private_recipe_shared.py b/cookbook/migrations/0179_recipe_private_recipe_shared.py new file mode 100644 index 00000000..9d3914b1 --- /dev/null +++ b/cookbook/migrations/0179_recipe_private_recipe_shared.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0.6 on 2022-07-13 10:53 + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('cookbook', '0178_remove_userpreference_search_style_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='recipe', + name='private', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='recipe', + name='shared', + field=models.ManyToManyField(blank=True, related_name='recipe_shared_with', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/cookbook/migrations/0180_invitelink_reusable.py b/cookbook/migrations/0180_invitelink_reusable.py new file mode 100644 index 00000000..021035de --- /dev/null +++ b/cookbook/migrations/0180_invitelink_reusable.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.6 on 2022-07-14 09:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0179_recipe_private_recipe_shared'), + ] + + operations = [ + migrations.AddField( + model_name='invitelink', + name='reusable', + field=models.BooleanField(default=False), + ), + ] diff --git a/cookbook/migrations/0181_space_image.py b/cookbook/migrations/0181_space_image.py new file mode 100644 index 00000000..5bfdbf5f --- /dev/null +++ b/cookbook/migrations/0181_space_image.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.6 on 2022-07-14 11:14 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0180_invitelink_reusable'), + ] + + operations = [ + migrations.AddField( + model_name='space', + name='image', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='space_image', to='cookbook.userfile'), + ), + ] diff --git a/cookbook/migrations/0182_userpreference_image.py b/cookbook/migrations/0182_userpreference_image.py new file mode 100644 index 00000000..d9405e40 --- /dev/null +++ b/cookbook/migrations/0182_userpreference_image.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.6 on 2022-07-14 13:32 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0181_space_image'), + ] + + operations = [ + migrations.AddField( + model_name='userpreference', + name='image', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user_image', to='cookbook.userfile'), + ), + ] diff --git a/cookbook/migrations/0183_alter_space_image.py b/cookbook/migrations/0183_alter_space_image.py new file mode 100644 index 00000000..38a8e2e6 --- /dev/null +++ b/cookbook/migrations/0183_alter_space_image.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.6 on 2022-08-04 16:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('cookbook', '0182_userpreference_image'), + ] + + operations = [ + migrations.AlterField( + model_name='space', + name='image', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='space_image', to='cookbook.userfile'), + ), + ] diff --git a/cookbook/models.py b/cookbook/models.py index 89795be0..fbe0c71c 100644 --- a/cookbook/models.py +++ b/cookbook/models.py @@ -4,6 +4,8 @@ import re import uuid from datetime import date, timedelta +import oauth2_provider.models +from PIL import Image from annoying.fields import AutoOneToOneField from django.contrib import auth from django.contrib.auth.models import Group, User @@ -25,7 +27,7 @@ from recipes.settings import (COMMENT_PREF_DEFAULT, FRACTION_PREF_DEFAULT, KJ_PR SORT_TREE_BY_NAME, STICKY_NAV_PREF_DEFAULT) -def get_user_name(self): +def get_user_display_name(self): if not (name := f"{self.first_name} {self.last_name}") == " ": return name else: @@ -57,11 +59,18 @@ def get_shopping_share(self): ])) -auth.models.User.add_to_class('get_user_name', get_user_name) +auth.models.User.add_to_class('get_user_display_name', get_user_display_name) auth.models.User.add_to_class('get_shopping_share', get_shopping_share) auth.models.User.add_to_class('get_active_space', get_active_space) +def oauth_token_get_owner(self): + return self.user + + +oauth2_provider.models.AccessToken.add_to_class('get_owner', oauth_token_get_owner) + + def get_model_name(model): return ('_'.join(re.findall('[A-Z][^A-Z]*', model.__name__))).lower() @@ -244,6 +253,7 @@ class FoodInheritField(models.Model, PermissionModelMixin): class Space(ExportModelOperationsMixin('space'), models.Model): name = models.CharField(max_length=128, default='Default') + image = models.ForeignKey("UserFile", on_delete=models.SET_NULL, null=True, blank=True, related_name='space_image') created_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True) created_at = models.DateTimeField(auto_now_add=True) message = models.CharField(max_length=512, default='', blank=True) @@ -355,34 +365,16 @@ 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) + image = models.ForeignKey("UserFile", on_delete=models.SET_NULL, null=True, related_name='user_image') theme = models.CharField(choices=THEMES, max_length=128, default=TANDOOR) - nav_color = models.CharField( - choices=COLORS, max_length=128, default=PRIMARY - ) + nav_color = models.CharField(choices=COLORS, max_length=128, default=PRIMARY) default_unit = models.CharField(max_length=32, default='g') use_fractions = models.BooleanField(default=FRACTION_PREF_DEFAULT) use_kj = models.BooleanField(default=KJ_PREF_DEFAULT) - 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' - ) - shopping_share = models.ManyToManyField( - User, blank=True, related_name='shopping_share' - ) + default_page = models.CharField(choices=PAGES, max_length=64, default=SEARCH) + plan_share = models.ManyToManyField(User, blank=True, related_name='plan_share_default') + shopping_share = models.ManyToManyField(User, blank=True, related_name='shopping_share') ingredient_decimals = models.IntegerField(default=2) comments = models.BooleanField(default=COMMENT_PREF_DEFAULT) shopping_auto_sync = models.IntegerField(default=5) @@ -612,7 +604,7 @@ class Food(ExportModelOperationsMixin('food'), TreeModel, PermissionModelMixin): # remove all inherited fields from food trough = Food.inherit_fields.through trough.objects.all().delete() - + # food is going to inherit attributes if len(inherit) > 0: # ManyToMany cannot be updated through an UPDATE operation @@ -749,6 +741,8 @@ class Recipe(ExportModelOperationsMixin('recipe'), models.Model, PermissionModel internal = models.BooleanField(default=False) nutrition = models.ForeignKey(NutritionInformation, blank=True, null=True, on_delete=models.CASCADE) show_ingredient_overview = models.BooleanField(default=True) + private = models.BooleanField(default=False) + shared = models.ManyToManyField(User, blank=True, related_name='recipe_shared_with') source_url = models.CharField(max_length=1024, default=None, blank=True, null=True) created_by = models.ForeignKey(User, on_delete=models.PROTECT) @@ -1017,9 +1011,8 @@ class InviteLink(ExportModelOperationsMixin('invite_link'), models.Model, Permis email = models.EmailField(blank=True) group = models.ForeignKey(Group, on_delete=models.CASCADE) valid_until = models.DateField(default=default_valid_until) - used_by = models.ForeignKey( - User, null=True, on_delete=models.CASCADE, related_name='used_by' - ) + used_by = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name='used_by') + reusable = models.BooleanField(default=False) created_by = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) @@ -1187,6 +1180,13 @@ class UserFile(ExportModelOperationsMixin('user_files'), models.Model, Permissio objects = ScopedManager(space='space') space = models.ForeignKey(Space, on_delete=models.CASCADE) + def is_image(self): + try: + img = Image.open(self.file.file.file) + return True + except Exception: + return False + def save(self, *args, **kwargs): if hasattr(self.file, 'file') and isinstance(self.file.file, UploadedFile) or isinstance(self.file.file, InMemoryUploadedFile): self.file.name = f'{uuid.uuid4()}' + pathlib.Path(self.file.name).suffix diff --git a/cookbook/serializer.py b/cookbook/serializer.py index 1e386c5d..c2b76b38 100644 --- a/cookbook/serializer.py +++ b/cookbook/serializer.py @@ -1,12 +1,12 @@ import traceback -from datetime import timedelta, datetime +import uuid +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, AnonymousUser from django.core.mail import send_mail from django.db.models import Avg, Q, QuerySet, Sum from django.http import BadHeaderError @@ -14,6 +14,8 @@ 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 oauth2_provider.models import AccessToken from rest_framework import serializers from rest_framework.exceptions import NotFound, ValidationError @@ -22,14 +24,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): @@ -124,22 +126,26 @@ class SpaceFilterSerializer(serializers.ListSerializer): # if query is sliced it came from api request not nested serializer return super().to_representation(data) if self.child.Meta.model == User: - data = data.filter(userspace__space=self.context['request'].user.get_active_space()).all() + if type(self.context['request'].user) == AnonymousUser: + data = [] + else: + data = data.filter(userspace__space=self.context['request'].user.get_active_space()).all() else: data = data.filter(**{'__'.join(data.model.get_space_key()): self.context['request'].space}) return super().to_representation(data) -class UserNameSerializer(WritableNestedModelSerializer): - username = serializers.SerializerMethodField('get_user_label') +class UserSerializer(WritableNestedModelSerializer): + display_name = serializers.SerializerMethodField('get_user_label') def get_user_label(self, obj): - return obj.get_user_name() + return obj.get_user_display_name() class Meta: list_serializer_class = SpaceFilterSerializer model = User - fields = ('id', 'username') + fields = ('id', 'username', 'first_name', 'last_name', 'display_name') + read_only_fields = ('username',) class GroupSerializer(UniqueFieldsMixin, WritableNestedModelSerializer): @@ -170,103 +176,6 @@ class FoodInheritFieldSerializer(UniqueFieldsMixin, WritableNestedModelSerialize read_only_fields = ['id'] -class SpaceSerializer(WritableNestedModelSerializer): - user_count = serializers.SerializerMethodField('get_user_count') - recipe_count = serializers.SerializerMethodField('get_recipe_count') - file_size_mb = serializers.SerializerMethodField('get_file_size_mb') - food_inherit = FoodInheritFieldSerializer(many=True) - - def get_user_count(self, obj): - return UserSpace.objects.filter(space=obj).count() - - def get_recipe_count(self, obj): - return Recipe.objects.filter(space=obj).count() - - def get_file_size_mb(self, obj): - try: - return UserFile.objects.filter(space=obj).aggregate(Sum('file_size_kb'))['file_size_kb__sum'] / 1000 - except TypeError: - return 0 - - def create(self, validated_data): - raise ValidationError('Cannot create using this endpoint') - - 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',) - read_only_fields = ('id', 'created_by', 'created_at', 'max_recipes', 'max_file_storage_mb', 'max_users', 'allow_sharing', 'demo',) - - -class UserSpaceSerializer(WritableNestedModelSerializer): - user = UserNameSerializer(read_only=True) - groups = GroupSerializer(many=True) - - def validate(self, data): - if self.instance.user == self.context['request'].space.created_by: # can't change space owner permission - raise serializers.ValidationError(_('Cannot modify Space owner permission.')) - return super().validate(data) - - def create(self, validated_data): - raise ValidationError('Cannot create using this endpoint') - - class Meta: - model = UserSpace - fields = ('id', 'user', 'space', 'groups', 'active', 'created_at', 'updated_at',) - read_only_fields = ('id', 'created_at', 'updated_at', 'space') - - -class SpacedModelSerializer(serializers.ModelSerializer): - def create(self, validated_data): - validated_data['space'] = self.context['request'].space - return super().create(validated_data) - - -class MealTypeSerializer(SpacedModelSerializer, WritableNestedModelSerializer): - - def create(self, validated_data): - validated_data['created_by'] = self.context['request'].user - return super().create(validated_data) - - class Meta: - list_serializer_class = SpaceFilterSerializer - model = MealType - fields = ('id', 'name', 'order', 'icon', 'color', 'default', 'created_by') - read_only_fields = ('created_by',) - - -class UserPreferenceSerializer(WritableNestedModelSerializer): - food_inherit_default = serializers.SerializerMethodField('get_food_inherit_defaults') - plan_share = UserNameSerializer(many=True, allow_null=True, required=False) - shopping_share = UserNameSerializer(many=True, allow_null=True, required=False) - food_children_exist = serializers.SerializerMethodField('get_food_children_exist') - - def get_food_inherit_defaults(self, obj): - return FoodInheritFieldSerializer(obj.user.get_active_space().food_inherit.all(), many=True).data - - def get_food_children_exist(self, obj): - space = getattr(self.context.get('request', None), 'space', None) - return Food.objects.filter(depth__gt=0, space=space).exists() - - def update(self, instance, validated_data): - with scopes_disabled(): - return super().update(instance, validated_data) - - def create(self, validated_data): - raise ValidationError('Cannot create using this endpoint') - - class Meta: - model = UserPreference - fields = ( - 'user', 'theme', 'nav_color', 'default_unit', 'default_page', 'use_fractions', 'use_kj', 'search_style', - 'show_recent', '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', - 'csv_delim', 'csv_prefix', - 'filter_to_supermarket', 'shopping_add_onhand', 'left_handed', 'food_children_exist' - ) - - class UserFileSerializer(serializers.ModelSerializer): file = serializers.FileField(write_only=True) file_download = serializers.SerializerMethodField('get_download_link') @@ -343,6 +252,106 @@ class UserFileViewSerializer(serializers.ModelSerializer): read_only_fields = ('id', 'file') +class SpaceSerializer(WritableNestedModelSerializer): + user_count = serializers.SerializerMethodField('get_user_count') + recipe_count = serializers.SerializerMethodField('get_recipe_count') + file_size_mb = serializers.SerializerMethodField('get_file_size_mb') + food_inherit = FoodInheritFieldSerializer(many=True) + image = UserFileViewSerializer(required=False, many=False, allow_null=True) + + def get_user_count(self, obj): + return UserSpace.objects.filter(space=obj).count() + + def get_recipe_count(self, obj): + return Recipe.objects.filter(space=obj).count() + + def get_file_size_mb(self, obj): + try: + return UserFile.objects.filter(space=obj).aggregate(Sum('file_size_kb'))['file_size_kb__sum'] / 1000 + except TypeError: + return 0 + + def create(self, validated_data): + raise ValidationError('Cannot create using this endpoint') + + 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', 'image',) + read_only_fields = ('id', 'created_by', 'created_at', 'max_recipes', 'max_file_storage_mb', 'max_users', 'allow_sharing', 'demo',) + + +class UserSpaceSerializer(WritableNestedModelSerializer): + user = UserSerializer(read_only=True) + groups = GroupSerializer(many=True) + + def validate(self, data): + if self.instance.user == self.context['request'].space.created_by: # can't change space owner permission + raise serializers.ValidationError(_('Cannot modify Space owner permission.')) + return super().validate(data) + + def create(self, validated_data): + raise ValidationError('Cannot create using this endpoint') + + class Meta: + model = UserSpace + fields = ('id', 'user', 'space', 'groups', 'active', 'created_at', 'updated_at',) + read_only_fields = ('id', 'created_at', 'updated_at', 'space') + + +class SpacedModelSerializer(serializers.ModelSerializer): + def create(self, validated_data): + validated_data['space'] = self.context['request'].space + return super().create(validated_data) + + +class MealTypeSerializer(SpacedModelSerializer, WritableNestedModelSerializer): + + def create(self, validated_data): + validated_data['created_by'] = self.context['request'].user + return super().create(validated_data) + + class Meta: + list_serializer_class = SpaceFilterSerializer + model = MealType + fields = ('id', 'name', 'order', 'icon', 'color', 'default', 'created_by') + read_only_fields = ('created_by',) + + +class UserPreferenceSerializer(WritableNestedModelSerializer): + food_inherit_default = serializers.SerializerMethodField('get_food_inherit_defaults') + plan_share = UserSerializer(many=True, allow_null=True, required=False) + shopping_share = UserSerializer(many=True, allow_null=True, required=False) + food_children_exist = serializers.SerializerMethodField('get_food_children_exist') + image = UserFileViewSerializer(required=False, allow_null=True, many=False) + + def get_food_inherit_defaults(self, obj): + return FoodInheritFieldSerializer(obj.user.get_active_space().food_inherit.all(), many=True).data + + def get_food_children_exist(self, obj): + space = getattr(self.context.get('request', None), 'space', None) + return Food.objects.filter(depth__gt=0, space=space).exists() + + def update(self, instance, validated_data): + with scopes_disabled(): + return super().update(instance, validated_data) + + def create(self, validated_data): + raise ValidationError('Cannot create using this endpoint') + + class Meta: + model = UserPreference + fields = ( + 'user', 'image', 'theme', 'nav_color', 'default_unit', 'default_page', 'use_fractions', 'use_kj', + 'plan_share', 'sticky_navbar', + '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', + 'csv_delim', 'csv_prefix', + 'filter_to_supermarket', 'shopping_add_onhand', 'left_handed', 'food_children_exist' + ) + + class StorageSerializer(SpacedModelSerializer): def create(self, validated_data): @@ -731,6 +740,7 @@ class RecipeSerializer(RecipeBaseSerializer): keywords = KeywordSerializer(many=True) rating = serializers.SerializerMethodField('get_recipe_rating') last_cooked = serializers.SerializerMethodField('get_recipe_last_cooked') + shared = UserSerializer(many=True, required=False) class Meta: model = Recipe @@ -738,6 +748,7 @@ class RecipeSerializer(RecipeBaseSerializer): 'id', 'name', 'description', 'image', 'keywords', 'steps', 'working_time', 'waiting_time', 'created_by', 'created_at', 'updated_at', 'source_url', 'internal', 'show_ingredient_overview', 'nutrition', 'servings', 'file_path', 'servings_text', 'rating', 'last_cooked', + 'private', 'shared', ) read_only_fields = ['image', 'created_by', 'created_at'] @@ -775,7 +786,7 @@ class CommentSerializer(serializers.ModelSerializer): class CustomFilterSerializer(SpacedModelSerializer, WritableNestedModelSerializer): - shared = UserNameSerializer(many=True, required=False) + shared = UserSerializer(many=True, required=False) def create(self, validated_data): validated_data['created_by'] = self.context['request'].user @@ -788,7 +799,7 @@ class CustomFilterSerializer(SpacedModelSerializer, WritableNestedModelSerialize class RecipeBookSerializer(SpacedModelSerializer, WritableNestedModelSerializer): - shared = UserNameSerializer(many=True) + shared = UserSerializer(many=True) filter = CustomFilterSerializer(allow_null=True, required=False) def create(self, validated_data): @@ -832,7 +843,7 @@ class MealPlanSerializer(SpacedModelSerializer, WritableNestedModelSerializer): meal_type_name = serializers.ReadOnlyField(source='meal_type.name') # TODO deprecate once old meal plan was removed note_markdown = serializers.SerializerMethodField('get_note_markdown') servings = CustomDecimalField() - shared = UserNameSerializer(many=True, required=False, allow_null=True) + shared = UserSerializer(many=True, required=False, allow_null=True) shopping = serializers.SerializerMethodField('in_shopping') def get_note_markdown(self, obj): @@ -896,7 +907,7 @@ class ShoppingListEntrySerializer(WritableNestedModelSerializer): ingredient_note = serializers.ReadOnlyField(source='ingredient.note') recipe_mealplan = ShoppingListRecipeSerializer(source='list_recipe', read_only=True) amount = CustomDecimalField() - created_by = UserNameSerializer(read_only=True) + created_by = UserSerializer(read_only=True) completed_at = serializers.DateTimeField(allow_null=True, required=False) def get_fields(self, *args, **kwargs): @@ -964,7 +975,7 @@ class ShoppingListEntryCheckedSerializer(serializers.ModelSerializer): class ShoppingListSerializer(WritableNestedModelSerializer): recipes = ShoppingListRecipeSerializer(many=True, allow_null=True) entries = ShoppingListEntrySerializer(many=True, allow_null=True) - shared = UserNameSerializer(many=True) + shared = UserSerializer(many=True) supermarket = SupermarketSerializer(allow_null=True) def create(self, validated_data): @@ -1077,7 +1088,7 @@ class InviteLinkSerializer(WritableNestedModelSerializer): if obj.email: try: if InviteLink.objects.filter(space=self.context['request'].space, created_at__gte=datetime.now() - timedelta(hours=4)).count() < 20: - message = _('Hello') + '!\n\n' + _('You have been invited by ') + escape(self.context['request'].user.username) + message = _('Hello') + '!\n\n' + _('You have been invited by ') + escape(self.context['request'].user.get_user_display_name()) message += _(' to join their Tandoor Recipes space ') + escape(self.context['request'].space.name) + '.\n\n' message += _('Click the following link to activate your account: ') + self.context['request'].build_absolute_uri(reverse('view_invite', args=[str(obj.uuid)])) + '\n\n' message += _('If the link does not work use the following code to manually join the space: ') + str(obj.uuid) + '\n\n' @@ -1099,7 +1110,7 @@ class InviteLinkSerializer(WritableNestedModelSerializer): class Meta: model = InviteLink fields = ( - 'id', 'uuid', 'email', 'group', 'valid_until', 'used_by', 'created_by', 'created_at',) + 'id', 'uuid', 'email', 'group', 'valid_until', 'used_by', 'reusable', 'created_by', 'created_at',) read_only_fields = ('id', 'uuid', 'created_by', 'created_at',) @@ -1125,6 +1136,27 @@ class BookmarkletImportSerializer(BookmarkletImportListSerializer): read_only_fields = ('created_by', 'space') +# OAuth / Auth Token related Serializers + +class AccessTokenSerializer(serializers.ModelSerializer): + token = serializers.SerializerMethodField('get_token') + + def create(self, validated_data): + validated_data['token'] = f'tda_{str(uuid.uuid4()).replace("-","_")}' + validated_data['user'] = self.context['request'].user + return super().create(validated_data) + + def get_token(self, obj): + if (timezone.now() - obj.created).seconds < 15: + return obj.token + return f'tda_************_******_***********{obj.token[len(obj.token)-4:]}' + + class Meta: + model = AccessToken + fields = ('id', 'token', 'expires', 'scope', 'created', 'updated') + read_only_fields = ('id', 'token',) + + # Export/Import Serializers class KeywordExportSerializer(KeywordSerializer): @@ -1232,6 +1264,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/static/css/vue-multiselect-bs4.min.css b/cookbook/static/css/vue-multiselect-bs4.min.css deleted file mode 100644 index c55f6184..00000000 --- a/cookbook/static/css/vue-multiselect-bs4.min.css +++ /dev/null @@ -1 +0,0 @@ -fieldset[disabled] .multiselect{pointer-events:none}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:inherit;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:calc(1.5em + 0.75rem + 2px);text-align:left;color:#495057}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{pointer-events:none;opacity:.65}.multiselect--active{z-index:50}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotateZ(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:calc(1.5em + 0.75rem + 2px)/2;line-height:calc(1.5em + 0.75rem + 2px)/2;border:none;border-radius:.25rem;background:#fff;padding:0 0 0 .75rem;width:calc(100%);transition:border .1s ease;box-sizing:border-box;margin-bottom:.375rem;vertical-align:top}.multiselect__input::placeholder{color:#6c757d}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:.75rem;margin-bottom:.375rem}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:calc(1.5em + 0.75rem + 2px);display:block;padding:.375rem calc(1.5em + 0.75rem + 2px) 0 .375rem;border-radius:.25rem;border:1px solid #ced4da;background:#fff;font-family:inherit;font-size:inherit}.multiselect__tag{position:relative;display:inline-block;padding:.25rem 2.1rem .25rem .4rem;border-radius:.25rem;margin-right:.4rem;color:#343a40;background:#f8f9fa;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis;font-size:75%;font-weight:normal}.multiselect__tag-icon{cursor:pointer;margin-left:.25rem;position:absolute;right:0;top:0;bottom:0;font-style:initial;width:1.7rem;text-align:center;line-height:1.7rem;transition:all .2s ease;font-size:75%;font-weight:normal}.multiselect__tag-icon:after{content:"×";color:#343a40;font-size:220%}.multiselect__tag-icon:focus,.multiselect__tag-icon:hover{background:#dc3545}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{line-height:calc(1.5em + 0.75rem + 2px)/2;min-height:calc(1.5em + 0.75rem + 2px);box-sizing:border-box;display:block;overflow:hidden;padding:8px 30px 0 12px;white-space:nowrap;margin:0;text-decoration:none;border-radius:.25rem;border:1px solid #ced4da;cursor:pointer}.multiselect__select{line-height:calc(1.5em + 0.75rem + 2px)/2;display:block;position:absolute;box-sizing:border-box;width:calc(1.5em + 0.75rem + 2px);height:calc(1.5em + 0.75rem + 2px);right:0;top:0;padding:8px 8px;margin:0;text-decoration:none;text-align:center;cursor:pointer;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:50%;color:#495057;border-style:solid;border-width:5px 5px 0 5px;border-color:#495057 transparent transparent transparent;content:""}.multiselect__placeholder{color:#6c757d;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #ced4da;border-top:none;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;z-index:50;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-radius:.25rem .25rem 0 0;border-bottom:none;border-top:1px solid #ced4da}.multiselect__content::webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:.375rem .75rem;min-height:calc(1.5em + 0.75rem + 2px);line-height:calc(1.5em + 0.75rem + 2px)/2;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:calc(1.5em + 0.75rem + 2px);padding-right:12px;padding-left:20px;font-family:inherit;font-size:inherit}.multiselect__option--highlight{background:#6c757d;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#6c757d;color:#fff}.multiselect__option--selected{background:#007bff;color:#fff;font-weight:bold}.multiselect__option--selected:after{content:attr(data-selected);color:silver}.multiselect__option--selected.multiselect__option--highlight{background:#70b5ff;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#70b5ff;content:attr(data-deselect);color:#fff}.multiselect--disabled{background:#e9ecef;pointer-events:none}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select{background:#e9ecef;color:#6c757d}.multiselect__option--disabled{background:#e9ecef;color:#6c757d;cursor:text;pointer-events:none}.multiselect__option--group{background:#e9ecef;color:#6c757d}.multiselect__option--group.multiselect__option--highlight{background:#6c757d;color:#e9ecef}.multiselect__option--group.multiselect__option--highlight:after{background:#6c757d}.multiselect__option--disabled.multiselect__option--highlight{background:#e9ecef}.multiselect__option--group-selected.multiselect__option--highlight{background:#70b5ff;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#70b5ff;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:.375rem;line-height:calc(1.5em + 0.75rem + 2px)/2;display:inline-block;vertical-align:top}.multiselect__spinner{position:absolute;right:0;top:0;width:calc(1.5em + 0.75rem + 2px);height:calc(1.5em + 0.75rem + 2px);background:#fff;display:block}.multiselect__spinner:before,.multiselect__spinner:after{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border:2px solid transparent;border-top-color:#343a40;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:spinning 2.4s cubic-bezier(0.41, 0.26, 0.2, 0.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:spinning 2.4s cubic-bezier(0.51, 0.09, 0.21, 0.8);animation-iteration-count:infinite}@keyframes spinning{from{transform:rotate(0)}to{transform:rotate(2turn)}}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}*[dir=rtl] .multiselect{text-align:right}*[dir=rtl] .multiselect__select{right:auto;left:1px}*[dir=rtl] .multiselect__tags{padding:.375rem .375rem 0 calc(1.5em + 0.75rem + 2px)}*[dir=rtl] .multiselect__content{text-align:right}*[dir=rtl] .multiselect__option:after{right:auto;left:0}*[dir=rtl] .multiselect__clear{right:auto;left:12px}*[dir=rtl] .multiselect__spinner{right:auto;left:1px}/*# sourceMappingURL=multiselect_bootstrap4.css.min.map */ diff --git a/cookbook/static/css/vue-multiselect.min.css b/cookbook/static/css/vue-multiselect.min.css deleted file mode 100644 index f9c50c56..00000000 --- a/cookbook/static/css/vue-multiselect.min.css +++ /dev/null @@ -1 +0,0 @@ -fieldset[disabled] .multiselect{pointer-events:none}.multiselect__spinner{position:absolute;right:1px;top:1px;width:48px;height:35px;background:#fff;display:block}.multiselect__spinner:after,.multiselect__spinner:before{position:absolute;content:"";top:50%;left:50%;margin:-8px 0 0 -8px;width:16px;height:16px;border-radius:100%;border-color:#41b883 transparent transparent;border-style:solid;border-width:2px;box-shadow:0 0 0 1px transparent}.multiselect__spinner:before{animation:a 2.4s cubic-bezier(.41,.26,.2,.62);animation-iteration-count:infinite}.multiselect__spinner:after{animation:a 2.4s cubic-bezier(.51,.09,.21,.8);animation-iteration-count:infinite}.multiselect__loading-enter-active,.multiselect__loading-leave-active{transition:opacity .4s ease-in-out;opacity:1}.multiselect__loading-enter,.multiselect__loading-leave-active{opacity:0}.multiselect,.multiselect__input,.multiselect__single{font-family:inherit;font-size:16px;-ms-touch-action:manipulation;touch-action:manipulation}.multiselect{box-sizing:content-box;display:block;position:relative;width:100%;min-height:40px;text-align:left;color:#35495e}.multiselect *{box-sizing:border-box}.multiselect:focus{outline:none}.multiselect--disabled{opacity:.6}.multiselect--active{z-index:1}.multiselect--active:not(.multiselect--above) .multiselect__current,.multiselect--active:not(.multiselect--above) .multiselect__input,.multiselect--active:not(.multiselect--above) .multiselect__tags{border-bottom-left-radius:0;border-bottom-right-radius:0}.multiselect--active .multiselect__select{transform:rotate(180deg)}.multiselect--above.multiselect--active .multiselect__current,.multiselect--above.multiselect--active .multiselect__input,.multiselect--above.multiselect--active .multiselect__tags{border-top-left-radius:0;border-top-right-radius:0}.multiselect__input,.multiselect__single{position:relative;display:inline-block;min-height:20px;line-height:20px;border:none;border-radius:5px;background:#fff;padding:0 0 0 5px;width:100%;transition:border .1s ease;box-sizing:border-box;margin-bottom:8px;vertical-align:top}.multiselect__input::-webkit-input-placeholder{color:#35495e}.multiselect__input:-ms-input-placeholder{color:#35495e}.multiselect__input::placeholder{color:#35495e}.multiselect__tag~.multiselect__input,.multiselect__tag~.multiselect__single{width:auto}.multiselect__input:hover,.multiselect__single:hover{border-color:#cfcfcf}.multiselect__input:focus,.multiselect__single:focus{border-color:#a8a8a8;outline:none}.multiselect__single{padding-left:5px;margin-bottom:8px}.multiselect__tags-wrap{display:inline}.multiselect__tags{min-height:40px;display:block;padding:8px 40px 0 8px;border-radius:5px;border:1px solid #e8e8e8;background:#fff;font-size:14px}.multiselect__tag{position:relative;display:inline-block;padding:4px 26px 4px 10px;border-radius:5px;margin-right:10px;color:#fff;line-height:1;background:#41b883;margin-bottom:5px;white-space:nowrap;overflow:hidden;max-width:100%;text-overflow:ellipsis}.multiselect__tag-icon{cursor:pointer;margin-left:7px;position:absolute;right:0;top:0;bottom:0;font-weight:700;font-style:normal;width:22px;text-align:center;line-height:22px;transition:all .2s ease;border-radius:5px}.multiselect__tag-icon:after{content:"\D7";color:#266d4d;font-size:14px}.multiselect__tag-icon:focus,.multiselect__tag-icon:hover{background:#369a6e}.multiselect__tag-icon:focus:after,.multiselect__tag-icon:hover:after{color:#fff}.multiselect__current{min-height:40px;overflow:hidden;padding:8px 12px 0;padding-right:30px;white-space:nowrap;border-radius:5px;border:1px solid #e8e8e8}.multiselect__current,.multiselect__select{line-height:16px;box-sizing:border-box;display:block;margin:0;text-decoration:none;cursor:pointer}.multiselect__select{position:absolute;width:40px;height:38px;right:1px;top:1px;padding:4px 8px;text-align:center;transition:transform .2s ease}.multiselect__select:before{position:relative;right:0;top:65%;color:#999;margin-top:4px;border-style:solid;border-width:5px 5px 0;border-color:#999 transparent transparent;content:""}.multiselect__placeholder{color:#adadad;display:inline-block;margin-bottom:10px;padding-top:2px}.multiselect--active .multiselect__placeholder{display:none}.multiselect__content-wrapper{position:absolute;display:block;background:#fff;width:100%;max-height:240px;overflow:auto;border:1px solid #e8e8e8;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;z-index:1;-webkit-overflow-scrolling:touch}.multiselect__content{list-style:none;display:inline-block;padding:0;margin:0;min-width:100%;vertical-align:top}.multiselect--above .multiselect__content-wrapper{bottom:100%;border-bottom-left-radius:0;border-bottom-right-radius:0;border-top-left-radius:5px;border-top-right-radius:5px;border-bottom:none;border-top:1px solid #e8e8e8}.multiselect__content::webkit-scrollbar{display:none}.multiselect__element{display:block}.multiselect__option{display:block;padding:12px;min-height:40px;line-height:16px;text-decoration:none;text-transform:none;vertical-align:middle;position:relative;cursor:pointer;white-space:nowrap}.multiselect__option:after{top:0;right:0;position:absolute;line-height:40px;padding-right:12px;padding-left:20px;font-size:13px}.multiselect__option--highlight{background:#41b883;outline:none;color:#fff}.multiselect__option--highlight:after{content:attr(data-select);background:#41b883;color:#fff}.multiselect__option--selected{background:#f3f3f3;color:#35495e;font-weight:700}.multiselect__option--selected:after{content:attr(data-selected);color:silver}.multiselect__option--selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect--disabled{background:#ededed;pointer-events:none}.multiselect--disabled .multiselect__current,.multiselect--disabled .multiselect__select,.multiselect__option--disabled{background:#ededed;color:#a6a6a6}.multiselect__option--disabled{cursor:text;pointer-events:none}.multiselect__option--group{background:#ededed;color:#35495e}.multiselect__option--group.multiselect__option--highlight{background:#35495e;color:#fff}.multiselect__option--group.multiselect__option--highlight:after{background:#35495e}.multiselect__option--disabled.multiselect__option--highlight{background:#dedede}.multiselect__option--group-selected.multiselect__option--highlight{background:#ff6a6a;color:#fff}.multiselect__option--group-selected.multiselect__option--highlight:after{background:#ff6a6a;content:attr(data-deselect);color:#fff}.multiselect-enter-active,.multiselect-leave-active{transition:all .15s ease}.multiselect-enter,.multiselect-leave-active{opacity:0}.multiselect__strong{margin-bottom:8px;line-height:20px;display:inline-block;vertical-align:top}[dir=rtl] .multiselect{text-align:right}[dir=rtl] .multiselect__select{right:auto;left:1px}[dir=rtl] .multiselect__tags{padding:8px 8px 0 40px}[dir=rtl] .multiselect__content{text-align:right}[dir=rtl] .multiselect__option:after{right:auto;left:0}[dir=rtl] .multiselect__clear{right:auto;left:12px}[dir=rtl] .multiselect__spinner{right:auto;left:1px}@keyframes a{0%{transform:rotate(0)}to{transform:rotate(2turn)}} \ No newline at end of file diff --git a/cookbook/static/js/Sortable.min.js b/cookbook/static/js/Sortable.min.js deleted file mode 100644 index eba06149..00000000 --- a/cookbook/static/js/Sortable.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! Sortable 1.10.2 - MIT | git://github.com/SortableJS/Sortable.git */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function o(t){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function a(){return(a=Object.assign||function(t){for(var e=1;e"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"===e[0]?t.parentNode===n&&h(t,e):h(t,e))||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode)}var i;return null}var f,p=/\s+/g;function k(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(p," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(p," ")}}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function g(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=e.left-n&&r<=e.right+n,i=a>=e.top-n&&a<=e.bottom+n;return n&&o&&i?l=t:void 0}}),l}((t=t.touches?t.touches[0]:t).clientX,t.clientY);if(e){var n={};for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);n.target=n.rootEl=e,n.preventDefault=void 0,n.stopPropagation=void 0,e[j]._onDragOver(n)}}}function kt(t){z&&z.parentNode[j]._isOutsideThisEl(t.target)}function Rt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Rt.supportPointer&&"PointerEvent"in window,emptyInsertThreshold:5};for(var o in O.initializePlugins(this,t,n),n)o in e||(e[o]=n[o]);for(var i in At(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&xt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?u(t,"pointerdown",this._onTapStart):(u(t,"mousedown",this._onTapStart),u(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(u(t,"dragover",this),u(t,"dragenter",this)),bt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,T())}function Xt(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||w||E?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),d&&(c=d.call(u,s,a)),c}function Yt(t){t.draggable=!1}function Bt(){Dt=!1}function Ft(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function Ht(t){return setTimeout(t,0)}function Lt(t){return clearTimeout(t)}Rt.prototype={constructor:Rt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(ht=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,z):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(function(t){St.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&St.push(o)}}(o),!z&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled||s.isContentEditable||(l=P(l,t.draggable,o,!1))&&l.animated||Z===l)){if(J=F(l),et=F(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return W({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),K("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return W({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),K("filter",n,{evt:e}),!0})))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;if(n&&!z&&n.parentNode===r){var s=X(n);if(q=r,G=(z=n).parentNode,V=z.nextSibling,Z=n,ot=a.group,rt={target:Rt.dragged=z,clientX:(e||t).clientX,clientY:(e||t).clientY},ct=rt.clientX-s.left,ut=rt.clientY-s.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,z.style["will-change"]="all",o=function(){K("delayEnded",i,{evt:t}),Rt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&(z.draggable=!0),i._triggerDragStart(t,e),W({sortable:i,name:"choose",originalEvent:t}),k(z,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){g(z,t.trim(),Yt)}),u(l,"dragover",Pt),u(l,"mousemove",Pt),u(l,"touchmove",Pt),u(l,"mouseup",i._onDrop),u(l,"touchend",i._onDrop),u(l,"touchcancel",i._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,z.draggable=!0),K("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(E||w))o();else{if(Rt.eventCanceled)return void this._onDrop();u(l,"mouseup",i._disableDelayedDrag),u(l,"touchend",i._disableDelayedDrag),u(l,"touchcancel",i._disableDelayedDrag),u(l,"mousemove",i._delayedDragTouchMoveHandler),u(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&u(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){z&&Yt(z),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;d(t,"mouseup",this._disableDelayedDrag),d(t,"touchend",this._disableDelayedDrag),d(t,"touchcancel",this._disableDelayedDrag),d(t,"mousemove",this._delayedDragTouchMoveHandler),d(t,"touchmove",this._delayedDragTouchMoveHandler),d(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?u(document,"pointermove",this._onTouchMove):u(document,e?"touchmove":"mousemove",this._onTouchMove):(u(z,"dragend",this),u(q,"dragstart",this._onDragStart));try{document.selection?Ht(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(vt=!1,q&&z){K("dragStarted",this,{evt:e}),this.nativeDraggable&&u(document,"dragover",kt);var n=this.options;t||k(z,n.dragClass,!1),k(z,n.ghostClass,!0),Rt.active=this,t&&this._appendGhost(),W({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Nt();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY))!==e;)e=t;if(z.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){if(e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);It()}},_onTouchMove:function(t){if(rt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=U&&v(U,!0),a=U&&r&&r.a,l=U&&r&&r.d,s=Ct&>&&b(gt),c=(i.clientX-rt.clientX+o.x)/(a||1)+(s?s[0]-Et[0]:0)/(a||1),u=(i.clientY-rt.clientY+o.y)/(l||1)+(s?s[1]-Et[1]:0)/(l||1);if(!Rt.active&&!vt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||t.clientX<=o.right&&t.clientY>o.bottom&&t.clientX>=o.left:t.clientX>o.right&&t.clientY>o.top||t.clientX<=o.right&&t.clientY>o.bottom+10}(n,a,this)&&!g.animated){if(g===z)return A(!1);if(g&&l===n.target&&(s=g),s&&(i=X(s)),!1!==Xt(q,l,z,o,s,i,n,!!s))return O(),l.appendChild(z),G=l,N(),A(!0)}else if(s.parentNode===l){i=X(s);var v,m,b,y=z.parentNode!==l,w=!function(t,e,n){var o=n?t.left:t.top,i=n?t.right:t.bottom,r=n?t.width:t.height,a=n?e.left:e.top,l=n?e.right:e.bottom,s=n?e.width:e.height;return o===a||i===l||o+r/2===a+s/2}(z.animated&&z.toRect||o,s.animated&&s.toRect||i,a),E=a?"top":"left",D=Y(s,"top","top")||Y(z,"top","top"),S=D?D.scrollTop:void 0;if(ht!==s&&(m=i[E],yt=!1,wt=!w&&e.invertSwap||y),0!==(v=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,u=o?n.top:n.left,d=o?n.bottom:n.right,h=!1;if(!a)if(l&&pt { diff --git a/cookbook/static/js/frac.js b/cookbook/static/js/frac.js deleted file mode 100644 index 40f21767..00000000 --- a/cookbook/static/js/frac.js +++ /dev/null @@ -1,43 +0,0 @@ -/* frac.js (C) 2012-present SheetJS -- http://sheetjs.com */ -/*https://developer.aliyun.com/mirror/npm/package/frac/v/0.3.0 Apache license*/ -var frac = function frac(x, D, mixed) { - var n1 = Math.floor(x), d1 = 1; - var n2 = n1+1, d2 = 1; - if(x !== n1) while(d1 <= D && d2 <= D) { - var m = (n1 + n2) / (d1 + d2); - if(x === m) { - if(d1 + d2 <= D) { d1+=d2; n1+=n2; d2=D+1; } - else if(d1 > d2) d2=D+1; - else d1=D+1; - break; - } - else if(x < m) { n2 = n1+n2; d2 = d1+d2; } - else { n1 = n1+n2; d1 = d1+d2; } - } - if(d1 > D) { d1 = d2; n1 = n2; } - if(!mixed) return [0, n1, d1]; - var q = Math.floor(n1/d1); - return [q, n1 - q*d1, d1]; -}; -frac.cont = function cont(x, D, mixed) { - var sgn = x < 0 ? -1 : 1; - var B = x * sgn; - var P_2 = 0, P_1 = 1, P = 0; - var Q_2 = 1, Q_1 = 0, Q = 0; - var A = Math.floor(B); - while(Q_1 < D) { - A = Math.floor(B); - P = A * P_1 + P_2; - Q = A * Q_1 + Q_2; - if((B - A) < 0.00000005) break; - B = 1 / (B - A); - P_2 = P_1; P_1 = P; - Q_2 = Q_1; Q_1 = Q; - } - if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } } - if(!mixed) return [0, sgn * P, Q]; - var q = Math.floor(sgn * P/Q); - return [q, sgn*P - q*Q, Q]; -}; -// eslint-disable-next-line no-undef -if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_FRAC === 'undefined') module.exports = frac; diff --git a/cookbook/static/js/vue.min.js b/cookbook/static/js/vue.min.js deleted file mode 100644 index 41094e00..00000000 --- a/cookbook/static/js/vue.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Vue.js v2.6.12 - * (c) 2014-2020 Evan You - * Released under the MIT License. - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Vue=t()}(this,function(){"use strict";var e=Object.freeze({});function t(e){return null==e}function n(e){return null!=e}function r(e){return!0===e}function i(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function o(e){return null!==e&&"object"==typeof e}var a=Object.prototype.toString;function s(e){return"[object Object]"===a.call(e)}function c(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function l(e){return null==e?"":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():""})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\B([A-Z])/g,C=g(function(e){return e.replace(w,"-$1").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf("edge/")>0,G=(J&&J.indexOf("android"),J&&/iphone|ipad|ipod|ios/.test(J)||"ios"===K),X=(J&&/chrome\/\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\/(\d+)/)),Y={}.watch,Q=!1;if(z)try{var ee={};Object.defineProperty(ee,"passive",{get:function(){Q=!0}}),window.addEventListener("test-passive",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!z&&!V&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),B},ne=z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return"function"==typeof e&&/native code/.test(e.toString())}var ie,oe="undefined"!=typeof Symbol&&re(Symbol)&&"undefined"!=typeof Reflect&&re(Reflect.ownKeys);ie="undefined"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,"default"))a=!1;else if(""===a||a===C(e)){var c=Pe(String,i.type);(c<0||s0&&(st((u=e(u,(a||"")+"_"+c))[0])&&st(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?st(f)?s[l]=he(f.text+u):""!==u&&s.push(he(u)):st(u)&&st(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key="__vlist"+a+"_"+c+"__"),s.push(u)));return s}(e):void 0}function st(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&"$"!==c[0]&&(i[c]=pt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=dt(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,"$stable",a),R(i,"$key",s),R(i,"$hasNormal",o),i}function pt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:at(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function dt(e,t){return function(){return e[t]}}function vt(e,t){var r,i,a,s,c;if(Array.isArray(e)||"string"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent("Event").timeStamp&&(sn=function(){return cn.now()})}function un(){var e,t;for(an=sn(),rn=!0,Qt.sort(function(e,t){return e.id-t.id}),on=0;onon&&Qt[n].id>e.id;)n--;Qt.splice(n+1,0,e)}else Qt.push(e);nn||(nn=!0,Ye(un))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var pn={enumerable:!0,configurable:!0,get:S,set:S};function dn(e,t,n){pn.get=function(){return this[t][n]},pn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,pn)}function vn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);xe(r,o,a),o in e||dn(e,"_props",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data="function"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return Re(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&dn(e,"_data",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;r||(n[i]=new fn(e,a||S,S,hn)),i in e||mn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:"string"==typeof e?e.split(",").indexOf(t)>-1:(n=e,"[object RegExp]"===a.call(n)&&e.test(t));var n}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=xn(a.componentOptions);s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=bn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De($n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&qt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=ut(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Pt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Pt(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,"$attrs",o&&o.attrs||e,null,!0),xe(t,"$listeners",n._parentListeners||e,null,!0)}(n),Yt(n,"beforeCreate"),function(e){var t=ct(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),vn(n),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(n),Yt(n,"created"),n.$options.el&&n.$mount(n.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return _n(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Re(e,this,'callback for immediate watcher "'+r.expression+'"')}return function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for "'+e+'"',i=0,o=t.length;iparseInt(this.max)&&On(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,"config",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Ye,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),M.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,A(e.options.components,Tn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Cn(e),function(e){M.forEach(function(t){e[t]=function(e,n){return n?("component"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}})}(e)}(wn),Object.defineProperty(wn.prototype,"$isServer",{get:te}),Object.defineProperty(wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,"FunctionalRenderContext",{value:Tt}),wn.version="2.6.12";var En=p("style,class"),Nn=p("input,textarea,option,select,progress"),jn=function(e,t,n){return"value"===n&&Nn(e)&&"button"!==t||"selected"===n&&"option"===e||"checked"===n&&"input"===e||"muted"===n&&"video"===e},Dn=p("contenteditable,draggable,spellcheck"),Ln=p("events,caret,typing,plaintext-only"),Mn=function(e,t){return Hn(t)||"false"===t?"false":"contenteditable"===e&&Ln(t)?t:"true"},In=p("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),Fn="http://www.w3.org/1999/xlink",Pn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Rn=function(e){return Pn(e)?e.slice(6,e.length):""},Hn=function(e){return null==e||!1===e};function Bn(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Un(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Un(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Vn(t));return""}(t.staticClass,t.class)}function Un(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+" "+t:e:t||""}function Vn(e){return Array.isArray(e)?function(e){for(var t,r="",i=0,o=e.length;i-1?hr(e,t,n):In(t)?Hn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Dn(t)?e.setAttribute(t,Mn(t,n)):Pn(t)?Hn(n)?e.removeAttributeNS(Fn,Rn(t)):e.setAttributeNS(Fn,t,n):hr(e,t,n)}function hr(e,t,n){if(Hn(n))e.removeAttribute(t);else{if(q&&!W&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var mr={create:dr,update:dr};function yr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Bn(r),c=i._transitionClasses;n(c)&&(s=zn(s,Vn(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}var gr,_r,br,$r,wr,Cr,xr={create:yr,update:yr},kr=/[\w).+\-_$\]]/;function Ar(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&" "===(h=e.charAt(v));v--);h&&kr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,$r),key:'"'+e.slice($r+1)+'"'}:{exp:e,key:null};_r=e,$r=wr=Cr=0;for(;!zr();)Vr(br=Ur())?Jr(br):91===br&&Kr(br);return{exp:e.slice(0,wr),key:e.slice(wr+1,Cr)}}(e);return null===n.key?e+"="+t:"$set("+n.exp+", "+n.key+", "+t+")"}function Ur(){return _r.charCodeAt(++$r)}function zr(){return $r>=gr}function Vr(e){return 34===e||39===e}function Kr(e){var t=1;for(wr=$r;!zr();)if(Vr(e=Ur()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){Cr=$r;break}}function Jr(e){for(var t=e;!zr()&&(e=Ur())!==t;);}var qr,Wr="__r",Zr="__c";function Gr(e,t,n){var r=qr;return function i(){null!==t.apply(null,arguments)&&Qr(e,i,n,r)}}var Xr=Ve&&!(X&&Number(X[1])<=53);function Yr(e,t,n,r){if(Xr){var i=an,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}qr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function Qr(e,t,n,r){(r||qr).removeEventListener(e,t._wrapper||t,n)}function ei(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};qr=r.elm,function(e){if(n(e[Wr])){var t=q?"change":"input";e[t]=[].concat(e[Wr],e[t]||[]),delete e[Wr]}n(e[Zr])&&(e.change=[].concat(e[Zr],e.change||[]),delete e[Zr])}(i),rt(i,o,Yr,Qr,Gr,r.context),qr=void 0}}var ti,ni={create:ei,update:ei};function ri(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]="");for(i in c){if(o=c[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i&&"PROGRESS"!==a.tagName){a._value=o;var u=t(o)?"":String(o);ii(a,u)&&(a.value=u)}else if("innerHTML"===i&&qn(a.tagName)&&t(a.innerHTML)){(ti=ti||document.createElement("div")).innerHTML=""+o+"";for(var l=ti.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function ii(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var oi={create:ri,update:ri},ai=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function si(e){var t=ci(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ci(e){return Array.isArray(e)?O(e):"string"==typeof e?ai(e):e}var ui,li=/^--/,fi=/\s*!important$/,pi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(fi.test(n))e.style.setProperty(C(t),n.replace(fi,""),"important");else{var r=vi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(yi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(yi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function bi(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&A(t,$i(e.name||"v")),A(t,e),t}return"string"==typeof e?$i(e):void 0}}var $i=g(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}}),wi=z&&!W,Ci="transition",xi="animation",ki="transition",Ai="transitionend",Oi="animation",Si="animationend";wi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ki="WebkitTransition",Ai="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi="WebkitAnimation",Si="webkitAnimationEnd"));var Ti=z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ti(function(){Ti(e)})}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gi(e,t))}function ji(e,t){e._transitionClasses&&h(e._transitionClasses,t),_i(e,t)}function Di(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ci?Ai:Si,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ci,l=a,f=o.length):t===xi?u>0&&(n=xi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ci:xi:null)?n===Ci?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ci&&Li.test(r[ki+"Property"])}}function Ii(e,t){for(;e.length1}function Ui(e,t){!0!==t.data.show&&Pi(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,""),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,""):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(N(Wi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function qi(e,t){return t.every(function(t){return!N(t,e)})}function Wi(e){return"_value"in e?e._value:e.value}function Zi(e){e.target.composing=!0}function Gi(e){e.target.composing&&(e.target.composing=!1,Xi(e.target,"input"))}function Xi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Yi(e){return!e.componentInstance||e.data&&e.data.transition?e:Yi(e.componentInstance._vnode)}var Qi={model:Vi,show:{bind:function(e,t,n){var r=t.value,i=(n=Yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,Pi(n,function(){e.style.display=o})):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Yi(n)).data&&n.data.transition?(n.data.show=!0,r?Pi(n,function(){e.style.display=e.__vOriginalDisplay}):Ri(n,function(){e.style.display="none"})):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},eo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function to(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?to(zt(t.children)):e}function no(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function ro(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var io=function(e){return e.tag||Ut(e)},oo=function(e){return"show"===e.name},ao={name:"transition",props:eo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(io)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=to(o);if(!a)return o;if(this._leaving)return ro(e,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=no(this),u=this._vnode,l=to(u);if(a.data.directives&&a.data.directives.some(oo)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!Ut(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if("out-in"===r)return this._leaving=!0,it(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),ro(e,o);if("in-out"===r){if(Ut(a))return u;var p,d=function(){p()};it(c,"afterEnter",d),it(c,"enterCancelled",d),it(f,"delayLeave",function(e){p=e})}}return o}}},so=A({tag:String,moveClass:String},eo);function co(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function uo(e){e.data.newPos=e.elm.getBoundingClientRect()}function lo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete so.mode;var fo={Transition:ao,TransitionGroup:{props:so,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Zt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=no(this),s=0;s-1?Gn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Gn[e]=/HTMLUnknownElement/.test(t.toString())},A(wn.options.directives,Qi),A(wn.options.components,fo),wn.prototype.__patch__=z?zi:S,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Yt(e,"beforeMount"),r=function(){e._update(e._render(),n)},new fn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Yt(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Yt(e,"mounted")),e}(this,e=e&&z?Yn(e):void 0,t)},z&&setTimeout(function(){F.devtools&&ne&&ne.emit("init",wn)},0);var po=/\{\{((?:.|\r?\n)+?)\}\}/g,vo=/[-.*+?^${}()|[\]\/\\]/g,ho=g(function(e){var t=e[0].replace(vo,"\\$&"),n=e[1].replace(vo,"\\$&");return new RegExp(t+"((?:.|\\n)+?)"+n,"g")});var mo={staticKeys:["staticClass"],transformNode:function(e,t){t.warn;var n=Fr(e,"class");n&&(e.staticClass=JSON.stringify(n));var r=Ir(e,"class",!1);r&&(e.classBinding=r)},genData:function(e){var t="";return e.staticClass&&(t+="staticClass:"+e.staticClass+","),e.classBinding&&(t+="class:"+e.classBinding+","),t}};var yo,go={staticKeys:["staticStyle"],transformNode:function(e,t){t.warn;var n=Fr(e,"style");n&&(e.staticStyle=JSON.stringify(ai(n)));var r=Ir(e,"style",!1);r&&(e.styleBinding=r)},genData:function(e){var t="";return e.staticStyle&&(t+="staticStyle:"+e.staticStyle+","),e.styleBinding&&(t+="style:("+e.styleBinding+"),"),t}},_o=function(e){return(yo=yo||document.createElement("div")).innerHTML=e,yo.textContent},bo=p("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),$o=p("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),wo=p("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),Co=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,xo=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,ko="[a-zA-Z_][\\-\\.0-9_a-zA-Z"+P.source+"]*",Ao="((?:"+ko+"\\:)?"+ko+")",Oo=new RegExp("^<"+Ao),So=/^\s*(\/?)>/,To=new RegExp("^<\\/"+Ao+"[^>]*>"),Eo=/^]+>/i,No=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},Io=/&(?:lt|gt|quot|amp|#39);/g,Fo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Po=p("pre,textarea",!0),Ro=function(e,t){return e&&Po(e)&&"\n"===t[0]};function Ho(e,t){var n=t?Fo:Io;return e.replace(n,function(e){return Mo[e]})}var Bo,Uo,zo,Vo,Ko,Jo,qo,Wo,Zo=/^@|^v-on:/,Go=/^v-|^@|^:|^#/,Xo=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,Yo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Qo=/^\(|\)$/g,ea=/^\[.*\]$/,ta=/:(.*)$/,na=/^:|^\.|^v-bind:/,ra=/\.[^.\]]+(?=[^\]]*$)/g,ia=/^v-slot(:|$)|^#/,oa=/[\r\n]/,aa=/\s+/g,sa=g(_o),ca="_empty_";function ua(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ma(t),rawAttrsMap:{},parent:n,children:[]}}function la(e,t){Bo=t.warn||Sr,Jo=t.isPreTag||T,qo=t.mustUseProp||T,Wo=t.getTagNamespace||T;t.isReservedTag;zo=Tr(t.modules,"transformNode"),Vo=Tr(t.modules,"preTransformNode"),Ko=Tr(t.modules,"postTransformNode"),Uo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=fa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&da(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&da(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'"default"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),Jo(e.tag)&&(c=!1);for(var f=0;f]*>)","i")),p=e.replace(f,function(e,n,r){return u=r.length,Do(l)||"noscript"===l||(n=n.replace(//g,"$1").replace(//g,"$1")),Ro(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),""});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf("<");if(0===d){if(No.test(e)){var v=e.indexOf("--\x3e");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(jo.test(e)){var h=e.indexOf("]>");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(To);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ro(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(To.test($)||Oo.test($)||No.test($)||jo.test($)||(w=$.indexOf("<",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(Oo);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(So))&&(r=e.match(xo)||e.match(Co));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&("p"===r&&wo(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else"br"===s?t.start&&t.start(e,[],!0,n,o):"p"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Bo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Wo(e);q&&"svg"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Ar(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c-1"+("true"===o?":("+t+")":":_q("+t+","+o+")")),Mr(e,"change","var $$a="+t+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+Br(t,"$$a.concat([$$v])")+")}else{$$i>-1&&("+Br(t,"$$a.slice(0,$$i).concat($$a.slice($$i+1))")+")}}else{"+Br(t,"$$c")+"}",null,!0)}(e,r,i);else if("input"===o&&"radio"===a)!function(e,t,n){var r=n&&n.number,i=Ir(e,"value")||"null";Er(e,"checked","_q("+t+","+(i=r?"_n("+i+")":i)+")"),Mr(e,"change",Br(t,i),null,!0)}(e,r,i);else if("input"===o||"textarea"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Wr:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=Br(t,l);c&&(f="if($event.target.composing)return;"+f),Er(e,"value","("+t+")"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,"blur","$forceUpdate()")}(e,r,i);else if(!F.isReservedTag(o))return Hr(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,"textContent","_s("+t.value+")",t)},html:function(e,t){t.value&&Er(e,"innerHTML","_s("+t.value+")",t)}},isPreTag:function(e){return"pre"===e},isUnaryTag:bo,mustUseProp:jn,canBeLeftOpenTag:$o,isReservedTag:Wn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(",")}(ba)},xa=g(function(e){return p("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(e?","+e:""))});function ka(e,t){e&&($a=xa(t.staticKeys||""),wa=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!wa(e.tag)||function(e){for(;e.parent;){if("template"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every($a)))}(t);if(1===t.type){if(!wa(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var n=0,r=t.children.length;n|^function(?:\s+[\w$]+)?\s*\(/,Oa=/\([^)]*?\);*$/,Sa=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,Ta={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},Na=function(e){return"if("+e+")return null;"},ja={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:Na("$event.target !== $event.currentTarget"),ctrl:Na("!$event.ctrlKey"),shift:Na("!$event.shiftKey"),alt:Na("!$event.altKey"),meta:Na("!$event.metaKey"),left:Na("'button' in $event && $event.button !== 0"),middle:Na("'button' in $event && $event.button !== 1"),right:Na("'button' in $event && $event.button !== 2")};function Da(e,t){var n=t?"nativeOn:":"on:",r="",i="";for(var o in e){var a=La(e[o]);e[o]&&e[o].dynamic?i+=o+","+a+",":r+='"'+o+'":'+a+","}return r="{"+r.slice(0,-1)+"}",i?n+"_d("+r+",["+i.slice(0,-1)+"])":n+r}function La(e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return La(e)}).join(",")+"]";var t=Sa.test(e.value),n=Aa.test(e.value),r=Sa.test(e.value.replace(Oa,""));if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Ta[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=Na(["ctrl","shift","alt","meta"].filter(function(e){return!c[e]}).map(function(e){return"$event."+e+"Key"}).join("||"))}else a.push(s);return a.length&&(i+=function(e){return"if(!$event.type.indexOf('key')&&"+e.map(Ma).join("&&")+")return null;"}(a)),o&&(i+=o),"function($event){"+i+(t?"return "+e.value+"($event)":n?"return ("+e.value+")($event)":r?"return "+e.value:e.value)+"}"}return t||n?e.value:"function($event){"+(r?"return "+e.value:e.value)+"}"}function Ma(e){var t=parseInt(e,10);if(t)return"$event.keyCode!=="+t;var n=Ta[e],r=Ea[e];return"_k($event.keyCode,"+JSON.stringify(e)+","+JSON.stringify(n)+",$event.key,"+JSON.stringify(r)+")"}var Ia={on:function(e,t){e.wrapListeners=function(e){return"_g("+e+","+t.value+")"}},bind:function(e,t){e.wrapData=function(n){return"_b("+n+",'"+e.tag+"',"+t.value+","+(t.modifiers&&t.modifiers.prop?"true":"false")+(t.modifiers&&t.modifiers.sync?",true":"")+")"}},cloak:S},Fa=function(e){this.options=e,this.warn=e.warn||Sr,this.transforms=Tr(e.modules,"transformCode"),this.dataGenFns=Tr(e.modules,"genData"),this.directives=A(A({},Ia),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Pa(e,t){var n=new Fa(t);return{render:"with(this){return "+(e?Ra(e,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function Ra(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ha(e,t);if(e.once&&!e.onceProcessed)return Ba(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Ua(e,t);if("template"!==e.tag||e.slotTarget||t.pre){if("slot"===e.tag)return function(e,t){var n=e.slotName||'"default"',r=qa(e,t),i="_t("+n+(r?","+r:""),o=e.attrs||e.dynamicAttrs?Ga((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:qa(t,n,!0);return"_c("+e+","+Va(t,n)+(r?","+r:"")+")"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Va(e,t));var i=e.inlineTemplate?null:qa(e,t,!0);n="_c('"+e.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o>>0}(a):"")+")"}(e,e.scopedSlots,t)+","),e.model&&(n+="model:{value:"+e.model.value+",callback:"+e.model.callback+",expression:"+e.model.expression+"},"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Pa(n,t.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(e){return"function(){"+e+"}"}).join(",")+"]}"}}(e,t);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",e.dynamicAttrs&&(n="_b("+n+',"'+e.tag+'",'+Ga(e.dynamicAttrs)+")"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ka(e){return 1===e.type&&("slot"===e.tag||e.children.some(Ka))}function Ja(e,t){var n=e.attrsMap["slot-scope"];if(e.if&&!e.ifProcessed&&!n)return Ua(e,t,Ja,"null");if(e.for&&!e.forProcessed)return za(e,t,Ja);var r=e.slotScope===ca?"":String(e.slotScope),i="function("+r+"){return "+("template"===e.tag?e.if&&n?"("+e.if+")?"+(qa(e,t)||"undefined")+":undefined":qa(e,t)||"undefined":Ra(e,t))+"}",o=r?"":",proxy:true";return"{key:"+(e.slotTarget||'"default"')+",fn:"+i+o+"}"}function qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag){var s=n?t.maybeComponent(a)?",1":",0":"";return""+(r||Ra)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
',ts.innerHTML.indexOf(" ")>0}var os=!!z&&is(!1),as=!!z&&is(!0),ss=g(function(e){var t=Yn(e);return t&&t.innerHTML}),cs=wn.prototype.$mount;return wn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ss(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement("div");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=rs(r,{outputSourceRange:!1,shouldDecodeNewlines:os,shouldDecodeNewlinesForHref:as,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return cs.call(this,e,t)},wn.compile=rs,wn}); \ No newline at end of file diff --git a/cookbook/static/js/vuedraggable.umd.min.js.map b/cookbook/static/js/vuedraggable.umd.min.js.map deleted file mode 100644 index 15751dea..00000000 --- a/cookbook/static/js/vuedraggable.umd.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://vuedraggable/webpack/universalModuleDefinition","webpack://vuedraggable/webpack/bootstrap","webpack://vuedraggable/./node_modules/core-js/modules/_string-at.js","webpack://vuedraggable/./node_modules/core-js/modules/_advance-string-index.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_has.js","webpack://vuedraggable/./node_modules/core-js/modules/_flags.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_to-absolute-index.js","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.string.iterator.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_enum-bug-keys.js","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.array.is-array.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_to-primitive.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_dom-create.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_create-property.js","webpack://vuedraggable/./node_modules/core-js/modules/_fix-re-wks.js","webpack://vuedraggable/./node_modules/core-js/modules/_dom-create.js","webpack://vuedraggable/./node_modules/core-js/modules/_classof.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_to-object.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_defined.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_fails.js","webpack://vuedraggable/./node_modules/core-js/modules/_redefine.js","webpack://vuedraggable/./node_modules/core-js/modules/_wks.js","webpack://vuedraggable/./node_modules/core-js/modules/_library.js","webpack://vuedraggable/./node_modules/core-js/modules/_cof.js","webpack://vuedraggable/./node_modules/core-js/modules/es6.string.includes.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iter-define.js","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.object.keys.js","webpack://vuedraggable/./node_modules/core-js/modules/_hide.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_html.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iobject.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-pie.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_hide.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_to-iobject.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_is-array-iter.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_to-integer.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_classof.js","webpack://vuedraggable/./node_modules/core-js/modules/_to-integer.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_set-to-string-tag.js","webpack://vuedraggable/./node_modules/core-js/modules/_property-desc.js","webpack://vuedraggable/./node_modules/core-js/library/fn/get-iterator.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iterators.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/object/create.js","webpack://vuedraggable/./node_modules/core-js/modules/_to-object.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iter-detect.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iter-step.js","webpack://vuedraggable/./node_modules/core-js/modules/_fails-is-regexp.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_wks.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/object/assign.js","webpack://vuedraggable/./node_modules/core-js/library/fn/object/assign.js","webpack://vuedraggable/./node_modules/core-js/modules/_regexp-exec.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-gpo.js","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.array.from.js","webpack://vuedraggable/./node_modules/core-js/library/fn/is-iterable.js","webpack://vuedraggable/./node_modules/core-js/modules/_shared.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_shared-key.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_core.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_array-includes.js","webpack://vuedraggable/./node_modules/core-js/modules/_export.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/get-iterator.js","webpack://vuedraggable/./node_modules/core-js/modules/_regexp-exec-abstract.js","webpack://vuedraggable/./node_modules/core-js/modules/_iobject.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_uid.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_export.js","webpack://vuedraggable/./node_modules/core-js/modules/es7.array.includes.js","webpack://vuedraggable/./node_modules/core-js/modules/_to-iobject.js","webpack://vuedraggable/./node_modules/core-js/modules/_has.js","webpack://vuedraggable/./node_modules/core-js/modules/_to-primitive.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_cof.js","webpack://vuedraggable/./node_modules/core-js/library/modules/web.dom.iterable.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_string-at.js","webpack://vuedraggable/./node_modules/core-js/modules/_global.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/array/from.js","webpack://vuedraggable/./node_modules/core-js/modules/_to-absolute-index.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_ie8-dom-define.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_a-function.js","webpack://vuedraggable/./node_modules/core-js/modules/_fails.js","webpack://vuedraggable/./node_modules/core-js/library/modules/core.get-iterator-method.js","webpack://vuedraggable/./node_modules/core-js/library/modules/core.get-iterator.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-dps.js","webpack://vuedraggable/./node_modules/core-js/modules/_core.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_add-to-unscopables.js","webpack://vuedraggable/./node_modules/core-js/modules/_object-dp.js","webpack://vuedraggable/./node_modules/core-js/library/fn/object/keys.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_descriptors.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iter-create.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_is-array.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_redefine.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-assign.js","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.object.create.js","webpack://vuedraggable/./node_modules/core-js/library/modules/core.is-iterable.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-gops.js","webpack://vuedraggable/./node_modules/core-js/modules/_ctx.js","webpack://vuedraggable/./node_modules/core-js/modules/_add-to-unscopables.js","webpack://vuedraggable/./node_modules/core-js/modules/_to-length.js","webpack://vuedraggable/./node_modules/core-js/modules/_descriptors.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-create.js","webpack://vuedraggable/external {\"commonjs\":\"sortablejs\",\"commonjs2\":\"sortablejs\",\"amd\":\"sortablejs\",\"root\":\"Sortable\"}","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.object.assign.js","webpack://vuedraggable/./node_modules/core-js/modules/es6.regexp.replace.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/object/keys.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js","webpack://vuedraggable/./node_modules/core-js/modules/_is-regexp.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_property-desc.js","webpack://vuedraggable/./node_modules/core-js/modules/es6.regexp.exec.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_iter-call.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_to-length.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_library.js","webpack://vuedraggable/./node_modules/core-js/modules/_defined.js","webpack://vuedraggable/./node_modules/core-js/modules/_array-includes.js","webpack://vuedraggable/./node_modules/core-js/library/modules/es6.array.iterator.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-keys.js","webpack://vuedraggable/./src/util/helper.js","webpack://vuedraggable/./node_modules/core-js/modules/_ie8-dom-define.js","webpack://vuedraggable/(webpack)/buildin/global.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/core-js/is-iterable.js","webpack://vuedraggable/./node_modules/core-js/modules/_uid.js","webpack://vuedraggable/./node_modules/core-js/modules/_an-object.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-sap.js","webpack://vuedraggable/./node_modules/core-js/modules/_string-context.js","webpack://vuedraggable/./node_modules/core-js/library/fn/array/from.js","webpack://vuedraggable/./node_modules/core-js/modules/_is-object.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_ctx.js","webpack://vuedraggable/./node_modules/core-js/modules/_a-function.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-dp.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_shared.js","webpack://vuedraggable/./node_modules/core-js/library/fn/object/create.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_an-object.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_global.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_object-keys-internal.js","webpack://vuedraggable/./node_modules/core-js/library/fn/array/is-array.js","webpack://vuedraggable/./node_modules/core-js/modules/es6.string.starts-with.js","webpack://vuedraggable/./node_modules/core-js/library/modules/_is-object.js","webpack://vuedraggable/./node_modules/core-js/modules/_function-to-string.js","webpack://vuedraggable/./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/arrayWithHoles.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/iterableToArrayLimit.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/nonIterableRest.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/slicedToArray.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/arrayWithoutHoles.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/iterableToArray.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/nonIterableSpread.js","webpack://vuedraggable/./node_modules/@babel/runtime-corejs2/helpers/esm/toConsumableArray.js","webpack://vuedraggable/./src/vuedraggable.js","webpack://vuedraggable/./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE_a352__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","toInteger","defined","TO_STRING","that","pos","a","b","String","length","undefined","charCodeAt","charAt","slice","at","S","index","unicode","it","anObject","result","global","ignoreCase","multiline","sticky","max","Math","min","$at","iterated","_t","_i","point","O","done","split","$export","isArray","isObject","fn","val","toString","valueOf","TypeError","document","is","createElement","$defineProperty","createDesc","f","redefine","hide","fails","wks","regexpExec","SPECIES","REPLACE_SUPPORTS_NAMED_GROUPS","re","exec","groups","replace","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","apply","arguments","KEY","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","constructor","nativeRegExpMethod","fns","nativeMethod","regexp","str","arg2","forceStringMethod","strfn","rxfn","RegExp","string","arg","cof","TAG","ARG","tryGet","e","T","B","callee","has","SRC","$toString","TPL","inspectSource","safe","isFunction","join","Function","store","uid","USE_SYMBOL","$exports","context","INCLUDES","P","F","includes","searchString","indexOf","LIBRARY","Iterators","$iterCreate","setToStringTag","getPrototypeOf","ITERATOR","BUGGY","keys","FF_ITERATOR","KEYS","VALUES","returnThis","Base","NAME","Constructor","next","DEFAULT","IS_SET","FORCED","methods","IteratorPrototype","getMethod","kind","proto","DEF_VALUES","VALUES_BUG","$native","$default","$entries","$anyNative","entries","values","toObject","$keys","dP","documentElement","propertyIsEnumerable","IObject","ArrayProto","Array","ceil","floor","isNaN","def","tag","stat","configurable","bitmap","writable","SAFE_CLOSING","riter","from","skipClosing","arr","iter","MATCH","assign","regexpFlags","nativeExec","nativeReplace","patchedExec","LAST_INDEX","UPDATES_LAST_INDEX_WRONG","re1","re2","NPCG_INCLUDED","PATCH","lastIndex","reCopy","match","source","IE_PROTO","ObjectProto","ctx","isArrayIter","toLength","createProperty","getIterFn","arrayLike","step","iterator","C","aLen","mapfn","mapping","iterFn","core","SHARED","push","version","copyright","shared","__e","toIObject","toAbsoluteIndex","IS_INCLUDES","$this","el","fromIndex","PROTOTYPE","type","own","out","exp","IS_FORCED","IS_GLOBAL","G","IS_STATIC","IS_PROTO","IS_BIND","target","expProto","U","W","R","classof","builtinExec","id","px","random","concat","IS_WRAP","virtual","$includes","TO_STRING_TAG","DOMIterables","Collection","window","__g","getIteratorMethod","getIterator","getKeys","defineProperties","Properties","IE8_DOM_DEFINE","toPrimitive","Attributes","descriptor","gOPS","pIE","$assign","A","K","forEach","k","getSymbols","isEnum","j","isIterable","getOwnPropertySymbols","aFunction","UNSCOPABLES","dPs","enumBugKeys","Empty","createDict","iframeDocument","iframe","lt","gt","style","display","appendChild","src","contentWindow","open","write","close","advanceStringIndex","regExpExec","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","REPLACE","$replace","maybeCallNative","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","matchStr","accumulatedResult","nextSourcePosition","matched","position","captures","namedCaptures","replacerArgs","replacement","getSubstitution","tailPos","symbols","ch","capture","isRegExp","forced","ret","addToUnscopables","_k","Arguments","getConsole","console","cached","cache","F_source_vuedraggable_node_modules_babel_runtime_corejs2_core_js_object_create__WEBPACK_IMPORTED_MODULE_1___default","hit","regex","camelize","_","toUpperCase","removeNode","node","parentElement","removeChild","insertNodeAt","fatherNode","refNode","children","nextSibling","insertBefore","g","$Object","D","arrayIndexOf","names","STARTS_WITH","$startsWith","startsWith","search","setPublicPath_i","currentScript","_arrayWithHoles","is_array_default","_iterableToArrayLimit","_arr","_n","_d","_e","_s","get_iterator_default","err","_nonIterableRest","_slicedToArray","_arrayWithoutHoles","arr2","_iterableToArray","is_iterable_default","from_default","_nonIterableSpread","_toConsumableArray","buildAttribute","propName","computeVmIndex","vnodes","element","map","elt","elm","computeIndexes","slots","isTransition","footerOffset","elmFromNodes","footerIndex","rawIndexes","idx","filter","ind","emit","evtName","evtData","_this","$nextTick","$emit","toLowerCase","delegateAndEmit","_this2","realList","isTransitionName","_slots","componentOptions","getSlot","slot","scopedSlot","computeChildrenAndOffsets","headerOffset","header","footer","getComponentAttributes","$attrs","componentData","attributes","update","attrs","keys_default","reduce","on","props","componentDataAttrs","assign_default","eventsListened","eventsToEmit","readonlyProperties","evt","draggingElement","options","list","required","default","noTransitionOnDrag","Boolean","clone","original","move","draggableComponent","inheritAttrs","data","transitionMode","noneFunctionalComponentMode","render","h","$slots","_computeChildrenAndOf","$scopedSlots","getTag","created","error","warn","mounted","_this3","$el","nodeName","getIsFunctional","Error","optionsAdded","onMove","originalEvent","onDragMove","draggable","_sortable","Sortable","rootContainer","beforeDestroy","destroy","computed","watch","handler","newOptionValue","updateOptions","deep","fnOptions","_vnode","functional","option","getChildrenNodes","$children","rawNodes","child","_this4","visibleIndexes","getUnderlyingVm","htmlElt","getUnderlyingPotencialDraggableComponent","_ref","vue","__vue__","$options","_componentTag","$parent","emitChanges","_this5","alterList","onList","newList","spliceList","_arguments","splice","updatePosition","oldIndex","newIndex","getRelatedContextFromMoveEvent","_ref2","to","related","component","destination","getVmIndex","domIndex","indexes","numberIndexes","getComponent","componentInstance","resetTransitionData","nodes","transitionContainer","kept","onDragStart","item","_underlying_vm_","onDragAdd","added","onDragRemove","pullMode","removed","onDragUpdate","moved","updateProperty","propertyName","computeFutureIndex","relatedContext","domChildren","currentDOMIndex","currentIndex","draggedInList","willInsertAfter","draggedContext","futureIndex","sendEvt","onDragEnd","Vue","__webpack_exports__"],"mappings":"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","file":"vuedraggable.umd.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"sortablejs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"sortablejs\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vuedraggable\"] = factory(require(\"sortablejs\"));\n\telse\n\t\troot[\"vuedraggable\"] = factory(root[\"Sortable\"]);\n})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE_a352__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"fb15\");\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = require('./_export');\n\n$export($export.S, 'Array', { isArray: require('./_is-array') });\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","module.exports = false;\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","exports.f = {}.propertyIsEnumerable;\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.get-iterator');\n","module.exports = {};\n","module.exports = require(\"core-js/library/fn/object/create\");","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","module.exports = require(\"core-js/library/fn/object/assign\");","require('../../modules/es6.object.assign');\nmodule.exports = require('../../modules/_core').Object.assign;\n","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","require('../modules/web.dom.iterable');\nrequire('../modules/es6.string.iterator');\nmodule.exports = require('../modules/core.is-iterable');\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var core = module.exports = { version: '2.6.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","module.exports = require(\"core-js/library/fn/get-iterator\");","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar ctx = require('./_ctx');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","require('./es6.array.iterator');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar TO_STRING_TAG = require('./_wks')('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","module.exports = require(\"core-js/library/fn/array/from\");","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var anObject = require('./_an-object');\nvar get = require('./core.get-iterator-method');\nmodule.exports = require('./_core').getIterator = function (it) {\n var iterFn = get(it);\n if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');\n return anObject(iterFn.call(it));\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","var core = module.exports = { version: '2.6.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","module.exports = function () { /* empty */ };\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","require('../../modules/es6.object.keys');\nmodule.exports = require('../../modules/_core').Object.keys;\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","module.exports = require('./_hide');\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').isIterable = function (it) {\n var O = Object(it);\n return O[ITERATOR] !== undefined\n || '@@iterator' in O\n // eslint-disable-next-line no-prototype-builtins\n || Iterators.hasOwnProperty(classof(O));\n};\n","exports.f = Object.getOwnPropertySymbols;\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","module.exports = __WEBPACK_EXTERNAL_MODULE_a352__;","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","module.exports = require(\"core-js/library/fn/object/keys\");","module.exports = require(\"core-js/library/fn/array/is-array\");","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","module.exports = true;\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","function getConsole() {\r\n if (typeof window !== \"undefined\") {\r\n return window.console;\r\n }\r\n return global.console;\r\n}\r\nconst console = getConsole();\r\n\r\nfunction cached(fn) {\r\n const cache = Object.create(null);\r\n return function cachedFn(str) {\r\n const hit = cache[str];\r\n return hit || (cache[str] = fn(str));\r\n };\r\n}\r\n\r\nconst regex = /-(\\w)/g;\r\nconst camelize = cached(str =>\r\n str.replace(regex, (_, c) => (c ? c.toUpperCase() : \"\"))\r\n);\r\n\r\nfunction removeNode(node) {\r\n if (node.parentElement !== null) {\r\n node.parentElement.removeChild(node);\r\n }\r\n}\r\n\r\nfunction insertNodeAt(fatherNode, node, position) {\r\n const refNode =\r\n position === 0\r\n ? fatherNode.children[0]\r\n : fatherNode.children[position - 1].nextSibling;\r\n fatherNode.insertBefore(node, refNode);\r\n}\r\n\r\nexport { insertNodeAt, camelize, console, removeNode };\r\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","module.exports = require(\"core-js/library/fn/is-iterable\");","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","require('../../modules/es6.string.iterator');\nrequire('../../modules/es6.array.from');\nmodule.exports = require('../../modules/_core').Array.from;\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","require('../../modules/es6.object.create');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function create(P, D) {\n return $Object.create(P, D);\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","require('../../modules/es6.array.is-array');\nmodule.exports = require('../../modules/_core').Array.isArray;\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var i\n if ((i = window.document.currentScript) && (i = i.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/))) {\n __webpack_public_path__ = i[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\nexport default null\n","import _Array$isArray from \"../../core-js/array/is-array\";\nexport default function _arrayWithHoles(arr) {\n if (_Array$isArray(arr)) return arr;\n}","import _getIterator from \"../../core-js/get-iterator\";\nexport default function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = _getIterator(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}","import arrayWithHoles from \"./arrayWithHoles\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit\";\nimport nonIterableRest from \"./nonIterableRest\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}","import _Array$isArray from \"../../core-js/array/is-array\";\nexport default function _arrayWithoutHoles(arr) {\n if (_Array$isArray(arr)) {\n for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n }\n}","import _Array$from from \"../../core-js/array/from\";\nimport _isIterable from \"../../core-js/is-iterable\";\nexport default function _iterableToArray(iter) {\n if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return _Array$from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles\";\nimport iterableToArray from \"./iterableToArray\";\nimport nonIterableSpread from \"./nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();\n}","import Sortable from \"sortablejs\";\r\nimport { insertNodeAt, camelize, console, removeNode } from \"./util/helper\";\r\n\r\nfunction buildAttribute(object, propName, value) {\r\n if (value === undefined) {\r\n return object;\r\n }\r\n object = object || {};\r\n object[propName] = value;\r\n return object;\r\n}\r\n\r\nfunction computeVmIndex(vnodes, element) {\r\n return vnodes.map(elt => elt.elm).indexOf(element);\r\n}\r\n\r\nfunction computeIndexes(slots, children, isTransition, footerOffset) {\r\n if (!slots) {\r\n return [];\r\n }\r\n\r\n const elmFromNodes = slots.map(elt => elt.elm);\r\n const footerIndex = children.length - footerOffset;\r\n const rawIndexes = [...children].map((elt, idx) =>\r\n idx >= footerIndex ? elmFromNodes.length : elmFromNodes.indexOf(elt)\r\n );\r\n return isTransition ? rawIndexes.filter(ind => ind !== -1) : rawIndexes;\r\n}\r\n\r\nfunction emit(evtName, evtData) {\r\n this.$nextTick(() => this.$emit(evtName.toLowerCase(), evtData));\r\n}\r\n\r\nfunction delegateAndEmit(evtName) {\r\n return evtData => {\r\n if (this.realList !== null) {\r\n this[\"onDrag\" + evtName](evtData);\r\n }\r\n emit.call(this, evtName, evtData);\r\n };\r\n}\r\n\r\nfunction isTransitionName(name) {\r\n return [\"transition-group\", \"TransitionGroup\"].includes(name);\r\n}\r\n\r\nfunction isTransition(slots) {\r\n if (!slots || slots.length !== 1) {\r\n return false;\r\n }\r\n const [{ componentOptions }] = slots;\r\n if (!componentOptions) {\r\n return false;\r\n }\r\n return isTransitionName(componentOptions.tag);\r\n}\r\n\r\nfunction getSlot(slot, scopedSlot, key) {\r\n return slot[key] || (scopedSlot[key] ? scopedSlot[key]() : undefined);\r\n}\r\n\r\nfunction computeChildrenAndOffsets(children, slot, scopedSlot) {\r\n let headerOffset = 0;\r\n let footerOffset = 0;\r\n const header = getSlot(slot, scopedSlot, \"header\");\r\n if (header) {\r\n headerOffset = header.length;\r\n children = children ? [...header, ...children] : [...header];\r\n }\r\n const footer = getSlot(slot, scopedSlot, \"footer\");\r\n if (footer) {\r\n footerOffset = footer.length;\r\n children = children ? [...children, ...footer] : [...footer];\r\n }\r\n return { children, headerOffset, footerOffset };\r\n}\r\n\r\nfunction getComponentAttributes($attrs, componentData) {\r\n let attributes = null;\r\n const update = (name, value) => {\r\n attributes = buildAttribute(attributes, name, value);\r\n };\r\n const attrs = Object.keys($attrs)\r\n .filter(key => key === \"id\" || key.startsWith(\"data-\"))\r\n .reduce((res, key) => {\r\n res[key] = $attrs[key];\r\n return res;\r\n }, {});\r\n update(\"attrs\", attrs);\r\n\r\n if (!componentData) {\r\n return attributes;\r\n }\r\n const { on, props, attrs: componentDataAttrs } = componentData;\r\n update(\"on\", on);\r\n update(\"props\", props);\r\n Object.assign(attributes.attrs, componentDataAttrs);\r\n return attributes;\r\n}\r\n\r\nconst eventsListened = [\"Start\", \"Add\", \"Remove\", \"Update\", \"End\"];\r\nconst eventsToEmit = [\"Choose\", \"Unchoose\", \"Sort\", \"Filter\", \"Clone\"];\r\nconst readonlyProperties = [\"Move\", ...eventsListened, ...eventsToEmit].map(\r\n evt => \"on\" + evt\r\n);\r\nvar draggingElement = null;\r\n\r\nconst props = {\r\n options: Object,\r\n list: {\r\n type: Array,\r\n required: false,\r\n default: null\r\n },\r\n value: {\r\n type: Array,\r\n required: false,\r\n default: null\r\n },\r\n noTransitionOnDrag: {\r\n type: Boolean,\r\n default: false\r\n },\r\n clone: {\r\n type: Function,\r\n default: original => {\r\n return original;\r\n }\r\n },\r\n element: {\r\n type: String,\r\n default: \"div\"\r\n },\r\n tag: {\r\n type: String,\r\n default: null\r\n },\r\n move: {\r\n type: Function,\r\n default: null\r\n },\r\n componentData: {\r\n type: Object,\r\n required: false,\r\n default: null\r\n }\r\n};\r\n\r\nconst draggableComponent = {\r\n name: \"draggable\",\r\n\r\n inheritAttrs: false,\r\n\r\n props,\r\n\r\n data() {\r\n return {\r\n transitionMode: false,\r\n noneFunctionalComponentMode: false\r\n };\r\n },\r\n\r\n render(h) {\r\n const slots = this.$slots.default;\r\n this.transitionMode = isTransition(slots);\r\n const { children, headerOffset, footerOffset } = computeChildrenAndOffsets(\r\n slots,\r\n this.$slots,\r\n this.$scopedSlots\r\n );\r\n this.headerOffset = headerOffset;\r\n this.footerOffset = footerOffset;\r\n const attributes = getComponentAttributes(this.$attrs, this.componentData);\r\n return h(this.getTag(), attributes, children);\r\n },\r\n\r\n created() {\r\n if (this.list !== null && this.value !== null) {\r\n console.error(\r\n \"Value and list props are mutually exclusive! Please set one or another.\"\r\n );\r\n }\r\n\r\n if (this.element !== \"div\") {\r\n console.warn(\r\n \"Element props is deprecated please use tag props instead. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#element-props\"\r\n );\r\n }\r\n\r\n if (this.options !== undefined) {\r\n console.warn(\r\n \"Options props is deprecated, add sortable options directly as vue.draggable item, or use v-bind. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#options-props\"\r\n );\r\n }\r\n },\r\n\r\n mounted() {\r\n this.noneFunctionalComponentMode =\r\n this.getTag().toLowerCase() !== this.$el.nodeName.toLowerCase() &&\r\n !this.getIsFunctional();\r\n if (this.noneFunctionalComponentMode && this.transitionMode) {\r\n throw new Error(\r\n `Transition-group inside component is not supported. Please alter tag value or remove transition-group. Current tag value: ${this.getTag()}`\r\n );\r\n }\r\n var optionsAdded = {};\r\n eventsListened.forEach(elt => {\r\n optionsAdded[\"on\" + elt] = delegateAndEmit.call(this, elt);\r\n });\r\n\r\n eventsToEmit.forEach(elt => {\r\n optionsAdded[\"on\" + elt] = emit.bind(this, elt);\r\n });\r\n\r\n const attributes = Object.keys(this.$attrs).reduce((res, key) => {\r\n res[camelize(key)] = this.$attrs[key];\r\n return res;\r\n }, {});\r\n\r\n const options = Object.assign({}, this.options, attributes, optionsAdded, {\r\n onMove: (evt, originalEvent) => {\r\n return this.onDragMove(evt, originalEvent);\r\n }\r\n });\r\n !(\"draggable\" in options) && (options.draggable = \">*\");\r\n this._sortable = new Sortable(this.rootContainer, options);\r\n this.computeIndexes();\r\n },\r\n\r\n beforeDestroy() {\r\n if (this._sortable !== undefined) this._sortable.destroy();\r\n },\r\n\r\n computed: {\r\n rootContainer() {\r\n return this.transitionMode ? this.$el.children[0] : this.$el;\r\n },\r\n\r\n realList() {\r\n return this.list ? this.list : this.value;\r\n }\r\n },\r\n\r\n watch: {\r\n options: {\r\n handler(newOptionValue) {\r\n this.updateOptions(newOptionValue);\r\n },\r\n deep: true\r\n },\r\n\r\n $attrs: {\r\n handler(newOptionValue) {\r\n this.updateOptions(newOptionValue);\r\n },\r\n deep: true\r\n },\r\n\r\n realList() {\r\n this.computeIndexes();\r\n }\r\n },\r\n\r\n methods: {\r\n getIsFunctional() {\r\n const { fnOptions } = this._vnode;\r\n return fnOptions && fnOptions.functional;\r\n },\r\n\r\n getTag() {\r\n return this.tag || this.element;\r\n },\r\n\r\n updateOptions(newOptionValue) {\r\n for (var property in newOptionValue) {\r\n const value = camelize(property);\r\n if (readonlyProperties.indexOf(value) === -1) {\r\n this._sortable.option(value, newOptionValue[property]);\r\n }\r\n }\r\n },\r\n\r\n getChildrenNodes() {\r\n if (this.noneFunctionalComponentMode) {\r\n return this.$children[0].$slots.default;\r\n }\r\n const rawNodes = this.$slots.default;\r\n return this.transitionMode ? rawNodes[0].child.$slots.default : rawNodes;\r\n },\r\n\r\n computeIndexes() {\r\n this.$nextTick(() => {\r\n this.visibleIndexes = computeIndexes(\r\n this.getChildrenNodes(),\r\n this.rootContainer.children,\r\n this.transitionMode,\r\n this.footerOffset\r\n );\r\n });\r\n },\r\n\r\n getUnderlyingVm(htmlElt) {\r\n const index = computeVmIndex(this.getChildrenNodes() || [], htmlElt);\r\n if (index === -1) {\r\n //Edge case during move callback: related element might be\r\n //an element different from collection\r\n return null;\r\n }\r\n const element = this.realList[index];\r\n return { index, element };\r\n },\r\n\r\n getUnderlyingPotencialDraggableComponent({ __vue__: vue }) {\r\n if (\r\n !vue ||\r\n !vue.$options ||\r\n !isTransitionName(vue.$options._componentTag)\r\n ) {\r\n if (\r\n !(\"realList\" in vue) &&\r\n vue.$children.length === 1 &&\r\n \"realList\" in vue.$children[0]\r\n )\r\n return vue.$children[0];\r\n\r\n return vue;\r\n }\r\n return vue.$parent;\r\n },\r\n\r\n emitChanges(evt) {\r\n this.$nextTick(() => {\r\n this.$emit(\"change\", evt);\r\n });\r\n },\r\n\r\n alterList(onList) {\r\n if (this.list) {\r\n onList(this.list);\r\n return;\r\n }\r\n const newList = [...this.value];\r\n onList(newList);\r\n this.$emit(\"input\", newList);\r\n },\r\n\r\n spliceList() {\r\n const spliceList = list => list.splice(...arguments);\r\n this.alterList(spliceList);\r\n },\r\n\r\n updatePosition(oldIndex, newIndex) {\r\n const updatePosition = list =>\r\n list.splice(newIndex, 0, list.splice(oldIndex, 1)[0]);\r\n this.alterList(updatePosition);\r\n },\r\n\r\n getRelatedContextFromMoveEvent({ to, related }) {\r\n const component = this.getUnderlyingPotencialDraggableComponent(to);\r\n if (!component) {\r\n return { component };\r\n }\r\n const list = component.realList;\r\n const context = { list, component };\r\n if (to !== related && list && component.getUnderlyingVm) {\r\n const destination = component.getUnderlyingVm(related);\r\n if (destination) {\r\n return Object.assign(destination, context);\r\n }\r\n }\r\n return context;\r\n },\r\n\r\n getVmIndex(domIndex) {\r\n const indexes = this.visibleIndexes;\r\n const numberIndexes = indexes.length;\r\n return domIndex > numberIndexes - 1 ? numberIndexes : indexes[domIndex];\r\n },\r\n\r\n getComponent() {\r\n return this.$slots.default[0].componentInstance;\r\n },\r\n\r\n resetTransitionData(index) {\r\n if (!this.noTransitionOnDrag || !this.transitionMode) {\r\n return;\r\n }\r\n var nodes = this.getChildrenNodes();\r\n nodes[index].data = null;\r\n const transitionContainer = this.getComponent();\r\n transitionContainer.children = [];\r\n transitionContainer.kept = undefined;\r\n },\r\n\r\n onDragStart(evt) {\r\n this.context = this.getUnderlyingVm(evt.item);\r\n evt.item._underlying_vm_ = this.clone(this.context.element);\r\n draggingElement = evt.item;\r\n },\r\n\r\n onDragAdd(evt) {\r\n const element = evt.item._underlying_vm_;\r\n if (element === undefined) {\r\n return;\r\n }\r\n removeNode(evt.item);\r\n const newIndex = this.getVmIndex(evt.newIndex);\r\n this.spliceList(newIndex, 0, element);\r\n this.computeIndexes();\r\n const added = { element, newIndex };\r\n this.emitChanges({ added });\r\n },\r\n\r\n onDragRemove(evt) {\r\n insertNodeAt(this.rootContainer, evt.item, evt.oldIndex);\r\n if (evt.pullMode === \"clone\") {\r\n removeNode(evt.clone);\r\n return;\r\n }\r\n const oldIndex = this.context.index;\r\n this.spliceList(oldIndex, 1);\r\n const removed = { element: this.context.element, oldIndex };\r\n this.resetTransitionData(oldIndex);\r\n this.emitChanges({ removed });\r\n },\r\n\r\n onDragUpdate(evt) {\r\n removeNode(evt.item);\r\n insertNodeAt(evt.from, evt.item, evt.oldIndex);\r\n const oldIndex = this.context.index;\r\n const newIndex = this.getVmIndex(evt.newIndex);\r\n this.updatePosition(oldIndex, newIndex);\r\n const moved = { element: this.context.element, oldIndex, newIndex };\r\n this.emitChanges({ moved });\r\n },\r\n\r\n updateProperty(evt, propertyName) {\r\n evt.hasOwnProperty(propertyName) &&\r\n (evt[propertyName] += this.headerOffset);\r\n },\r\n\r\n computeFutureIndex(relatedContext, evt) {\r\n if (!relatedContext.element) {\r\n return 0;\r\n }\r\n const domChildren = [...evt.to.children].filter(\r\n el => el.style[\"display\"] !== \"none\"\r\n );\r\n const currentDOMIndex = domChildren.indexOf(evt.related);\r\n const currentIndex = relatedContext.component.getVmIndex(currentDOMIndex);\r\n const draggedInList = domChildren.indexOf(draggingElement) !== -1;\r\n return draggedInList || !evt.willInsertAfter\r\n ? currentIndex\r\n : currentIndex + 1;\r\n },\r\n\r\n onDragMove(evt, originalEvent) {\r\n const onMove = this.move;\r\n if (!onMove || !this.realList) {\r\n return true;\r\n }\r\n\r\n const relatedContext = this.getRelatedContextFromMoveEvent(evt);\r\n const draggedContext = this.context;\r\n const futureIndex = this.computeFutureIndex(relatedContext, evt);\r\n Object.assign(draggedContext, { futureIndex });\r\n const sendEvt = Object.assign({}, evt, {\r\n relatedContext,\r\n draggedContext\r\n });\r\n return onMove(sendEvt, originalEvent);\r\n },\r\n\r\n onDragEnd() {\r\n this.computeIndexes();\r\n draggingElement = null;\r\n }\r\n }\r\n};\r\n\r\nif (typeof window !== \"undefined\" && \"Vue\" in window) {\r\n window.Vue.component(\"draggable\", draggableComponent);\r\n}\r\n\r\nexport default draggableComponent;\r\n","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"sourceRoot":""} \ No newline at end of file diff --git a/cookbook/static/themes/tandoor.min.css b/cookbook/static/themes/tandoor.min.css index 6b49a5f0..af19696b 100644 --- a/cookbook/static/themes/tandoor.min.css +++ b/cookbook/static/themes/tandoor.min.css @@ -6113,9 +6113,11 @@ a.close.disabled { .align-text-top { vertical-align: text-top !important } - +/*! + * technically the wrong color but not used anywhere besides nav and this way changing nav color is supported + */ .bg-primary { - background-color: #b98766 !important + background-color: rgb(221, 191, 134) !important; } a.bg-primary:focus, a.bg-primary:hover, button.bg-primary:focus, button.bg-primary:hover { 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/templates/base.html b/cookbook/templates/base.html index 14caa688..09f89174 100644 --- a/cookbook/templates/base.html +++ b/cookbook/templates/base.html @@ -69,7 +69,7 @@ -